Merge: nitrpg: minor enhancements
authorJean Privat <jean@pryen.org>
Wed, 22 Apr 2015 04:18:11 +0000 (11:18 +0700)
committerJean Privat <jean@pryen.org>
Wed, 22 Apr 2015 04:18:11 +0000 (11:18 +0700)
Mainly designed to fully close #1168 and work on #1161.

Pull-Request: #1185
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>

1140 files changed:
VERSION
benchmarks/bench_engines.sh
benchmarks/markdown/.gitignore [new file with mode: 0644]
benchmarks/markdown/Makefile [new file with mode: 0644]
benchmarks/markdown/README.md
benchmarks/markdown/bench_markdown.sh
benchmarks/markdown/benches/Makefile
benchmarks/markdown/engines/Makefile
benchmarks/markdown/engines/nitmd/Makefile
benchmarks/markdown/engines/pandoc/Makefile [new file with mode: 0644]
benchmarks/markdown/engines/pandoc/pandoc.hs [new file with mode: 0644]
benchmarks/strings/.gitignore [new file with mode: 0644]
benchmarks/strings/Makefile [new file with mode: 0644]
benchmarks/strings/README.md [new file with mode: 0644]
benchmarks/strings/array_to_s_vars/array_to_s_buffer.nit
benchmarks/strings/array_to_s_vars/array_to_s_flatstr.nit
benchmarks/strings/array_to_s_vars/array_to_s_man_buf.nit
benchmarks/strings/array_to_s_vars/array_to_s_rope.nit
benchmarks/strings/array_to_s_vars/array_to_s_rope_buf.nit [new file with mode: 0644]
benchmarks/strings/bench_strings.sh [moved from benchmarks/bench_strings.sh with 53% similarity]
benchmarks/strings/chain_concat.nit
benchmarks/strings/iteration_bench.nit
benchmarks/strings/substr_bench.nit
benchmarks/strings/utf_chain_concat.nit [deleted file]
benchmarks/strings/utf_iteration_bench.nit [deleted file]
benchmarks/strings/utf_substr_bench.nit [deleted file]
bin/Makefile [new file with mode: 0644]
clib/gc_chooser.c
contrib/benitlux/src/benitlux_daily.nit
contrib/header_keeper/Makefile [new file with mode: 0644]
contrib/header_keeper/src/header_keeper.nit [new file with mode: 0644]
contrib/inkscape_tools/Makefile
contrib/nitcc/src/Makefile
contrib/nitester/src/nitester.nit
contrib/nitiwiki/Makefile
contrib/opportunity/src/opportunity_controller.nit
contrib/pep8analysis/Makefile
contrib/pep8analysis/src/backbone.nit
contrib/pep8analysis/src/flow_analysis/framework.nit
examples/calculator/Makefile
examples/calculator/src/calculator_android.nit
examples/calculator/src/calculator_logic.nit
examples/mnit_dino/src/dino_android.nit
examples/mnit_simple/src/complete_simple_android.nit
examples/rosettacode/perlin_noise.nit [new file with mode: 0644]
lib/a_star.nit
lib/ai/backtrack.nit
lib/ai/examples/puzzle.nit
lib/ai/search.nit
lib/android/NitActivity.java [new file with mode: 0644]
lib/android/README.md
lib/android/aware.nit
lib/android/dalvik.nit
lib/android/examples/src/ui_test.nit
lib/android/intent/intent_api10.nit
lib/android/log.nit
lib/android/native_app_glue.nit
lib/android/nit_activity.nit [new file with mode: 0644]
lib/android/ui.nit
lib/app/app_base.nit
lib/deriving.nit [new file with mode: 0644]
lib/egl.nit
lib/geometry/points_and_lines.nit
lib/geometry/quadtree.nit
lib/github/github_curl.nit
lib/glesv2/glesv2.nit
lib/html/bootstrap.nit [new file with mode: 0644]
lib/ios/app.nit [new file with mode: 0644]
lib/ios/examples/hello_ios.nit [new file with mode: 0644]
lib/ios/ios.nit [new file with mode: 0644]
lib/ios/platform.nit [new file with mode: 0644]
lib/json_serialization.nit
lib/jvm.nit
lib/md5.nit
lib/meta.nit [new file with mode: 0644]
lib/mnit/numbers.nit
lib/mnit/tileset.nit
lib/noise.nit [new file with mode: 0644]
lib/poset.nit
lib/privileges/privileges.nit [moved from lib/privileges.nit with 100% similarity]
lib/pthreads/README.md
lib/pthreads/examples/threaded_example.nit [new file with mode: 0644]
lib/pthreads/pthreads.nit
lib/sax/helpers/sax_locator_impl.nit
lib/sax/sax_parse_exception.nit
lib/saxophonit/test_saxophonit.nit
lib/serialization.nit [deleted file]
lib/serialization/README.md [new file with mode: 0644]
lib/serialization/serialization.nit [new file with mode: 0644]
lib/signals.nit
lib/socket/socket.nit
lib/socket/socket_c.nit
lib/standard/collection/abstract_collection.nit
lib/standard/collection/array.nit
lib/standard/collection/hash_collection.nit
lib/standard/collection/sorter.nit
lib/standard/collection/union_find.nit
lib/standard/exec.nit
lib/standard/exec_nit.c
lib/standard/exec_nit.h
lib/standard/file.nit
lib/standard/file_nit.h
lib/standard/kernel.nit
lib/standard/kernel_nit.h
lib/standard/math.nit
lib/standard/stream.nit
lib/standard/string.nit
lib/standard/string_search.nit
lib/string_experimentations/utf8_noindex.nit
lib/template/examples/tmpl_composer.nit
misc/README.md
misc/jenkins/check_contrib.sh [new file with mode: 0755]
misc/vim/plugin/nit.vim
share/man/nitc.md
share/man/nitunit.md
src/annotation.nit
src/astbuilder.nit
src/astvalidation.nit
src/compiler/abstract_compiler.nit
src/compiler/coloring.nit
src/compiler/compiler.nit
src/compiler/global_compiler.nit
src/compiler/separate_compiler.nit
src/compiler/separate_erasure_compiler.nit
src/doc/doc_base.nit
src/doc/doc_phases/doc_graphs.nit
src/doc/doc_phases/doc_hierarchies.nit
src/doc/doc_phases/doc_html.nit
src/doc/doc_phases/doc_structure.nit
src/doc/html_templates/html_components.nit
src/doc/html_templates/html_model.nit
src/doc/html_templates/html_templates.nit
src/doc/vim_autocomplete.nit
src/ffi/c_compiler_options.nit
src/ffi/extern_classes.nit
src/ffi/extra_java_files.nit
src/ffi/ffi_base.nit
src/ffi/java.nit
src/ffi/pkgconfig.nit
src/frontend/check_annotation.nit
src/frontend/deriving.nit [new file with mode: 0644]
src/frontend/div_by_zero.nit
src/frontend/frontend.nit
src/frontend/glsl_validation.nit
src/frontend/no_warning.nit
src/frontend/parallelization_phase.nit [new file with mode: 0644]
src/frontend/serialization_phase.nit
src/highlight.nit
src/interpreter/debugger.nit
src/interpreter/naive_interpreter.nit
src/literal.nit
src/loader.nit
src/location.nit
src/metrics/detect_covariance.nit
src/metrics/detect_variance_constraints.nit
src/metrics/rta_metrics.nit
src/mixin.nit
src/model/mdoc.nit
src/model/mmodule.nit
src/model/model.nit
src/modelbuilder.nit
src/modelbuilder_base.nit
src/modelize/modelize_class.nit
src/modelize/modelize_property.nit
src/neo.nit
src/nit.nit
src/nitdbg_client.nit
src/nitls.nit
src/nitni/nitni_base.nit
src/nitni/nitni_callbacks.nit
src/nitserial.nit
src/nitunit.nit
src/nitvm.nit
src/parser/.gitignore [new file with mode: 0644]
src/parser/Makefile
src/parser/README.md
src/parser/lexer.nit
src/parser/lexer_work.nit
src/parser/nit.sablecc3xx
src/parser/org/nitlanguage/gen/TestParser.java [new file with mode: 0644]
src/parser/parser.nit
src/parser/parser_abs.nit
src/parser/parser_nodes.nit
src/parser/parser_prod.nit
src/parser/parser_work.nit
src/parser/tables_nit.c
src/parser_util.nit
src/phase.nit
src/platform/android.nit
src/platform/android_annotations.nit
src/platform/app_annotations.nit [new file with mode: 0644]
src/platform/emscripten.nit
src/platform/ios.nit [new file with mode: 0644]
src/platform/platform.nit
src/platform/pnacl.nit
src/platform/xcode_templates.nit [new file with mode: 0644]
src/pretty.nit
src/rapid_type_analysis.nit
src/semantize/auto_super_init.nit
src/semantize/flow.nit
src/semantize/local_var_init.nit
src/semantize/scope.nit
src/semantize/typing.nit
src/test_parser.nit
src/test_phase.nit
src/testing/testing_doc.nit
src/testing/testing_suite.nit
src/toolcontext.nit
src/transform.nit
src/vm/variables_numbering.nit [new file with mode: 0644]
src/vm/virtual_machine.nit [moved from src/vm.nit with 98% similarity]
src/vm/vm.nit [new file with mode: 0644]
src/vm/vm_optimizations.nit [moved from src/vm_optimizations.nit with 99% similarity]
tests/Linux.skip
tests/base_adaptive_loop.nit [new file with mode: 0644]
tests/base_adaptive_loop2.nit [new file with mode: 0644]
tests/base_adaptive_loop3.nit [new file with mode: 0644]
tests/base_adaptive_loop_array.nit [new file with mode: 0644]
tests/base_adaptive_loop_call.nit [new file with mode: 0644]
tests/base_adaptive_loop_null.nit [new file with mode: 0644]
tests/base_arg_default.nit [new file with mode: 0644]
tests/base_arg_default2.nit [new file with mode: 0644]
tests/base_arg_default_autoinit.nit [new file with mode: 0644]
tests/base_attr.nit
tests/base_attr_abstract.nit [new file with mode: 0644]
tests/base_attr_def.nit
tests/base_attr_init_val2.nit
tests/base_autocast_array.nit [new file with mode: 0644]
tests/base_combined_assignment.nit
tests/base_empty_module.nit
tests/base_eq_null_notnull.nit
tests/base_gen.nit
tests/base_gen2.nit
tests/base_gen_int.nit
tests/base_init_raf2.nit [new file with mode: 0644]
tests/base_new_intern.nit [new file with mode: 0644]
tests/base_notnull.nit [new file with mode: 0644]
tests/base_notnull_lit.nit [new file with mode: 0644]
tests/base_simple.nit
tests/base_types_formal_and_virtual.nit
tests/base_types_formal_and_virtual2.nit
tests/base_types_formal_and_virtual4.nit
tests/base_var_type_evolution_null5.nit
tests/base_var_type_evolution_null_while.nit
tests/base_var_type_evolution_nullable.nit
tests/base_with.nit [new file with mode: 0644]
tests/bench_421.nit
tests/bench_add_all.nit
tests/bench_complex_sort.nit
tests/bench_fib.nit
tests/bench_int_range_iterator.nit
tests/bench_netsim.nit
tests/bench_nsieve_bool.nit
tests/bench_send.nit
tests/bench_send2.nit
tests/bench_strfib.nit [new file with mode: 0644]
tests/bench_string_append.nit
tests/bench_string_super.nit
tests/bench_string_tos.nit
tests/bench_tak.nit
tests/error_constraint_raf.nit.broken
tests/error_needed_types.nit
tests/error_operators.nit [new file with mode: 0644]
tests/error_prop_glob.nit
tests/error_toplevel.nit
tests/error_virtual_type.nit [new file with mode: 0644]
tests/error_virtual_type2.nit [new file with mode: 0644]
tests/niti.skip
tests/nitunit.args
tests/nitvm.skip
tests/sav/base_adaptive_alt1.res
tests/sav/base_adaptive_alt2.res
tests/sav/base_adaptive_alt3.res
tests/sav/base_adaptive_loop.res [new file with mode: 0644]
tests/sav/base_adaptive_loop2.res [new file with mode: 0644]
tests/sav/base_adaptive_loop2_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop2_alt2.res [new file with mode: 0644]
tests/sav/base_adaptive_loop2_alt3.res [new file with mode: 0644]
tests/sav/base_adaptive_loop3.res [new file with mode: 0644]
tests/sav/base_adaptive_loop3_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop3_alt2.res [new file with mode: 0644]
tests/sav/base_adaptive_loop3_alt3.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_array.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_array_1alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_array_1alt1_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_array_1alt2.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_array_1alt2_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_array_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_call.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_call_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_call_alt2.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_null.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_null_alt1.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_null_alt2.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_null_alt3.res [new file with mode: 0644]
tests/sav/base_adaptive_loop_null_alt4.res [new file with mode: 0644]
tests/sav/base_arg_default.res [new file with mode: 0644]
tests/sav/base_arg_default2.res [new file with mode: 0644]
tests/sav/base_arg_default2_alt1.res [new file with mode: 0644]
tests/sav/base_arg_default_alt1.res [new file with mode: 0644]
tests/sav/base_arg_default_alt2.res [new file with mode: 0644]
tests/sav/base_arg_default_autoinit.res [new file with mode: 0644]
tests/sav/base_arg_default_autoinit_alt1.res [new file with mode: 0644]
tests/sav/base_array_lit_typed_alt1.res
tests/sav/base_array_lit_typed_alt2.res
tests/sav/base_as_cast.res
tests/sav/base_as_cast_alt1.res
tests/sav/base_as_cast_alt2.res
tests/sav/base_as_cast_alt3.res
tests/sav/base_as_cast_alt4.res
tests/sav/base_as_cast_alt5.res
tests/sav/base_as_cast_alt6.res
tests/sav/base_as_notnull.res
tests/sav/base_as_notnull2.res
tests/sav/base_as_notnull2_alt1.res
tests/sav/base_as_notnull2_alt2.res
tests/sav/base_as_notnull2_alt3.res
tests/sav/base_as_notnull_alt1.res
tests/sav/base_as_notnull_alt2.res
tests/sav/base_as_notnull_alt3.res
tests/sav/base_as_notnull_alt4.res
tests/sav/base_as_notnull_alt5.res
tests/sav/base_as_notnull_alt6.res
tests/sav/base_as_notnull_alt7.res
tests/sav/base_as_notnull_int.res
tests/sav/base_assert2_alt1.res
tests/sav/base_assert2_alt2.res
tests/sav/base_assert_alt2.res
tests/sav/base_attr3_alt1.res
tests/sav/base_attr3_alt2.res
tests/sav/base_attr3_alt3.res
tests/sav/base_attr3_alt4.res
tests/sav/base_attr4_alt1.res
tests/sav/base_attr4_alt2.res
tests/sav/base_attr5_alt1.res
tests/sav/base_attr5_alt11.res
tests/sav/base_attr5_alt12.res
tests/sav/base_attr5_alt13.res
tests/sav/base_attr5_alt14.res
tests/sav/base_attr5_alt16.res
tests/sav/base_attr5_alt17.res
tests/sav/base_attr5_alt21.res
tests/sav/base_attr5_alt23.res
tests/sav/base_attr5_alt25.res
tests/sav/base_attr5_alt3.res
tests/sav/base_attr5_alt5.res
tests/sav/base_attr5_alt6.res
tests/sav/base_attr7_alt1.res
tests/sav/base_attr7_alt2.res
tests/sav/base_attr7_alt3.res
tests/sav/base_attr_abstract.res [new file with mode: 0644]
tests/sav/base_attr_abstract_alt1.res [new file with mode: 0644]
tests/sav/base_attr_abstract_alt2.res [new file with mode: 0644]
tests/sav/base_attr_abstract_alt3.res [new file with mode: 0644]
tests/sav/base_attr_abstract_alt4.res [new file with mode: 0644]
tests/sav/base_attr_init_val_block_alt1.res
tests/sav/base_attr_init_val_block_alt2.res
tests/sav/base_attr_isset_alt2.res
tests/sav/base_attr_lazy_alt1.res
tests/sav/base_attr_lazy_alt2.res
tests/sav/base_attr_named_setters_alt1.res
tests/sav/base_attr_named_setters_alt2.res
tests/sav/base_attr_named_setters_alt3.res
tests/sav/base_attr_named_setters_alt4.res
tests/sav/base_attr_readonly_alt1.res
tests/sav/base_attr_readonly_alt3.res
tests/sav/base_autocast_array.res [new file with mode: 0644]
tests/sav/base_autocast_array_alt1.res [new file with mode: 0644]
tests/sav/base_autocast_array_alt2.res [new file with mode: 0644]
tests/sav/base_autocast_array_alt3.res [new file with mode: 0644]
tests/sav/base_classid.res
tests/sav/base_combined_assignment.res
tests/sav/base_combined_assignment_alt1.res
tests/sav/base_control_flow_alt1.res
tests/sav/base_covar_int2_alt2.res
tests/sav/base_covar_int2_alt4.res
tests/sav/base_covar_int_alt2.res
tests/sav/base_covar_int_alt4.res
tests/sav/base_deprecated.res
tests/sav/base_div_by_zero.res
tests/sav/base_eq_null_notnull.res
tests/sav/base_error_class_kind2_alt1.res
tests/sav/base_error_class_kind2_alt10.res
tests/sav/base_error_class_kind2_alt11.res
tests/sav/base_error_class_kind2_alt12.res
tests/sav/base_error_class_kind2_alt13.res
tests/sav/base_error_class_kind2_alt14.res
tests/sav/base_error_class_kind2_alt15.res
tests/sav/base_error_class_kind2_alt2.res
tests/sav/base_error_class_kind2_alt3.res
tests/sav/base_error_class_kind2_alt4.res
tests/sav/base_error_class_kind2_alt5.res
tests/sav/base_error_class_kind2_alt6.res
tests/sav/base_error_class_kind2_alt7.res
tests/sav/base_error_class_kind2_alt8.res
tests/sav/base_error_class_kind2_alt9.res
tests/sav/base_error_class_kind_alt1.res
tests/sav/base_error_class_kind_alt10.res
tests/sav/base_error_class_kind_alt11.res
tests/sav/base_error_class_kind_alt12.res
tests/sav/base_error_class_kind_alt13.res
tests/sav/base_error_class_kind_alt14.res
tests/sav/base_error_class_kind_alt15.res
tests/sav/base_error_class_kind_alt2.res
tests/sav/base_error_class_kind_alt3.res
tests/sav/base_error_class_kind_alt4.res
tests/sav/base_error_class_kind_alt5.res
tests/sav/base_error_class_kind_alt6.res
tests/sav/base_error_class_kind_alt7.res
tests/sav/base_error_class_kind_alt8.res
tests/sav/base_error_class_kind_alt9.res
tests/sav/base_error_doubledef.res
tests/sav/base_error_new_abstract.res
tests/sav/base_error_new_interface.res
tests/sav/base_for_nullable_alt2.res
tests/sav/base_formal_subtype.res
tests/sav/base_gen2_alt1.res
tests/sav/base_gen2_alt2.res
tests/sav/base_gen2_alt3.res
tests/sav/base_gen2_alt4.res
tests/sav/base_gen2_alt5.res
tests/sav/base_gen_alt1.res
tests/sav/base_gen_bound_alt1.res
tests/sav/base_gen_bound_alt2.res
tests/sav/base_gen_bound_alt3.res
tests/sav/base_gen_bound_alt4.res
tests/sav/base_gen_bound_alt5.res
tests/sav/base_gen_bound_alt6.res
tests/sav/base_gen_bound_alt7.res
tests/sav/base_gen_bound_alt8.res
tests/sav/base_gen_bound_alt9.res
tests/sav/base_gen_final_bound.res
tests/sav/base_gen_int_alt1.res
tests/sav/base_gen_reassign_alt3.res
tests/sav/base_gen_redef_alt2.res
tests/sav/base_gen_redef_alt3.res
tests/sav/base_if_expr_alt1.res
tests/sav/base_import_alt3.res
tests/sav/base_init_autoinit2_alt1.res
tests/sav/base_init_autoinit2_alt2.res
tests/sav/base_init_autoinit3_alt6.res
tests/sav/base_init_autoinit3_alt7.res
tests/sav/base_init_autoinit_alt1.res
tests/sav/base_init_inherit3.res
tests/sav/base_init_inherit4.res
tests/sav/base_init_linext2_alt1.res
tests/sav/base_init_noinit_alt4.res
tests/sav/base_init_noinit_alt5.res
tests/sav/base_init_nosuper_alt2.res
tests/sav/base_init_nosuper_alt3.res
tests/sav/base_init_raf2.res [new file with mode: 0644]
tests/sav/base_init_simple_alt1.res
tests/sav/base_init_super_call2_alt1.res
tests/sav/base_init_super_call2_alt2.res
tests/sav/base_init_super_call2_alt3.res
tests/sav/base_init_super_call2_alt4.res
tests/sav/base_init_super_call2_alt5.res
tests/sav/base_init_super_call2_alt6.res
tests/sav/base_init_super_call_alt1.res
tests/sav/base_init_super_call_alt2.res
tests/sav/base_init_super_call_alt3.res
tests/sav/base_init_super_call_alt4.res
tests/sav/base_init_super_call_alt5.res
tests/sav/base_init_super_call_alt6.res
tests/sav/base_inline_statement_alt1.res
tests/sav/base_inline_statement_alt2.res
tests/sav/base_inline_statement_alt3.res
tests/sav/base_isa.res
tests/sav/base_isa1.res
tests/sav/base_isa2.res
tests/sav/base_isa3.res
tests/sav/base_isa_cast2_alt1.res
tests/sav/base_isa_cast2_alt2.res
tests/sav/base_isa_cast2_alt3.res
tests/sav/base_isa_cast2_alt4.res
tests/sav/base_isa_cast2_alt5.res
tests/sav/base_isa_cast2_alt6.res
tests/sav/base_isa_cast2_alt7.res
tests/sav/base_isa_cast3_alt1.res
tests/sav/base_isa_cast3_alt2.res
tests/sav/base_isa_cast3_alt3.res
tests/sav/base_isa_cast3_alt4.res
tests/sav/base_isa_cast3_alt5.res
tests/sav/base_isa_cast3_alt6.res
tests/sav/base_isa_cast3_alt7.res
tests/sav/base_isa_cast3_alt8.res
tests/sav/base_isa_cast3_alt9.res
tests/sav/base_isa_cast4_alt1.res
tests/sav/base_isa_cast4_alt2.res
tests/sav/base_isa_cast4_alt3.res
tests/sav/base_isa_cast4_alt4.res
tests/sav/base_isa_cast_alt1.res
tests/sav/base_isa_cast_alt2.res
tests/sav/base_isa_cast_alt3.res
tests/sav/base_isa_cast_alt4.res
tests/sav/base_isa_cast_alt7.res
tests/sav/base_isa_cast_self_alt1.res
tests/sav/base_isa_cast_self_alt2.res
tests/sav/base_isa_cast_self_alt3.res
tests/sav/base_isa_cast_self_alt4.res
tests/sav/base_isa_gen1.res
tests/sav/base_isa_gen2.res
tests/sav/base_isa_gen3.res
tests/sav/base_isa_gen4.res
tests/sav/base_isa_gen5.res
tests/sav/base_isa_gen8.res
tests/sav/base_isa_nil.res
tests/sav/base_isa_nullable1.res
tests/sav/base_isa_nullable2.res
tests/sav/base_isa_vt_gen1.res
tests/sav/base_iterator3.res
tests/sav/base_label_do_alt2.res
tests/sav/base_label_do_alt3.res
tests/sav/base_label_do_alt6.res
tests/sav/base_label_for_alt2.res
tests/sav/base_label_for_alt3.res
tests/sav/base_label_for_alt6.res
tests/sav/base_label_loop_alt2.res
tests/sav/base_label_loop_alt3.res
tests/sav/base_label_loop_alt6.res
tests/sav/base_label_while2_alt6.res
tests/sav/base_label_while2_alt7.res
tests/sav/base_label_while_alt2.res
tests/sav/base_label_while_alt3.res
tests/sav/base_label_while_alt6.res
tests/sav/base_meth_call_alt1.res
tests/sav/base_meth_call_alt2.res
tests/sav/base_meth_call_alt3.res
tests/sav/base_meth_call_alt4.res
tests/sav/base_new_alt1.res
tests/sav/base_new_alt2.res
tests/sav/base_new_alt3.res
tests/sav/base_new_alt4.res
tests/sav/base_new_alt5.res
tests/sav/base_new_alt6.res
tests/sav/base_new_alt7.res
tests/sav/base_new_alt8.res
tests/sav/base_new_intern.res [new file with mode: 0644]
tests/sav/base_no_object.res
tests/sav/base_no_object_alt1.res
tests/sav/base_notnull.res [new file with mode: 0644]
tests/sav/base_notnull_1alt1.res [new file with mode: 0644]
tests/sav/base_notnull_1alt1_alt1.res [new file with mode: 0644]
tests/sav/base_notnull_1alt1_alt2.res [new file with mode: 0644]
tests/sav/base_notnull_1alt1_alt3.res [new file with mode: 0644]
tests/sav/base_notnull_1alt1_alt4.res [new file with mode: 0644]
tests/sav/base_notnull_alt1.res [new file with mode: 0644]
tests/sav/base_notnull_alt2.res [new file with mode: 0644]
tests/sav/base_notnull_alt3.res [new file with mode: 0644]
tests/sav/base_notnull_alt4.res [new file with mode: 0644]
tests/sav/base_notnull_lit.res [new file with mode: 0644]
tests/sav/base_notnull_lit_alt1.res [new file with mode: 0644]
tests/sav/base_notnull_lit_alt2.res [new file with mode: 0644]
tests/sav/base_null.res
tests/sav/base_nullable_alt1.res
tests/sav/base_nullable_alt10.res
tests/sav/base_nullable_alt2.res
tests/sav/base_nullable_alt3.res
tests/sav/base_nullable_alt4.res
tests/sav/base_nullable_alt5.res
tests/sav/base_nullable_alt6.res
tests/sav/base_nullable_alt7.res
tests/sav/base_nullable_alt8.res
tests/sav/base_nullable_alt9.res
tests/sav/base_orelse_alt1.res
tests/sav/base_orelse_alt2.res
tests/sav/base_prot2_alt1.res
tests/sav/base_prot2_alt2.res
tests/sav/base_prot2_alt3.res
tests/sav/base_prot2_alt4.res
tests/sav/base_prot3_alt1.res
tests/sav/base_prot3_alt2.res
tests/sav/base_prot3_alt3.res
tests/sav/base_prot3_alt4.res
tests/sav/base_prot3_alt5.res
tests/sav/base_prot3_alt6.res
tests/sav/base_prot3_alt7.res
tests/sav/base_prot3_alt8.res
tests/sav/base_prot3_alt9.res
tests/sav/base_prot_sig2_alt1.res
tests/sav/base_prot_sig2_alt2.res
tests/sav/base_prot_sig2_alt3.res
tests/sav/base_prot_sig2_alt4.res
tests/sav/base_prot_sig2_alt5.res
tests/sav/base_prot_sig2_alt6.res
tests/sav/base_prot_sig_alt1.res
tests/sav/base_prot_sig_alt2.res
tests/sav/base_prot_sig_alt3.res
tests/sav/base_prot_sig_alt4.res
tests/sav/base_prot_sig_alt5.res
tests/sav/base_prot_sig_alt6.res
tests/sav/base_prot_sig_alt7.res
tests/sav/base_prot_sig_vt_alt1.res
tests/sav/base_prot_sig_vt_alt2.res
tests/sav/base_prot_sig_vt_alt3.res
tests/sav/base_prot_sig_vt_alt4.res
tests/sav/base_prot_sig_vt_alt5.res
tests/sav/base_prot_sig_vt_alt6.res
tests/sav/base_prot_sig_vt_alt7.res
tests/sav/base_prot_sig_vt_alt8.res
tests/sav/base_range_alt1.res
tests/sav/base_range_alt2.res
tests/sav/base_self_type_alt1.res
tests/sav/base_self_type_alt3.res
tests/sav/base_sig_inh_alt1.res
tests/sav/base_upcast2.res
tests/sav/base_upcast2_1alt1_alt10.res
tests/sav/base_upcast2_1alt1_alt2.res
tests/sav/base_upcast2_1alt1_alt7.res
tests/sav/base_upcast2_1alt1_alt8.res
tests/sav/base_upcast2_1alt1_alt9.res
tests/sav/base_upcast2_1alt2_alt1.res
tests/sav/base_upcast2_1alt2_alt10.res
tests/sav/base_upcast2_1alt2_alt3.res
tests/sav/base_upcast2_1alt2_alt4.res
tests/sav/base_upcast2_1alt2_alt5.res
tests/sav/base_upcast2_1alt2_alt6.res
tests/sav/base_upcast2_1alt2_alt8.res
tests/sav/base_upcast2_1alt2_alt9.res
tests/sav/base_upcast2_1alt3_alt1.res
tests/sav/base_upcast2_1alt3_alt10.res
tests/sav/base_upcast2_1alt3_alt2.res
tests/sav/base_upcast2_1alt3_alt4.res
tests/sav/base_upcast2_1alt3_alt5.res
tests/sav/base_upcast2_1alt3_alt7.res
tests/sav/base_upcast2_1alt3_alt9.res
tests/sav/base_upcast2_1alt4_alt1.res
tests/sav/base_upcast2_1alt4_alt10.res
tests/sav/base_upcast2_1alt4_alt2.res
tests/sav/base_upcast2_1alt4_alt3.res
tests/sav/base_upcast2_1alt4_alt7.res
tests/sav/base_upcast2_1alt4_alt8.res
tests/sav/base_upcast2_1alt5_alt1.res
tests/sav/base_upcast2_1alt5_alt2.res
tests/sav/base_upcast2_1alt5_alt3.res
tests/sav/base_upcast2_1alt5_alt4.res
tests/sav/base_upcast2_1alt5_alt7.res
tests/sav/base_upcast2_1alt5_alt8.res
tests/sav/base_upcast2_alt1.res
tests/sav/base_upcast2_alt10.res
tests/sav/base_upcast2_alt2.res
tests/sav/base_upcast2_alt3.res
tests/sav/base_upcast2_alt4.res
tests/sav/base_upcast2_alt5.res
tests/sav/base_upcast2_alt6.res
tests/sav/base_upcast2_alt7.res
tests/sav/base_upcast2_alt8.res
tests/sav/base_upcast2_alt9.res
tests/sav/base_upcast_alt1.res
tests/sav/base_user_annotation3.res
tests/sav/base_user_annotation4.res
tests/sav/base_var2_alt1.res
tests/sav/base_var2_alt2.res
tests/sav/base_var2_alt3.res
tests/sav/base_var2_alt4.res
tests/sav/base_var2_alt5.res
tests/sav/base_var2_alt6.res
tests/sav/base_var2_alt7.res
tests/sav/base_var2_alt8.res
tests/sav/base_var2_alt9.res
tests/sav/base_var_alt1.res
tests/sav/base_var_alt2.res
tests/sav/base_var_alt3.res
tests/sav/base_var_alt4.res
tests/sav/base_var_alt5.res
tests/sav/base_var_alt6.res
tests/sav/base_var_alt7.res
tests/sav/base_var_alt8.res
tests/sav/base_var_assignment_flow_alt1.res
tests/sav/base_var_assignment_flow_alt2.res
tests/sav/base_var_assignment_flow_alt3.res
tests/sav/base_var_assignment_flow_alt4.res
tests/sav/base_var_assignment_flow_alt5.res
tests/sav/base_var_assignment_flow_alt6.res
tests/sav/base_var_null2_1alt3_alt1.res
tests/sav/base_var_null_alt1.res
tests/sav/base_var_null_alt10.res
tests/sav/base_var_null_alt11.res
tests/sav/base_var_null_alt12.res
tests/sav/base_var_null_alt2.res
tests/sav/base_var_null_alt3.res
tests/sav/base_var_null_alt4.res
tests/sav/base_var_null_alt5.res
tests/sav/base_var_null_alt6.res
tests/sav/base_var_null_alt7.res
tests/sav/base_var_null_alt8.res
tests/sav/base_var_null_alt9.res
tests/sav/base_var_type_evolution_alt1.res
tests/sav/base_var_type_evolution_alt2.res
tests/sav/base_var_type_evolution_alt3.res
tests/sav/base_var_type_evolution_alt4.res
tests/sav/base_var_type_evolution_alt5.res
tests/sav/base_var_type_evolution_alt6.res
tests/sav/base_var_type_evolution_alt7.res
tests/sav/base_var_type_evolution_null2_alt1.res
tests/sav/base_var_type_evolution_null2_alt2.res
tests/sav/base_var_type_evolution_null3.res
tests/sav/base_var_type_evolution_null3_alt1.res
tests/sav/base_var_type_evolution_null4_alt1.res
tests/sav/base_var_type_evolution_null4_alt2.res
tests/sav/base_var_type_evolution_null4_alt3.res
tests/sav/base_var_type_evolution_null4_alt4.res
tests/sav/base_var_type_evolution_null_alt2.res
tests/sav/base_var_type_evolution_null_alt4.res
tests/sav/base_var_type_evolution_null_alt5.res
tests/sav/base_var_type_evolution_null_alt6.res
tests/sav/base_var_type_evolution_null_alt7.res
tests/sav/base_var_untyped_alt1.res
tests/sav/base_var_untyped_alt3.res
tests/sav/base_var_untyped_alt4.res
tests/sav/base_var_untyped_alt5.res
tests/sav/base_var_untyped_alt6.res
tests/sav/base_var_untyped_alt7.res
tests/sav/base_var_untyped_alt8.res
tests/sav/base_vararg3_alt1.res
tests/sav/base_vararg3_alt2.res
tests/sav/base_vararg3_alt3.res
tests/sav/base_vararg3_alt4.res
tests/sav/base_vararg_alt1.res
tests/sav/base_vararg_alt2.res
tests/sav/base_vararg_alt3.res
tests/sav/base_vararg_alt4.res
tests/sav/base_vararg_alt5.res
tests/sav/base_vararg_alt6.res
tests/sav/base_vararg_alt7.res
tests/sav/base_vararg_alt8.res
tests/sav/base_virtual_int2_alt1.res
tests/sav/base_virtual_int2_alt3.res
tests/sav/base_virtual_type2_alt1.res
tests/sav/base_virtual_type3_alt1.res
tests/sav/base_virtual_type4_alt1.res
tests/sav/base_virtual_type5_alt1.res
tests/sav/base_virtual_type5_alt2.res
tests/sav/base_virtual_type7.res
tests/sav/base_virtual_type_alt1.res
tests/sav/base_virtual_type_alt2.res
tests/sav/base_virtual_type_alt3.res
tests/sav/base_virtual_type_check_alt1.res
tests/sav/base_virtual_type_check_alt2.res
tests/sav/base_virtual_type_check_alt3.res
tests/sav/base_virtual_type_check_alt4.res
tests/sav/base_virtual_type_check_alt5.res
tests/sav/base_virtual_type_check_alt6.res
tests/sav/base_virtual_type_check_alt7.res
tests/sav/base_virtual_type_check_alt9.res
tests/sav/base_virtual_type_fixed_alt1.res
tests/sav/base_virtual_type_redef_alt1.res
tests/sav/base_virtual_type_redef_alt2.res
tests/sav/base_virtual_type_self.res
tests/sav/base_virtual_type_self_alt1.res
tests/sav/base_virtual_type_self_alt2.res
tests/sav/base_virtual_type_self_alt3.res
tests/sav/base_virtual_type_self_alt4.res
tests/sav/base_virtual_type_self_alt5.res
tests/sav/base_with.res [new file with mode: 0644]
tests/sav/base_with_alt1.res [new file with mode: 0644]
tests/sav/bench_421.res
tests/sav/bench_add_all.res
tests/sav/bench_complex_sort.res [new file with mode: 0644]
tests/sav/bench_fib.res
tests/sav/bench_int_range_iterator.res
tests/sav/bench_netsim.res
tests/sav/bench_nsieve_bool.res
tests/sav/bench_send.res [new file with mode: 0644]
tests/sav/bench_send2.res [new file with mode: 0644]
tests/sav/bench_strfib.res [new file with mode: 0644]
tests/sav/bench_string_append.res
tests/sav/bench_string_append_alt1.res
tests/sav/bench_string_super.res
tests/sav/bench_string_tos.res
tests/sav/error_annot_c_compiler_alt1.res
tests/sav/error_annot_c_compiler_alt2.res
tests/sav/error_annot_c_compiler_alt3.res
tests/sav/error_annot_c_compiler_alt4.res
tests/sav/error_annot_c_compiler_alt5.res
tests/sav/error_annot_c_compiler_alt6.res
tests/sav/error_annot_pkgconfig_alt0.res
tests/sav/error_annot_pkgconfig_alt1.res
tests/sav/error_annot_pkgconfig_alt2.res
tests/sav/error_annot_pkgconfig_alt3.res
tests/sav/error_attr_2def.res
tests/sav/error_attr_assign.res
tests/sav/error_attr_unk.res
tests/sav/error_class_generic.res
tests/sav/error_class_generic_alt1.res
tests/sav/error_class_generic_alt2.res
tests/sav/error_class_generic_alt3.res
tests/sav/error_class_generic_alt4.res
tests/sav/error_class_generic_alt5.res
tests/sav/error_class_generic_alt6.res
tests/sav/error_class_glob.res
tests/sav/error_cons_arity.res
tests/sav/error_cons_arity2.res
tests/sav/error_constraint.res
tests/sav/error_decl_type_var.res
tests/sav/error_defs2_alt1.res
tests/sav/error_defs2_alt2.res
tests/sav/error_defs_alt1.res
tests/sav/error_defs_alt2.res
tests/sav/error_defs_alt3.res
tests/sav/error_defs_alt4.res
tests/sav/error_defs_alt5.res
tests/sav/error_defs_alt6.res
tests/sav/error_defs_alt7.res
tests/sav/error_defs_alt8.res
tests/sav/error_defs_alt9.res
tests/sav/error_defs_init_1alt1_alt1.res
tests/sav/error_defs_init_1alt1_alt2.res
tests/sav/error_defs_init_1alt2_alt1.res
tests/sav/error_defs_init_1alt2_alt2.res
tests/sav/error_defs_init_1alt3_alt3.res
tests/sav/error_defs_init_1alt3_alt4.res
tests/sav/error_defs_init_1alt4_alt3.res
tests/sav/error_defs_init_1alt4_alt4.res
tests/sav/error_defs_init_1alt5_alt5.res
tests/sav/error_defs_init_1alt5_alt6.res
tests/sav/error_defs_init_1alt5_alt7.res
tests/sav/error_defs_init_1alt6_alt5.res
tests/sav/error_defs_init_1alt6_alt6.res
tests/sav/error_defs_init_1alt6_alt7.res
tests/sav/error_defs_init_1alt7_alt5.res
tests/sav/error_defs_init_1alt7_alt6.res
tests/sav/error_defs_init_1alt7_alt7.res
tests/sav/error_expr_not_ok.res
tests/sav/error_expr_not_ok_alt1.res
tests/sav/error_expr_not_ok_alt2.res
tests/sav/error_expr_not_ok_alt3.res
tests/sav/error_expr_not_ok_alt4.res
tests/sav/error_expr_not_ok_alt5.res
tests/sav/error_expr_not_ok_alt6.res
tests/sav/error_for_coll.res
tests/sav/error_formal.res
tests/sav/error_formal_name.res
tests/sav/error_fun_ret.res
tests/sav/error_fun_ret2.res
tests/sav/error_fun_ret3.res
tests/sav/error_fun_ret4.res
tests/sav/error_fun_ret5.res
tests/sav/error_gen_f_inh_clash.res
tests/sav/error_if_bool.res
tests/sav/error_inh_clash.res
tests/sav/error_inh_clash2.res
tests/sav/error_inh_clash3.res
tests/sav/error_inh_clash4.res
tests/sav/error_inh_loop.res
tests/sav/error_init_auto.res
tests/sav/error_init_auto_alt1.res
tests/sav/error_init_auto_alt2.res
tests/sav/error_init_auto_alt3.res
tests/sav/error_init_auto_alt4.res
tests/sav/error_intern.res
tests/sav/error_kern_attr_any.res
tests/sav/error_kern_attr_int.res
tests/sav/error_left_bool.res
tests/sav/error_loop_bool_while.res
tests/sav/error_meth_2def.res
tests/sav/error_meth_2def2.res
tests/sav/error_meth_create.res
tests/sav/error_meth_unk1.res
tests/sav/error_meth_unk2.res
tests/sav/error_mod_unk.res
tests/sav/error_needed_method_alt1.res
tests/sav/error_needed_method_alt2.res
tests/sav/error_needed_method_alt3.res
tests/sav/error_needed_method_alt4.res
tests/sav/error_needed_method_alt6.res
tests/sav/error_needed_method_alt7.res
tests/sav/error_needed_types_alt8.res
tests/sav/error_operators.res [new file with mode: 0644]
tests/sav/error_parser_oneline_bad_char.res
tests/sav/error_parser_oneline_bad_char_empty.res
tests/sav/error_parser_oneline_bad_char_full.res
tests/sav/error_parser_oneline_bad_char_noeol.res
tests/sav/error_parser_oneline_bad_string.res
tests/sav/error_parser_oneline_bad_string_noeol.res
tests/sav/error_parser_oneline_char.res
tests/sav/error_parser_oneline_char_noeol.res
tests/sav/error_parser_oneline_string.res
tests/sav/error_parser_oneline_string_noeol.res
tests/sav/error_parser_oneline_string_start.res
tests/sav/error_parser_oneline_string_start_noeol.res
tests/sav/error_prop_loc_alt1.res
tests/sav/error_prop_name_alt1.res
tests/sav/error_prop_name_alt2.res
tests/sav/error_prop_name_alt3.res
tests/sav/error_prop_name_alt4.res
tests/sav/error_redef2_1alt1_alt1.res
tests/sav/error_redef2_1alt1_alt2.res
tests/sav/error_redef2_1alt1_alt3.res
tests/sav/error_redef2_1alt1_alt4.res
tests/sav/error_redef2_1alt1_alt5.res
tests/sav/error_redef2_1alt1_alt6.res
tests/sav/error_redef2_1alt1_alt7.res
tests/sav/error_redef2_1alt1_alt8.res
tests/sav/error_redef2_1alt1_alt9.res
tests/sav/error_redef2_1alt2_alt1.res
tests/sav/error_redef2_1alt2_alt2.res
tests/sav/error_redef2_1alt2_alt3.res
tests/sav/error_redef2_1alt2_alt4.res
tests/sav/error_redef2_1alt2_alt5.res
tests/sav/error_redef2_1alt2_alt6.res
tests/sav/error_redef2_1alt2_alt7.res
tests/sav/error_redef2_1alt2_alt8.res
tests/sav/error_redef2_1alt2_alt9.res
tests/sav/error_redef2_1alt3_alt1.res
tests/sav/error_redef2_1alt3_alt2.res
tests/sav/error_redef2_1alt3_alt3.res
tests/sav/error_redef2_1alt3_alt4.res
tests/sav/error_redef2_1alt3_alt5.res
tests/sav/error_redef2_1alt3_alt6.res
tests/sav/error_redef2_1alt3_alt7.res
tests/sav/error_redef2_1alt3_alt8.res
tests/sav/error_redef2_1alt3_alt9.res
tests/sav/error_redef2_1alt4_alt1.res
tests/sav/error_redef2_1alt4_alt2.res
tests/sav/error_redef2_1alt4_alt3.res
tests/sav/error_redef2_1alt4_alt4.res
tests/sav/error_redef2_1alt4_alt5.res
tests/sav/error_redef2_1alt4_alt6.res
tests/sav/error_redef2_1alt4_alt7.res
tests/sav/error_redef2_1alt4_alt8.res
tests/sav/error_redef2_1alt4_alt9.res
tests/sav/error_redef2_alt3.res
tests/sav/error_redef2_alt4.res
tests/sav/error_redef2_alt5.res
tests/sav/error_redef2_alt6.res
tests/sav/error_redef2_alt9.res
tests/sav/error_redef3.res
tests/sav/error_redef4.res
tests/sav/error_redef_1alt1_alt2.res
tests/sav/error_redef_1alt1_alt3.res
tests/sav/error_redef_1alt1_alt4.res
tests/sav/error_redef_1alt1_alt5.res
tests/sav/error_redef_1alt1_alt6.res
tests/sav/error_redef_1alt1_alt7.res
tests/sav/error_redef_1alt1_alt8.res
tests/sav/error_redef_1alt1_alt9.res
tests/sav/error_redef_1alt2_alt1.res
tests/sav/error_redef_1alt2_alt4.res
tests/sav/error_redef_1alt2_alt5.res
tests/sav/error_redef_1alt2_alt6.res
tests/sav/error_redef_1alt2_alt7.res
tests/sav/error_redef_1alt2_alt8.res
tests/sav/error_redef_1alt2_alt9.res
tests/sav/error_redef_1alt3_alt1.res
tests/sav/error_redef_1alt3_alt2.res
tests/sav/error_redef_1alt3_alt3.res
tests/sav/error_redef_1alt3_alt5.res
tests/sav/error_redef_1alt3_alt6.res
tests/sav/error_redef_1alt3_alt8.res
tests/sav/error_redef_1alt3_alt9.res
tests/sav/error_redef_1alt4_alt1.res
tests/sav/error_redef_1alt4_alt2.res
tests/sav/error_redef_1alt4_alt3.res
tests/sav/error_redef_1alt4_alt4.res
tests/sav/error_redef_1alt4_alt7.res
tests/sav/error_redef_alt1.res
tests/sav/error_redef_alt2.res
tests/sav/error_redef_alt3.res
tests/sav/error_redef_alt4.res
tests/sav/error_redef_alt5.res
tests/sav/error_redef_alt6.res
tests/sav/error_redef_alt7.res
tests/sav/error_redef_alt8.res
tests/sav/error_redef_alt9.res
tests/sav/error_redef_class.res
tests/sav/error_ref_attr.res
tests/sav/error_ref_fun.res
tests/sav/error_ref_param.res
tests/sav/error_ref_proc.res
tests/sav/error_ref_ret.res
tests/sav/error_req_loop0.res
tests/sav/error_req_loop1.res
tests/sav/error_req_loop2.res
tests/sav/error_ret_fun.res
tests/sav/error_ret_proc.res
tests/sav/error_ret_type.res
tests/sav/error_right_bool.res
tests/sav/error_signature.res
tests/sav/error_spe_attr.res
tests/sav/error_spe_fun.res
tests/sav/error_spe_param.res
tests/sav/error_spe_param2.res
tests/sav/error_spe_proc.res
tests/sav/error_spe_ret.res
tests/sav/error_star_type.res
tests/sav/error_super_none.res
tests/sav/error_superclass_superfluous_alt1.res
tests/sav/error_superclass_superfluous_alt2.res
tests/sav/error_superclass_superfluous_alt3.res
tests/sav/error_superclass_superfluous_alt4.res
tests/sav/error_superclass_superfluous_alt5.res
tests/sav/error_syntax.res
tests/sav/error_syntax2.res
tests/sav/error_syntax3.res
tests/sav/error_syntax_alt1.res
tests/sav/error_toplevel_alt1.res
tests/sav/error_toplevel_alt2.res
tests/sav/error_toplevel_alt3.res
tests/sav/error_toplevel_alt4.res
tests/sav/error_toplevel_alt5.res
tests/sav/error_type_not_ok.res
tests/sav/error_type_not_ok2.res
tests/sav/error_type_not_ok2_alt1.res
tests/sav/error_type_not_ok3.res
tests/sav/error_type_not_ok3_alt1.res
tests/sav/error_type_not_ok4.res
tests/sav/error_type_not_ok4_alt1.res
tests/sav/error_type_not_ok5.res
tests/sav/error_type_not_ok5_alt1.res
tests/sav/error_type_not_ok_alt1.res
tests/sav/error_type_unk.res
tests/sav/error_type_unk_alt1.res
tests/sav/error_type_unk_alt2.res
tests/sav/error_type_unk_alt3.res
tests/sav/error_type_unk_alt4.res
tests/sav/error_type_unk_alt5.res
tests/sav/error_type_unk_alt6.res
tests/sav/error_type_unk_alt7.res
tests/sav/error_unk_class.res
tests/sav/error_var_args.res
tests/sav/error_var_args2.res
tests/sav/error_var_args3.res
tests/sav/error_var_args4.res
tests/sav/error_var_assign.res
tests/sav/error_virtual_type2.res [new file with mode: 0644]
tests/sav/error_virtual_type2_alt1.res [new file with mode: 0644]
tests/sav/error_virtual_type2_alt2.res [new file with mode: 0644]
tests/sav/error_virtual_type2_alt3.res [new file with mode: 0644]
tests/sav/error_virtual_type2_alt4.res [new file with mode: 0644]
tests/sav/error_virtual_type2_alt5.res [new file with mode: 0644]
tests/sav/error_virtual_type2_alt6.res [new file with mode: 0644]
tests/sav/error_virtual_type_alt1.res [new file with mode: 0644]
tests/sav/error_virtual_type_alt2.res [new file with mode: 0644]
tests/sav/error_virtual_type_alt3.res [new file with mode: 0644]
tests/sav/error_virtual_type_alt4.res [new file with mode: 0644]
tests/sav/error_virtual_type_alt5.res [new file with mode: 0644]
tests/sav/error_visibility_protected_alt9.res
tests/sav/fixme/base_gen_f.res
tests/sav/fixme/base_isa_cast4_alt5.res
tests/sav/fixme/test_paire.res
tests/sav/hello_ios.res [new file with mode: 0644]
tests/sav/nitg-common/fixme/base_with_alt1.res [new file with mode: 0644]
tests/sav/nitg-e/base_autocast_array_alt2.res [new file with mode: 0644]
tests/sav/nitg-e/base_isa_gen1.res
tests/sav/nitg-e/base_isa_gen4.res
tests/sav/nitg-e/base_isa_gen5.res
tests/sav/nitg-e/base_isa_nullable1.res
tests/sav/nitg-e/base_isa_nullable2.res
tests/sav/nitg-e/base_notnull_lit.res [new file with mode: 0644]
tests/sav/nitg-e/error_needed_method_alt4.res [deleted file]
tests/sav/nitg-e/fixme/base_gen_reassign_alt4.res
tests/sav/nitg-e/fixme/base_gen_reassign_alt5.res
tests/sav/nitg-e/fixme/base_gen_reassign_alt6.res
tests/sav/nitg-e/test_deserialization.res
tests/sav/nitg-e/test_deserialization_serial.res
tests/sav/nitg-e/test_meta.res [new file with mode: 0644]
tests/sav/nitg-g/fixme/base_gen_infinite.res
tests/sav/nitg-g/fixme/test_meta.res [moved from tests/sav/nitg-sg/fixme/test_gen.res with 100% similarity]
tests/sav/nitg-s/fixme/base_gen_infinite.res
tests/sav/nitg-s/fixme/test_meta.res [new file with mode: 0644]
tests/sav/nitg-sg/fixme/base_gen_infinite.res
tests/sav/nitg-sg/fixme/test_meta.res [new file with mode: 0644]
tests/sav/niti/error_needed_method_alt4.res
tests/sav/nitlight_args1.res
tests/sav/nitmetrics_args1.res
tests/sav/nitserial_args1.res
tests/sav/nituml_args3.res
tests/sav/nituml_args4.res
tests/sav/nitunit_args1.res
tests/sav/nitunit_args4.res
tests/sav/nitunit_args5.res
tests/sav/nitunit_args6.res [new file with mode: 0644]
tests/sav/nitunit_args7.res [new file with mode: 0644]
tests/sav/nitx_args2.res
tests/sav/nitx_args3.res
tests/sav/perlin_noise.res [new file with mode: 0644]
tests/sav/syntax_annotations.res
tests/sav/syntax_annotations2.res
tests/sav/syntax_annotations3.res
tests/sav/test_annot_pkgconfig_alt1.res
tests/sav/test_annot_pkgconfig_alt2.res
tests/sav/test_attr_easy.res
tests/sav/test_combined_assignment_alt1.res
tests/sav/test_deriving.res [new file with mode: 0644]
tests/sav/test_deriving_alt1.res [new file with mode: 0644]
tests/sav/test_deriving_alt2.res [new file with mode: 0644]
tests/sav/test_deriving_alt3.res [new file with mode: 0644]
tests/sav/test_deriving_alt4.res [new file with mode: 0644]
tests/sav/test_deserialization.res
tests/sav/test_docdown_args2.res
tests/sav/test_ffi_c_operators.res
tests/sav/test_ffi_c_polymorphism_alt1.res
tests/sav/test_ffi_c_polymorphism_alt2.res
tests/sav/test_gen_inh.res
tests/sav/test_hash.res
tests/sav/test_isa.res
tests/sav/test_map.res
tests/sav/test_mem.res
tests/sav/test_meta.res [new file with mode: 0644]
tests/sav/test_multiconstraint.res
tests/sav/test_multiconstraint_inh.res
tests/sav/test_multiconstraint_ref.res
tests/sav/test_multiconstraint_ref2.res
tests/sav/test_new_native_alt1.res
tests/sav/test_parser.res
tests/sav/test_parser_args1.res
tests/sav/test_parser_args2.res
tests/sav/test_parser_args3.res
tests/sav/test_parser_args5.res
tests/sav/test_parser_args6.res
tests/sav/test_parser_args7.res
tests/sav/test_phase_args2.res
tests/sav/test_platform_ios.res [new file with mode: 0644]
tests/sav/test_string_triple4_alt1.res
tests/sav/test_super_gen.res
tests/sav/test_super_gen_raf.res
tests/sav/test_super_param2.res
tests/sav/test_superstring_alt1.res
tests/sav/test_toolcontext_args1.res
tests/sav/test_toolcontext_args2.res
tests/sav/test_variance_attr.res
tests/sav/threaded_example.res [new file with mode: 0644]
tests/sav/xymus_net.res
tests/test_deriving.nit [new file with mode: 0644]
tests/test_ffi_c_callbacks.nit
tests/test_ffi_c_more_callbacks.nit
tests/test_ffi_c_operators.nit
tests/test_ffi_objc_types_and_callbacks.nit
tests/test_map.nit
tests/test_mem.nit
tests/test_meta.nit [new file with mode: 0644]
tests/test_nitunit3/README.md [new file with mode: 0644]
tests/test_nitunit3/test_nitunit3.nit [new file with mode: 0644]
tests/test_nitunit_md.md [new file with mode: 0644]
tests/test_platform_ios.nit [new file with mode: 0644]
tests/test_prog/platform/platform.nit
tests/testosx.sh [new file with mode: 0755]
tests/tests.sh

diff --git a/VERSION b/VERSION
index 2c0a9c7..3d105a6 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-v0.7.2
+v0.7.3
index 442f7bd..ae91703 100755 (executable)
@@ -43,7 +43,10 @@ function run_compiler()
 {
        local title=$1
        shift
-       if test -n "$fast"; then
+       if test "$fast" = truetrue; then
+               run_command "$@" ../examples/hello_world.nit -o "hello.$title.bin"
+               bench_command "hello" "hello_world" "./hello.$title.bin"
+       elif test -n "$fast"; then
                run_command "$@" ../src/nitc.nit -o "nitc.$title.bin"
                bench_command "nitc-g" "nitc --global ../src/test_parser.nit" "./nitc.$title.bin" -v --global --no-cc ../src/test_parser.nit
                run_command "$@" ../src/nit.nit -o "nit.$title.bin"
@@ -59,6 +62,7 @@ function run_compiler()
                run_command "$@" ../src/nit.nit -o "nit.$title.bin"
                bench_command "nit-queens" "nit queens.nit 8" "./nit.$title.bin" ../lib/ai/examples/queens.nit -q 8
                bench_command "nit-nitcc" "nit nitcc.nit calc.sablecc" "./nit.$title.bin" ../contrib/nitcc/src/nitcc.nit ../contrib/nitcc/examples/calc.sablecc
+               rm calc* 2> /dev/null # remove generated cruft
                run_command "$@" ../src/nitdoc.nit -o "nitdoc.$title.bin"
                rm -r out 2> /dev/null
                mkdir out 2> /dev/null
@@ -77,7 +81,7 @@ function run_compiler()
                bench_command "nitmd" "markdown" "./nitmd.$title.bin" markdown/benches/out/mixed.md 80
        fi
 
-       rm -r *.bin .nit_compile out
+       rm -r *.bin .nit_compile out 2> /dev/null
 }
 
 ## HANDLE OPTIONS ##
@@ -100,7 +104,7 @@ while [ "$stop" = false ]; do
                -h) usage; exit;;
                -n) count="$2"; shift; shift;;
                --dry) dry_run=true; shift;;
-               --fast) fast=true; shift;;
+               --fast) fast=true$fast; shift;;
                --html) html="index.html"; echo >"$html" "<html><head></head><body>"; shift;;
                *) stop=true
        esac
@@ -155,109 +159,70 @@ function bench_steps()
 }
 bench_steps
 
-# $#: options to compare
-function bench_nitc-g_options()
+# Simple script to compare various options on nitc
+#
+# usage: *name* *common* [NOALL] *options*...
+#
+# * *name*, the name of the bench
+# * *common*, options to use on each case
+# * NOALL, optional flag to avoid a last case including all additional options
+# * *options*, sequences of options, one for each case
+#
+# Example: `bench_nitc_options "foo" "-a -b" -c "-d -e"` generates 4 cases:
+#
+# * only *common*: `nitc -a -b`
+# * *common* and first *options*: `nitc -a -b -c`
+# * *common* and second *options*: `nitc -a -b -d -e`
+# * all: *common* and all *options*: `nitc -a -b -c -d -e`
+function bench_nitc_options()
 {
        tag=$1
        shift
-       name="$FUNCNAME-$tag"
+       common=$1
+       shift
+       name="$FUNCNAME-$tag$common"
+       name=${name// /}
        skip_test "$name" && return
-       prepare_res "$name.dat" "no options" "nitc-g without options"
-       run_compiler "nitc-g" ./nitc --global
+       prepare_res "$name.dat" "no options" "nitc $common without more options"
+       run_compiler "nitc-$name" ./nitc $common
 
        if test "$1" = NOALL; then
+               withall=
                shift
-       elif test -n "$2"; then
-               prepare_res "$name-all.dat" "all" "nitc-g with all options $@"
-               run_compiler "nitc-g-$tag" ./nitc --global $@
+       else
+               withall=true
        fi
 
        for opt in "$@"; do
-               ot=${opt// /+}
+               ot=${opt// /}
                prepare_res "$name$ot.dat" "$opt" "nitc-g with option $opt"
-               run_compiler "nitc-g$ot" ./nitc --global $opt
+               run_compiler "nitc-$name" ./nitc $common $opt
        done
 
-       plot "$name.gnu"
-}
-bench_nitc-g_options "slower" --hardening --no-shortcut-range
-bench_nitc-g_options "nocheck" --no-check-null --no-check-autocast --no-check-attr-isset --no-check-covariance --no-check-assert
-
-function bench_nitc-s_options()
-{
-       tag=$1
-       shift
-       name="$FUNCNAME-$tag"
-       skip_test "$name" && return
-       prepare_res "$name.dat" "no options" "nitc-s without options"
-       run_compiler "nitc-s" ./nitc --separate
-
-       if test "$1" = NOALL; then
-               shift
-       elif test -n "$2"; then
-               prepare_res "$name-all.dat" "all" "nitc-s with all options $@"
-               run_compiler "nitc-s-$tag" ./nitc --separate $@
+       if test -n "$2" -a -n "$withall"; then
+               prepare_res "$name-all.dat" "all" "nitc-g with all options $@"
+               run_compiler "nitc-$name" ./nitc $common $@
        fi
 
-       for opt in "$@"; do
-               ot=${opt// /+}
-               prepare_res "$name-$ot.dat" "$opt" "nitc-s with option $opt"
-               run_compiler "nitc-s$ot" ./nitc --separate $opt
-       done
-
        plot "$name.gnu"
 }
-bench_nitc-s_options "slower" --hardening --no-shortcut-equal --no-union-attribute --no-shortcut-range --no-inline-intern "--no-gcc-directive likely --no-gcc-directive noreturn"
-bench_nitc-s_options "nocheck" --no-check-null --no-check-autocast --no-check-attr-isset --no-check-covariance --no-check-assert
-bench_nitc-s_options "faster" --skip-dead-methods --inline-coloring-numbers --inline-some-methods --direct-call-monomorph "--inline-some-methods --direct-call-monomorph" ""
 
-function bench_nitc-e_options()
-{
-       tag=$1
-       shift
-       name="$FUNCNAME-$tag"
-       skip_test "$name" && return
-       prepare_res "$name.dat" "no options" "nitc-e without options"
-       run_compiler "nitc-e" ./nitc --erasure
+bench_nitc_options "slower" --global --hardening --no-shortcut-range
+bench_nitc_options "nocheck" --global --no-check-null --no-check-autocast --no-check-attr-isset --no-check-covariance --no-check-assert
 
-       if test "$1" = NOALL; then
-               shift
-       elif test -n "$2"; then
-               prepare_res "$name-all.dat" "all" "nitc-e with all options $@"
-               run_compiler "nitc-e-$tag" ./nitc --erasure $@
-       fi
+bench_nitc_options "slower" --separate --hardening --no-shortcut-equal --no-union-attribute --no-shortcut-range --no-inline-intern "--no-gcc-directive likely --no-gcc-directive noreturn" "--no-tag-primitives"
+bench_nitc_options "nocheck" --separate --no-check-null --no-check-autocast --no-check-attr-isset --no-check-covariance --no-check-assert
+bench_nitc_options "faster" --separate --skip-dead-methods --inline-coloring-numbers --inline-some-methods --direct-call-monomorph "--inline-some-methods --direct-call-monomorph"
 
-       for opt in "$@"; do
-               ot=${opt// /+}
-               prepare_res "$name$ot.dat" "$opt" "nitc-e with option $opt"
-               run_compiler "nitc-e$ot" ./nitc --erasure $opt
-       done
+bench_nitc_options "slower" --erasure --hardening --no-shortcut-equal --no-union-attribute --no-shortcut-range --no-inline-intern
+bench_nitc_options "nocheck" --erasure --no-check-null --no-check-autocast --no-check-attr-isset --no-check-covariance --no-check-assert --no-check-erasure-cast
+bench_nitc_options "faster" --erasure --skip-dead-methods --inline-coloring-numbers --inline-some-methods --direct-call-monomorph --rta
 
-       plot "$name.gnu"
-}
-bench_nitc-e_options "slower" --hardening --no-shortcut-equal --no-union-attribute --no-shortcut-range --no-inline-intern
-bench_nitc-e_options "nocheck" --no-check-null --no-check-autocast --no-check-attr-isset --no-check-covariance --no-check-assert --no-check-erasure-cast
-bench_nitc-e_options "faster" --skip-dead-methods --inline-coloring-numbers --inline-some-methods --direct-call-monomorph --rta
-
-function bench_engines()
-{
-       name="$FUNCNAME"
-       skip_test "$name" && return
-       prepare_res "$name-nitc-s.dat" "nitc-s" "nitc with --separate"
-       run_compiler "nitc-s" ./nitc --separate
-       prepare_res "$name-nitc-e.dat" "nitc-e" "nitc with --erasure"
-       run_compiler "nitc-e" ./nitc --erasure
-       prepare_res "$name-nitc-sg.dat" "nitc-sg" "nitc with --separate --semi-global"
-       run_compiler "nitc-sg" ./nitc --separate --semi-global
-       prepare_res "$name-nitc-eg.dat" "nitc-eg" "nitc with --erasure --semi-global"
-       run_compiler "nitc-eg" ./nitc --erasure --semi-global
-       prepare_res "$name-nitc-egt.dat" "nitc-egt" "nitc with --erasure --semi-global --rta"
-       run_compiler "nitc-egt" ./nitc --erasure --semi-global --rta
-       prepare_res "$name-nitc-g.dat" "nitc-g" "nitc with --global"
-       run_compiler "nitc-g" ./nitc --global
-       plot "$name.gnu"
-}
-bench_engines
+bench_nitc_options "engine" "" NOALL "--separate" "--erasure" "--separate --semi-global" "--erasure --semi-global" "--erasure --semi-global --rta" "--global"
+bench_nitc_options "policy" "" NOALL "--separate" "--erasure" "--separate --no-check-covariance" "--erasure --no-check-covariance --no-check-erasure-cast"
+bench_nitc_options "nullables" "" "--no-check-attr-isset" "--no-union-attribute"
+bench_nitc_options "linkboost" "" NOALL --trampoline-call --colors-are-symbols "--colors-are-symbols --trampoline-call" "--separate --link-boost" "--separate --colors-are-symbols --guard-call" "--separate --colors-are-symbols --direct-call-monomorph0"
+bench_nitc_options "monomorph" "" --direct-call-monomorph0 --direct-call-monomorph
 
 function bench_nitc-e_gc()
 {
@@ -287,38 +252,6 @@ function bench_cc_nitc-e()
 }
 bench_cc_nitc-e
 
-function bench_policy()
-{
-       name="$FUNCNAME"
-       skip_test "$name" && return
-       prepare_res "$name-nitc-s.dat" "nitc-s" "nitc with --separate"
-       run_compiler "nitc-s" ./nitc --separate
-       prepare_res "$name-nitc-e.dat" "nitc-e" "nitc with --erasure"
-       run_compiler "nitc-e" ./nitc --erasure
-       prepare_res "$name-nitc-su.dat" "nitc-su" "nitc with --separate --no-check-covariance"
-       run_compiler "nitc-su" ./nitc --separate --no-check-covariance
-       prepare_res "$name-nitc-eu.dat" "nitc-eu" "nitc with --erasure --no-check-covariance --no-check-erasure-cast"
-       run_compiler "nitc-eu" ./nitc --erasure --no-check-covariance --no-check-erasure-cast
-       plot "$name.gnu"
-}
-bench_policy
-
-function bench_nullables()
-{
-       name="$FUNCNAME"
-       skip_test "$name" && return
-       prepare_res "$name-nitc.dat" "nitc" "nitc no options"
-       run_compiler "nitc" ./nitc --separate
-       prepare_res "$name-nitc-ni.dat" "nitc-ni" "nitc --no-check-attr-isset"
-       run_compiler "nitc" ./nitc --separate --no-check-attr-isset
-       prepare_res "$name-nitc-nu.dat" "nitc-nu" "nitc --no-union-attribute"
-       run_compiler "nitc" ./nitc --separate --no-union-attribute
-       prepare_res "$name-nitc-nu-ni.dat" "nitc-nu-ni" "nitc --no-union-attribute --no-check-attr-isset"
-       run_compiler "nitc" ./nitc --separate --no-union-attribute --no-check-attr-isset
-       plot "$name.gnu"
-}
-bench_nullables
-
 function bench_compilation_time
 {
        name="$FUNCNAME"
@@ -339,44 +272,6 @@ function bench_compilation_time
 }
 bench_compilation_time
 
-function bench_linkboost()
-{
-       name="$FUNCNAME"
-       skip_test "$name" && return
-       prepare_res "$name-nitc-st.dat" "nitc-st" "nitc with --separate --trampoline-call"
-       run_compiler "nitc-st" ./nitc --separate --trampoline-call
-       prepare_res "$name-nitc-s.dat" "nitc-s" "nitc with --separate"
-       run_compiler "nitc-s" ./nitc --separate
-       prepare_res "$name-nitc-sc.dat" "nitc-sc" "nitc with --separate --colors-are-symbols"
-       run_compiler "nitc-sc" ./nitc --separate --colors-are-symbols
-       prepare_res "$name-nitc-sct.dat" "nitc-sct" "nitc with --separate --colors-are-symbols --trampoline-call"
-       run_compiler "nitc-sct" ./nitc --separate --colors-are-symbols --trampoline-call
-       prepare_res "$name-nitc-sl.dat" "nitc-sl" "nitc with --separate --link-boost"
-       run_compiler "nitc-scts" ./nitc --separate --link-boost
-       prepare_res "$name-nitc-scgc.dat" "nitc-scgc" "nitc with --separate --colors-are-symbols --guard-call"
-       run_compiler "nitc-scgc" ./nitc --separate --colors-are-symbols --guard-call
-       prepare_res "$name-nitc-scd.dat" "nitc-scd" "nitc with --separate --colors-are-symbols --direct-call-monomorph0"
-       run_compiler "nitc-scd" ./nitc --separate --colors-are-symbols --direct-call-monomorph0
-       plot "$name.gnu"
-}
-bench_linkboost
-
-function bench_call_monomorph()
-{
-       name="$FUNCNAME"
-       skip_test "$name" && return
-       prepare_res "$name-nitc.dat" "nitc" "nitc with --separate"
-       run_compiler "nitc" ./nitc
-       prepare_res "$name-nitc-d0.dat" "nitc-d0" "nitc with --separate --direct-call-monomorph0"
-       run_compiler "nitc-d0" ./nitc --direct-call-monomorph0
-       prepare_res "$name-nitc-d1.dat" "nitc-d" "nitc with --separate --direct-call-monomorph"
-       run_compiler "nitc-d1" ./nitc --direct-call-monomorph
-       prepare_res "$name-nitc-d2.dat" "nitc-d2" "nitc with --separate --direct-call-monomorph2"
-       run_compiler "nitc-d2" ./nitc --direct-call-monomorph --direct-call-monomorph0
-       plot "$name.gnu"
-}
-bench_call_monomorph
-
 if test -n "$html"; then
        echo >>"$html" "</body></html>"
 fi
diff --git a/benchmarks/markdown/.gitignore b/benchmarks/markdown/.gitignore
new file mode 100644 (file)
index 0000000..ada48ff
--- /dev/null
@@ -0,0 +1,15 @@
+benches/gen_benches
+benches/out/
+
+engines/nitmd/nitmd
+engines/nitmd/nitmd-o
+
+engines/markdown4j/Markdown4j.class
+engines/markdown4j/markdown4j-2.2.jar
+
+engines/pandoc/pandoc
+engines/pandoc/pandoc.hi
+engines/pandoc/pandoc.o
+
+engines/txtmark/Txtmark.class
+engines/txtmark/txtmark-0.11.jar
diff --git a/benchmarks/markdown/Makefile b/benchmarks/markdown/Makefile
new file mode 100644 (file)
index 0000000..802fab6
--- /dev/null
@@ -0,0 +1,21 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+all:
+       ./bench_markdown.sh all
+
+clean:
+       $(MAKE) clean -C benches
+       $(MAKE) clean -C engines
+       rm -rf out/
index a739cd8..29219c5 100644 (file)
@@ -11,6 +11,7 @@ Benches markdown parsers.
 * nitmd
 * txtmark 0.11 (https://github.com/rjeschke/txtmark)
 * markdown4j 2.2 (https://code.google.com/p/markdown4j/)
+* pandoc (last version installed from `cabal`)
 
 ## Benches
 
index 4cb0f15..aaa34f0 100755 (executable)
@@ -74,7 +74,7 @@ engdir="./engines"
 bncdir="./benches/out"
 mkdir -p $outdir
 
-s=50
+s=200
 
 function bench_nitmd()
 {
@@ -88,6 +88,18 @@ function bench_nitmd()
 }
 bench_nitmd
 
+function bench_nitmd-o()
+{
+       name="$FUNCNAME"
+       skip_test "$name" && return
+       prepare_res $outdir/nitmd-o.dat "nitmd-o" "nitmd-o"
+       for file in $bncdir/*.md; do
+               bench=`basename $file .md`
+               bench_command "$bench" "" "$engdir/nitmd/nitmd-o" "$file" "$s"
+       done
+}
+bench_nitmd-o
+
 function bench_txtmark()
 {
        name="$FUNCNAME"
@@ -112,6 +124,18 @@ function bench_markdown4j()
 }
 bench_markdown4j
 
+function bench_pandoc()
+{
+       name="$FUNCNAME"
+       skip_test "$name" && return
+       prepare_res $outdir/pandoc.dat "pandoc" "pandoc"
+       for file in $bncdir/*.md; do
+               name=`basename $file .md`
+               bench_command "$bench" "" "$engdir/pandoc/pandoc" "$file" "$s"
+       done
+}
+bench_pandoc
+
 if test "$#" -gt 0; then
     plot $outdir/bench_markdown.gnu
 fi
index 641c47e..4cb8c36 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+NITC=../../../bin/nitc
+
 all: out
 
 gen_benches:
-       nitc gen_benches.nit
+       $(NITC) gen_benches.nit
 
 out: gen_benches
        ./gen_benches ./plain.md -o ./out
index 588e744..7301d01 100644 (file)
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-all: nitmd/nitmd txtmark/Txtmark.class markdown4j/Markdown4j.class
+all: nitmd/nitmd txtmark/Txtmark.class markdown4j/Markdown4j.class pandoc/pandoc
 
 nitmd/nitmd:
        make -C nitmd
@@ -25,7 +25,11 @@ txtmark/Txtmark.class:
 markdown4j/Markdown4j.class:
        make -C markdown4j
 
+pandoc/pandoc:
+       make -C pandoc
+
 clean:
        make -C nitmd clean
        make -C txtmark clean
        make -C markdown4j clean
+       make -C pandoc clean
index aa79fbc..256ddfe 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+NITC=../../../../bin/nitc
+
+all: nitmd nitmd-o
+
 nitmd:
-       nitc nitmd.nit
+       $(NITC) nitmd.nit
+
+nitmd-o:
+       $(NITC) --semi-global nitmd.nit -o $@
 
-test: nitmd
+test: all
        ./nitmd ../../benches/hello.md 5
+       ./nitmd-o ../../benches/hello.md 5
 
 clean:
-       rm -rf nitmd
+       rm -rf nitmd nitmd-o
diff --git a/benchmarks/markdown/engines/pandoc/Makefile b/benchmarks/markdown/engines/pandoc/Makefile
new file mode 100644 (file)
index 0000000..ca4a354
--- /dev/null
@@ -0,0 +1,27 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+pandoc:
+       cabal install pandoc
+       ghc pandoc.hs -O
+
+test: pandoc
+       ./pandoc ../../benches/hello.md 5
+
+clean:
+       rm pandoc.hi
+       rm pandoc.o
+       rm pandoc
diff --git a/benchmarks/markdown/engines/pandoc/pandoc.hs b/benchmarks/markdown/engines/pandoc/pandoc.hs
new file mode 100644 (file)
index 0000000..5c5db42
--- /dev/null
@@ -0,0 +1,33 @@
+module Main where
+
+       import System.Environment (getArgs)
+       import Text.Pandoc
+
+       -- Reads a String and parses it as a Pandoc instance
+       readDoc :: String -> Pandoc
+       readDoc = readMarkdown def
+
+       -- Writes a Pandoc instances as a String
+       writeDoc :: Pandoc -> String
+       writeDoc = writeHtmlString def
+
+       -- Reads markdown, writes HTML and prints it in stdout
+       doBench :: String -> IO ()
+       doBench fileName        = do
+               content                 <- readFile fileName
+               let markdown    = readDoc content
+               let html                =  writeDoc markdown
+               print html
+
+       -- Executes `doBench` n times
+       loop :: Int -> String -> IO ()
+       loop 0 _ = return ()
+       loop n fileName = do
+               doBench fileName
+               loop (n  - 1) fileName
+               return ()
+
+       main :: IO ()
+       main = do
+               (fileName:count:_)      <- getArgs
+               loop (read count::Int) fileName
diff --git a/benchmarks/strings/.gitignore b/benchmarks/strings/.gitignore
new file mode 100644 (file)
index 0000000..0e224dc
--- /dev/null
@@ -0,0 +1,4 @@
+arraytos/
+string_concat/
+string_iter/
+string_substr/
diff --git a/benchmarks/strings/Makefile b/benchmarks/strings/Makefile
new file mode 100644 (file)
index 0000000..a6d89bf
--- /dev/null
@@ -0,0 +1,16 @@
+all:   concat iter substr array
+
+concat:
+       ./bench_strings.sh cct 10 10000000 1
+
+substr:
+       ./bench_strings.sh substr 10 10000000 10
+
+iter:
+       ./bench_strings.sh iter 10 10000000 10
+
+array:
+       ./bench_strings.sh array 10 10000000 10
+
+clean:
+       rm -rf arraytos/ string_concat/ string_iter/ string_substr/ 2>/dev/null
diff --git a/benchmarks/strings/README.md b/benchmarks/strings/README.md
new file mode 100644 (file)
index 0000000..b87b981
--- /dev/null
@@ -0,0 +1,41 @@
+# Strings
+
+Strings are a building block of programming.
+Since they are that necessary, we must keep them as performing as possible.
+
+This series of benchmarks works on different structures for handling strings on the most common operations done on them.
+
+## Structures
+
+Some more structures are susceptible to be added as the project advances.
+At the moment, what is available consists of
+
+* Flat strings
+* Flat buffers
+* Rope strings
+* Rope buffers
+
+A String is defined as an immutable string.
+A Buffer is defined as a mutable string.
+
+Flat strings are arrays of characters, the most basic implementation of a string.
+Ropes are a tree-like structure where strings are bound through concatenation nodes.
+
+## Tests
+
+`concat`: Benches the concatenation speed of strings and buffers.
+
+`iter`: Benches the time of iteration of a string, through iterators or indexed access
+
+`substr`: Benches the time required to produce a substring.
+
+`arraytos`: Special bench, it measures the speed of `Array::to_s` through the use of various strategies.
+
+## Usage
+
+To pass a series of benches you can use the `make` command to bench all the aforementioned tests with default values.
+
+Each bench will be executed 5 times and the mean time will be represented in the final graph.
+
+The alternative is to use `bench_strings.sh` with custom arguments to it.
+For more information on the arguments and the format, execute it with the -h option for help.
index d61b742..f18ece7 100644 (file)
@@ -13,6 +13,9 @@
 # To be used as a Mixin at compile-time for benchmarking purposes.
 module array_to_s_buffer
 
+intrude import standard::collection::array
+import standard::string
+
 redef class Array[E]
        redef fun to_s: String do
                var s = new FlatBuffer
index 0240d5b..7028e3f 100644 (file)
 # To be used as a Mixin at compile-time for benchmarking purposes.
 module array_to_s_flatstr
 
+intrude import standard::string
+
+redef class FlatString
+       redef fun +(o) do
+               var mlen = length
+               var slen = o.length
+               var nns = new NativeString(mlen + slen)
+               items.copy_to(nns, mlen, index_from, 0)
+               if o isa FlatString then
+                       o.items.copy_to(nns, slen, o.index_from, mlen)
+               else
+                       var pos = mlen
+                       for i in o.chars do
+                               nns[pos] = i
+                               pos += 1
+                       end
+               end
+               return nns.to_s_with_length(mlen)
+       end
+end
+
 redef class Array[E]
 
        redef fun to_s do
index ec81322..c5dbd00 100644 (file)
@@ -13,9 +13,8 @@
 # To be used as a Mixin at compile-time for benchmarking purposes.
 module array_to_s_man_buf
 
-redef class NativeArray[E]
-       new(length: Int) is intern
-end
+intrude import standard::collection::array
+import standard::string
 
 redef class Array[E]
        redef fun to_s: String do
index c162dff..9f86a8a 100644 (file)
 # To be used as a Mixin at compile-time for benchmarking purposes.
 module array_to_s_rope
 
+intrude import standard::collection::array
+intrude import standard::ropes
+
 redef class Array[E]
 
        redef fun to_s do
-               var i = 1
                var l = length
+               var it = _items
                if l == 0 then return ""
-               var s: String = new RopeString.from(self[0].to_s)
-               var its = _items
-               while i < l do
-                       var e = its[i]
-                       if e != null then s += e.to_s
-                       i += 1
+               if l == 1 then return it[0].to_s
+               var c = new Concat(it[0].to_s, it[1].to_s)
+               for i in [2 .. l[ do
+                       c = new Concat(c, it[i].to_s)
                end
-               return s
+               return c
        end
+
 end
diff --git a/benchmarks/strings/array_to_s_vars/array_to_s_rope_buf.nit b/benchmarks/strings/array_to_s_vars/array_to_s_rope_buf.nit
new file mode 100644 (file)
index 0000000..c7e3e7b
--- /dev/null
@@ -0,0 +1,32 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# This file is free software, which comes along with NIT.  This software is
+# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
+# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
+# is kept unaltered, and a notification of the changes is added.
+# You  are  allowed  to  redistribute it and sell it, alone or is a part of
+# another product.
+
+# Implementation of Array::to_s with RopeBuffer exclusively
+#
+# To be used as a Mixin at compile-time for benchmarking purposes.
+module array_to_s_rope_buf
+
+intrude import standard::collection::array
+import standard::ropes
+
+redef class Array[E]
+       redef fun to_s: String do
+               var s = new RopeBuffer
+               var i = 0
+               var l = length
+               var its = _items
+               while i < l do
+                       var e = its[i]
+                       if e != null then s.append(e.to_s)
+                       i += 1
+               end
+               return s.to_s
+       end
+end
similarity index 53%
rename from benchmarks/bench_strings.sh
rename to benchmarks/strings/bench_strings.sh
index 16992e9..a710dc0 100755 (executable)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-source ./bench_common.sh
-source ./bench_plot.sh
+source ../bench_common.sh
+source ../bench_plot.sh
 
 # Default number of times a command must be run with bench_command
 # Can be overrided with 'the option -n'
-count=2
+count=5
 
 function usage()
 {
@@ -28,8 +28,6 @@ function usage()
        echo "  -h: this help"
        echo ""
        echo "Benches : "
-       echo "  all : all benches"
-       echo "    - usage : * max_nb_cct loops strlen"
        echo "  iter: bench iterations"
        echo "    - usage : iter max_nb_cct loops strlen"
        echo "  cct: concatenation benching"
@@ -40,21 +38,20 @@ function usage()
        echo "    - usage : array nb_cct loops max_arrlen"
 }
 
-function benches()
-{
-       bench_concat $@;
-       bench_iteration $@;
-       bench_substr $@;
-       bench_array $@;
-}
-
 function bench_array()
 {
+       if [ -d arraytos ]; then
+               rm arraytos/*
+       else
+               mkdir arraytos
+       fi
+       cd arraytos
+
        if $verbose; then
                echo "*** Benching Array.to_s performance ***"
        fi
 
-       ../bin/nitc --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_flatstr.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../array_tos.nit -m ../array_to_s_vars/array_to_s_rope.nit
 
        prepare_res arr_tos_ropes.out arr_tos_ropes ropes
        if $verbose; then
@@ -64,23 +61,10 @@ function bench_array()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $1, Loops = $2"
                fi
-               bench_command $i ropes$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+               bench_command $i ropes$i ./array_tos --loops $2 --strlen $i --ccts $1
        done
 
-       ../bin/nitc --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_flatstr.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
-       prepare_res arr_tos_buf_ropes.out arr_tos_buf_ropes buffered_ropes
-       if $verbose; then
-               echo "Buffered Ropes :"
-       fi
-       for i in `seq 1 "$3"`; do
-               if $verbose; then
-                       echo "String length = $i, Concats/loop = $1, Loops = $2"
-               fi
-               bench_command $i buf_ropes$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
-       done
-
-       ../bin/nitc --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_flatstr.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../array_tos.nit -m ../array_to_s_vars/array_to_s_flatstr.nit
 
        prepare_res arr_tos_flat.out arr_tos_flat flatstring
        if $verbose; then
@@ -90,10 +74,10 @@ function bench_array()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $1, Loops = $2"
                fi
-               bench_command $i flatstring$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+               bench_command $i flatstring$i ./array_tos --loops $2 --strlen $i --ccts $1
        done
 
-       ../bin/nitc --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_buffer.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../array_tos.nit -m ../array_to_s_vars/array_to_s_buffer.nit
 
        prepare_res arr_tos_buf.out arr_tos_buf flatbuffer
        if $verbose; then
@@ -103,10 +87,10 @@ function bench_array()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $1, Loops = $2"
                fi
-               bench_command $i flatbuffer$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+               bench_command $i flatbuffer$i ./array_tos --loops $2 --strlen $i --ccts $1
        done
 
-       ../bin/nitc --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_manual.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../array_tos.nit -m ../array_to_s_vars/array_to_s_manual.nit
 
        prepare_res arr_tos_man.out arr_tos_man memmove
        if $verbose; then
@@ -116,10 +100,10 @@ function bench_array()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $1, Loops = $2"
                fi
-               bench_command $i memmove$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+               bench_command $i memmove$i ./array_tos --loops $2 --strlen $i --ccts $1
        done
 
-       ../bin/nitc --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_man_buf.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../array_tos.nit -m ../array_to_s_vars/array_to_s_man_buf.nit
 
        prepare_res arr_tos_man_buf.out arr_tos_man_buf flatbuf_with_capacity
        if $verbose; then
@@ -129,10 +113,10 @@ function bench_array()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $1, Loops = $2"
                fi
-               bench_command $i flatbuf_with_capacity$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+               bench_command $i flatbuf_with_capacity$i ./array_tos --loops $2 --strlen $i --ccts $1
        done
 
-       ../bin/nitc --global ./strings/array_tos.nit -m ./strings/array_to_s_vars/array_to_s_rope_buf.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../array_tos.nit -m ../array_to_s_vars/array_to_s_rope_buf.nit
 
        prepare_res arr_tos_rope_buf.out arr_tos_rope_buf ropebuf
        if $verbose; then
@@ -142,16 +126,24 @@ function bench_array()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $1, Loops = $2"
                fi
-               bench_command $i ropebuf$i ./array_tos --loops $2 --strlen $i --ccts $1 "NIT_GC_CHOOSER=large"
+               bench_command $i ropebuf$i ./array_tos --loops $2 --strlen $i --ccts $1
        done
 
        plot array_tos.gnu
+
+       cd ..
 }
 
 function bench_concat()
 {
-       ../bin/nitc --global ./strings/chain_concat.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-       ../bin/nitc --global ./strings/utf_chain_concat.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       if [ -d string_concat ]; then
+               rm string_concat/*
+       else
+               mkdir string_concat
+       fi
+       cd string_concat
+
+       ../../../bin/nitc --global ../chain_concat.nit
 
        if $verbose; then
                echo "*** Benching concat performance ***"
@@ -165,7 +157,7 @@ function bench_concat()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $2, Loops = $3"
                fi
-               bench_command $i flatstring$i ./chain_concat -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatstring$i ./chain_concat -m flatstr --loops $2 --strlen $3 --ccts $i
        done
 
        prepare_res concat_buf.out concat_buf flatbuffer
@@ -176,22 +168,9 @@ function bench_concat()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $2, Loops = $3"
                fi
-               bench_command $i flatbuffer$i ./chain_concat -m flatbuf --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatbuffer$i ./chain_concat -m flatbuf --loops $2 --strlen $3 --ccts $i
        done
 
-       prepare_res concat_flatstr_utf8_noindex.out concat_flatstr_utf8_noindex flatstring_utf8_noindex
-       if $verbose; then
-               echo "FlatString UTF-8 (without index) :"
-       fi
-       for i in `seq 1 "$1"`; do
-               if $verbose; then
-                       echo "String length = $i, Concats/loop = $2, Loops = $3"
-               fi
-               bench_command $i flatstr_utf8_noindex$i ./utf_chain_concat -m flatstr_utf8_noindex --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
-       done
-
-       ../bin/nitc --global ./strings/chain_concat.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
        prepare_res concat_ropes.out concat_ropes ropes
        if $verbose; then
                echo "Ropes :"
@@ -200,46 +179,39 @@ function bench_concat()
                if $verbose; then
                        echo "String length = $i, Concats/loop = $2, Loops = $3"
                fi
-               bench_command $i ropes$i ./chain_concat -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i ropes$i ./chain_concat -m ropestr --loops $2 --strlen $3 --ccts $i
        done
 
-       ../bin/nitc --global ./strings/chain_concat.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
        prepare_res concat_buf_ropes.out concat_buf_ropes buffered_ropes
        if $verbose; then
-               echo "buffered ropes :"
-       fi
-       for i in `seq 1 "$1"`; do
-               if $verbose; then
-                       echo "string length = $i, concats/loop = $2, loops = $3"
-               fi
-               bench_command $i buf_ropes$i ./chain_concat -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
-       done
-
-       ../bin/nitc --global ./strings/chain_cct_ropebuf.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
-       prepare_res cct_buf_ropes.out cct_buf_ropes cctbuf_ropes
-       if $verbose; then
-               echo "buffered ropes :"
+               echo "Rope Buffer:"
        fi
        for i in `seq 1 "$1"`; do
                if $verbose; then
                        echo "string length = $i, concats/loop = $2, loops = $3"
                fi
-               bench_command $i cctbuf_ropes$i ./chain_cct_ropebuf --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i buf_ropes$i ./chain_concat -m ropebuf --loops $2 --strlen $3 --ccts $i
        done
 
        plot concat.gnu
+
+       cd ..
 }
 
 function bench_iteration()
 {
+       if [ -d string_iter ]; then
+               rm string_iter/*
+       else
+               mkdir string_iter
+       fi
+       cd string_iter
+
        if $verbose; then
                echo "*** Benching iteration performance ***"
        fi
 
-       ../bin/nitc --global ./strings/iteration_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-       ../bin/nitc --global ./strings/utf_iteration_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../iteration_bench.nit
 
        prepare_res iter_flat_iter.out iter_flat_iter flatstring_iter
        if $verbose; then
@@ -249,7 +221,7 @@ function bench_iteration()
                if $verbose; then
                        echo "String base length = $1, Concats = $i, Loops = $3"
                fi
-               bench_command $i flatstr_iter$i ./iteration_bench -m flatstr --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatstr_iter$i ./iteration_bench -m flatstr --iter-mode iterator --loops $2 --strlen $3 --ccts $i
        done
 
        prepare_res iter_flat_index.out iter_flat_index flatstring_index
@@ -260,7 +232,7 @@ function bench_iteration()
                if $verbose; then
                        echo "String base length = $1, Concats = $i, Loops = $3"
                fi
-               bench_command $i flatstr_index$i ./iteration_bench -m flatstr --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatstr_index$i ./iteration_bench -m flatstr --iter-mode index --loops $2 --strlen $3 --ccts $i
        done
 
        prepare_res iter_buf_iter.out iter_buf_iter flatbuffer_iter
@@ -271,7 +243,7 @@ function bench_iteration()
                if $verbose; then
                        echo "String base length = $1, Concats = $i, Loops = $3"
                fi
-               bench_command $i flatbuf_iter$i ./iteration_bench -m flatbuf --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatbuf_iter$i ./iteration_bench -m flatbuf --iter-mode iterator --loops $2 --strlen $3 --ccts $i
        done
 
        prepare_res iter_buf_index.out iter_buf_index flatbuffer_index
@@ -282,33 +254,9 @@ function bench_iteration()
                if $verbose; then
                        echo "String base length = $1, Concats = $i, Loops = $3"
                fi
-               bench_command $i flatbuf_index$i ./iteration_bench -m flatbuf --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatbuf_index$i ./iteration_bench -m flatbuf --iter-mode index --loops $2 --strlen $3 --ccts $i
        done
 
-       prepare_res iter_flat_utf8_noindex_iter.out iter_flat_iter_utf8_noindex flatstring_utf8_noindex_iter
-       if $verbose; then
-               echo "FlatStrings by iterator :"
-       fi
-       for i in `seq 1 "$1"`; do
-               if $verbose; then
-                       echo "String base length = $1, Concats = $i, Loops = $3"
-               fi
-               bench_command $i flatstr_iter_utf8_noindex$i ./utf_iteration_bench -m flatstr_utf8_noindex --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
-       done
-
-       prepare_res iter_flat_utf8_noindex_index.out iter_flat_index_utf8_noindex flatstring_utf8_noindex_index
-       if $verbose; then
-               echo "FlatStrings by index :"
-       fi
-       for i in `seq 1 "$1"`; do
-               if $verbose; then
-                       echo "String base length = $1, Concats = $i, Loops = $3"
-               fi
-               bench_command $i flatstr_index_utf8_noindex$i ./utf_iteration_bench -m flatstr_utf8_noindex --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
-       done
-
-       ../bin/nitc --global ./strings/iteration_bench.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
        prepare_res iter_ropes_iter.out iter_ropes_iter ropes_iter
        if $verbose; then
                echo "Ropes by iterator :"
@@ -317,7 +265,7 @@ function bench_iteration()
                if $verbose; then
                        echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
                fi
-               bench_command $i ropes_iter$i ./iteration_bench -m flatstr --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i ropes_iter$i ./iteration_bench -m ropestr --iter-mode iterator --loops $2 --strlen $3 --ccts $i
        done
 
        prepare_res iter_ropes_index.out iter_ropes_index ropes_index
@@ -328,44 +276,50 @@ function bench_iteration()
                if $verbose; then
                        echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
                fi
-               bench_command $i ropes_index$i ./iteration_bench -m flatstr --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i ropes_index$i ./iteration_bench -m ropestr --iter-mode index --loops $2 --strlen $3 --ccts $i
        done
 
-       ../bin/nitc --global ./strings/iteration_bench.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
        prepare_res iter_buf_ropes_iter.out iter_buf_ropes_iter buf_ropes_iter
        if $verbose; then
-               echo "Buffered Ropes by iterator :"
+               echo "RopeBuffer by iterator :"
        fi
        for i in `seq 1 "$1"`; do
                if $verbose; then
                        echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
                fi
-               bench_command $i buf_ropes_iter$i ./iteration_bench -m flatstr --iter-mode iterator --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i buf_ropes_iter$i ./iteration_bench -m ropebuf --iter-mode iterator --loops $2 --strlen $3 --ccts $i
        done
 
        prepare_res iter_buf_ropes_index.out iter_buf_ropes_index buf_ropes_index
        if $verbose; then
-               echo "Buffered Ropes by index :"
+               echo "RopeBuffer by index :"
        fi
        for i in `seq 1 "$1"`; do
                if $verbose; then
                        echo "String base length = $1, Concats (depth of the rope) = $i, Loops = $3"
                fi
-               bench_command $i buf_ropes_index$i ./iteration_bench -m flatstr --iter-mode index --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i buf_ropes_index$i ./iteration_bench -m ropebuf --iter-mode index --loops $2 --strlen $3 --ccts $i
        done
 
        plot iter.gnu
+
+       cd ..
 }
 
 function bench_substr()
 {
+       if [ -d string_substr ]; then
+               rm string_substr/*
+       else
+               mkdir string_substr
+       fi
+       cd string_substr
+
        if $verbose; then
                echo "*** Benching substring performance ***"
        fi
 
-       ../bin/nitc --global ./strings/substr_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-       ../bin/nitc --global ./strings/utf_substr_bench.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
+       ../../../bin/nitc --global ../substr_bench.nit
 
        prepare_res substr_flat.out substr_flat flatstring
        if $verbose; then
@@ -375,7 +329,7 @@ function bench_substr()
                if $verbose; then
                        echo "String length = $i, loops = $2, Loops = $3"
                fi
-               bench_command $i flatstring$i ./substr_bench -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatstring$i ./substr_bench -m flatstr --loops $2 --strlen $3 --ccts $i
        done
 
        prepare_res substr_buf.out substr_buf flatbuffer
@@ -386,22 +340,9 @@ function bench_substr()
                if $verbose; then
                        echo "String length = $i, loops = $2, Loops = $3"
                fi
-               bench_command $i flatbuffer$i ./substr_bench -m flatbuf --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
-       done
-
-       prepare_res substr_flat_utf8_noindex.out substr_flat_utf8_noindex flatstring_utf8_noindex
-       if $verbose; then
-               echo "FlatStrings UTF-8 (without index) :"
-       fi
-       for i in `seq 1 "$1"`; do
-               if $verbose; then
-                       echo "String length = $i, loops = $2, Loops = $3"
-               fi
-               bench_command $i flatstring_utf8_noindex$i ./utf_substr_bench -m flatstr_utf8_noindex --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i flatbuffer$i ./substr_bench -m flatbuf --loops $2 --strlen $3 --ccts $i
        done
 
-       ../bin/nitc --global ./strings/substr_bench.nit -m ../lib/standard/ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
        prepare_res substr_ropes.out substr_ropes ropes
        if $verbose; then
                echo "Ropes :"
@@ -410,22 +351,23 @@ function bench_substr()
                if $verbose; then
                        echo "String length = $i, loops = $2, Loops = $3"
                fi
-               bench_command $i ropes$i ./substr_bench -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i ropes$i ./substr_bench -m ropestr --loops $2 --strlen $3 --ccts $i
        done
 
-       ../bin/nitc --global ./strings/substr_bench.nit -m ../lib/standard/ropes.nit -m ../lib/buffered_ropes.nit --make-flags "CFLAGS=\"-g -O2 -DNOBOEHM\""
-
        prepare_res substr_buf_ropes.out substr_buf_ropes buf_ropes
        if $verbose; then
-               echo "Buffered Ropes :"
+               echo "RopeBuffers :"
        fi
        for i in `seq 1 "$1"`; do
                if $verbose; then
                        echo "String length = $i, loops = $2, Loops = $3"
                fi
-               bench_command $i buf_ropes$i ./substr_bench -m flatstr --loops $2 --strlen $3 --ccts $i "NIT_GC_CHOOSER=large"
+               bench_command $i buf_ropes$i ./substr_bench -m ropebuf --loops $2 --strlen $3 --ccts $i
        done
+
        plot substr.gnu
+
+       cd ..
 }
 
 stop=false
@@ -448,6 +390,5 @@ case "$1" in
        cct) shift; bench_concat $@ ;;
        substr) shift; bench_substr $@ ;;
        array) shift; bench_array $@ ;;
-       all) shift; benches $@ ;;
        *) usage; exit;;
 esac
index a45075f..a70dd14 100644 (file)
 # Benches measuring the performance of several concatenations on Text variants
 module chain_concat
 
+intrude import standard::ropes
 import opts
 
+redef class FlatString
+       redef fun +(o) do
+               var mlen = length
+               var slen = o.length
+               var nlen = mlen + slen
+               var ns = new NativeString(nlen + 1)
+               items.copy_to(ns, mlen, index_from, 0)
+               if o isa FlatString then
+                       o.items.copy_to(ns, slen, o.index_from, 0)
+               else
+                       var pos = mlen
+                       for i in o.chars do
+                               ns[pos] = i
+                               pos += 1
+                       end
+               end
+               return ns.to_s_with_length(nlen)
+       end
+end
+
 fun bench_flatstr(str_size: Int, nb_ccts: Int, loops: Int)
 do
        var lft = "a" * str_size
 
-       for i in [0..loops] do
-               var str: String = lft
-               for j in [0..nb_ccts] do
+       for i in [0 .. loops[ do
+               var str: String = ""
+               for j in [0 .. nb_ccts[ do
                        str += lft
                end
        end
 end
 
+fun bench_ropestr(str_size, nb_ccts, loops: Int) do
+       var lft = "a" * str_size
+
+       for i in [0 .. loops[ do
+               var str: String = ""
+               for j in [0 .. nb_ccts[ do
+                       str = new Concat(str, lft)
+               end
+       end
+end
+
 fun bench_flatbuf(str_size: Int, nb_ccts: Int, loops: Int)
 do
        var lft = "a" * str_size
 
-       for i in [0..loops] do
-               var buf = new FlatBuffer.from(lft)
-               for j in [0..nb_ccts] do
+       for i in [0 .. loops[ do
+               var buf = new FlatBuffer
+               for j in [0 .. nb_ccts[ do
+                       buf.append(lft)
+               end
+       end
+end
+
+fun bench_ropebuf(str_size: Int, nb_ccts: Int, loops: Int)
+do
+       var lft = "a" * str_size
+
+       for i in [0 .. loops[ do
+               var buf = new RopeBuffer
+               for j in [0 .. nb_ccts[ do
                        buf.append(lft)
                end
-               buf.to_s
        end
 end
 
 var opts = new OptionContext
-var mode = new OptionEnum(["flatstr", "flatbuf"], "Mode", -1, "-m")
+var mode = new OptionEnum(["flatstr", "ropestr", "flatbuf", "ropebuf"], "Mode", -1, "-m")
 var nb_ccts = new OptionInt("Number of concatenations per loop", -1, "--ccts")
 var loops = new OptionInt("Number of loops to be done", -1, "--loops")
 var strlen = new OptionInt("Length of the base string", -1, "--strlen")
@@ -57,7 +100,12 @@ var modval = mode.value
 if modval == 0 then
        bench_flatstr(strlen.value, nb_ccts.value, loops.value)
 else if modval == 1 then
+       bench_ropestr(strlen.value, nb_ccts.value, loops.value)
+else if modval == 2 then
        bench_flatbuf(strlen.value, nb_ccts.value, loops.value)
+else if modval == 3 then
+       bench_ropebuf(strlen.value, nb_ccts.value, loops.value)
+
 else
        opts.usage
        exit -1
index 0e36c49..b37ad26 100644 (file)
 module iteration_bench
 
 import opts
+intrude import standard::ropes
+
+redef class Concat
+       redef fun +(o) do
+               var s = o.to_s
+               return new Concat(self, s)
+       end
+end
+
+redef class FlatString
+       redef fun +(o) do
+               var s = o.to_s
+               var b = new FlatBuffer.with_capacity(length + s.length)
+               b.append self
+               for i in s.substrings do b.append i
+               return b.to_s
+       end
+end
 
 fun bench_flatstr_iter(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
-       var x = a
-       for i in [0 .. nb_cct] do x += a
+       a = a * nb_cct
        var cnt = 0
        var c: Char
        while cnt != loops do
-               for i in x do
+               for i in a do
                        c = i
                end
                cnt += 1
@@ -31,8 +48,40 @@ end
 fun bench_flatstr_index(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
-       var x = a
-       for i in [0 .. nb_cct] do x += a
+       a = a * nb_cct
+       var cnt = 0
+       var c: Char
+       var pos = 0
+       while cnt != loops do
+               pos = 0
+               while pos < a.length do
+                       c = a[pos]
+                       pos += 1
+               end
+               cnt += 1
+       end
+end
+
+fun bench_ropestr_iter(nb_cct: Int, loops: Int, strlen: Int)
+do
+       var a = "a" * strlen
+       var x: String = new Concat(a, a)
+       for i in [2 .. nb_cct[ do x = new Concat(x, a)
+       var cnt = 0
+       var c: Char
+       while cnt != loops do
+               for i in x do
+                       c = i
+               end
+               cnt += 1
+       end
+end
+
+fun bench_ropestr_index(nb_cct: Int, loops: Int, strlen: Int)
+do
+       var a = "a" * strlen
+       var x: String = new Concat(a, a)
+       for i in [2 .. nb_cct[ do x = new Concat(x, a)
        var cnt = 0
        var c: Char
        var pos = 0
@@ -49,8 +98,8 @@ end
 fun bench_flatbuf_iter(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
+       a = a * nb_cct
        var x = new FlatBuffer.from(a)
-       for i in [0 .. nb_cct] do x.append a
        var cnt = 0
        var c: Char
        while cnt != loops do
@@ -64,8 +113,41 @@ end
 fun bench_flatbuf_index(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
+       a = a * nb_cct
        var x = new FlatBuffer.from(a)
-       for i in [0 .. nb_cct] do x.append a
+       var cnt = 0
+       var c: Char
+       var pos = 0
+       while cnt != loops do
+               pos = 0
+               while pos < x.length do
+                       c = x[pos]
+                       pos += 1
+               end
+               cnt += 1
+       end
+end
+
+fun bench_ropebuf_iter(nb_cct: Int, loops: Int, strlen: Int)
+do
+       var a = "a" * strlen
+       var x = new RopeBuffer.from(a)
+       for i in [0 .. nb_cct[ do x.append a
+       var cnt = 0
+       var c: Char
+       while cnt != loops do
+               for i in x do
+                       c = i
+               end
+               cnt += 1
+       end
+end
+
+fun bench_ropebuf_index(nb_cct: Int, loops: Int, strlen: Int)
+do
+       var a = "a" * strlen
+       var x = new RopeBuffer.from(a)
+       for i in [0 .. nb_cct[ do x.append a
        var cnt = 0
        var c: Char
        var pos = 0
@@ -80,7 +162,7 @@ do
 end
 
 var opts = new OptionContext
-var mode = new OptionEnum(["flatstr", "flatbuf"], "Mode", -1, "-m")
+var mode = new OptionEnum(["flatstr", "flatbuf", "ropestr", "ropebuf"], "Mode", -1, "-m")
 var access_mode = new OptionEnum(["iterator", "index"], "Iteration mode", -1, "--iter-mode")
 var nb_ccts = new OptionInt("Number of concatenations done to the string (in the case of the rope, this will increase its depth)", -1, "--ccts")
 var loops = new OptionInt("Number of loops to be done", -1, "--loops")
@@ -115,6 +197,24 @@ else if modval == 1 then
                opts.usage
                exit(-1)
        end
+else if modval == 2 then
+       if iterval == 0 then
+               bench_ropestr_iter(nb_ccts.value, loops.value, strlen.value)
+       else if iterval == 1 then
+               bench_ropestr_index(nb_ccts.value, loops.value, strlen.value)
+       else
+               opts.usage
+               exit(-1)
+       end
+else if modval == 3 then
+       if iterval == 0 then
+               bench_ropebuf_iter(nb_ccts.value, loops.value, strlen.value)
+       else if iterval == 1 then
+               bench_ropebuf_index(nb_ccts.value, loops.value, strlen.value)
+       else
+               opts.usage
+               exit(-1)
+       end
 else
        opts.usage
        exit(-1)
index effb9ec..3727960 100644 (file)
 module substr_bench
 
 import opts
+intrude import standard::ropes
 
 fun bench_flatstr(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
-       var x = a
-       for i in [0 .. nb_cct] do x += a
+       a = a * nb_cct
+       var maxl = a.length - 1
        var cnt = 0
        while cnt != loops do
-               x.substring(0,5)
+               a.substring(maxl.rand, maxl.rand)
                cnt += 1
        end
 end
@@ -28,17 +29,44 @@ end
 fun bench_flatbuf(nb_cct: Int, loops: Int, strlen: Int)
 do
        var a = "a" * strlen
+       a = a * nb_cct
+       var maxl = a.length - 1
        var x = new FlatBuffer.from(a)
-       for i in [0 .. nb_cct] do x.append a
        var cnt = 0
        while cnt != loops do
-               x.substring(0,5)
+               x.substring(maxl.rand, maxl.rand)
+               cnt += 1
+       end
+end
+
+fun bench_ropestr(nb_cct: Int, loops: Int, strlen: Int)
+do
+       var a = "a" * strlen
+       var x = new Concat(a, a)
+       for i in [2 .. nb_cct[ do x = new Concat(x, a)
+       var maxl = x.length - 1
+       var cnt = 0
+       while cnt != loops do
+               x.substring(maxl.rand, maxl.rand)
+               cnt += 1
+       end
+end
+
+fun bench_ropebuf(nb_cct: Int, loops: Int, strlen: Int)
+do
+       var a = "a" * strlen
+       var x = new RopeBuffer.from(a)
+       for i in [1 .. nb_cct[ do x.append a
+       var maxl = x.length - 1
+       var cnt = 0
+       while cnt != loops do
+               x.substring(maxl.rand, maxl.rand)
                cnt += 1
        end
 end
 
 var opts = new OptionContext
-var mode = new OptionEnum(["flatstr", "flatbuf"], "Mode", -1, "-m")
+var mode = new OptionEnum(["flatstr", "flatbuf", "ropestr", "ropebuf"], "Mode", -1, "-m")
 var nb_ccts = new OptionInt("Number of concatenations done to the string (in the case of the rope, this will increase its depth)", -1, "--ccts")
 var loops = new OptionInt("Number of loops to be done", -1, "--loops")
 var strlen = new OptionInt("Length of the base string", -1, "--strlen")
@@ -52,11 +80,16 @@ if nb_ccts.value == -1 or loops.value == -1 or strlen.value == -1 then
 end
 
 var modval = mode.value
+srand_from(0)
 
 if modval == 0 then
        bench_flatstr(nb_ccts.value, loops.value, strlen.value)
 else if modval == 1 then
        bench_flatbuf(nb_ccts.value, loops.value, strlen.value)
+else if modval == 2 then
+       bench_ropestr(nb_ccts.value, loops.value, strlen.value)
+else if modval == 3 then
+       bench_ropebuf(nb_ccts.value, loops.value, strlen.value)
 else
        opts.usage
        exit(-1)
diff --git a/benchmarks/strings/utf_chain_concat.nit b/benchmarks/strings/utf_chain_concat.nit
deleted file mode 100644 (file)
index d720403..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# This file is part of NIT ( http://www.nitlanguage.org ).
-#
-# This file is free software, which comes along with NIT.  This software is
-# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
-# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
-# is kept unaltered, and a notification of the changes is added.
-# You  are  allowed  to  redistribute it and sell it, alone or is a part of
-# another product.
-
-# Benches measuring the performance of several concatenations on Text variants
-module utf_chain_concat
-
-import opts
-import string_experimentations::utf8_noindex
-
-fun bench_flatstr(str_size: Int, nb_ccts: Int, loops: Int)
-do
-       var lft = "a" * str_size
-
-       for i in [0..loops] do
-               var str: String = lft
-               for j in [0..nb_ccts] do
-                       str += lft
-               end
-       end
-end
-
-var opts = new OptionContext
-var nb_ccts = new OptionInt("Number of concatenations per loop", -1, "--ccts")
-var loops = new OptionInt("Number of loops to be done", -1, "--loops")
-var strlen = new OptionInt("Length of the base string", -1, "--strlen")
-opts.add_option(nb_ccts, loops, strlen)
-
-opts.parse(args)
-
-if nb_ccts.value == -1 or loops.value == -1 or strlen.value == -1 then
-       opts.usage
-       exit -1
-end
-
-bench_flatstr(strlen.value, nb_ccts.value, loops.value)
diff --git a/benchmarks/strings/utf_iteration_bench.nit b/benchmarks/strings/utf_iteration_bench.nit
deleted file mode 100644 (file)
index 80277c0..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-# This file is part of NIT ( http://www.nitlanguage.org ).
-#
-# This file is free software, which comes along with NIT.  This software is
-# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
-# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
-# is kept unaltered, and a notification of the changes is added.
-# You  are  allowed  to  redistribute it and sell it, alone or is a part of
-# another product.
-
-# Benches for iteration on variants of Text
-module utf_iteration_bench
-
-import opts
-import string_experimentations::utf8_noindex
-
-fun bench_flatstr_iter(nb_cct: Int, loops: Int, strlen: Int)
-do
-       var a = "a" * strlen
-       var x = a.as(FlatString)
-       for i in [0 .. nb_cct] do x = (x + a).as(FlatString)
-       var cnt = 0
-       var c: UnicodeChar
-       while cnt != loops do
-               var it = new FlatStringIter(x)
-               for i in it do
-                       c = i
-               end
-               cnt += 1
-       end
-end
-
-fun bench_flatstr_index(nb_cct: Int, loops: Int, strlen: Int)
-do
-       var a = "a" * strlen
-       var x = a.as(FlatString)
-       for i in [0 .. nb_cct] do x = (x + a).as(FlatString)
-       var cnt = 0
-       var c: UnicodeChar
-       var pos = 0
-       while cnt != loops do
-               pos = 0
-               while pos < x.length do
-                       c = x.char_at(pos)
-                       pos += 1
-               end
-               cnt += 1
-       end
-end
-
-var opts = new OptionContext
-var access_mode = new OptionEnum(["iterator", "index"], "Iteration mode", -1, "--iter-mode")
-var nb_ccts = new OptionInt("Number of concatenations done to the string (in the case of the rope, this will increase its depth)", -1, "--ccts")
-var loops = new OptionInt("Number of loops to be done", -1, "--loops")
-var strlen = new OptionInt("Length of the base string", -1, "--strlen")
-opts.add_option(nb_ccts, loops, strlen, access_mode)
-
-opts.parse(args)
-
-if nb_ccts.value == -1 or loops.value == -1 or strlen.value == -1 then
-       opts.usage
-       exit(-1)
-end
-
-var iterval = access_mode.value
-
-if iterval == 0 then
-       bench_flatstr_iter(nb_ccts.value, loops.value, strlen.value)
-else if iterval == 1 then
-       bench_flatstr_index(nb_ccts.value, loops.value, strlen.value)
-else
-       opts.usage
-       exit(-1)
-end
diff --git a/benchmarks/strings/utf_substr_bench.nit b/benchmarks/strings/utf_substr_bench.nit
deleted file mode 100644 (file)
index 7d71a8b..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# This file is part of NIT ( http://www.nitlanguage.org ).
-#
-# This file is free software, which comes along with NIT.  This software is
-# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
-# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
-# is kept unaltered, and a notification of the changes is added.
-# You  are  allowed  to  redistribute it and sell it, alone or is a part of
-# another product.
-
-# Benches on the substring operation on variants of Text
-module utf_substr_bench
-
-import opts
-import string_experimentations::utf8_noindex
-
-fun bench_flatstr(nb_cct: Int, loops: Int, strlen: Int)
-do
-       var a = "a" * strlen
-       var x = a
-       for i in [0 .. nb_cct] do x += a
-       var cnt = 0
-       while cnt != loops do
-               x.substring(0,5)
-               cnt += 1
-       end
-end
-
-var opts = new OptionContext
-var nb_ccts = new OptionInt("Number of concatenations done to the string (in the case of the rope, this will increase its depth)", -1, "--ccts")
-var loops = new OptionInt("Number of loops to be done", -1, "--loops")
-var strlen = new OptionInt("Length of the base string", -1, "--strlen")
-opts.add_option(nb_ccts, loops, strlen)
-
-opts.parse(args)
-
-if nb_ccts.value == -1 or loops.value == -1 or strlen.value == -1 then
-       opts.usage
-       exit(-1)
-end
-
-bench_flatstr(nb_ccts.value, loops.value, strlen.value)
diff --git a/bin/Makefile b/bin/Makefile
new file mode 100644 (file)
index 0000000..45a278a
--- /dev/null
@@ -0,0 +1,27 @@
+# Copyright 2013 Alexandre Terrasa <alexandre@moz-code.org>.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+all: run
+
+run: hello_world.jar
+       java -jar hello_world.jar
+
+hello_world.jar: nitj
+       NIT_DIR= ./nitj ../examples/hello_world.nit
+
+nitj:
+       NIT_DIR= ./nitg ../src/nitj.nit
+
+clean:
+       rm -rf -- hello_world.jar .nit_jcompile 2> /dev/null || true
index f40a23e..497cc7e 100644 (file)
@@ -61,6 +61,7 @@ void nit_gcollect(void) {
 #ifdef WITH_LIBGC
        case gc_opt_boehm: GC_gcollect(); break;
 #endif
+       default: break; /* nothing can be done */
        }
 }
 
index 35aa64c..bb6d1fa 100644 (file)
@@ -230,11 +230,11 @@ if not opts.errors.is_empty or opts.help.value == true then
 end
 
 var ben = new Benitlux("sherbrooke")
-ben.run(opts.send_emails.value or else false)
+ben.run(opts.send_emails.value)
 
 # The parsing logic for the wellington locaiton is active (to gather data)
 # but the web interface do not allow to subscribe to its mailing list.
 #
 # TODO revamp mailing list Web interface
 ben = new Benitlux("wellington")
-ben.run(opts.send_emails.value or else false)
+ben.run(opts.send_emails.value)
diff --git a/contrib/header_keeper/Makefile b/contrib/header_keeper/Makefile
new file mode 100644 (file)
index 0000000..90ac840
--- /dev/null
@@ -0,0 +1,8 @@
+bin/header_keeper:
+       mkdir -p bin
+       ../../bin/nitc --dir bin src/header_keeper.nit
+
+check: tests
+tests: bin/header_keeper
+       gcc -E /usr/include/SDL/SDL_image.h | bin/header_keeper SDL_image.h
+       gcc -E /usr/include/GLES2/gl2.h | bin/header_keeper gl2.h
diff --git a/contrib/header_keeper/src/header_keeper.nit b/contrib/header_keeper/src/header_keeper.nit
new file mode 100644 (file)
index 0000000..adf6b77
--- /dev/null
@@ -0,0 +1,57 @@
+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Filters preprocessed C-like header files to remove included files
+#
+# This tool is used in the process of parsing header files to extract
+# information on the declared services (the functions and structures).
+# This information is then used to generate bindings for Nit code
+# to access these services.
+#
+# The C preprocessor extends macros, inline files marked with `#include`,
+# and more. This tool acts after the C preprocessor, in a way to keep
+# everything but the included files. It searches for line pragmas
+# to identify the source of each line. The result is printed to stdout.
+#
+# Typical usage on the output of `gcc -E` (it would be the same with `clang`):
+#
+# ~~~sh
+# gcc -E /usr/include/SDL/SDL_image.h | header_keeper SDL_image.h > preprocessed_header.h
+# ~~~
+#
+# This module can also be used as a library.
+# The main service is the method `header_keeper`.
+module header_keeper
+
+# Filters the preprocessed `input` to keep only files from `target` and write to the `output`
+fun header_keeper(input: Reader, output: Writer, target: String)
+do
+       var in_target = false
+       while not input.eof do
+               var line = input.read_line
+               if not line.is_empty and line[0] == '#' then
+                       in_target = line.has(target)
+                       continue
+               end
+
+               if in_target then output.write line + "\n"
+       end
+end
+
+if args.length != 1 then
+       print "Usage: header_keeper header_name.h"
+       exit 1
+end
+
+header_keeper(sys.stdin, sys.stdout, args.first)
index d1f81e0..bfadf98 100644 (file)
@@ -4,6 +4,7 @@ bins:
        mkdir -p bin
        ../../bin/nitc --dir bin src/svg_to_png_and_nit.nit src/svg_to_icons.nit
 
+check: tests
 tests: test-dino test-app
 
 test-app: bin/svg_to_png_and_nit
index ae422ff..030cd5d 100644 (file)
@@ -33,6 +33,7 @@ minilang: nitcc ../examples/minilang.sablecc ../examples/minilang.nit
        ${NITC} ../examples/minilang.nit -v
        printf "10\n42\n" | ./minilang ../examples/minilang.minilang
 
+check: tests
 tests:
        cd ../tests && ./run
 
index 11df5b2..fb51b4d 100644 (file)
@@ -131,7 +131,6 @@ abstract class Processor
                                else
                                        full_path.file_delete
                                end
-                               stat.free
                        end
                        mpi.finalize
                        exit 0
index 8e385f9..2bff3fc 100644 (file)
@@ -4,6 +4,7 @@ nitiwiki:
        mkdir -p bin
        ../../bin/nitc src/nitiwiki.nit -o bin/nitiwiki
 
+check: tests
 tests: nitiwiki
        cd tests; make
 
index 0c3656f..868dd9e 100644 (file)
@@ -198,9 +198,9 @@ class OpportunityMeetupREST
                if args.has("new_pers") then
                        var name = request.string_arg("persname")
                        var m_id = request.string_arg("meetup_id")
-                       var ans = request.string_arg("answers").split("&")
-                       if name == null or m_id == null then return bad_req
-                       print ans
+                       var ans_str = request.string_arg("answers")
+                       if name == null or m_id == null or ans_str == null then return bad_req
+                       var ans = ans_str.split("&")
                        var ansmap = new HashMap[Int, Int]
                        for i in ans do
                                var mp = i.split("=")
index cf8c325..f3fa803 100644 (file)
@@ -5,6 +5,7 @@ bin/pep8analysis:
 doc/index.html:
        ../../bin/nitdoc src/pep8analysis.nit
 
+check: tests
 tests: bin/pep8analysis
        bin/pep8analysis --cfg-long tests/privat/*.pep tests/micro/*.pep tests/terrasa/*.pep
 
index d731e41..251f920 100644 (file)
@@ -98,4 +98,4 @@ redef class Location
        end
 end
 
-protected fun manager: AnalysisManager do return once new AnalysisManager
+fun manager: AnalysisManager do return once new AnalysisManager
index e32246c..338836b 100644 (file)
@@ -52,7 +52,7 @@ class FlowAnalysis[S]
                        end
 
                        if current_in != null then
-                               in_set(block) = current_in.as(not null)
+                               in_set(block) = current_in
                        else
                                continue
                        end
@@ -61,7 +61,7 @@ class FlowAnalysis[S]
 
                        var old_out = out_set(block)
                        for line in block.lines do
-                               self.current_in = current_in.as(not null)
+                               self.current_in = current_in
                                self.current_out = empty_set
                                pre_line_visit(line)
                                enter_visit(line)
index 43cdcc4..6f9a0a3 100644 (file)
@@ -8,3 +8,6 @@ android:
        mkdir -p bin/ res/
        ../../contrib/inkscape_tools/bin/svg_to_icons art/icon.svg --android --out res/
        ../../bin/nitc -o bin/calculator.apk src/calculator_android.nit
+
+android-install: android
+       adb install -r bin/calculator.apk
index e66fea8..1b1e686 100644 (file)
 module calculator_android is
        app_name "app.nit Calc."
        app_version(0, 1, git_revision)
-       java_package "org.nitlanguage.calculator"
+       app_namespace "org.nitlanguage.calculator"
 
-       # Use a translucent background and lock in portrait mode
-       android_manifest_activity """
-               android:theme="@android:style/Theme.Holo.Wallpaper"
-               android:screenOrientation="portrait""""
+       # Lock in portrait mode
+       android_manifest_activity """android:screenOrientation="portrait""""
 end
 
-import android
+# FIXME the next line should import `android` only when it uses nit_activity
+import android::log
 import android::ui
 
 import calculator_logic
 
-redef class App
+redef class Activity
+       super EventCatcher
+
        private var context = new CalculatorContext
 
        # The main display, at the top of the screen
@@ -43,7 +44,7 @@ redef class App
        # Has this window been initialized?
        private var inited = false
 
-       redef fun init_window
+       redef fun on_start
        do
                super
 
@@ -51,8 +52,7 @@ redef class App
                inited = true
 
                # Setup UI
-               var context = native_activity
-               var layout = new NativeLinearLayout(context)
+               var layout = new NativeLinearLayout(native)
                layout.set_vertical
 
                # Display screen
@@ -69,12 +69,13 @@ redef class App
                           ["="]]
 
                for line in ops do
-                       var buts_layout = new NativeLinearLayout(context)
+                       var buts_layout = new NativeLinearLayout(native)
                        buts_layout.set_horizontal
                        layout.add_view_with_weight(buts_layout, 1.0)
 
                        for op in line do
                                var but = new Button
+                               but.event_catcher = self
                                but.text = op
                                but.text_size = 40
                                buts_layout.add_view_with_weight(but.native, 1.0)
@@ -82,7 +83,33 @@ redef class App
                        end
                end
 
-               context.content_view = layout
+               native.content_view = layout
+       end
+
+       redef fun on_save_instance_state(state)
+       do
+               super
+
+               var nity = new Bundle.from(state)
+               nity["context"] = context.to_json
+       end
+
+       redef fun on_restore_instance_state(state)
+       do
+               super
+
+               var nity = new Bundle.from(state)
+               if not nity.has("context") then return
+
+               var json = nity.string("context")
+               if json == null then return
+
+               context = new CalculatorContext.from_json(json)
+       end
+
+       redef fun on_resume
+       do
+               display.text = context.display_text
        end
 
        redef fun catch_event(event)
index 57d3b5a..be55201 100644 (file)
@@ -15,6 +15,8 @@
 # Business logic of a calculator
 module calculator_logic
 
+import json::dynamic
+
 # Hold the state of the calculator and its services
 class CalculatorContext
        # Result of the last operation
@@ -118,6 +120,52 @@ class CalculatorContext
                self.result = result
                self.current = null
        end
+
+       # Serialize calculator state to Json
+       fun to_json: String
+       do
+               # Do not save NaN nor inf
+               var result = self.result
+               if result != null and (result.to_f.is_nan or result.to_f.is_inf != 0) then result = null
+
+               var self_last_op = self.last_op
+               var last_op
+               if self_last_op == null then
+                       last_op = "null"
+               else last_op = "\"{self_last_op}\""
+
+               var self_current = self.current
+               var current
+               if self_current == null then
+                       current = "null"
+               else current = "\"{self_current}\""
+
+               return """
+{
+       "result": {{{result or else "null"}}},
+       "last_op": {{{last_op}}},
+       "current": {{{current}}}
+}"""
+       end
+
+       # Load calculator state from Json
+       init from_json(json_string: String)
+       do
+               var json = json_string.to_json_value
+               if json.is_error then
+                       print "Loading state failed: {json.to_error}"
+                       return
+               end
+
+               var result = json["result"]
+               if result.is_numeric then self.result = result.to_numeric
+
+               var last_op = json["last_op"]
+               if last_op.is_string then self.last_op = last_op.to_s.chars.first
+
+               var current = json["current"]
+               if current.is_string then self.current = new FlatBuffer.from(current.to_s)
+       end
 end
 
 redef universal Float
index aac6d47..be92d49 100644 (file)
@@ -15,7 +15,7 @@
 # limitations under the License.
 
 module dino_android is
-       java_package("org.nitlanguage.dino")
+       app_namespace "org.nitlanguage.dino"
 end
 
 import dino
index 8700ab2..f8cff4f 100644 (file)
@@ -15,8 +15,8 @@
 # limitations under the License.
 
 module complete_simple_android is
-       java_package("org.nitlanguage.test_all")
-       target_api_version(19)
+       app_namespace "org.nitlanguage.test_all"
+       target_api_version 19
 end
 
 import test_bundle
diff --git a/examples/rosettacode/perlin_noise.nit b/examples/rosettacode/perlin_noise.nit
new file mode 100644 (file)
index 0000000..a3352da
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/bin/env nit
+#
+# This file is part of NIT ( http://www.nitlanguage.org ).
+# This program is public domain
+
+# Task: Perlin noise
+#
+# See: <http://rosettacode.org/wiki/Perlin_noise>
+module perlin_noise
+
+redef universal Float
+       # Smoothened `self`
+       fun fade: Float do return self*self*self*(self*(self*6.0-15.0)+10.0)
+end
+
+# Improved noise
+class ImprovedNoise
+       # Permutations
+       var p: Array[Int] = [151,160,137,91,90,15,
+               131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
+               190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
+               88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
+               77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
+               102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
+               135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
+               5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
+               223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
+               129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
+               251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
+               49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
+               138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]
+
+       # Noise value in [-1..1] at 3d coordinates `x, y, z`
+       fun noise(x, y, z: Float): Float
+       do
+               var xx = x.to_i.bin_and(255)
+               var yy = y.to_i.bin_and(255)
+               var zz = z.to_i.bin_and(255)
+
+               x -= x.floor
+               y -= y.floor
+               z -= z.floor
+
+               var u = x.fade
+               var v = y.fade
+               var w = z.fade
+
+               var a  = p[xx  ] + yy
+               var aa = p[a   ] + zz
+               var ab = p[a+1 ] + zz
+               var b  = p[xx+1] + yy
+               var ba = p[b   ] + zz
+               var bb = p[b+1 ] + zz
+
+               return w.lerp(v.lerp(u.lerp(grad(p[aa  ], x,     y,     z    ),
+                                           grad(p[ba  ], x-1.0, y,     z    )),
+                                    u.lerp(grad(p[ab  ], x,     y-1.0, z    ),
+                                           grad(p[bb  ], x-1.0, y-1.0, z    ))),
+                      v.lerp(u.lerp(grad(p[aa+1], x,     y,     z-1.0),
+                                           grad(p[ba+1], x-1.0, y,     z-1.0)),
+                                    u.lerp(grad(p[ab+1], x,     y-1.0, z-1.0),
+                                           grad(p[bb+1], x-1.0, y-1.0, z-1.0))))
+       end
+
+       # Value at a corner of the grid
+       fun grad(hash: Int, x, y, z: Float): Float
+       do
+               var h = hash.bin_and(15)
+               var u = if h < 8 then x else y
+               var v = if h < 4 then y else if h == 12 or h == 14 then x else z
+               return (if h.is_even then u else -u) + (if h.bin_and(2) == 0 then v else -v)
+       end
+end
+
+var map = new ImprovedNoise
+print map.noise(3.14, 42.0, 7.0).to_precision(17)
index 2cbd7cf..9735d90 100644 (file)
@@ -147,7 +147,8 @@ class Node
 
                                while frontier_node != self do
                                        path.nodes.unshift(frontier_node)
-                                       frontier_node = frontier_node.best_source.as(not null)
+                                       frontier_node = frontier_node.best_source
+                                       assert frontier_node != null
                                end
 
                                return path
index 550df10..ddc68ef 100644 (file)
@@ -209,6 +209,7 @@ class BacktrackSolver[S: Object, A]
 
                                problem.backtrack(state, a)
                                node = node.parent
+                               assert node != null
                                continue
                        end
 
index 83c4b4c..0583035 100644 (file)
@@ -103,7 +103,7 @@ class PuzzleProblem
                if x < width-1 then res.add(1)
                if y >= 1 then res.add(-width)
                if y < width-1 then res.add(width)
-               return res.as_random.take_all
+               return res
        end
 
        # Return the state where the tile at hole+action has moved
index 69b5c0d..f406949 100644 (file)
@@ -731,7 +731,7 @@ class SearchNode[S: Object, A]
                print "result:{state}"
                for n in path do
                        var a = n.action
-                       if a != null then print "    + {a or else ""}"
+                       if a != null then print "    + {a}"
                        print "  {n.steps}: {n.state} ({n.cost}$)"
                end
        end
diff --git a/lib/android/NitActivity.java b/lib/android/NitActivity.java
new file mode 100644 (file)
index 0000000..3744988
--- /dev/null
@@ -0,0 +1,111 @@
+/* This file is part of NIT ( http://www.nitlanguage.org ).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package nit.app;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/*
+ * Entry point to Nit applications on Android, redirect most calls to Nit
+ */
+public class NitActivity extends Activity {
+
+       // Nit activity associated to `this`
+       protected int nitActivity = 0;
+
+       /*
+        * Calls to Nit or to the C framework
+        */
+
+       static {
+               System.loadLibrary("main");
+       }
+
+       /*
+        * Callbacks to Nit through C
+        */
+       protected native int nitRegisterActivity();
+       protected native void nitOnCreate(int activity, Bundle savedInstanceState);
+       protected native void nitOnStart(int activity);
+       protected native void nitOnRestart(int activity);
+       protected native void nitOnResume(int activity);
+       protected native void nitOnPause(int activity);
+       protected native void nitOnStop(int activity);
+       protected native void nitOnDestroy(int activity);
+       protected native void nitOnSaveInstanceState(int activity, Bundle savedInstanceState);
+       protected native void nitOnRestoreInstanceState(int activity, Bundle savedInstanceState);
+
+       /*
+        * Implementation of OS callbacks
+        */
+
+       @Override
+       public void onCreate(Bundle savedInstanceState) {
+               super.onCreate(savedInstanceState);
+
+               nitActivity = nitRegisterActivity();
+
+               nitOnCreate(nitActivity, savedInstanceState);
+       }
+
+       @Override
+       protected void onStart() {
+               super.onStart();
+               nitOnStart(nitActivity);
+       }
+
+       @Override
+       protected void onRestart() {
+               super.onRestart();
+               nitOnRestart(nitActivity);
+       }
+
+       @Override
+       protected void onResume() {
+               super.onResume();
+               nitOnResume(nitActivity);
+       }
+
+       @Override
+       protected void onPause() {
+               super.onPause();
+               nitOnPause(nitActivity);
+       }
+
+       @Override
+       protected void onStop() {
+               super.onStop();
+               nitOnStop(nitActivity);
+       }
+
+       @Override
+       protected void onDestroy() {
+               super.onDestroy();
+               nitOnDestroy(nitActivity);
+       }
+
+       @Override
+       public void onSaveInstanceState(Bundle savedInstanceState) {
+               super.onSaveInstanceState(savedInstanceState);
+               nitOnSaveInstanceState(nitActivity, savedInstanceState);
+       }
+
+       @Override
+       public void onRestoreInstanceState(Bundle savedInstanceState) {
+               super.onRestoreInstanceState(savedInstanceState);
+               nitOnRestoreInstanceState(nitActivity, savedInstanceState);
+       }
+}
index 1f4e659..fb11c65 100644 (file)
@@ -32,7 +32,7 @@ as the launcher name.
 
     Example: `app_name "My App"`
 
-* `java_package` specifies the package used by the generated Java
+* `app_namespace` specifies the package used by the generated Java
 classes and the APK file. Once the application is published, this
 value should not be changed. By default, the compiler will use
 the package `org.nitlanguage.{module_name}`.
@@ -54,6 +54,11 @@ integer as argument. They are applied in the Android manifest as
 
     See http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
 
+* The annotation `android_activity` defines a Java class used as an
+  entrypoint to your application. As of now, this annotation should
+  only be used by low level implementations of Nit on Android.
+  It's usefulness will be extended in the future to customize user applications.
+
 ## Project entry points
 
 Importing `android::landscape` or `android::portrait` locks the generated
index 6740fe2..fec387d 100644 (file)
 # used to tag `ldflags` annotations.
 module aware is
        new_annotation android
-       new_annotation java_package
        new_annotation min_api_version
        new_annotation max_api_version
        new_annotation target_api_version
        new_annotation android_manifest
        new_annotation android_manifest_application
        new_annotation android_manifest_activity
+       new_annotation android_activity
 end
index b6e65ca..48603dc 100644 (file)
 # Java related services specific to Android and its Dalvik VM
 module dalvik
 
-import native_app_glue
+import activities
+
+redef class App
+       # The main Java Activity of this application
+       fun native_activity: NativeActivity is abstract
+end
 
 extern class JavaClassLoader in "Java" `{java.lang.ClassLoader`}
        super JavaObject
 end
 
 redef class Sys
-       # Get the running JVM
-       redef fun create_default_jvm
-       do
-               var jvm = app.native_app_glue.ndk_native_activity.vm
-               var jni_env = jvm.attach_current_thread
-               if jni_env.address_is_null then jni_env = jvm.env
+       # We cannot create a JVM on Android
+       #
+       # This method is not reachable on this platform anyway.
+       # `Sys::jvm` is implemented by the main activity modules.
+       redef fun create_default_jvm do abort
 
-               self.jvm = jvm
-               self.jni_env = jni_env
-       end
+       redef fun jni_env do return jvm.attach_current_thread
 
        private var class_loader: nullable JavaObject = null
        private var class_loader_method: nullable JMethodID = null
@@ -41,7 +43,7 @@ redef class Sys
        do
                var class_loader = self.class_loader
                if class_loader == null then
-                       find_class_loader(app.native_app_glue.ndk_native_activity.java_native_activity)
+                       find_class_loader app.native_activity
                        class_loader = self.class_loader
                        assert class_loader != null
                end
@@ -58,14 +60,14 @@ redef class Sys
                // Retrieve main activity
                jclass class_activity = (*env)->GetObjectClass(env, native_activity);
                if (class_activity == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retreiving activity class");
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving activity class");
                        (*env)->ExceptionDescribe(env);
                        exit(1);
                }
 
                jmethodID class_activity_getClassLoader = (*env)->GetMethodID(env, class_activity, "getClassLoader", "()Ljava/lang/ClassLoader;");
                if (class_activity_getClassLoader == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retreiving 'getClassLoader' method");
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 'getClassLoader' method");
                        (*env)->ExceptionDescribe(env);
                        exit(1);
                }
@@ -73,14 +75,14 @@ redef class Sys
                // Call activity.getClassLoader
                jobject instance_class_loader = (*env)->CallObjectMethod(env, native_activity, class_activity_getClassLoader);
                if (instance_class_loader == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retreiving class loader instance");
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving class loader instance");
                        (*env)->ExceptionDescribe(env);
                        exit(1);
                }
 
                jclass class_class_loader = (*env)->GetObjectClass(env, instance_class_loader);
                if (class_class_loader == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retreiving class of class loader");
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving class of class loader");
                        (*env)->ExceptionDescribe(env);
                        exit(1);
                }
@@ -88,7 +90,7 @@ redef class Sys
                // Get the method ClassLoader.findClass
                jmethodID class_class_loader_findClass = (*env)->GetMethodID(env, class_class_loader, "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
                if (class_class_loader_findClass == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retreiving 'findClass' method");
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed retrieving 'findClass' method");
                        (*env)->ExceptionDescribe(env);
                        exit(1);
                }
@@ -109,7 +111,7 @@ redef class Sys
 
                jclass java_class = (*env)->CallObjectMethod(env, instance_class_loader, class_loader_findClass, class_name);
                if (java_class == NULL) {
-                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed loading targetted class");
+                       __android_log_print(ANDROID_LOG_ERROR, "Nit", "Failed loading targeted class");
                        (*env)->ExceptionDescribe(env);
                        exit(1);
                }
index f6c2a1b..bdb06c5 100644 (file)
@@ -16,9 +16,9 @@
 
 # Test for app.nit's UI services
 module ui_test is
-       app_name("app.nit UI test")
+       app_name "app.nit UI test"
        app_version(0, 1, git_revision)
-       java_package("org.nitlanguage.ui_test")
+       app_namespace "org.nitlanguage.ui_test"
        android_manifest_activity """android:theme="@android:style/Theme.Light""""
 end
 
index 8d84981..d2aa796 100644 (file)
@@ -1334,11 +1334,11 @@ redef extern class NativeActivity
 end
 
 # Allows user to get values with enum-like syntax : `intent_action.main`
-protected fun intent_action: Action do return once new Action
+fun intent_action: Action do return once new Action
 # Allows user to get values with enum-like syntax : `intent_category.home`
-protected fun intent_category: Category do return once new Category
+fun intent_category: Category do return once new Category
 # Allows user to get values with enum-like syntax : `intent_flag.activity_brought_to_front`
-protected fun intent_flag: Flag do return once new Flag
+fun intent_flag: Flag do return once new Flag
 
 private class StringCopyArray
        var collection = new Array[String]
index c165331..6b0faea 100644 (file)
@@ -24,30 +24,30 @@ in "C" `{
 `}
 
 # Default Android log priority
-protected fun priority_default: Int do return 1
+fun priority_default: Int do return 1
 
 # Verbose Android log priority
-protected fun priority_verbose: Int do return 2
+fun priority_verbose: Int do return 2
 
 # Debug Android log priority
-protected fun priority_debug: Int do return 3
+fun priority_debug: Int do return 3
 
 # Info Android log priority
-protected fun priority_info: Int do return 4
+fun priority_info: Int do return 4
 
 # Warn Android log priority
-protected fun priority_warn: Int do return 5
+fun priority_warn: Int do return 5
 
 # Error Android log priority
-protected fun priority_error: Int do return 6
+fun priority_error: Int do return 6
 
 # Fatal Android log priority
-protected fun priority_fatal: Int do return 7
+fun priority_fatal: Int do return 7
 
 # Silent Android log priority
-protected fun priority_silent: Int do return 8
+fun priority_silent: Int do return 8
 
 # Write `text` to Android log at priority `level` with tag `tag`
-protected fun log_write(level: Int, tag, text: NativeString) `{
+fun log_write(level: Int, tag, text: NativeString) `{
        __android_log_write(level, tag, text);
 `}
index 9017a29..826eef2 100644 (file)
 #   which is a subclass of `Activity` and `Context` (in Java). It represent
 #   main activity of the running application. Use it to get anything related
 #   to the `Context` and as anchor to execute Java UI code.
-module native_app_glue is ldflags "-landroid"
+module native_app_glue is
+       ldflags "-landroid"
+       android_activity "android.app.NativeActivity"
+end
 
 import platform
 import log
-import activities
+import dalvik
 
 in "C header" `{
        #include <android_native_app_glue.h>
@@ -123,6 +126,10 @@ extern class NativeNativeActivity in "Java" `{ android.app.NativeActivity `}
        super NativeActivity
 end
 
+redef class Sys
+       redef fun jvm do return app.native_app_glue.ndk_native_activity.vm
+end
+
 redef class App
        redef fun setup
        do
@@ -135,8 +142,7 @@ redef class App
        # The underlying implementation using the Android native_app_glue framework
        fun native_app_glue: NativeAppGlue `{ return native_app_glue_data; `}
 
-       # The main Java Activity of this application
-       fun native_activity: NativeActivity do return native_app_glue.ndk_native_activity.java_native_activity
+       redef fun native_activity do return native_app_glue.ndk_native_activity.java_native_activity
 
        # Set `native_app_glue` command handler to our C implementation which
        # will callback self.
@@ -148,7 +154,7 @@ redef class App
        `}
 
        # Notification from the Android framework to generate a new saved state
-       # 
+       #
        # You can use the `shared_preferences` module or `NativeAppGlue::saved_state`.
        fun save_state do end
 
@@ -175,7 +181,7 @@ redef class App
        fun stop do end
 
        # Notification from the Android framework, `native_activity` is being destroyed
-       # 
+       #
        # Clean up and exit.
        fun destroy do end
 
@@ -197,7 +203,7 @@ redef class App
        fun input_changed do end
 
        # Notification from the Android framework, the window has been resized.
-       # 
+       #
        # Please redraw with its new size.
        fun window_resized do end
 
@@ -205,7 +211,7 @@ redef class App
        fun window_redraw_needed do end
 
        # Notification from the Android framework, the content area of the window has changed
-       # 
+       #
        # Raised when the soft input window being shown or hidden, and similar events.
        fun content_rect_changed do end
 
@@ -227,7 +233,7 @@ redef class App
 
                struct android_app *app_glue = App_native_app_glue(recv);
                struct android_poll_source* source = (struct android_poll_source*)data;
-               
+
                // Process this event.
                if (source != NULL) source->process(app_glue, source);
        `}
@@ -255,13 +261,13 @@ extern class NdkNativeActivity `{ ANativeActivity * `}
 
        # Path to this application's internal data directory.
        fun internal_data_path: NativeString `{ return (char*)recv->internalDataPath; `}
-    
+
        # Path to this application's external (removable/mountable) data directory.
        fun external_data_path: NativeString `{ return (char*)recv->externalDataPath; `}
-    
+
        # The platform's SDK version code.
        fun sdk_version: Int `{ return recv->sdkVersion; `}
-    
+
        # This is the native instance of the application.  It is not used by
        # the framework, but can be set by the application to its own instance
        # state.
diff --git a/lib/android/nit_activity.nit b/lib/android/nit_activity.nit
new file mode 100644 (file)
index 0000000..765ed01
--- /dev/null
@@ -0,0 +1,251 @@
+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Some documentation of this module has been adapted from the
+# Android Open Source Project.
+
+# Core implementation of `app.nit` on Android using a custom Java entry point
+#
+# This module is implemented in 3 languages:
+#
+# * The Java code, in `NitActivity.java` acts as the entry point registered
+#   to the Android OS. It relays most of the Android callbacks to C.
+#   In theory, there may be more than one instance of `NitActivity` alive at
+#   a given time. They hold a reference to the corresponding Nit `Activity`
+#   in the attribute `nitActivity`.
+#
+# * The C code is defined in the top part of this source file. It acts as a
+#   glue between Java and Nit by relaying calls between both languages.
+#   It keeps a global variables reference to the Java VM and the Nit `App`.
+#
+# * The Nit code defines the `Activity` class with the callbacks from Android.
+#   The callback methods should be redefined by user modules.
+#
+# The main is invoked when the native library is dynamically linked by
+# the Java virtual machine. For this reason, the main _must_ execute quickly,
+# on the main UI thread at least.
+module nit_activity is
+       extra_java_files "NitActivity.java"
+       android_activity "nit.app.NitActivity"
+end
+
+import platform
+import log
+import activities
+import bundle
+import dalvik
+
+in "C body" `{
+
+       #include <jni.h>
+       #include <android/log.h>
+
+       // Nit's App running instance
+       App global_app;
+
+       // Java VM that launched this program
+       JavaVM *global_jvm;
+
+       // JNI callback on loading this program
+       jint JNI_OnLoad(JavaVM *vm, void *reserved) {
+               // Set aside the Java VM
+               global_jvm = vm;
+
+               // Invoke Nit system and main
+               main(0, NULL);
+
+               return JNI_VERSION_1_2;
+       }
+
+       /*
+        * Implementations of NitActivity.java native methods
+        */
+
+       JNIEXPORT jint JNICALL Java_nit_app_NitActivity_nitRegisterActivity
+         (JNIEnv *env, jobject java_activity)
+       {
+               Activity nit_activity = App_register_activity(global_app, java_activity);
+               Activity_incr_ref(nit_activity);
+               return (jint)(void*)nit_activity;
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnCreate
+         (JNIEnv *env, jobject java_activity, jint nit_activity, jobject saved_state)
+       {
+               Activity_on_create((Activity)nit_activity, saved_state);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnStart
+         (JNIEnv *env, jobject java_activity, jint nit_activity)
+       {
+               Activity_on_start((Activity)nit_activity);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnRestart
+         (JNIEnv *env, jobject java_activity, jint nit_activity)
+       {
+               Activity_on_restart((Activity)nit_activity);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnResume
+         (JNIEnv *env, jobject java_activity, jint nit_activity)
+       {
+               Activity_on_resume((Activity)nit_activity);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnPause
+         (JNIEnv *env, jobject java_activity, jint nit_activity)
+       {
+               Activity_on_pause((Activity)nit_activity);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnStop
+         (JNIEnv *env, jobject java_activity, jint nit_activity)
+       {
+               Activity_on_stop((Activity)nit_activity);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnDestroy
+         (JNIEnv *env, jobject java_activity, jint nit_activity)
+       {
+               Activity_on_destroy((Activity)nit_activity);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnSaveInstanceState
+         (JNIEnv *env, jobject java_activity, jint nit_activity, jobject saved_state)
+       {
+               Activity_on_save_instance_state((Activity)nit_activity, saved_state);
+       }
+
+       JNIEXPORT void JNICALL Java_nit_app_NitActivity_nitOnRestoreInstanceState
+         (JNIEnv *env, jobject java_activity, jint nit_activity, jobject saved_state)
+       {
+               Activity_on_restore_instance_state((Activity)nit_activity, saved_state);
+       }
+`}
+
+# Wrapper to our Java `NitActivity`
+extern class NativeNitActivity in "Java" `{ nit.app.NitActivity `}
+       super NativeActivity
+end
+
+redef class Sys
+       redef fun jvm `{ return global_jvm; `}
+end
+
+redef class App
+       # Known activities
+       var activities = new Array[Activity]
+
+       # The main Java Activity of this application
+       redef fun native_activity do return activities.first.native
+
+       redef fun setup do set_global_app
+
+       # Register app in C
+       private fun set_global_app import register_activity,
+       Activity.on_create, Activity.on_destroy,
+       Activity.on_start, Activity.on_restart, Activity.on_stop,
+       Activity.on_pause, Activity.on_resume,
+       Activity.on_save_instance_state, Activity.on_restore_instance_state `{
+               App_incr_ref(recv);
+               global_app = recv;
+       `}
+
+       # Create the Nit side to this new `native` Java activity, and return it to Java
+       private fun register_activity(native: NativeNitActivity): Activity
+       do
+               native = native.new_global_ref
+               var activity = new Activity(native)
+               activities.add activity
+               return activity
+       end
+end
+
+# An Android activity
+#
+# You must implement the callbacks (prefixed with `on_`) to follow the
+# standard Android life-cycle.
+class Activity
+       # Native Java activity
+       var native: NativeActivity
+
+       # Notification from Android, the activity is created
+       #
+       # Do your normal static set up here.
+       #
+       # If available, `save_state` contains the activity's previous state
+       # as registered by `on_save_instance_state`.
+       #
+       # Followed by `on_start`.
+       fun on_create(save_state: NativeBundle) do end
+
+       # Notification from Android, the activity has been restarted
+       #
+       # Followed by `on_start`.
+       fun on_restart do end
+
+       # Notification from Android, the activity has been started
+       #
+       # Followed by `on_resume` or `on_stop`.
+       fun on_start do end
+
+       # Notification from Android, the activity has been resumed
+       #
+       # Followed by `on_pause`
+       fun on_resume do end
+
+       # Notification from Android, the activity has been paused
+       #
+       # Followed by `on_resume` or `on_stop`.
+       fun on_pause do end
+
+       # Notification from Android, the activity has been stopped
+       #
+       # Followed by `on_restart` or `on_destroy`.
+       fun on_stop do end
+
+       # Notification from Android, the activity is being destroyed
+       #
+       # Clean up and exit.
+       fun on_destroy
+       do
+               native.delete_global_ref
+               app.activities.remove self
+       end
+
+       # Notification from Android, the activity is being re-initialized from a `save_state`
+       #
+       # Occurs after `on_start`.
+       fun on_restore_instance_state(save_state: NativeBundle) do end
+
+       # Notification from Android, the activity may be stopped, save state
+       #
+       # Occurs before `on_stop` and, without guarantee, before or after `on_pause`.
+       fun on_save_instance_state(save_state: NativeBundle) do end
+
+       # Notification from Android, the system is running low on memory
+       #
+       # Try to reduce your memory use.
+       fun on_low_memory do end
+
+       # Notification from Android, the current window of the activity has lost or gained focus
+       fun on_window_focus_changed(has_focus: Bool) do end
+
+       # Notification from Android, the current device configuration has changed
+       fun on_configuration_changed do end
+end
+
+# Set up global data in C and leave it to Android to callback Java, which we relay to Nit
+app.setup
index a07718e..6d0e0f8 100644 (file)
@@ -34,7 +34,7 @@
 # ~~~
 module ui is min_api_version 14
 
-import native_app_glue
+import nit_activity
 import pthreads::concurrent_collections
 
 in "Java" `{
@@ -78,71 +78,12 @@ end
 
 redef class App
        super EventCatcher
-
-       # Queue of events to be received by the main thread
-       var event_queue = new ConcurrentList[AppEvent]
-
-       # Call `react` on all `AppEvent` available in `event_queue`
-       protected fun loop_on_ui_callbacks
-       do
-               var queue = event_queue
-               while not queue.is_empty do
-                       var event = queue.pop
-                       event.react
-               end
-       end
-
-       redef fun run
-       do
-               loop
-                       # Process Android events
-                       poll_looper 100
-
-                       # Process app.nit events
-                       loop_on_ui_callbacks
-               end
-       end
 end
 
 redef extern class NativeActivity
 
-       # Fill this entire `NativeActivity` with `popup`
-       #
-       # This is a workaround for the use on `takeSurface` in `NativeActivity.java`
-       #
-       # TODO replace NativeActivity by our own NitActivity
-       private fun dedicate_to_popup(popup: NativePopupWindow, popup_layout: NativeViewGroup) in "Java" `{
-               final LinearLayout final_main_layout = new LinearLayout(recv);
-               final ViewGroup final_popup_layout = popup_layout;
-               final PopupWindow final_popup = popup;
-               final Activity final_recv = recv;
-
-               recv.runOnUiThread(new Runnable() {
-                       @Override
-                       public void run()  {
-                               MarginLayoutParams params = new MarginLayoutParams(
-                                       LinearLayout.LayoutParams.MATCH_PARENT,
-                                       LinearLayout.LayoutParams.MATCH_PARENT);
-
-                               final_recv.setContentView(final_main_layout, params);
-
-                               final_popup.showAtLocation(final_popup_layout, Gravity.TOP, 0, 40);
-                       }
-               });
-       `}
-
        # Set the main layout of this activity
-       fun content_view=(layout: NativeViewGroup)
-       do
-               var popup = new NativePopupWindow(self)
-               popup.content_view = layout
-               dedicate_to_popup(popup, layout)
-       end
-
-       # Set the real content view of this activity, without hack
-       #
-       # TODO bring use this instead of the hack with `dedicate_to_pupup`
-       private fun real_content_view=(layout: NativeViewGroup) in "Java" `{
+       fun content_view=(layout: NativeViewGroup) in "Java" `{
                final ViewGroup final_layout = layout;
                final Activity final_recv = recv;
 
@@ -221,23 +162,18 @@ class Button
 
        init
        do
-               var native = new NativeButton(app.native_activity, app.event_queue, self)
+               var native = new NativeButton(app.native_activity, self)
                self.native = native.new_global_ref
        end
 
-       # Click event on the Main thread
+       # Click event
        #
        # By default, this method calls `app.catch_event`. It can be specialized
        # with custom behavior or the receiver of `catch_event` can be changed
        # with `event_catcher=`.
        fun click(event: AppEvent) do event_catcher.catch_event(event)
 
-       # Click event on the UI thread
-       #
-       # This method is called on the UI thread and redirects the event to `click`
-       # throught `App::event_queue`. In most cases, you should implement `click`
-       # and leave `click_ui` as is.
-       fun click_ui do app.event_queue.add(new ClickEvent(self))
+       private fun click_from_native do click(new ClickEvent(self))
 end
 
 # An Android editable text field
@@ -248,7 +184,7 @@ class EditText
 
        init
        do
-               var native = new NativeEditText(app.native_activity)
+               var native = new NativeEditText(app.activities.first.native)
                self.native = native.new_global_ref
        end
 end
@@ -387,14 +323,15 @@ extern class NativeButton in "Java" `{ android.widget.Button `}
 
        redef type SELF: NativeButton
 
-       new (context: NativeActivity, queue: ConcurrentList[AppEvent], sender_object: Object) import Button.click_ui in "Java" `{
+       new (context: NativeActivity, sender_object: Object)
+       import Button.click_from_native in "Java" `{
                final int final_sender_object = sender_object;
 
                return new Button(context){
                        @Override
                        public boolean onTouchEvent(MotionEvent event) {
                                if(event.getAction() == MotionEvent.ACTION_DOWN) {
-                                       Button_click_ui(final_sender_object);
+                                       Button_click_from_native(final_sender_object);
                                        return true;
                                }
                                return false;
index a528d57..2a335c4 100644 (file)
@@ -16,6 +16,7 @@
 
 module app_base is
        new_annotation app_name
+       new_annotation app_namespace
        new_annotation app_version
 end
 
@@ -51,6 +52,6 @@ class App
        fun window_closing do end
 end
 
-protected fun app: App do return once new App
+fun app: App do return once new App
 app.setup
 app.run
diff --git a/lib/deriving.nit b/lib/deriving.nit
new file mode 100644 (file)
index 0000000..ae8394e
--- /dev/null
@@ -0,0 +1,117 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# This file is free software, which comes along with NIT.  This software is
+# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+# without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
+# PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
+# is kept unaltered, and a notification of the changes is added.
+# You  are  allowed  to  redistribute it and sell it, alone or is a part of
+# another product.
+
+# Automatic derivable implementation of standard basic methods.
+#
+# This module introduce `Derivable` as the main interface to implement (or auto-implement) and
+# provides additional mixin-interfaces with specific default behavior of standard basic methods based
+# on the services of this interface.
+#
+# The name *deriving* is inspired from the deriving mechanism of Haskell.
+#
+# This module also introduce a new annotation `auto_derive`. See `Derivable` for details.
+module deriving is
+       new_annotation auto_derive
+end
+
+# Interface of objects that expose some kind of internal representation in a very unreliable way.
+#
+# The point of this interface is to allow objects to give a basic representation of
+# themselves within a simple key-value dictionary.
+# The specific semantic of each key and value is let unspecified.
+#
+# Moreover the class annotation `auto_derive` will automatically implements the
+# interface with the attributes locally defined in the class.
+#
+# ~~~
+# class A
+#    auto_derive
+#    var an_int: Int
+#    var a_string: String
+# end
+#
+# var a = new A(5, "five")
+# var map = a.derive_to_map
+# assert map.length == 2
+# assert map["an_int"] == 5
+# assert map["a_string"] == "five"
+# ~~~
+interface Derivable
+       # Returns a map that loosely represents the object `self`.
+       #
+       # Warning: by default the method returns an empty Map.
+       # It is done this way so that subclasses can just call `super` and add their own attributes.
+       #
+       # Forgetting to redefine `derive_to_map` will broke the expectation of the user of the class
+       # Since an empty map is not POLA.
+       #
+       # Note that the semantic of keys and values is let unspecified.
+       # Moreover, there is no specification nor mechanism to avoid key collision.
+       fun derive_to_map: Map[String, nullable Object]
+       do
+               return new HashMap[String, nullable Object]
+       end
+end
+
+# Implementation of `to_s` for `Derivable` objects.
+#
+# The implementation uses `to_s` for each value of `attributes_to_map`.
+#
+# ~~~
+# class A
+#    auto_derive
+#    super DeriveToS
+#    var an_int: Int
+#    var a_string: String
+# end
+#
+# var a = new A(5, "five")
+# assert a.to_s == "an_int:5; a_string:five"
+# ~~~
+#
+# Warning: the method may go in an infinite recursion if there is a circuit in
+# the implementation of `to_s`.
+interface DeriveToS
+       super Derivable
+       redef fun to_s do return derive_to_map.join("; ", ":")
+end
+
+# Implementation of `==` and `hash` for `Derivable` objects.
+#
+# The implementations just call `==` and `hash` on `derive_to_map`.
+#
+# ~~~
+# class A
+#    auto_derive
+#    super DeriveEqual
+#    var an_int: Int
+#    var a_string: String
+# end
+#
+# var a = new A(5, "five")
+# var b = new A(5, "five")
+# var c = new A(6, "six")
+# assert a == b
+# assert a.hash == b.hash
+# assert a != c
+# ~~~
+#
+# Warning: the method may go in an infinite recursion if there is a circuit in
+# the implementation of `==` or `hash`.
+interface DeriveEqual
+       super Derivable
+       redef fun ==(other) do
+               if not other isa Derivable then return false
+               return derive_to_map == other.derive_to_map
+       end
+       redef fun hash do
+               return derive_to_map.hash
+       end
+end
index b664c8a..d062cfc 100644 (file)
@@ -452,6 +452,6 @@ redef class Object
        end
 end
 
-protected fun egl_bind_opengl_api: Bool `{ return eglBindAPI(EGL_OPENGL_API); `}
-protected fun egl_bind_opengl_es_api: Bool `{ return eglBindAPI(EGL_OPENGL_ES_API); `}
-protected fun egl_bind_openvg_api: Bool `{ return eglBindAPI(EGL_OPENVG_API); `}
+fun egl_bind_opengl_api: Bool `{ return eglBindAPI(EGL_OPENGL_API); `}
+fun egl_bind_opengl_es_api: Bool `{ return eglBindAPI(EGL_OPENGL_ES_API); `}
+fun egl_bind_openvg_api: Bool `{ return eglBindAPI(EGL_OPENVG_API); `}
index 14a67fb..303aae1 100644 (file)
@@ -55,9 +55,13 @@ end
 
 # An abstract 2d line segment
 interface ILine[N: Numeric]
+       # The type of points that ends the segment
        type P: IPoint[N]
 
+       # The point that is the left-end of the segment
        fun point_left: P is abstract
+
+       # The point that is the right-end of the segment
        fun point_right: P is abstract
 
        redef fun to_s do return "{point_left}--{point_right}"
index 97c0783..089b6ee 100644 (file)
@@ -29,7 +29,7 @@ import pipeline
 abstract class QuadTree[E: Boxed[Numeric]]
        super BoxedCollection[E]
 
-       protected var center: nullable Point[Numeric]
+       protected var center: nullable Point[Numeric] = null
        var data: Array[E] = new Array[E]
 
        #  ________________
@@ -39,20 +39,14 @@ abstract class QuadTree[E: Boxed[Numeric]]
        #  |   0   |   3   |
        #  |_______|_______|
 
-       protected var child0: nullable QuadTree[E]
-       protected var child1: nullable QuadTree[E]
-       protected var child2: nullable QuadTree[E]
-       protected var child3: nullable QuadTree[E]
+       protected var child0: nullable QuadTree[E] = null
+       protected var child1: nullable QuadTree[E] = null
+       protected var child2: nullable QuadTree[E] = null
+       protected var child3: nullable QuadTree[E] = null
 
        # represent the threshold before subdividing the node
-       protected var item_limit = 4
-       protected var parent_node: nullable QuadTree[E]
-
-       # create the quadtree and set the item limit for each node
-       init(limit: Int)
-       do
-               self.item_limit = limit
-       end
+       protected var item_limit: Int
+       protected var parent_node: nullable QuadTree[E] = null
 
        # create a node, giving him self as a parent. Used to create children nodes
        init with_parent(limit: Int, parent: QuadTree[E])
@@ -62,10 +56,10 @@ abstract class QuadTree[E: Boxed[Numeric]]
        end
 
        redef fun items_overlapping(region :Boxed[Numeric]): SimpleCollection[E] do
-        var res = new Array[E]
-        items_overlapping_in(region,res)
-        return res
-     end  
+               var res = new Array[E]
+               items_overlapping_in(region,res)
+               return res
+       end
 
        # add the item to the tree, create children if the limit is reached
        redef fun add(item: E) do if self.is_leaf then self.data.add(item) else add_to_children(item)
@@ -92,7 +86,7 @@ abstract class QuadTree[E: Boxed[Numeric]]
                        else if self.center.y > item.top then
                                self.data.add(item)
                        else if self.center.y < item.bottom then
-                                       self.data.add(item)
+                               self.data.add(item)
                        else
                                self.data.add(item)
                        end
@@ -215,23 +209,16 @@ end
 # the center of the parent node
 class SQuadTree[E: Boxed[Numeric]]
        super QuadTree[E]
-       
+
        # the width of the current node of the QuadTree
        var width: Numeric
        # the height of the current node of the QuadTree
        var height: Numeric
 
-       init(l: Int, c: Point[Numeric], w: Numeric, h: Numeric)
-       do
-               self.item_limit = l
-               self.center = c
-               self.width = w
-               self.height = h
-       end
-
        init with_parent(l: Int, c: Point[Numeric], w: Numeric, h: Numeric, p: QuadTree[E])
        do
-               init(l, c, w, h)
+               init(l, w, h)
+               center = c
                self.parent_node = p
        end
 
index cc12923..8e70600 100644 (file)
@@ -82,7 +82,7 @@ class GithubCurl
                        if obj isa JsonObject then
                                if obj.keys.has("message") then
                                        var title = "GithubAPIError"
-                                       var msg = obj["message"].to_s or else ""
+                                       var msg = obj["message"].to_s
                                        var err = new GithubError(msg, title)
                                        err.json["requested_uri"] = uri
                                        err.json["status_code"] = response.status_code
index de2babc..5b05f8b 100644 (file)
@@ -366,7 +366,7 @@ extern class GLError
        end
 end
 
-protected fun assert_no_gl_error
+fun assert_no_gl_error
 do
        var error = gl.error
        if not error.is_ok then
diff --git a/lib/html/bootstrap.nit b/lib/html/bootstrap.nit
new file mode 100644 (file)
index 0000000..66befa3
--- /dev/null
@@ -0,0 +1,466 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# HTML templates for Bootstrap components.
+#
+# See http://getbootstrap.com/components/
+module bootstrap
+
+import template
+
+# Bootstrap component abstraction.
+#
+# Mainly used to factoryze CSS treatments.
+# Can be used in the future to handle generic stuff like attributes or escaping.
+#
+# TODO merge with html::HTMTag without init conflict?
+# HTMLTag requires the main init to pass a tagname,
+# this was so much verbose here.
+abstract class BSComponent
+       super Template
+
+       # CSS classes to add on this element.
+       var css_classes = new Array[String]
+
+       # Render `self` css clases as a `class` attribute.
+       fun render_css_classes: String do
+               if css_classes.is_empty then return ""
+               return " class=\"{css_classes.join(" ")}\""
+       end
+end
+
+# A `<a>` tag.
+#
+# Not really a Bootstrap component but used in other components
+# that it required its own abstraction.
+#
+# Example:
+# ~~~
+# var lnk = new Link("http://nitlanguage.org", "Nit")
+# assert lnk.write_to_string == "<a href=\"http://nitlanguage.org\">Nit</a>"
+# ~~~
+#
+# Creates a link with a title attribute:
+# ~~~
+# lnk = new Link.with_title("http://nitlanguage.org", "Nit", "Nit homepage")
+# assert lnk.write_to_string == "<a href=\"http://nitlanguage.org\" title=\"Nit homepage\">Nit</a>"
+# ~~~
+class Link
+       super BSComponent
+
+       # URL pointed by this link.
+       var href: String is writable
+
+       # Displayed text.
+       var text: Writable is writable
+
+       # Optional title.
+       var title: nullable String is noinit, writable
+
+       # Creates a link with a `title` attribute.
+       init with_title(href: String, text: Writable, title: nullable String) do
+               self.href = href
+               self.text = text
+               self.title = title
+       end
+
+       redef fun rendering do
+               add "<a{render_css_classes} href=\"{href}\""
+               if title != null then add " title=\"{title.write_to_string}\""
+               add ">{text}</a>"
+       end
+end
+
+# A `<h1>` to `<h6>` tag.
+#
+# Not really a Bootstrap component but used in other components
+# that it required its own abstraction.
+#
+# Example:
+# ~~~
+# var h1 = new Header(1, "Title")
+# assert h1.write_to_string == "<h1>Title</h1>"
+# ~~~
+#
+# With subtext:
+# ~~~
+# var h6 = new Header.with_subtext(6, "Title", "with subtext")
+# assert h6.write_to_string == "<h6>Title<small>with subtext</small></h6>"
+# ~~~
+class Header
+       super BSComponent
+
+       # Header level between 1 and 6.
+       var level: Int
+
+       # Displayed text.
+       var text: Writable
+
+       # Optional subtext.
+       var subtext: nullable Writable is noinit, writable
+
+       # Creates a link with a `title` attribute.
+       init with_subtext(level: Int, text: Writable, subtext: String) do
+               self.level = level
+               self.text = text
+               self.subtext = subtext
+       end
+
+       redef fun rendering do
+               add "<h{level}{render_css_classes}>{text.write_to_string}"
+               if subtext != null then add "<small>{subtext.write_to_string}</small>"
+               add "</h{level}>"
+       end
+end
+
+# An abstract HTML list.
+#
+# Many Bootstrap components are built around a HTML list.
+#
+# Used to factorize behavior between OrderedList and UnorderedList.
+abstract class HTMLList
+       super BSComponent
+
+       # A list contains `<li>` tags as children.
+       #
+       # See ListItem.
+       var items = new Array[ListItem]
+
+       # Adds a new ListItem to `self`.
+       fun add_li(item: ListItem) do items.add item
+
+       # Does `self` contains no items?
+       fun is_empty: Bool do return items.is_empty
+end
+
+# A `<ol>` list tag.
+#
+# Example:
+#
+# ~~~
+# var lst = new OrderedList
+# lst.add_li(new ListItem("foo"))
+# lst.add_li(new ListItem("bar"))
+# lst.add_li(new ListItem("baz"))
+#
+# assert lst.write_to_string == """
+# <ol>
+# <li>foo</li>
+# <li>bar</li>
+# <li>baz</li>
+# </ol>
+# """
+# ~~~
+class OrderedList
+       super HTMLList
+
+       redef fun rendering do
+               addn "<ol{render_css_classes}>"
+               for item in items do add item
+               addn "</ol>"
+       end
+end
+
+# A `<ul>` list tag.
+#
+# Example:
+#
+# ~~~
+# var lst = new UnorderedList
+# lst.add_li(new ListItem("foo"))
+# lst.add_li(new ListItem("bar"))
+# lst.add_li(new ListItem("baz"))
+#
+# assert lst.write_to_string == """
+# <ul>
+# <li>foo</li>
+# <li>bar</li>
+# <li>baz</li>
+# </ul>
+# """
+# ~~~
+class UnorderedList
+       super HTMLList
+
+       redef fun rendering do
+               addn "<ul{render_css_classes}>"
+               for item in items do add item
+               addn "</ul>"
+       end
+end
+
+# A `<li>` tag.
+class ListItem
+       super BSComponent
+
+       # Content to display in this list item.
+       var text: Writable is writable
+
+       redef fun rendering do addn "<li{render_css_classes}>{text.write_to_string}</li>"
+end
+
+# A Boostrap icon.
+#
+# See http://getbootstrap.com/components/#glyphicons
+#
+# Example:
+#
+# ~~~
+# var icon = new BSIcon("star")
+# assert icon.write_to_string == "<span class=\"glyphicon glyphicon-star\" aria-hidden=\"true\"></span>"
+# ~~~
+class BSIcon
+       super BSComponent
+
+       # Glyphicon name to display.
+       #
+       # See full list at http://getbootstrap.com/components/#glyphicons.
+       var icon: String
+
+       init do css_classes.add "glyphicon glyphicon-{icon}"
+
+       redef fun rendering do
+               add "<span{render_css_classes} aria-hidden=\"true\"></span>"
+       end
+end
+
+# A Bootstrap breadcrumbs component.
+#
+# See http://getbootstrap.com/components/#breadcrumbs
+#
+# Example:
+#
+# ~~~
+# var bc = new BSBreadCrumbs
+# bc.add_li(new ListItem("foo"))
+# bc.add_li(new ListItem("bar"))
+# bc.add_li(new ListItem("baz"))
+#
+# assert bc.write_to_string == """
+# <ol class=\"breadcrumbs\">
+# <li>foo</li>
+# <li>bar</li>
+# <li class=\"active\">baz</li>
+# </ol>
+# """
+# ~~~
+class BSBreadCrumbs
+       super OrderedList
+
+       init do css_classes.add "breadcrumbs"
+
+       redef fun rendering do
+               items.last.css_classes.add "active"
+               super
+       end
+end
+
+# A Bootstrap label component.
+#
+# See http://getbootstrap.com/components/#labels
+#
+# Example:
+#
+# ~~~
+# var lbl = new BSLabel("danger", "Danger!")
+# assert lbl.write_to_string == "<span class=\"label label-danger\">Danger!</span>"
+# ~~~
+class BSLabel
+       super BSComponent
+
+       # Class used to change the color of the label.
+       #
+       # Can be one of `default`, `primary`, `success`, `info`, `warning` or `danger`.
+       var color: String
+
+       # Text to display in the label.
+       var text: Writable
+
+       init do css_classes.add "label label-{color}"
+
+       redef fun rendering do
+               add "<span{render_css_classes}>{text.write_to_string}</span>"
+       end
+end
+
+# A Bootstrap badge component.
+#
+# See http://getbootstrap.com/components/#badges
+#
+# Example:
+#
+# ~~~
+# var b = new BSBadge("42 messages")
+# assert b.write_to_string == "<span class=\"badge\">42 messages</span>"
+# ~~~
+class BSBadge
+       super BSComponent
+
+       # Text to display in the label.
+       var text: Writable
+
+       init do css_classes.add "badge"
+
+       redef fun rendering do
+               add "<span{render_css_classes}>{text.write_to_string}</span>"
+       end
+end
+
+# A Bootstrap page header component.
+#
+# See http://getbootstrap.com/components/#page-header
+#
+# Example:
+#
+# ~~~
+# var h = new BSPageHeader("Welcome")
+# assert h.write_to_string == """
+# <div class=\"page-header\">
+# Welcome
+# </div>
+# """
+# ~~~
+class BSPageHeader
+       super BSComponent
+
+       # Text to display as title.
+       var text: Writable
+
+       init do css_classes.add "page-header"
+
+       redef fun rendering do
+               addn "<div{render_css_classes}>"
+               addn text.write_to_string
+               addn "</div>"
+       end
+end
+
+# A Bootstrap alert component.
+#
+# See http://getbootstrap.com/components/#alerts
+#
+# Example:
+#
+# ~~~
+# var alert = new BSAlert("danger", "Danger!")
+# assert alert.write_to_string == """
+# <div class="alert alert-danger">
+# Danger!
+# </div>
+# """
+# ~~~
+class BSAlert
+       super BSComponent
+
+       # Class used to change the color of the alert.
+       #
+       # Can be one of `primary`, `success`, `info`, `warning` or `danger`.
+       var color: String
+
+       # Text to display in the alert.
+       var text: Writable
+
+       # Can the alert be dismissed by clicking the close button?
+       #
+       # See http://getbootstrap.com/components/#alerts-dismissible
+       #
+       # Default is `false`.
+       var is_dismissible = false
+
+       init do css_classes.add "alert alert-{color}"
+
+       redef fun rendering do
+               addn "<div{render_css_classes}>"
+               if is_dismissible then
+                       add "<button type=\"button\" class=\"close\" data-dismiss=\"alert\""
+                       add "aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span>"
+                       addn "</button>"
+               end
+               addn text.write_to_string
+               addn "</div>"
+       end
+end
+
+# A Bootstrap panel component.
+#
+# See http://getbootstrap.com/components/#panels
+#
+# Example:
+#
+# ~~~
+# var p = new BSPanel("default", "Panel content")
+#
+# assert p.write_to_string == """
+# <div class="panel panel-default">
+# <div class="panel-body">
+# Panel content
+# </div>
+# </div>
+# """
+# ~~~
+#
+# Panel with heading:
+#
+# ~~~
+# p = new BSPanel("danger", "Panel content")
+# p.heading = "Panel heading"
+#
+# assert p.write_to_string == """
+# <div class="panel panel-danger">
+# <div class="panel-heading">
+# Panel heading
+# </div>
+# <div class="panel-body">
+# Panel content
+# </div>
+# </div>
+# """
+# ~~~
+class BSPanel
+       super BSComponent
+
+       # Panel color.
+       #
+       # Can be one of `default`, `primary`, `success`, `info`, `warning` or `danger`.
+       var color: String
+
+       # Panel header if any.
+       var heading: nullable Writable is noinit, writable
+
+       # Body to display in the panel.
+       var body: Writable
+
+       # Panel footer is any.
+       var footer: nullable Writable is noinit, writable
+
+       init do css_classes.add "panel panel-{color}"
+
+       redef fun rendering do
+               addn "<div{render_css_classes}>"
+               if heading != null then
+                       addn "<div class=\"panel-heading\">"
+                       addn heading.write_to_string
+                       addn "</div>"
+               end
+               addn "<div class=\"panel-body\">"
+               addn body.write_to_string
+               addn "</div>"
+               if footer != null then
+                       addn "<div class=\"panel-footer\">"
+                       addn footer.write_to_string
+                       addn "</div>"
+               end
+               addn "</div>"
+       end
+end
diff --git a/lib/ios/app.nit b/lib/ios/app.nit
new file mode 100644 (file)
index 0000000..0e337bc
--- /dev/null
@@ -0,0 +1,191 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Basic structure for Nit apps on iOS
+module app
+
+import platform
+import ::app
+
+in "ObjC Header" `{
+       #import <UIKit/UIKit.h>
+
+       // Our interface to the iOS system
+       @interface AppDelegate: UIResponder <UIApplicationDelegate>
+
+               // The main window
+               @property (strong, nonatomic) UIWindow *window;
+       @end
+`}
+
+in "ObjC" `{
+
+       // Global reference to the App from app.nit
+       App app_nit_ios_app;
+
+       // Our own C argc and argv
+       int app_nit_ios_argc;
+       char **app_nit_ios_argv;
+
+       @implementation AppDelegate
+
+       - (BOOL)application:(UIApplication *)application
+               willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+
+               // Set aside `application` to be used from Nit
+               App_ui_application__assign(app_nit_ios_app, application);
+               App_app_delegate__assign(app_nit_ios_app, self);
+
+               // Complete the callback
+               return App_will_finish_launching_with_options(app_nit_ios_app);
+       }
+
+       - (BOOL)application:(UIApplication *)application
+               didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+
+               return App_did_finish_launching_with_options(app_nit_ios_app);
+       }
+
+       - (void)applicationWillResignActive:(UIApplication *)application {
+               App_will_resign_active(app_nit_ios_app);
+       }
+
+       - (void)applicationDidEnterBackground:(UIApplication *)application {
+               App_did_enter_background(app_nit_ios_app);
+       }
+
+       - (void)applicationWillEnterForeground:(UIApplication *)application {
+               App_will_enter_foreground(app_nit_ios_app);
+       }
+
+       - (void)applicationDidBecomeActive:(UIApplication *)application {
+               App_did_become_active(app_nit_ios_app);
+       }
+
+       - (void)applicationWillTerminate:(UIApplication *)application {
+               App_will_terminate(app_nit_ios_app);
+       }
+
+       @end
+`}
+
+# Application interface to the iOS system
+extern class AppDelegate in "ObjC" `{ AppDelegate * `}
+end
+
+# Graphical application to which events are sent
+extern class UIApplication in "ObjC" `{ UIApplication * `}
+end
+
+redef class App
+
+       # Main graphical application
+       var ui_application: UIApplication
+
+       # Application interface to the iOS system
+       var app_delegate: AppDelegate
+
+       # Copy back to C the command line arguments
+       #
+       # Nit extracts the first arguments from the `args` sequence,
+       # so we need to add it back. That's why Nit's `args` is smaller than in C.
+       private fun register_args(program_name: NativeString, argc: Int,
+       argv: Sequence[String]) import Sequence[String].[], String.to_cstring in "ObjC" `{
+               app_nit_ios_argc = argc+1;
+
+               // TODO copy or pin the strings when needed
+               app_nit_ios_argv = malloc(argc * sizeof(char*));
+               app_nit_ios_argv[0] = program_name;
+               for (int i = 0; i < argc; i ++) {
+                       String arg = Sequence_of_String__index(argv, i);
+                       app_nit_ios_argv[i+1] = String_to_cstring(arg);
+               }
+       `}
+
+       # Register `self` globally in C so it can be retrieved from iOS callbacks
+       private fun register_globally in "ObjC" `{
+               App_incr_ref(recv);
+               app_nit_ios_app = recv;
+       `}
+
+       # Entry point to the iOS framework
+       private fun ui_application_main: Bool import did_finish_launching_with_options,
+       will_finish_launching_with_options,
+       will_resign_active, did_enter_background, will_enter_foreground,
+       did_become_active, will_terminate, ui_application=, app_delegate= in "ObjC" `{
+
+               @autoreleasepool {
+                       return UIApplicationMain(app_nit_ios_argc, app_nit_ios_argv,
+                               nil, NSStringFromClass([AppDelegate class]));
+               }
+       `}
+
+       # The application is about to launch
+       #
+       # Redef this method to set the very first custom code to be executed.
+       fun will_finish_launching_with_options: Bool do return true
+
+       # The application just launched but is not yet displayed to the user
+       #
+       # Redef this method to customize the behavior.
+       fun did_finish_launching_with_options: Bool do return true
+
+       # The application is about to move from active to inactive state
+       #
+       # This can occur for certain types of temporary interruptions
+       # (such as an incoming phone call or SMS message) or when the
+       # user quits the application and it begins the transition to
+       # the background state.
+       #
+       # Redef this method to pause ongoing tasks, disable timers, and
+       # throttle down OpenGL ES frame rates. Games should use this
+       # method to pause.
+       fun will_resign_active do end
+
+       # The application just left foreground it can be suspended at any time
+       #
+       # Redef this method to release shared resources, save user data,
+       # invalidate timers, and store application state to restore your
+       # application to its current state in case it is terminated later.
+       #
+       # If your application supports background execution, this method
+       # is called instead of `will_terminate` when the user quits.
+       fun did_enter_background do end
+
+       # The application will enter the foreground
+       #
+       # Called as part of the transition from the background to the
+       # inactive state.
+       #
+       # Redef to und changes made on entering the background.
+       fun will_enter_foreground do end
+
+       # The application just became active
+       #
+       # Redef to restart any tasks that were paused (or not yet started) while
+       # the application was inactive. If the application was previously
+       # in the background, optionally refresh the user interface.
+       fun did_become_active do end
+
+       # The application is about to terminate (not suspended)
+       #
+       # Redef to save data if appropriate.
+       fun will_terminate do end
+end
+
+app.register_args(program_name.to_cstring, args.length, args)
+app.register_globally
+
+var ret = app.ui_application_main
+exit if ret then 0 else 1
diff --git a/lib/ios/examples/hello_ios.nit b/lib/ios/examples/hello_ios.nit
new file mode 100644 (file)
index 0000000..3269906
--- /dev/null
@@ -0,0 +1,54 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Simple iOS app with a single label
+module hello_ios is
+       app_name "Hello iOS"
+       app_namespace "nit.app.hello_ios"
+       app_version(0, 5, git_revision)
+end
+
+import ios
+
+redef class App
+       redef fun did_finish_launching_with_options
+       do
+               return app_delegate.hello_world
+       end
+end
+
+redef class AppDelegate
+
+       # Print and show "Hello World!"
+       private fun hello_world: Bool in "ObjC" `{
+
+               // Print to the console
+               NSLog(@"Hello World!");
+
+               // Display "Hello world!" on the screen
+               recv.window = [[UIWindow alloc] initWithFrame:
+               [[UIScreen mainScreen] bounds]];
+               recv.window.backgroundColor = [UIColor whiteColor];
+
+               UILabel *label = [[UILabel alloc] init];
+               label.text = @"Hello World!";
+               label.center = CGPointMake(100, 100);
+               [label sizeToFit];
+
+               [recv.window addSubview: label];
+               [recv.window makeKeyAndVisible];
+
+               return YES;
+       `}
+end
diff --git a/lib/ios/ios.nit b/lib/ios/ios.nit
new file mode 100644 (file)
index 0000000..9d5079d
--- /dev/null
@@ -0,0 +1,19 @@
+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# iOS services for Nit app on iOS
+module ios
+
+import platform
+import app
diff --git a/lib/ios/platform.nit b/lib/ios/platform.nit
new file mode 100644 (file)
index 0000000..47d1536
--- /dev/null
@@ -0,0 +1,16 @@
+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Triggers compilation for the iOS platform
+module platform is platform "ios"
index 4c552f6..e8c76b4 100644 (file)
@@ -102,7 +102,7 @@ class JsonDeserializer
 
                assert current.keys.has(name)
                var value = current[name]
-               
+
                return convert_object(value)
        end
 
@@ -164,7 +164,7 @@ class JsonDeserializer
                                assert val isa String
 
                                if val.length != 1 then print "Error: expected a single char when deserializing '{val}'."
-                               
+
                                return val.chars.first
                        end
 
index abdcab6..4482a93 100644 (file)
@@ -40,9 +40,15 @@ in "C Header" `{
 class JavaVMBuilder
        super JniEnvRef
 
-       var version: Int = "00010002".to_hex
+       # Version code of the JVM requested by `create_jvm`
+       #
+       # Default at 0x00010002
+       var version = 0x00010002 is writable
+
+       # Additional option strings
        var options = new Array[String]
 
+       # Create the JVM and return it on success
        fun create_jvm: nullable JavaVM
        do
                var args = new JavaVMInitArgs
@@ -69,7 +75,7 @@ class JavaVMBuilder
        end
 end
 
-extern class JavaVMInitArgs `{ JavaVMInitArgs* `}
+private extern class JavaVMInitArgs `{ JavaVMInitArgs* `}
        new `{ return (JavaVMInitArgs*)malloc(sizeof(JavaVMInitArgs)); `}
 
        # Set the defaut config for a VM
@@ -92,7 +98,7 @@ extern class JavaVMInitArgs `{ JavaVMInitArgs* `}
        fun n_options=(v: Int) `{ recv->nOptions = v; `}
 end
 
-extern class JavaVMOption `{ JavaVMOption* `}
+private extern class JavaVMOption `{ JavaVMOption* `}
        fun string: String import NativeString.to_s `{
                return NativeString_to_s((char*)recv->optionString);
        `}
@@ -108,7 +114,7 @@ extern class JavaVMOption `{ JavaVMOption* `}
        `}
 end
 
-extern class JavaVMOptionArray `{ JavaVMOption* `}
+private extern class JavaVMOptionArray `{ JavaVMOption* `}
        new(size: Int) `{ return (JavaVMOption*)malloc(sizeof(JavaVMOption)*size); `}
 
        fun [](i: Int): JavaVMOption `{ return recv+i; `}
@@ -119,7 +125,8 @@ extern class JavaVM `{JavaVM *`}
        # Create the JVM, returns its handle and store the a pointer to JniEnv in `env_ref`
        #
        # Unavailable on Android, where you cannot instanciate a new JVM.
-       new(args: JavaVMInitArgs, env_ref: JniEnvRef) import jni_error, JniEnvRef.jni_env=, JniEnv.as nullable `{
+       private new(args: JavaVMInitArgs, env_ref: JniEnvRef)
+       import jni_error, JniEnvRef.jni_env=, JniEnv.as nullable `{
 
        #ifdef ANDROID
                JavaVM_jni_error(NULL, "JVM creation not supported on Android", 0);
@@ -142,7 +149,7 @@ extern class JavaVM `{JavaVM *`}
                }
        `}
 
-       fun jni_error(msg: NativeString, v: Int)
+       private fun jni_error(msg: NativeString, v: Int)
        do
                print "JNI Error: {msg} ({v})"
                abort
@@ -162,7 +169,7 @@ extern class JavaVM `{JavaVM *`}
                return env;
        `}
 
-       fun attach_current_thread: JniEnv `{
+       fun attach_current_thread: JniEnv import jni_error `{
                JNIEnv *env;
        #ifdef ANDROID
                // the signature is different (better actually) on Android
@@ -180,30 +187,30 @@ end
 
 # Represents a jni JNIEnv, which is a thread in a JavaVM
 extern class JniEnv `{JNIEnv *`}
-       
+
        # Get a class object from its fully-qualified name or null if the class cannot be found
        fun find_class(class_name : String): JClass import String.to_cstring `{
                return (*recv)->FindClass(recv,String_to_cstring(class_name));
        `}
-       
+
        # Return the method id for an instance of a class or interface
        # The method is determined by its name and signature
        # To obtain the method ID of a constructor, supply "<init>" as the method name and "void(V)" as the return type
        fun get_method_id(clazz : JClass, name : String, signature : String): JMethodID import String.to_cstring `{
                return (*recv)->GetMethodID(recv, clazz, String_to_cstring(name), String_to_cstring(signature));
        `}
-       
+
        # Construct a new Java object from the `clazz`, using the constructor Ì€ method_id`
        fun new_object(clazz: JClass, method_id: JMethodID): JavaObject `{
                return (*recv)->NewObject(recv, clazz, method_id);
        `}
-       
+
        # Return the JClass of `obj`
        fun get_object_class(obj: JavaObject): JClass `{
                return (*recv)->GetObjectClass(recv, obj);
        `}
 
-       # Registers native methods with the class specified by the `clazz` argument     
+       # Registers native methods with the class specified by the `clazz` argument
        fun register_natives(clazz: JClass, method: JNINativeMethod, n_method : Int): Int `{
                return (*recv)->RegisterNatives(recv, clazz, method, n_method);
        `}
@@ -214,7 +221,7 @@ extern class JniEnv `{JNIEnv *`}
                (*recv)->CallVoidMethodA(recv, obj, method_id, args_tab);
                free(args_tab);
        `}
-       
+
        # Call a method on `obj` designed by `method_id` with an array `args` of argument returning a JavaObject
        fun call_object_method(obj: JavaObject, method_id: JMethodID, args: nullable Array[nullable Object]): JavaObject import convert_args_to_jni `{
                jvalue * args_tab = JniEnv_convert_args_to_jni(recv, args);
@@ -222,7 +229,7 @@ extern class JniEnv `{JNIEnv *`}
                free(args_tab);
                return res;
        `}
-       
+
        # Call a method on `obj` designed by `method_id` with an array `args` of arguments returning a Bool
        fun call_boolean_method(obj: JavaObject, method_id: JMethodID, args: nullable Array[nullable Object]): Bool import convert_args_to_jni `{
                jvalue * args_tab = JniEnv_convert_args_to_jni(recv, args);
@@ -246,7 +253,7 @@ extern class JniEnv `{JNIEnv *`}
                free(args_tab);
                return res;
        `}
-       
+
        # Call a method on `obj` designed by `method_id` with an array `args` of arguments returning a Float
        fun call_float_method(obj: JavaObject, method_id: JMethodID, args: nullable Array[nullable Object]): Float import convert_args_to_jni `{
                jvalue * args_tab = JniEnv_convert_args_to_jni(recv, args);
@@ -305,7 +312,7 @@ extern class JniEnv `{JNIEnv *`}
        fun get_field_id(clazz: JClass, name: String, sign: String): JFieldID import String.to_cstring `{
                return (*recv)->GetFieldID(recv, clazz, String_to_cstring(name), String_to_cstring(sign));
        `}
-       
+
        # returns the value of an instance (nonstatic) field of an object. The field to access is specified by a field ID obtained by calling get_field_id()
        fun get_object_field(obj: JavaObject, fieldID: JFieldID): JavaObject `{
                return (*recv)->GetObjectField(recv, obj, fieldID);
@@ -314,7 +321,7 @@ extern class JniEnv `{JNIEnv *`}
        fun get_boolean_field(obj: JavaObject, fieldID: JFieldID): Bool `{
                return (*recv)->GetBooleanField(recv, obj, fieldID);
        `}
-       
+
        fun get_char_field(obj: JavaObject, fieldID: JFieldID): Char `{
                return (*recv)->GetCharField(recv, obj, fieldID);
        `}
@@ -341,12 +348,12 @@ extern class JniEnv `{JNIEnv *`}
 
        fun set_int_field(obj: JavaObject, fieldID: JFieldID, value: Int) `{
                (*recv)->SetIntField(recv, obj, fieldID, value);
-       `}              
+       `}
 
        fun set_float_field(obj: JavaObject, fieldID: JFieldID, value: Float) `{
                (*recv)->SetFloatField(recv, obj, fieldID, value);
        `}
-       
+
        # Check for pending exception without creating a local reference to the exception object
        fun exception_check: Bool `{
                return (*recv)->ExceptionCheck(recv);
@@ -371,7 +378,7 @@ extern class JniEnv `{JNIEnv *`}
        fun exception_clear `{
                return (*recv)->ExceptionClear(recv);
        `}
-       
+
        # Raise a fatal error
        fun fatal_error(msg: String) import String.to_cstring `{
                (*recv)->FatalError(recv, String_to_cstring(msg));
@@ -395,7 +402,7 @@ extern class JniEnv `{JNIEnv *`}
        `}
 end
 
-# used to initialize a JavaVM 
+# used to initialize a JavaVM
 class JniEnvRef
        var jni_env: nullable JniEnv = null
 end
@@ -445,11 +452,11 @@ extern class JValue `{jvalue`}
        fun get_boolean:Bool `{
                return recv.z;
        `}
-       
+
        fun set_char(c: Char)`{
                recv.c = c;
        `}
-       
+
        fun get_char: Char `{
                return recv.c;
        `}
index f0b028e..85828aa 100644 (file)
@@ -492,7 +492,7 @@ in "C Header" `{
 redef class String
        # returns the md5 digest of the receiver string
        # algorithm implemented by L. Peter Deutsch <ghost@aladdin.com>
-       fun md5: String import String.to_cstring, NativeString.to_s, String.print `{
+       fun md5: String import String.to_cstring, NativeString.to_s `{
                md5_state_t state;
                md5_byte_t digest[16]; /* result */
                char *hex_output = malloc(33*sizeof(char));
diff --git a/lib/meta.nit b/lib/meta.nit
new file mode 100644 (file)
index 0000000..68ba9f4
--- /dev/null
@@ -0,0 +1,99 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Simple user-defined meta-level to manipulate types of instances as object.
+#
+# Unfortunately, since the meta-objects are user-defined they are provided without
+# any pre-defined information or behavior.
+# For the same reasons, the Nit OO mechanisms do not rely on this user-defined meta-level.
+#
+# However `meta` permits the definition of user-defined meta-classes at any level
+# of meta, even with user-defined meta-loops.
+#
+# ## Meta-classes
+#
+# Meta-classes can be defined easily in 3 steps:
+#
+# * define a root for the class hierarchy (eg `XObject`)
+# * define a meta-class (eq `XClass[E: XObject] super Class[E]`)
+# * redefine `CLASS` and `class_factory` in the root
+#
+# ~~~nitish because broke with nitc, see Limitation bellow
+# class XObject
+#    redef CLASS: XClass[SELF]
+#    redef class_factory(name) do return new XClass[SELF](name)
+# end
+# class XClass[E: XObject] super Class[E] end
+#
+# var x1 = new XObject
+# var x2 = new XObject
+# assert x1.get_class == x2.get_class
+# assert x1.get_class isa XClass[XObject]
+# assert x1.get_class.get_class isa Class[XClass[XObject]]
+# ~~~
+#
+# ## Limitation
+#
+# Currently works only with the interpreter `nit` and the compiler with `--erasure` (without `--rta`).
+#
+# `--rta` will try to detect all the runtime types, and will infinitely discover `Class[Class[Class[....]]]`.
+# Unfortunately, `--separate` and `--global` require `--rta`.
+#
+# Moreover, the interpreter and `--erasure` have a different behavior with generics since
+# with `--erasure` a single meta-instance is shared for all type variations of a same generic class.
+#
+# Class names are used as a primary key to identify classes.
+# But name conflicts are not managed and will make the program crashes at runtime (on some cast error)
+module meta
+
+redef class Object
+       # The meta-object representing the dynamic type of `self`.
+       #
+       # Specific meta-object can be used in subclasses
+       # by redefining `CLASS` and `class_factory`.
+       fun get_class: CLASS do
+               var class_pool = once new HashMap[String, Class[Object]]
+               var name = class_name
+               var res = class_pool.get_or_null(name)
+               if res != null then return res.as(CLASS)
+               res = class_factory(name)
+               assert res.name == name
+               class_pool[name] = res
+               return res
+       end
+
+       # The type of the class of self.
+       # To be redefined in case of specific meta-class.
+       type CLASS: Class[SELF]
+
+       # Implementation used by `get_class` to create the specific class.
+       #
+       # To be redefined to use specific meta-classes.
+       #
+       # Note: Do not forget to update the virtual type `CLASS`.
+       #
+       # REQUIRE: `result.name` == `name`
+       protected fun class_factory(name: String): CLASS
+       do
+               return new Class[SELF](name)
+       end
+end
+
+# This meta-class is the root the meta-class hierarchy
+class Class[E: Object]
+       # The name of the class
+       var name: String
+
+       redef fun to_s do return name
+end
index e7fb184..1b7a017 100644 (file)
@@ -24,8 +24,6 @@ class NumberImages
 
        # Images from 0 to 9
        var imgs: Array[Image]
-
-       private init(imgs: Array[Image]) do self.imgs = imgs
 end
 
 redef class App
index 5bd5d4d..c9dbb16 100644 (file)
@@ -17,7 +17,7 @@ module tileset
 
 import mnit_display
 
-# Efficienly retrieve tiles in a big image
+# Efficiently retrieve tiles in a big image
 class TileSet
        # The image containing the tileset
        var image: Image
@@ -63,20 +63,20 @@ end
 class TileSetFont
        super TileSet
 
-       # Each caracter in the image
+       # Each character in the image
        # in left->right, then top->bottom order
        # Use space (' ') for holes in the tileset
        var chars: String
 
        # Additional space to insert horizontally between characters
-       # A negave value will display tile overlaped
+       # A negative value will display tile overlapped
        var hspace: Numeric = 0.0 is writable
 
        # Additional space to insert vertically between characters
-       # A negave value will display tile overlaped
+       # A negative value will display tile overlapped
        var vspace: Numeric = 0.0 is writable
 
-       # The glyph (tile) associated to the caracter `c` according to `chars`
+       # The glyph (tile) associated to the character `c` according to `chars`
        # Returns null if `c` is not in `chars`
        fun char(c: Char): nullable Image
        do
@@ -84,6 +84,30 @@ class TileSetFont
                if i == -1 then return null
                return subimages[i]
        end
+
+       # Distance between the beginning of a letter tile and the beginning of the next letter tile
+       fun advance: Numeric do return width.add(hspace)
+
+       # Distance between the beginning and the end of the longest line of `text`
+       fun text_width(text: String): Numeric
+       do
+               var lines = text.split('\n')
+               if lines.is_empty then return 0
+
+               var longest = 0
+               for line in lines do longest = longest.max(line.length)
+
+               return longest.mul(advance)
+       end
+
+       # Distance between the top of the first line to the bottom of the last line in `text`
+       fun text_height(text: Text): Numeric
+       do
+               if text.is_empty then return 0
+
+               var n_lines = text.chars.count('\n')
+               return (n_lines+1).mul(height.add(vspace)).sub(vspace)
+       end
 end
 
 redef class Display
diff --git a/lib/noise.nit b/lib/noise.nit
new file mode 100644 (file)
index 0000000..0754d4b
--- /dev/null
@@ -0,0 +1,337 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Provides the noise generators `PerlinNoise` and `InterpolatedNoise`
+module noise
+
+# 2D noise generator
+abstract class Noise
+
+       # Get the noise value at `x`, `y`
+       #
+       # The coordinates `x`, `y` can be floats of any size.
+       #
+       # Returns a value between or equal to `min` and `max`.
+       fun [](x, y: Float): Float is abstract
+
+       # Lowest possible value returned by `[]`
+       #
+       # Default at `0.0`.
+       #
+       # Require: `min < max`
+       var min = 0.0 is writable
+
+       # Highest possible value returned by `[]`
+       #
+       # Default at `1.0`.
+       #
+       # Require: `min < max`
+       var max = 1.0 is writable
+
+       # Distance between reference points of the noise
+       #
+       # Higher values will result in smoother noise and
+       # lower values will result in steeper curves.
+       #
+       # Default at `1.0`.
+       var period = 1.0 is writable
+
+       # Amplitude of the values returned by `[]`
+       fun amplitude: Float do return max - min
+
+       # Set the desired amplitude of the values returned by `[]`
+       #
+       # Will only modify `max`, `min` stays the same.
+       fun amplitude=(value: Float) do max = min + value
+
+       # Frequency of this noise
+       fun frequency: Float do return 1.0/period
+
+       # Set the frequency if this noise
+       fun frequency=(value: Float) do period = 1.0/value
+
+       # Seed to the random number generator `gradient_vector`
+       #
+       # By default, `seed` has a random value created with `Int::rand`.
+       var seed: Int = 19559.rand is lazy, writable
+end
+
+# 2D Perlin noise generator using layered `InterpolatedNoise`
+#
+# Get values at any coordinates with `[]`.
+# The behavior of this generator can be customized using its attributes `min`,
+# `max`, `period` and `seed`.
+#
+# This noise is more realistic and less smooth than the `InterpolatedNoise`.
+#
+# Due to implementation logic, the full amplitude cannot be reached.
+# In practice, only `amplitude * (1.0 - 1.0 / n_levels)` is covered.
+#
+# This implementation uses a custom deterministic pseudo random number
+# generator to set `InterpolatedNoise::seed` of the `layers`.
+# It is seeded with the local `seed` and can be further customized by
+# redefining `pseudo_random`.
+# This process do not require any state, so this class only holds the
+# attributes of the generator and does not keep any generated data.
+#
+# ## Usage example
+#
+# ~~~
+# var map = new PerlinNoise
+# map.min = 0.0
+# map.max = 16.0
+# map.period = 20.0
+# map.seed = 0
+#
+# var max = 0.0
+# var min = 100.0
+# for y in 30.times do
+#     for x in 70.times do
+#         # Get a value at x, y
+#         var val = map[x.to_f, y.to_f]
+#         printn val.to_i.to_hex
+#
+#         max = max.max(val)
+#         min = min.min(val)
+#     end
+#     print ""
+# end
+# assert max <= map.max
+# assert min >= map.min
+# ~~~
+#
+# ## Result at seed == 0
+#
+# ~~~raw
+# 76666555444322234567789abbcbbaabbaa98777766665665566667888987655444444
+# 776665554443322234567789abbbbbbbbba98777766666665556666788998654444444
+# 777766544443322234566789abbbbbbbbaa99877777776665556666788888655444444
+# 777776444443322244556679abbbccbbbaa99877777776655556666688888655444444
+# 777766444444332244555678abbbccbbbaa99887787877655556666678888654444444
+# 8887654344443333444456789abcccbbaa999877888886555555666688777654444455
+# 8887654344443333444456789abbcdcbaa999887889887655555566677777654444456
+# 7876654434444444444456778abbcccaaa999888899888655555566677777654444556
+# 78765544344445544444567789bbccca99999888899988765555566666667654445566
+# 77765444344455554445567889bbccba99999998999988765555566555666654445667
+# 7765444334555665445556788abbbba988998999999988765555566545556554456677
+# 87654444334556655455567899bbbba998888899999887766555566544556555456777
+# 87655444334566665555567899bbbbba98888899988888776555566544556555556777
+# 97655544334566665555567899abbbba98888899988888776555655544456555667777
+# 97655544444566665556667899aaaaba98888999877777776555555444456666667777
+# 866555444456666666566789999aaaaa98889998877777766556544443456667777777
+# 976555445556776666666789aa99aaaa98889998876777666555544444456677887777
+# 9765554556667777776667899999aaaa98889988876676666555443444446678888888
+# 87655555666777788766678999899aaa99889988776666666554433344446789998888
+# 876555566777788888766889998899a999889987776666666543333334456899a99899
+# 766556677877889998877888888889a99998888777666666653222233345799aaa999a
+# 6665556777777899998878988888899999999887777656666543222233446899aa999a
+# 6655456777777899999888988888889999a988887776566666532222233457899a999a
+# 665555677777789999998998888878899aa9888887765666655322222234578899aa9a
+# 665555677777789999a98888888877899aa9888887766666655322222234467899aa9a
+# 65666677667778999aaa988878877789aaa9888887776676654322222344467889aa9a
+# 55566677767788899aaa987777777789aaa9888887776666654322222344567889aaa9
+# 5566767777788889aaaa987777777789aaaa988887777666555432122344556899aaa9
+# 5567777777788889aaaa977777777789aaaa99888777766555543212234555689aaaaa
+# 5667877777889989aaa9876677777889aaaa99888777765554443212334555689aaaaa
+# ~~~
+class PerlinNoise
+       super Noise
+
+       # Desired number of `layers`
+       #
+       # This attribute must be assigned before any call to `layers` or `[]`.
+       #
+       # By default, it is the highest integer under the logarithm base 2
+       # of `amplitude`, or 4, whichever is the highest.
+       var n_layers: Int = 4.max(amplitude.abs.log_base(2.0).to_i) is lazy, writable
+
+       # Layers of `InterpolatedNoise` composing `self`
+       var layers: Array[InterpolatedNoise] is lazy do
+               var layers = new Array[InterpolatedNoise]
+
+               var max = max
+               var min = min
+               var period = period
+               var seed = seed
+               for l in n_layers.times do
+                       min = min / 2.0
+                       max = max / 2.0
+                       seed = pseudo_random(seed)
+
+                       var layer = new InterpolatedNoise
+                       layer.min = min
+                       layer.max = max
+                       layer.period = period
+                       layer.seed = seed
+                       layers.add layer
+
+                       period = period / 2.0
+               end
+               return layers
+       end
+
+       redef fun [](x, y)
+       do
+               var val = 0.0
+               for layer in layers do
+                       val += layer[x, y]
+               end
+               return val
+       end
+
+       # Deterministic pseudo random number generator
+       #
+       # Used to get seeds for layers from the previous layers or `seed`.
+       protected fun pseudo_random(value: Int): Int
+       do
+               return value + 2935391 % 954847
+       end
+end
+
+# Simple interpolated noise
+#
+# Generates smoother noise than `PerlinNoise`.
+#
+# Each coordinates at a multiple of `period` defines a random vector and
+# values in between are interpolated from these vectors.
+#
+# This implementation uses a custom deterministic pseudo random number
+# generator seeded with `seed`.
+# It can be further customized by redefining `gradient_vector`.
+# This process do not require any state, so this class only holds the
+# attributes of the generator and does not keep any generated data.
+#
+# ## Usage example
+#
+# ~~~
+# var map = new InterpolatedNoise
+# map.min = 0.0
+# map.max = 16.0
+# map.period = 20.0
+# map.seed = 0
+#
+# var max = 0.0
+# var min = 100.0
+# for y in 30.times do
+#     for x in 70.times do
+#         # Get a value at x, y
+#         var val = map[x.to_f, y.to_f]
+#         printn val.to_i.to_hex
+#
+#         max = max.max(val)
+#         min = min.min(val)
+#     end
+#     print ""
+# end
+# assert max <= map.max
+# assert min >= map.min
+# ~~~
+#
+# ## Result at seed == 0
+#
+# ~~~raw
+# 89abcddeeeeeeeddcba9877666555555555666778766555544444555566789abcddeee
+# 789abcddeeeeeeddccba887766655555555566677766555544444555566779abcddeee
+# 689abcddeeeeeeeddcba988776655555555555667666555554455555566778abccdeee
+# 678abccdeeeeeeeedccba988766655555555555666655555555555556666789abcddee
+# 5789abcddeeeeeeeddcba998776655544444555666655555555555556666789abcddee
+# 5689abcddeeeeeeeedccba98776655544444455566555555555555566666789abccdde
+# 4679abccdeeeffeeeddcba98776655444444445565555555555555666666789abbcddd
+# 4678abccdeeeffeeeedcba98876555444444444555555555566666666666689aabccdd
+# 46789abcdeeeeffeeedccb988765544443344445555566666666666666666789abccdd
+# 45789abcddeeeffeeeddcb987765544433334445555666666666666666666789abbccd
+# 45789abcddeeeeeeeeddcb987665444333333445556666666777777777766789aabccc
+# 45789abcddeeeeeeeeddca987655443333333445566666777777777777776789aabbcc
+# 45789abcddeeeeeeeedcca9876544333333333455666777777788877777767899aabbc
+# 46789abcddeeeeeeeddcba9876544333222333455667777888888888877767899aabbb
+# 46789abcdddeeeeedddcba87655433222223334566777888889998888877778899aabb
+# 5678aabcdddeeeedddccb987654332222222334566778889999999998887778899aaab
+# 5689abbcddddeedddccba9865443222222223345677889999aaaa99998877788999aaa
+# 6789abbcddddddddccbba8765432221111223345678899aaaaaaaaaa9988778889999a
+# 6789abccdddddddccbba9865433221111122344577899aabbbbbbbaaa9987788889999
+# 789abbccddddddccbba9876543211111111234567899aabbbccccbbbaa987788888899
+# 889abbccdddddccbba9886543211000001123456889abbcccccccccbba988888888888
+# 899abbcccddddcccbaa9875432211000011223457899abbcccccccccbba98888888888
+# 899abbccccddccccbba9876533211000001123456789aabccccddcccbbaa9998888888
+# 899abbccccccccccbbaa9765432111000011223456899abbcccdddcccbba9999988888
+# 899abbbcccccccccbbaa9865432211000011123456789abbccdddddcccbba999988888
+# 899aabbcccccccccbbaa9875433211100001122346789abbccddddddcccbaa99988888
+# 899aabbbcccccccbbbbaa876543211100001122345689aabccdddddddccbaaa9988887
+# 899aabbbbbbccbbbbbbaa876543221110001112335679aabccddddddddcbbaa9988877
+# 899aaabbbbbbbbbbbbbaa9765433211111111123356789abccddddddddccbaa9988777
+# 8999aaaabbbbbbbbbbaaa9765433221111111122356789abccdddeedddccbaa9988777
+# ~~~
+class InterpolatedNoise
+       super Noise
+
+       redef fun [](x, y)
+       do
+               x = x/period
+               y = y/period
+
+               # Get grid coordinates
+               var x0 = if x > 0.0 then x.to_i else x.to_i - 1
+               var x1 = x0 + 1
+               var y0 = if y > 0.0 then y.to_i else y.to_i - 1
+               var y1 = y0 + 1
+
+               # Position in grid
+               var sx = x - x0.to_f
+               var sy = y - y0.to_f
+
+               # Interpolate
+               var n0 = gradient_dot_product(x0, y0, x, y)
+               var n1 = gradient_dot_product(x1, y0, x, y)
+               var ix0 = sx.lerp(n0, n1)
+               n0 = gradient_dot_product(x0, y1, x, y)
+               n1 = gradient_dot_product(x1, y1, x, y)
+               var ix1 = sx.lerp(n0, n1)
+               var val = sy.lerp(ix0, ix1)
+
+               # Return value in [min...max] from val in [-0.5...0.5]
+               val += 0.5
+               return val.lerp(min, max)
+       end
+
+       # Get the component `w` of the gradient unit vector at `x`, `y`
+       #
+       # `w` at 0 targets the X axis, at 1 the Y axis.
+       #
+       # Returns a value between -1.0 and 1.0.
+       #
+       # Require: `w == 0 or w == 1`
+       protected fun gradient_vector(x, y, w: Int): Float
+       do
+               assert w == 0 or w == 1
+
+               # Use our own deterministic pseudo random number generator
+               #
+               # These magic prime numbers were determined good enough by
+               # non-emperical experimentation. They may need to be changed/improved.
+               var i = 17957*seed + 45127*x + 22613*y
+               var mod = 19031
+
+               var angle = (i%mod).to_f*2.0*pi/mod.to_f
+               if w == 0 then return angle.cos
+               return angle.sin
+       end
+
+       private fun gradient_dot_product(ix, iy: Int, x, y: Float): Float
+       do
+               var dx = x - ix.to_f
+               var dy = y - iy.to_f
+
+               return dx*gradient_vector(ix, iy, 0) + dy*gradient_vector(ix, iy, 1)
+       end
+end
index 93afcf1..3288e5c 100644 (file)
@@ -149,20 +149,37 @@ class POSet[E]
                # Update the transitive reduction
                if te.tos.has(f) then return # Skip the reduction if there is a loop
 
-               for x in te.dfroms.to_a do
+               # Remove transitive edges.
+               # Because the sets of direct is iterated, the list of edges to remove
+               # is stored and is applied after the iteration.
+               # The usual case is that no direct edges need to be removed,
+               # so start with a `null` list of edges.
+               var to_remove: nullable Array[E] = null
+               for x in te.dfroms do
                        var xe = self.elements[x]
                        if xe.tos.has(f) then
-                               te.dfroms.remove(x)
+                               if to_remove == null then to_remove = new Array[E]
+                               to_remove.add x
                                xe.dtos.remove(t)
                        end
                end
-               for x in fe.dtos.to_a do
+               if to_remove != null then
+                       for x in to_remove do te.dfroms.remove(x)
+                       to_remove.clear
+               end
+
+               for x in fe.dtos do
                        var xe = self.elements[x]
                        if xe.froms.has(t) then
                                xe.dfroms.remove(f)
-                               fe.dtos.remove(x)
+                               if to_remove == null then to_remove = new Array[E]
+                               to_remove.add x
                        end
                end
+               if to_remove != null then
+                       for x in to_remove do fe.dtos.remove(x)
+               end
+
                fe.dtos.add t
                te.dfroms.add f
        end
index e612dbe..4a117b4 100644 (file)
@@ -11,6 +11,9 @@ This group also provides two optional modules with thread-safe collections:
 
 Theses services are implemented using the POSIX threads.
 
+You can also use the `is threaded` annotation on methods, which makes them run on their own thread.
+Methods with return value or self calls are not supported.
+
 ## Known limitations:
 
 * Most services from the Nit library are not thread-safe. You must manage
diff --git a/lib/pthreads/examples/threaded_example.nit b/lib/pthreads/examples/threaded_example.nit
new file mode 100644 (file)
index 0000000..9a0af4b
--- /dev/null
@@ -0,0 +1,38 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Romain Chanoir <romain.chanoir@viacesi.fr>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# test for threaded annotation
+module threaded_example
+
+import pthreads
+
+# the `is threaded` annotation makes this method run on an other thread
+fun foo is threaded do
+       sys.nanosleep(1,0)
+       print "threaded"
+end
+
+# Parameterized `threaded` method, same as foo, but with parameters
+fun bar(i : Int, s : String) is threaded do
+       sys.nanosleep(2, 0)
+       print i
+       print s
+end
+
+foo
+bar(10, "parameterized and threaded")
+print "main"
+sys.nanosleep(5,0)
index 5d6b80d..8b8de1f 100644 (file)
@@ -19,6 +19,7 @@ module pthreads is
        cflags "-pthread"
        ldflags "-pthread"
        pkgconfig "bdw-gc"
+       new_annotation threaded
 end
 
 #
index eb04677..99d0228 100644 (file)
@@ -29,7 +29,7 @@ import sax::sax_locator
 #      redef fun start_document do
 #              # save the location of the start of the document
 #              # for future use.
-#              start_loc = new SAXLocatorImpl.with(locator)
+#              start_loc = new SAXLocatorImpl.from(locator)
 #      end
 #     end
 #
@@ -62,7 +62,7 @@ class SAXLocatorImpl super SAXLocator
        # Parameters:
        #
        # * `locator`: locator to copy.
-       init with(locator: SAXLocator) do
+       init from(locator: SAXLocator) do
                public_id = locator.public_id
                system_id = locator.system_id
                line_number = locator.line_number
index ae2586b..388febc 100644 (file)
@@ -88,7 +88,7 @@ class SAXParseException
        # caused the error or warning.
        # * `column_number`: column number of the end of the text that
        # caused the error or warning.
-       init with(message: String, public_id: nullable String,
+       init with_info(message: String, public_id: nullable String,
                        system_id: nullable String, line_number: Int, column_number: Int) do
                init(message)
                self.public_id = public_id
index 270ed22..c4afbbf 100644 (file)
@@ -50,7 +50,7 @@ class TestSaxophonit
                expected.document_locator = new SAXLocatorImpl
                expected.start_document
                expected.start_element("", "a", "a", new AttributesImpl)
-               expected.fatal_error(new SAXParseException.with(
+               expected.fatal_error(new SAXParseException.with_info(
                                "The type in the closing tag (`b`) does not match the type " +
                                "in the opening tag (`a`).", null, null, 1, 8))
                expected.end_document
diff --git a/lib/serialization.nit b/lib/serialization.nit
deleted file mode 100644 (file)
index 8a1d1ee..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# This file is part of NIT ( http://www.nitlanguage.org ).
-#
-# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Offers services to serialize a Nit objects to different persistent formats
-module serialization is
-       new_annotation auto_serializable
-end
-
-# Abstract serialization service to be sub-classed by specialized services.
-interface Serializer
-       # Main method of this service, serialize the `object`
-       fun serialize(object: nullable Serializable) is abstract
-
-       # Serialize an object as a "possible" reference, depending of the service
-       fun serialize_reference(object: Serializable) is abstract
-
-       # Serialize an attribute, used by `Serializable::core_serialize_to`
-       fun serialize_attribute(name: String, value: nullable Object)
-       do
-               if not try_to_serialize(value) then
-                       warn("argument {value.class_name}::{name} is not serializable.")
-               end
-       end
-
-       # Serialize `value` is possie, i.e. it is `Serializable` or `null`
-       fun try_to_serialize(value: nullable Object): Bool
-       do
-               if value isa Serializable then
-                       value.serialize_to_or_delay(self)
-               else if value == null then
-                       serialize value
-               else return false
-               return true
-       end
-
-       # Warn of problems and potential errors (such as if an attribute
-       # is not serializable)
-       fun warn(msg: String) do print "Serialization warning: {msg}"
-end
-
-# Abstract deserialization service
-#
-# After initialization of one of its sub-classes, call `deserialize`
-interface Deserializer
-       # Main method of this class, returns a Nit object
-       fun deserialize: nullable Object is abstract
-
-       # Internal method to be implemented by sub-classes
-       fun deserialize_attribute(name: String): nullable Object is abstract
-
-       # Internal method called by objects in creation,
-       # to be implemented by sub-classes
-       fun notify_of_creation(new_object: Object) is abstract
-
-       # Mainly generated method to return the next instance of the givent
-       # class by name
-       fun deserialize_class(class_name: String): Object do
-               print "Error: doesn't know how to deserialize class \"{class_name}\""
-               abort
-       end
-end
-
-# Instances of this class can be passed to `Serializer::serialize`
-interface Serializable
-       # Full or true serialization
-       fun serialize_to(v: Serializer) do v.serialize(self)
-
-       # Body of the serialization of this class
-       # Can be redefed in sub classes and refinements
-       fun core_serialize_to(v: Serializer) do end
-
-       # Whether full serialization (calls `serialize_to`) or place only references
-       fun serialize_to_or_delay(v: Serializer) do v.serialize_reference(self)
-end
-
-# Instances of this class are not delayed and instead serialized immediately
-# This applies mainly to `universal` types
-interface DirectSerializable
-       super Serializable
-
-       redef fun serialize_to_or_delay(v) do serialize_to(v)
-end
-
-redef class Bool super DirectSerializable end
-redef class Char super DirectSerializable end
-redef class Int super DirectSerializable end
-redef class Float super DirectSerializable end
-redef class NativeString super DirectSerializable end
-redef class String super DirectSerializable end
-redef class Array[E] super Serializable end
diff --git a/lib/serialization/README.md b/lib/serialization/README.md
new file mode 100644 (file)
index 0000000..4cbcf64
--- /dev/null
@@ -0,0 +1,254 @@
+# Abstract serialization services
+
+The serialization services are centered around the `auto_serializable` annotation,
+the `Serializable` interface and the implementations of `Serializer` and `Deserializer`.
+
+## The `auto_serializable` annotation
+
+A class annotated with `auto_serializable` identifies it as a subclass of Serializable and
+triggers the generation of customized serialization and deserialization services.
+
+~~~
+import serialization
+
+# Simple serializable class identifying a human
+class Person
+       auto_serializable
+
+       # First and last name
+       var name: String
+
+       # Year of birth (`null` if unknown)
+       var birth: nullable Int
+
+       redef fun ==(o) do return o isa SELF and name == o.name and birth == o.birth
+       redef fun hash do return name.hash
+end
+~~~
+
+The `Person` class also defines `==` and `hash`, this is optional but we will use it to make an important point.
+By definition of a serializable class, an instance can be serialized to a stream, then deserialized.
+The deserialized instance will not be the same instance, but they should be equal.
+So, in this case, we can compare both instances with `==` to test their equality.
+
+Some conditions applies to the classes that can be annotated as `auto_serializable`.
+All attributes of the class must be serializable, runtime errors will be
+raised when trying to serialize non-serializable attributes.
+
+In the class `Person`, all attributes are typed with classes the standards library.
+These common types are defined defined as serializable by this project.
+The attributes could also be typed with user-defined `auto_serializable`
+classes or any other subclass of `Serializable`.
+
+~~~
+# This `auto_serializable` class is composed of two `auto_serializable` attributes
+class Partnership
+       auto_serializable
+
+       var partner_a: Person
+       var partner_b: Person
+
+       redef fun ==(o) do return o isa SELF and partner_a == o.partner_a and partner_b == o.partner_b
+       redef fun hash do return partner_a.hash + 1024*partner_b.hash
+end
+~~~
+
+The `auto_serializable` applies only to the class definition,
+only attributes declared locally will be serialized.
+However, each definition of a class (a refinement or specialization)
+can declare `auto_serializable`.
+
+## Custom serializable classes
+
+The annotation `auto_serializable` should be enough for most cases,
+but in some cases you need more control over the serialization process.
+
+For more control, create a subclass to `Serializable` and redefine `core_serialize_to`.
+This method should use `Serializer::serialize_attribute` to serialize its components.
+`serialize_attribute` works as a dictionary and organize attributes with a key.
+
+You will also need to redefine `Deserializer::deserialize_class` to support this specific class.
+The method should only act on known class names, and call super otherwise.
+
+### Example: the User class
+
+The following example cannot use the `auto_serializable` annotations
+because some of the arguments to the `User` class need special treatment:
+
+* The `name` attribute is perfectly normal, it can be serialized and deserialized
+  directly.
+
+* The `password` attribute must be encrypted before being serialized,
+  and unencrypted on deserialization.
+
+* The `avatar` attributes is kept as ASCII art in memory.
+  It could be serialized as such but it is cleaner to only
+  serialize the path to its source on the file system.
+  The data is reloaded on deserialization.
+
+For this customization, the following code snippet implements
+two serialization services: `User::core_serialize_to` and
+`Deserializer::deserialize_class`.
+
+~~~
+module user_credentials
+
+# User credentials for a website
+class User
+       super Serializable
+
+       # User name
+       var name: String
+
+       # Clear text password
+       var password: String
+
+       # User's avatar image as data blob
+       var avatar: Image
+
+       redef fun core_serialize_to(serializer: Serializer)
+       do
+               # This is the normal serialization process
+               serializer.serialize_attribute("name", name)
+
+               # Serialized an encrypted version of the password
+               #
+               # Obviously, `rot(13)` is not a good encrption
+               serializer.serialize_attribute("pass", password.rot(13))
+
+               # Do not serialize the image, only its path
+               serializer.serialize_attribute("avatar_path", avatar.path)
+       end
+end
+
+redef class Deserializer
+       redef fun deserialize_class(name)
+       do
+               if name == "User" then
+                       # Deserialize normally
+                       var user = deserialize_attribute("name")
+
+                       # Decrypt password
+                       var pass = deserialize_attribute("pass").rot(-13)
+
+                       # Deserialize the path and load the avatar from the file system
+                       var avatar_path = deserialize_attribute("avatar_path")
+                       var avatar = new Image(avatar_path)
+
+                       return new User(user, pass, avatar)
+               end
+
+               return super
+       end
+end
+
+# An image loaded in memory as ASCII art
+#
+# Not really useful for this example, provided for consistency only.
+class Image
+       # Path on the filesystem for `self`
+       var path: String
+
+       # ASCII art composing this image
+       var ascii_art: String = path.read_all is lazy
+end
+
+~~~
+
+See the documentation of the module `serialization::serialization` for more
+information on the services to redefine.
+
+## Serialization services
+
+The `auto_serializable` annotation and the `Serializable` class are used on
+classes specific to the business domain.
+To write (and read) instances of these classes to a persistent format
+you must use implementations of `Serializer` and `Deserializer`.
+
+The main implementations of these services are `JsonSerializer` and `JsonDeserializer`,
+from the `json_serialization` module.
+
+~~~
+import json_serialization
+import user_credentials
+
+# Data to be serialized and deserialized
+var couple = new Partnership(
+       new Person("Alice", 1985, new Image("alice.png")),
+       new Person("Bob", null, new Image("bob.png")))
+
+var path = "serialized_data.json"
+var writer = new FileWriter(path)
+var serializer = new JsonSerializer(writer)
+serializer.serialize couple
+writer.close
+
+var reader = new FileReader(path)
+var deserializer = new JsonDeserializer(reader.to_s)
+var deserialized_couple = deserializer.deserialize
+reader.close
+
+assert couple == deserialize_couple
+~~~
+
+## Limitations and TODO
+
+The serialization has some limitations:
+
+* Not enough classes from the standard library are supported.
+  This only requires someone to actually code the support.
+  It should not be especially hard for most classes, some can
+  simply declare the `auto_serializable` annotation.
+
+* A limitation of the Json parser prevents deserializing from files
+  with more than one object.
+  This could be improved in the future, but for now you should
+  serialize a single object to each filesand use different instances of
+  serializer and deserializer each time.
+
+* The `auto_serializable` annotation does not handle very well
+  complex constructors. This could be improved in the compiler.
+  For now, you may prefer to use `auto_serializable` on simple classes,
+  of by using custom `Serializable`.
+
+* The serialization uses only the short name of a class, not its qualified name.
+  This will cause problem when different classes using the same name.
+  This could be solved partially in the compiler and the library.
+  A special attention must be given to the consistency of the name across
+  the different programs sharing the serialized data.
+
+* The serialization support in the compiler need some help to
+  deal with generic types. The solution is to use `nitserial`,
+  the next section explores this subject.
+
+## Dealing with generic types
+
+One limitation of the serialization support in the compiler is with generic types.
+For example, the `Array` class is generic and serializable.
+However, the runtime types of Array instances are parameterized and are unknown to the compiler.
+So the compiler won't support serializing instances of `Array[MySerializable]`.
+
+The tool `nitserial` solves this problem at the level of user modules.
+It does so by parsing a Nit module, group or project to find all known
+parameterized types of generic classes.
+It will then generating a Nit module to handle deserialization of these types.
+
+Usage steps to serialize parameterized types:
+
+* Write your program, let's call it `my_prog.nit`,
+  it must use some parameterized serializable types.
+  Let's say that you use `Array[MySerializable]`.
+
+* Run nitserial using `nitserial my_prog.nit` to
+  generate the file `my_prog_serial.nit`.
+
+* Compile your program by mixing in the generated module with:
+  `nitc my_prog.nit -m my_prog_serial.nit`
+
+This was a simple example, in practical cases you may need
+to use more than one generated file.
+For example, on a client/server system, an instance can be created
+server-side, serialized and the used client-side.
+In this case, two files will be generated by nitserial,
+one for the server and one for the client.
+Both the files should be compiled with both the client and the server.
diff --git a/lib/serialization/serialization.nit b/lib/serialization/serialization.nit
new file mode 100644 (file)
index 0000000..31f98f0
--- /dev/null
@@ -0,0 +1,153 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Abstract services to serialize Nit objects to different formats
+#
+# This module declares the `auto_serializable` annotation to mark Nit classes as serializable.
+# For an introduction to this service, refer to the documentation of the `serialization` group.
+# This documentation provides more technical information on interesting entitie of this module.
+#
+# Interesting entities for end users of serializable classes:
+#
+# * Serialize an instance subclass of `Serializable` with either
+#   `Serializer::serializable` and `Serializable::serialize`.
+# * Deserialize an object using `Deserializer::deserialize`.
+#   The object type must the be checked with an `assert` or otherwise.
+#
+# Interesting entities to create custom serializable classes:
+#
+# * Subclass `Serializable` to declare a class as serializable and to customize
+#   the serialization and deserialization behavior.
+# * Redefine `Serializable::core_serialize_to` to customize the serialization
+#   of the receiver class.
+# * Redefine `Deserializer::deserialize_class` to customize the deserialization
+#   of a specific class by name.
+#
+# Interesting entities for serialization format:
+#
+# * Subclass `Serializer` and `Deserializer` with custom serices.
+# * In `Serializer`, `serialize` and `serialize_reference` must be redefined.
+# * In `Deserializer`; `deserialize`, `deserialize_attribute and
+#   `notify_of_creation` must be redefined.
+module serialization is
+       new_annotation auto_serializable
+end
+
+# Abstract serialization service to be sub-classed by specialized services.
+interface Serializer
+       # Entry point method of this service, serialize the `object`
+       #
+       # This method, and refinements, should handle `null` and probably
+       # use double dispatch to customize the bahavior per serializable objects.
+       fun serialize(object: nullable Serializable) is abstract
+
+       # Serialize an object, with full serialization or a simple reference
+       protected fun serialize_reference(object: Serializable) is abstract
+
+       # Serialize an attribute to compose a serializable object
+       #
+       # This method should be called from `Serializable::core_serialize_to`.
+       fun serialize_attribute(name: String, value: nullable Object)
+       do
+               if not try_to_serialize(value) then
+                       warn("argument {value.class_name}::{name} is not serializable.")
+               end
+       end
+
+       # Serialize `value` is possie, i.e. it is `Serializable` or `null`
+       fun try_to_serialize(value: nullable Object): Bool
+       do
+               if value isa Serializable then
+                       value.serialize_to_or_delay(self)
+               else if value == null then
+                       serialize value
+               else return false
+               return true
+       end
+
+       # Warn of problems and potential errors (such as if an attribute
+       # is not serializable)
+       fun warn(msg: String) do print "Serialization warning: {msg}"
+end
+
+# Abstract deserialization service
+#
+# After initialization of one of its sub-classes, call `deserialize`
+interface Deserializer
+       # Main method of this class, returns a Nit object
+       fun deserialize: nullable Object is abstract
+
+       # Internal method to be implemented by sub-classes
+       fun deserialize_attribute(name: String): nullable Object is abstract
+
+       # Internal method called by objects in creation,
+       # to be implemented by sub-classes
+       fun notify_of_creation(new_object: Object) is abstract
+
+       # Deserialize the next available object as an instance of `class_name`
+       #
+       # Returns the deserialized object on success, aborts on error.
+       #
+       # This method should be redefined for each custom subclass of `Serializable`.
+       # All refinement should look for a precise `class_name` and call super
+       # on unsupported classes.
+       fun deserialize_class(class_name: String): Object do
+               print "Error: doesn't know how to deserialize class \"{class_name}\""
+               abort
+       end
+end
+
+# Instances of this class can be passed to `Serializer::serialize`
+interface Serializable
+       # Serialize `self` to `serializer`
+       #
+       # This is a shortcut to `Serializer::serialize`.
+       fun serialize_to(serializer: Serializer) do serializer.serialize(self)
+
+       # Actual serialization of `self` to `serializer`
+       #
+       # This writes the full data of `self` to `serializer`.
+       #
+       # This method can be redefined in sub classes and refinements.
+       # It should use `Serializer::serialize_attribute` to to register real or
+       # logical attributes.
+       #
+       # Any refinement should have its equivalent refinement of
+       # `Deserializer::deserialize_class` to support this custom deserialization.
+       fun core_serialize_to(serializer: Serializer) do end
+
+       # Accept references or force direct serialization (using `serialize_to`)
+       #
+       # The subclass change the default behavior, which will accept references,
+       # to force to always serialize copies of `self`.
+       private fun serialize_to_or_delay(v: Serializer) do v.serialize_reference(self)
+end
+
+# Instances of this class are not delayed and instead serialized immediately
+# This applies mainly to `universal` types
+interface DirectSerializable
+       super Serializable
+
+       redef fun serialize_to_or_delay(v) do serialize_to(v)
+end
+
+redef class Bool super DirectSerializable end
+redef class Char super DirectSerializable end
+redef class Int super DirectSerializable end
+redef class Float super DirectSerializable end
+redef class NativeString super DirectSerializable end
+redef class String super DirectSerializable end
+redef class Array[E] super Serializable end
index f9709da..58482a8 100644 (file)
@@ -244,82 +244,82 @@ redef class Process
 end
 
 # Hang up detected on controlling terminal or death of controlling process
-protected fun sighup: Int do return 1
+fun sighup: Int do return 1
 
 # Issued if the user sends an interrupt signal
-protected fun sigint: Int do return 2
+fun sigint: Int do return 2
 
 # Issued if the user sends a quit signal
-protected fun sigquit: Int do return 3
+fun sigquit: Int do return 3
 
 # Issued if the user attempts to execute an illegal, malformed, unknown, or privileged instruction
-protected fun sigill: Int do return 4
+fun sigill: Int do return 4
 
 # Issued when an exception occurs: a condition that a debugger has requested to be informed of
-protected fun sigtrap: Int do return 5
+fun sigtrap: Int do return 5
 
 # This signal is sent to a process to tell it to abort, i. e. to terminate
-protected fun sigabrt: Int do return 6
+fun sigabrt: Int do return 6
 
 # This signal is sent to a process when it causes a bus error
-protected fun sigbus: Int do return 7
+fun sigbus: Int do return 7
 
 # Issued if an illegal mathematical operation is attempted
-protected fun sigfpe: Int do return 8
+fun sigfpe: Int do return 8
 
 # If a process gets this signal it must quit immediately and will not perform any clean-up operations
-protected fun sigkill: Int do return 9
+fun sigkill: Int do return 9
 
 # Sent to a process to indicate user-defined conditions
-protected fun sigusr1: Int do return 10
+fun sigusr1: Int do return 10
 
 # Sent to a process when it makes an invalid virtual memory reference, or segmentation fault
-protected fun sigsegv: Int do return 11
+fun sigsegv: Int do return 11
 
 # Sent to a process to indicate user-defined conditions
-protected fun sigusr2: Int do return 12
+fun sigusr2: Int do return 12
 
 # Sent to a process when it attempts to write to a pipe without a process connected to the other end
-protected fun sigpipe: Int do return 13
+fun sigpipe: Int do return 13
 
 # Alarm Clock signal
-protected fun sigalarm: Int do return 14
+fun sigalarm: Int do return 14
 
 # Software termination signal
-protected fun sigterm: Int do return 15
+fun sigterm: Int do return 15
 
 # Sent to a process when a child process terminates or is interrupted
-protected fun sigchild: Int do return 17
+fun sigchild: Int do return 17
 
 # Tell the operating system to continue (restart) a process previously paused by the SIGSTOP or SIGTSTP signal
-protected fun sigcont: Int do return 18
+fun sigcont: Int do return 18
 
 # Tell the operating system to stop a process
-protected fun sigstop: Int do return 19
+fun sigstop: Int do return 19
 
 # Sent to a process by its terminal to request it to stop temporarily
-protected fun sigtstp: Int do return 20
+fun sigtstp: Int do return 20
 
 # Sent to a process when a socket has urgent or out-of-band data available to read
-protected fun sigurg: Int do return 23
+fun sigurg: Int do return 23
 
 # Sent to a process when it has used the CPU for a duration that exceeds a user-settable value
-protected fun sigxcpu: Int do return 24
+fun sigxcpu: Int do return 24
 
 # Sent to a process when it grows a file larger than the maximum allowed size
-protected fun sigxfsz: Int do return 25
+fun sigxfsz: Int do return 25
 
 # Virtual timer expired
-protected fun sigvtalrm: Int do return 26
+fun sigvtalrm: Int do return 26
 
 # Profiling timer expired
-protected fun sigprof: Int do return 27
+fun sigprof: Int do return 27
 
 # Sent to a process when its controlling terminal changes its window size 
-protected fun sigwinch: Int do return 28
+fun sigwinch: Int do return 28
 
 # Sent to a process when the system experiences a power failure
-protected fun sigpwr: Int do return 30
+fun sigpwr: Int do return 30
 
 # Sent to a process when it passes a bad argument to a system call
-protected fun sigsys: Int do return 31
+fun sigsys: Int do return 31
index 42c7e00..681e239 100644 (file)
@@ -204,7 +204,7 @@ class TCPServer
                        closed = true
                        return
                end
-               addrin = new NativeSocketAddrIn.with(port, new NativeSocketAddressFamilies.af_inet)
+               addrin = new NativeSocketAddrIn.with_port(port, new NativeSocketAddressFamilies.af_inet)
                address = addrin.address
 
                # Bind it
index 44aff9e..8758cdf 100644 (file)
@@ -238,7 +238,7 @@ extern class NativeSocketAddrIn `{ struct sockaddr_in* `}
                return sai;
        `}
 
-       new with(port: Int, family: NativeSocketAddressFamilies) `{
+       new with_port(port: Int, family: NativeSocketAddressFamilies) `{
                struct sockaddr_in *sai = NULL;
                sai = malloc(sizeof(struct sockaddr_in));
                sai->sin_family = family;
index 858d569..1b1e71e 100644 (file)
@@ -66,6 +66,14 @@ interface Collection[E]
        #     assert [1..1[.is_empty   == true
        fun is_empty: Bool do return length == 0
 
+       # Alias for `not is_empty`.
+       #
+       # Some people prefer to have conditions grammatically easier to read.
+       #
+       #     assert [1,2,3].not_empty  == true
+       #     assert [1..1[.not_empty   == false
+       fun not_empty: Bool do return not self.is_empty
+
        # Number of items in the collection.
        #
        #     assert [10,20,30].length == 3
@@ -203,7 +211,7 @@ end
 #
 # Used to pass arguments by reference.
 #
-# Also used when one want to give asingle element when a full
+# Also used when one want to give a single element when a full
 # collection is expected
 class Container[E]
        super Collection[E]
@@ -416,7 +424,14 @@ interface MapRead[K, V]
                return default
        end
 
-       # Alias for `keys.has`
+       # Is there an item associated with `key`?
+       #
+       #     var x = new HashMap[String, Int]
+       #     x["four"] = 4
+       #     assert x.has_key("four") == true
+       #     assert x.has_key("five") == false
+       #
+       # By default it is a synonymous to `keys.has` but could be redefined with a direct implementation.
        fun has_key(key: K): Bool do return self.keys.has(key)
 
        # Get a new iterator on the map.
@@ -466,6 +481,49 @@ interface MapRead[K, V]
        # Note: the value is returned *as is*, implementations may want to store the value in the map before returning it
        # @toimplement
        protected fun provide_default_value(key: K): V do abort
+
+       # Does `self` and `other` have the same keys associated with the same values?
+       #
+       # ~~~
+       # var a = new HashMap[String, Int]
+       # var b = new ArrayMap[Object, Numeric]
+       # assert a == b
+       # a["one"] = 1
+       # assert a != b
+       # b["one"] = 1
+       # assert a == b
+       # b["one"] = 2
+       # assert a != b
+       # ~~~
+       redef fun ==(other)
+       do
+               if not other isa MapRead[nullable Object, nullable Object] then return false
+               if other.length != self.length then return false
+               for k, v in self do
+                       if not other.has_key(k) then return false
+                       if other[k] != v then return false
+               end
+               return true
+       end
+
+       # A hashcode based on the hashcode of the keys and the values.
+       #
+       # ~~~
+       # var a = new HashMap[String, Int]
+       # var b = new ArrayMap[Object, Numeric]
+       # a["one"] = 1
+       # b["one"] = 1
+       # assert a.hash == b.hash
+       # ~~~
+       redef fun hash
+       do
+               var res = length
+               for k, v in self do
+                       if k != null then res += k.hash * 7
+                       if v != null then res += v.hash * 11
+               end
+               return res
+       end
 end
 
 # Maps are associative collections: `key` -> `item`.
@@ -963,6 +1021,8 @@ interface CoupleMap[K, V]
                        return c.second
                end
        end
+
+       redef fun has_key(key) do return couple_at(key) != null
 end
 
 # Iterator on CoupleMap
index ae351cf..cdb5242 100644 (file)
@@ -13,7 +13,9 @@
 
 # This module introduces the standard array structure.
 # It also implements two other abstract collections : ArrayMap and ArraySet
-module array
+module array is
+       no_warning "useless-type-test" # to avoid warning with nitc while compiling with c_src
+end
 
 import abstract_collection
 
@@ -130,8 +132,70 @@ abstract class AbstractArrayRead[E]
                end
        end
 
-       redef fun iterator: ArrayIterator[E] do return new ArrayIterator[E](self)
+       redef fun iterator: ArrayIterator[E] do
+               var res = _free_iterator
+               if res == null then return new ArrayIterator[E](self)
+               res._index = 0
+               _free_iterator = null
+               return res
+       end
+
+       # An old iterator, free to reuse.
+       # Once an iterator is `finish`, it become reusable.
+       # Since some arrays are iterated a lot, this avoid most of the
+       # continuous allocation/garbage-collection of the needed iterators.
+       private var free_iterator: nullable ArrayIterator[E] = null
+
        redef fun reverse_iterator do return new ArrayReverseIterator[E](self)
+
+       # Returns a sub-array containing `count` elements starting from `from`.
+       #
+       # For most cases (see other case bellow),
+       # the first element is `from` and
+       # the last element is `from+count-1`.
+       #
+       # ~~~
+       # var a = [10, 20, 30, 40, 50]
+       # assert a.sub(0, 3) == [10, 20, 30]
+       # assert a.sub(3, 2) == [40, 50]
+       # assert a.sub(3, 1) == [40]
+       # ~~~
+       #
+       # If `count` is 0 or negative then an empty array is returned
+       #
+       # ~~~
+       # assert a.sub(3,0).is_empty
+       # assert a.sub(3,-1).is_empty
+       # ~~~
+       #
+       # If `from < 0` or `from+count>length` then inexistent elements are ignored.
+       # In this case the length of the result is lower than count.
+       #
+       # ~~~
+       # assert a.sub(-2, 4)  == [10, 20]
+       # assert a.sub(4, 99)  == [50]
+       # assert a.sub(-9, 99) == [10,20,30,40,50]
+       # assert a.sub(-99, 9).is_empty
+       # ~~~
+       fun sub(from: Int, count: Int): Array[E] do
+               if from < 0 then
+                       count += from
+                       from = 0
+               end
+               if count < 0 then
+                       count = 0
+               end
+               var to = from + count
+               if to > length then
+                       to = length
+               end
+               var res = new Array[E].with_capacity(to - from)
+               while from < to do
+                       res.add(self[from])
+                       from += 1
+               end
+               return res
+       end
 end
 
 # Resizable one dimension array of objects.
@@ -252,6 +316,7 @@ end
 #     assert a == b
 class Array[E]
        super AbstractArray[E]
+       super Cloneable
 
        redef fun [](index)
        do
@@ -393,6 +458,29 @@ class Array[E]
                return true
        end
 
+       # Shallow clone of `self`
+       #
+       # ~~~
+       # var a = [1,2,3]
+       # var b = a.clone
+       # assert a == b
+       # a.add 4
+       # assert a != b
+       # b.add 4
+       # assert a == b
+       # ~~~
+       #
+       # Note that the clone is shallow and elements are shared between `self` and the result.
+       #
+       # ~~~
+       # var aa = [a]
+       # var bb = aa.clone
+       # assert aa == bb
+       # aa.first.add 5
+       # assert aa == bb
+       # ~~~
+       redef fun clone do return to_a
+
        # Concatenation of arrays.
        #
        # Returns a new array built by concatenating `self` and `other` together.
@@ -453,6 +541,8 @@ private class ArrayIterator[E]
        redef var index = 0
 
        var array: AbstractArrayRead[E]
+
+       redef fun finish do _array._free_iterator = self
 end
 
 private class ArrayReverseIterator[E]
@@ -473,6 +563,7 @@ end
 # A set implemented with an Array.
 class ArraySet[E]
        super Set[E]
+       super Cloneable
 
        # The stored elements.
        private var array: Array[E] is noinit
@@ -519,6 +610,37 @@ class ArraySet[E]
        init with_capacity(i: Int) do _array = new Array[E].with_capacity(i)
 
        redef fun new_set do return new ArraySet[E]
+
+       # Shallow clone of `self`
+       #
+       # ~~~
+       # var a = new ArraySet[Int]
+       # a.add 1
+       # a.add 2
+       # var b = a.clone
+       # assert a == b
+       # a.add 3
+       # assert a != b
+       # b.add 3
+       # assert a == b
+       # ~~~
+       #
+       # Note that the clone is shallow and keys and values are shared between `self` and the result.
+       #
+       # ~~~
+       # var aa = new ArraySet[Array[Int]]
+       # aa.add([1,2])
+       # var bb = aa.clone
+       # assert aa == bb
+       # aa.first.add 5
+       # assert aa == bb
+       # ~~~
+       redef fun clone
+       do
+               var res = new ArraySet[E]
+               res.add_all self
+               return res
+       end
 end
 
 # Iterators on sets implemented with arrays.
@@ -538,6 +660,7 @@ end
 # Associative arrays implemented with an array of (key, value) pairs.
 class ArrayMap[K, E]
        super CoupleMap[K, E]
+       super Cloneable
 
        # O(n)
        redef fun [](key)
@@ -561,8 +684,8 @@ class ArrayMap[K, E]
                end
        end
 
-       redef var keys: RemovableCollection[K] = new ArrayMapKeys[K, E](self)
-       redef var values: RemovableCollection[E] = new ArrayMapValues[K, E](self)
+       redef var keys: RemovableCollection[K] = new ArrayMapKeys[K, E](self) is lazy
+       redef var values: RemovableCollection[E] = new ArrayMapValues[K, E](self) is lazy
 
        # O(1)
        redef fun length do return _items.length
@@ -616,6 +739,35 @@ class ArrayMap[K, E]
                end
                return -1
        end
+
+       # Shallow clone of `self`
+       #
+       # ~~~
+       # var a = new ArrayMap[String,Int]
+       # a["one"] = 1
+       # a["two"] = 2
+       # var b = a.clone
+       # assert a == b
+       # a["zero"] = 0
+       # assert a != b
+       # ~~~
+       #
+       # Note that the clone is shallow and keys and values are shared between `self` and the result.
+       #
+       # ~~~
+       # var aa = new ArrayMap[String, Array[Int]]
+       # aa["two"] = [1,2]
+       # var bb = aa.clone
+       # assert aa == bb
+       # aa["two"].add 5
+       # assert aa == bb
+       # ~~~
+       redef fun clone
+       do
+               var res = new ArrayMap[K,E]
+               res.recover_with self
+               return res
+       end
 end
 
 private class ArrayMapKeys[K, E]
index b62d876..e5ff507 100644 (file)
@@ -272,8 +272,9 @@ class HashMap[K, V]
                enlarge(0)
        end
 
-       redef var keys: RemovableCollection[K] = new HashMapKeys[K, V](self)
-       redef var values: RemovableCollection[V] = new HashMapValues[K, V](self)
+       redef var keys: RemovableCollection[K] = new HashMapKeys[K, V](self) is lazy
+       redef var values: RemovableCollection[V] = new HashMapValues[K, V](self) is lazy
+       redef fun has_key(k) do return node_at(k) != null
 end
 
 # View of the keys of a HashMap
index cfcc376..00c45a3 100644 (file)
@@ -250,6 +250,81 @@ interface Comparator
 
 end
 
+redef class MapRead[K,V]
+       # Return an array of all values sorted with their keys using `comparator`.
+       #
+       # ~~~
+       # var map = new HashMap[Int, String]
+       # map[10] = "ten"
+       # map[2]  = "two"
+       # map[1]  = "one"
+       # assert map.values_sorted_by_key(default_comparator) == ["one", "two", "ten"]
+       # assert map.values_sorted_by_key(alpha_comparator) == ["one", "ten", "two"]
+       # ~~~
+       fun values_sorted_by_key(comparator: Comparator): Array[V]
+       do
+               var keys = self.keys.to_a
+               comparator.sort(keys)
+               return [for k in keys do self[k]]
+       end
+
+       # Return an array of all keys sorted with their values using `comparator`.
+       #
+       # ~~~
+       # var map = new HashMap[String, Int]
+       # map["ten"] = 10
+       # map["two"] = 2
+       # map["one"] = 1
+       # assert map.keys_sorted_by_values(default_comparator) == ["one", "two", "ten"]
+       # assert map.keys_sorted_by_values(alpha_comparator) == ["one", "ten", "two"]
+       # ~~~
+       #
+       # See: `to_map_comparator` to get the comparator used internally.
+       fun keys_sorted_by_values(comparator: Comparator): Array[K]
+       do
+               var keys = self.keys.to_a
+               var map_cmp = to_map_comparator(comparator)
+               map_cmp.sort(keys)
+               return keys
+       end
+
+       # A comparator that compares things with their values in self.
+       #
+       # See `MapComparator` for details.
+       fun to_map_comparator(comparator: Comparator): MapComparator[K, V] do return new MapComparator[K,V](self, comparator)
+end
+
+# A comparator that compares things with their values in a map.
+#
+# ~~~
+# var map = new HashMap[String, Int]
+# map["ten"] = 10
+# map["two"] = 2
+# map["one"] = 1
+#
+# var map_cmp = map.to_map_comparator(default_comparator)
+# var a = ["ten", "one", "two"]
+# map_cmp.sort(a)
+# assert a == ["one", "two", "ten"]
+# map_cmp = map.to_map_comparator(alpha_comparator)
+# map_cmp.sort(a)
+# assert a == ["one", "ten", "two"]
+# ~~~
+class MapComparator[K,V]
+       super Comparator
+
+       # What is compared are the keys of the values
+       redef type COMPARED: K
+
+       # The map that associates compared elements to the value used to compare them
+       var map: MapRead[K,V]
+
+       # The comparator used to compare values
+       var comparator: Comparator
+
+       redef fun compare(a,b) do return comparator.compare(map[a], map[b])
+end
+
 # This comparator uses the operator `<=>` to compare objects.
 # see `default_comparator` for an easy-to-use general stateless default comparator.
 class DefaultComparator
index 4df80b5..12c9c86 100644 (file)
@@ -33,10 +33,46 @@ import hash_collection
 # The methods `in_same_subset`, `to_partitions`, and their variations are offered instead.
 class DisjointSet[E]
        super SimpleCollection[E]
+       super Cloneable
 
        # The node in the hiearchical structure for each element
        private var nodes = new HashMap[E, DisjointSetNode]
 
+       # Copy constructor
+       init from(other: DisjointSet[E])
+       do
+               # Associate a root node in other to the associated root node in self
+               var map = new HashMap[DisjointSetNode, DisjointSetNode]
+               for e, v in other.nodes do
+                       # Create the associated node
+                       var n2 = new DisjointSetNode
+                       nodes[e] = n2
+
+                       # Get the root node in other and the associated one in self
+                       var p = other.find(e)
+                       var p2 = map.get_or_null(p)
+                       if p2 == null then
+                               # if no associated root node, then a new subset is created
+                               map[p] = n2.parent
+                               number_of_subsets += 1
+                       else
+                               # else attach the new node to the subset of the root node
+                               n2.parent = p2
+                       end
+               end
+       end
+
+       # Shallow copy
+       #
+       #     var s = new DisjointSet[Int]
+       #     s.add_all([1,2,3,4,5])
+       #     s.union_all([1,4,5])
+       #     var s2 = s.clone
+       #     assert s2.number_of_subsets == 3
+       #     assert s2.all_in_same_subset([1,4,5]) == true
+       #     assert s2.in_same_subset(1,2) == false
+       redef fun clone do return new DisjointSet[E].from(self)
+
        # The number of subsets in the partition
        #
        #     var s = new DisjointSet[Int]
index d9a0704..8cd2f70 100644 (file)
@@ -129,7 +129,9 @@ class ProcessWriter
        redef fun execute
        do
                super
-               stream_out = new FileWriter.from_fd(data.in_fd)
+               var out = new FileWriter.from_fd(data.in_fd)
+               out.set_buffering_mode(0, sys.buffer_mode_none)
+               stream_out = out
        end
 end
 
index 317e909..93f5f9b 100644 (file)
@@ -142,3 +142,12 @@ void exec_NativeProcess_NativeProcess_wait_0(void*d) {
                data->running = 0;
        }
 }
+
+int string_NativeString_NativeString_system_0(const char *cmd) {
+       int status = system(cmd);
+       if (WIFSIGNALED(status) && WTERMSIG(status) == SIGINT) {
+               // cmd exited on SIGINT: in my opinion the user wants the main to be discontinued
+               kill(getpid(), SIGINT);
+       }
+       return status;
+}
index c6a59d4..fbd040a 100644 (file)
@@ -31,7 +31,7 @@ struct se_exec_data {
 
 se_exec_data_t* exec_Process_Process_basic_exec_execute_4(void *, char *, char *, int, int);
 
-#define string_NativeString_NativeString_system_0(self) (system(self))
+int string_NativeString_NativeString_system_0(const char*);
 
 #define exec_NativeProcess_NativeProcess_id_0(self) (((se_exec_data_t*)self)->id)
 #define exec_NativeProcess_NativeProcess_status_0(self) (((se_exec_data_t*)self)->status)
index 2009a50..bb87a6f 100644 (file)
@@ -42,11 +42,36 @@ abstract class FileStream
        private var file: nullable NativeFile = null
 
        # The status of a file. see POSIX stat(2).
-       fun file_stat: NativeFileStat do return _file.file_stat
+       #
+       #     var f = new FileReader.open("/etc/issue")
+       #     assert f.file_stat.is_file
+       #
+       # Return null in case of error
+       fun file_stat: nullable FileStat
+       do
+               var stat = _file.file_stat
+               if stat.address_is_null then return null
+               return new FileStat(stat)
+       end
 
        # File descriptor of this file
        fun fd: Int do return _file.fileno
 
+       redef fun close
+       do
+               if _file == null then return
+               if _file.address_is_null then
+                       if last_error != null then return
+                       last_error = new IOError("Cannot close unopened file")
+                       return
+               end
+               var i = _file.io_close
+               if i != 0 then
+                       last_error = new IOError("Close failed due to error {sys.errno.strerror}")
+               end
+               _file = null
+       end
+
        # Sets the buffering mode for the current FileStream
        #
        # If the buf_size is <= 0, its value will be 512 by default
@@ -72,6 +97,11 @@ class FileReader
 
        # Open the same file again.
        # The original path is reused, therefore the reopened file can be a different file.
+       #
+       #     var f = new FileReader.open("/etc/issue")
+       #     var l = f.read_line
+       #     f.reopen
+       #     assert l == f.read_line
        fun reopen
        do
                if not eof and not _file.address_is_null then close
@@ -89,11 +119,9 @@ class FileReader
 
        redef fun close
        do
-               if _file == null or _file.address_is_null then return
-               var i = _file.io_close
+               super
                _buffer.clear
                end_reached = true
-               _file = null
        end
 
        redef fun fill_buffer
@@ -111,6 +139,16 @@ class FileReader
        redef var end_reached: Bool = false
 
        # Open the file at `path` for reading.
+       #
+       #     var f = new FileReader.open("/etc/issue")
+       #     assert not f.end_reached
+       #     f.close
+       #
+       # In case of error, `last_error` is set
+       #
+       #     f = new FileReader.open("/fail/does not/exist")
+       #     assert f.end_reached
+       #     assert f.last_error != null
        init open(path: String)
        do
                self.path = path
@@ -122,6 +160,9 @@ class FileReader
                end
        end
 
+       # Creates a new File stream from a file descriptor
+       #
+       # This is a low-level method.
        init from_fd(fd: Int) do
                self.path = ""
                prepare_buffer(1)
@@ -150,24 +191,12 @@ class FileWriter
                else
                        for i in s.substrings do write_native(i.to_cstring, i.length)
                end
-               _file.flush
        end
 
        redef fun close
        do
-               if _file == null then return
-               if _file.address_is_null then
-                       if last_error != null then return
-                       last_error = new IOError("Cannot close unopened write stream")
-                       _is_writable = false
-                       return
-               end
-               var i = _file.io_close
-               if i != 0 then
-                       last_error = new IOError("Close failed due to error {sys.errno.strerror}")
-               end
+               super
                _is_writable = false
-               _file = null
        end
        redef var is_writable = false
 
@@ -223,18 +252,20 @@ redef class Int
 end
 
 # Constant for read-only file streams
-private fun read_only: NativeString do return "r".to_cstring
+private fun read_only: NativeString do return once "r".to_cstring
 
 # Constant for write-only file streams
 #
 # If a stream is opened on a file with this method,
 # it will wipe the previous file if any.
 # Else, it will create the file.
-private fun wipe_write: NativeString do return "w".to_cstring
+private fun wipe_write: NativeString do return once "w".to_cstring
 
 ###############################################################################
 
 # Standard input stream.
+#
+# The class of the default value of `sys.stdin`.
 class Stdin
        super FileReader
 
@@ -248,16 +279,21 @@ class Stdin
 end
 
 # Standard output stream.
+#
+# The class of the default value of `sys.stdout`.
 class Stdout
        super FileWriter
        init do
                _file = new NativeFile.native_stdout
                path = "/dev/stdout"
                _is_writable = true
+               set_buffering_mode(256, sys.buffer_mode_line)
        end
 end
 
 # Standard error stream.
+#
+# The class of the default value of `sys.stderr`.
 class Stderr
        super FileWriter
        init do
@@ -304,6 +340,10 @@ class Path
        #
        # Returns `null` if there is no file at `self`.
        #
+       #     assert "/etc/".to_path.stat.is_dir
+       #     assert "/etc/issue".to_path.stat.is_file
+       #     assert "/fail/does not/exist".to_path.stat == null
+       #
        # ~~~
        # var p = "/tmp/".to_path
        # var stat = p.stat
@@ -330,8 +370,6 @@ class Path
        end
 
        # Delete a file from the file system, return `true` on success
-       #
-       # Require: `exists`
        fun delete: Bool do return path.to_cstring.file_delete
 
        # Copy content of file at `path` to `dest`
@@ -457,7 +495,7 @@ class Path
                end
 
                # Delete the directory itself
-               if ok then path.to_cstring.rmdir
+               if ok then ok = path.to_cstring.rmdir and ok
 
                return ok
        end
@@ -499,6 +537,11 @@ class FileStat
                return stat.atime
        end
 
+       # Returns the last access time
+       #
+       # alias for `last_access_time`
+       fun atime: Int do return last_access_time
+
        # Returns the last modification time in seconds since Epoch
        fun last_modification_time: Int
        do
@@ -506,6 +549,12 @@ class FileStat
                return stat.mtime
        end
 
+       # Returns the last modification time
+       #
+       # alias for `last_modification_time`
+       fun mtime: Int do return last_modification_time
+
+
        # Size of the file at `path`
        fun size: Int
        do
@@ -513,13 +562,16 @@ class FileStat
                return stat.size
        end
 
-       # Is this a regular file and not a device file, pipe, socket, etc.?
+       # Is self a regular file and not a device file, pipe, socket, etc.?
        fun is_file: Bool
        do
                assert not finalized
                return stat.is_reg
        end
 
+       # Alias for `is_file`
+       fun is_reg: Bool do return is_file
+
        # Is this a directory?
        fun is_dir: Bool
        do
@@ -543,6 +595,11 @@ class FileStat
                return stat.ctime
        end
 
+       # Returns the last status change time
+       #
+       # alias for `last_status_change_time`
+       fun ctime: Int do return last_status_change_time
+
        # Returns the permission bits of file
        fun mode: Int
        do
@@ -589,10 +646,20 @@ redef class String
        fun file_exists: Bool do return to_cstring.file_exists
 
        # The status of a file. see POSIX stat(2).
-       fun file_stat: NativeFileStat do return to_cstring.file_stat
+       fun file_stat: nullable FileStat
+       do
+               var stat = to_cstring.file_stat
+               if stat.address_is_null then return null
+               return new FileStat(stat)
+       end
 
        # The status of a file or of a symlink. see POSIX lstat(2).
-       fun file_lstat: NativeFileStat do return to_cstring.file_lstat
+       fun file_lstat: nullable FileStat
+       do
+               var stat = to_cstring.file_lstat
+               if stat.address_is_null then return null
+               return new FileStat(stat)
+       end
 
        # Remove a file, return true if success
        fun file_delete: Bool do return to_cstring.file_delete
@@ -675,11 +742,12 @@ redef class String
        end
 
        # Simplify a file path by remove useless ".", removing "//", and resolving ".."
-       # ".." are not resolved if they start the path
-       # starting "/" is not removed
-       # trainling "/" is removed
        #
-       # Note that the method only wonrk on the string:
+       # * ".." are not resolved if they start the path
+       # * starting "/" is not removed
+       # * trailing "/" is removed
+       #
+       # Note that the method only work on the string:
        #
        #  * no I/O access is performed
        #  * the validity of the path is not checked
@@ -715,7 +783,6 @@ redef class String
        # Using a standard "{self}/{path}" does not work in the following cases:
        #
        # * `self` is empty.
-       # * `path` ends with `'/'`.
        # * `path` starts with `'/'`.
        #
        # This method ensures that the join is valid.
@@ -836,28 +903,47 @@ redef class String
        end
 
        # Create a directory (and all intermediate directories if needed)
-       fun mkdir
+       #
+       # Return an error object in case of error.
+       #
+       #    assert "/etc/".mkdir != null
+       fun mkdir: nullable Error
        do
                var dirs = self.split_with("/")
                var path = new FlatBuffer
-               if dirs.is_empty then return
+               if dirs.is_empty then return null
                if dirs[0].is_empty then
                        # it was a starting /
                        path.add('/')
                end
+               var error: nullable Error = null
                for d in dirs do
                        if d.is_empty then continue
                        path.append(d)
                        path.add('/')
-                       path.to_s.to_cstring.file_mkdir
+                       var res = path.to_s.to_cstring.file_mkdir
+                       if not res and error == null then
+                               error = new IOError("Cannot create directory `{path}`: {sys.errno.strerror}")
+                       end
                end
+               return error
        end
 
        # Delete a directory and all of its content, return `true` on success
        #
        # Does not go through symbolic links and may get stuck in a cycle if there
        # is a cycle in the filesystem.
-       fun rmdir: Bool do return to_path.rmdir
+       #
+       # Return an error object in case of error.
+       #
+       #    assert "/fail/does not/exist".rmdir != null
+       fun rmdir: nullable Error
+       do
+               var res = to_path.rmdir
+               if res then return null
+               var error = new IOError("Cannot change remove `{self}`: {sys.errno.strerror}")
+               return error
+       end
 
        # Change the current working directory
        #
@@ -866,8 +952,18 @@ redef class String
        #     "..".chdir
        #     assert getcwd == "/"
        #
-       # TODO: errno
-       fun chdir do to_cstring.file_chdir
+       # Return an error object in case of error.
+       #
+       #     assert "/etc".chdir == null
+       #     assert "/fail/does no/exist".chdir != null
+       #     assert getcwd == "/etc" # unchanger
+       fun chdir: nullable Error
+       do
+               var res = to_cstring.file_chdir
+               if res then return null
+               var error = new IOError("Cannot change directory to `{self}`: {sys.errno.strerror}")
+               return error
+       end
 
        # Return right-most extension (without the dot)
        #
@@ -897,7 +993,17 @@ redef class String
                end
        end
 
-       # returns files contained within the directory represented by self
+       # Returns entries contained within the directory represented by self.
+       #
+       #     var files = "/etc".files
+       #     assert files.has("issue")
+       #
+       # Returns an empty array in case of error
+       #
+       #     files = "/etc/issue".files
+       #     assert files.is_empty
+       #
+       # TODO find a better way to handle errors and to give them back to the user.
        fun files: Array[String] is extern import Array[String], Array[String].add, NativeString.to_s, String.to_cstring `{
                char *dir_path;
                DIR *dir;
@@ -905,8 +1011,11 @@ redef class String
                dir_path = String_to_cstring( recv );
                if ((dir = opendir(dir_path)) == NULL)
                {
-                       perror( dir_path );
-                       exit( 1 );
+                       //perror( dir_path );
+                       //exit( 1 );
+                       Array_of_String results;
+                       results = new_Array_of_String();
+                       return results;
                }
                else
                {
@@ -942,14 +1051,14 @@ redef class NativeString
                return stat_element;
        `}
        private fun file_mkdir: Bool is extern "string_NativeString_NativeString_file_mkdir_0"
-       private fun rmdir: Bool `{ return rmdir(recv); `}
+       private fun rmdir: Bool `{ return !rmdir(recv); `}
        private fun file_delete: Bool is extern "string_NativeString_NativeString_file_delete_0"
-       private fun file_chdir is extern "string_NativeString_NativeString_file_chdir_0"
+       private fun file_chdir: Bool is extern "string_NativeString_NativeString_file_chdir_0"
        private fun file_realpath: NativeString is extern "file_NativeString_realpath"
 end
 
 # This class is system dependent ... must reify the vfs
-extern class NativeFileStat `{ struct stat * `}
+private extern class NativeFileStat `{ struct stat * `}
        # Returns the permission bits of file
        fun mode: Int is extern "file_FileStat_FileStat_mode_0"
        # Returns the last access time
@@ -998,18 +1107,14 @@ end
 
 redef class Sys
 
-       init do
-               if stdout isa FileStream then stdout.as(FileStream).set_buffering_mode(256, buffer_mode_line)
-       end
-
        # Standard input
-       var stdin: PollableReader = new Stdin is protected writable
+       var stdin: PollableReader = new Stdin is protected writable, lazy
 
        # Standard output
-       var stdout: Writer = new Stdout is protected writable
+       var stdout: Writer = new Stdout is protected writable, lazy
 
        # Standard output for errors
-       var stderr: Writer = new Stderr is protected writable
+       var stderr: Writer = new Stderr is protected writable, lazy
 
        # Enumeration for buffer mode full (flushes when buffer is full)
        fun buffer_mode_full: Int is extern "file_Sys_Sys_buffer_mode_full_0"
@@ -1097,30 +1202,30 @@ redef class Sys
 end
 
 # Print `objects` on the standard output (`stdout`).
-protected fun printn(objects: Object...)
+fun printn(objects: Object...)
 do
        sys.stdout.write(objects.to_s)
 end
 
 # Print an `object` on the standard output (`stdout`) and add a newline.
-protected fun print(object: Object)
+fun print(object: Object)
 do
        sys.stdout.write(object.to_s)
        sys.stdout.write("\n")
 end
 
 # Read a character from the standard input (`stdin`).
-protected fun getc: Char
+fun getc: Char
 do
        return sys.stdin.read_char.ascii
 end
 
 # Read a line from the standard input (`stdin`).
-protected fun gets: String
+fun gets: String
 do
        return sys.stdin.read_line
 end
 
 # Return the working (current) directory
-protected fun getcwd: String do return file_getcwd.to_s
+fun getcwd: String do return file_getcwd.to_s
 private fun file_getcwd: NativeString is extern "string_NativeString_NativeString_file_getcwd_0"
index d8d9b4b..d86b2df 100644 (file)
@@ -46,9 +46,9 @@ int file_NativeFile_NativeFile_set_buffering_type_0(FILE* f, int buf_sz, int mod
 #define file_Sys_Sys_buffer_mode_line_0(self) _IOLBF
 #define file_Sys_Sys_buffer_mode_none_0(self) _IONBF
 
-#define string_NativeString_NativeString_file_mkdir_0(p) (mkdir(p, 0777))
+#define string_NativeString_NativeString_file_mkdir_0(p) (!mkdir(p, 0777))
 #define string_NativeString_NativeString_file_getcwd_0(p) (getcwd(NULL, 0))
-#define string_NativeString_NativeString_file_chdir_0(p) (chdir(p)?-1:0) /* hack to avoid warn_unused_result */
+#define string_NativeString_NativeString_file_chdir_0(p) (!chdir(p))
 #define file_NativeString_realpath(p) (realpath(p, NULL))
 
 #define file_stdin_poll_in(self) file_stdin_poll_in_()
index 5cc0547..3f32a62 100644 (file)
@@ -17,10 +17,6 @@ module kernel
 
 import end # Mark this module is a top level one. (must be only one)
 
-`{
-#include <errno.h>
-`}
-
 ###############################################################################
 # System Classes                                                              #
 ###############################################################################
@@ -111,9 +107,7 @@ class Sys
        fun run do main
 
        # Number of the last error
-       fun errno: Int is extern `{
-               return errno;
-       `}
+       fun errno: Int is extern "sys_errno"
 end
 
 # Quit the program with a specific return code
@@ -226,6 +220,25 @@ interface Discrete
        end
 end
 
+# Something that can be cloned
+#
+# This interface introduces the `clone` method used to duplicate an instance
+# Its specific semantic is let to the subclasses.
+interface Cloneable
+       # Duplicate `self`
+       #
+       # The specific semantic of this method is let to the subclasses;
+       # Especially, if (and how) attributes are cloned (depth vs. shallow).
+       #
+       # As a rule of thumb, the principle of least astonishment should
+       # be used to guide the semantic.
+       #
+       # Note that as the returned clone depends on the semantic,
+       # the `==` method, if redefined, should ensure the equality
+       # between an object and its clone.
+       fun clone: SELF is abstract
+end
+
 # A numeric value supporting mathematical operations
 interface Numeric
        super Comparable
@@ -433,11 +446,17 @@ universal Int
        #     assert 5.lshift(1)    == 10
        fun lshift(i: Int): Int is intern
 
+       # alias of `lshift`
+       fun <<(i: Int): Int do return lshift(i)
+
        # `i` bits shift fo the right (aka >>)
        #
        #     assert 5.rshift(1)    == 2
        fun rshift(i: Int): Int is intern
 
+       # alias of `rshift`
+       fun >>(i: Int): Int do return rshift(i)
+
        redef fun to_i do return self
        redef fun to_f is intern
 
@@ -699,6 +718,22 @@ universal Char
        do
                return is_lower or is_upper
        end
+
+       # Is self a whitespace character?
+       #
+       # These correspond to the "Other" and "Separator" groups of the Unicode.
+       #
+       # In the ASCII encoding, this is those <= to space (0x20) plus delete (0x7F).
+       #
+       #     assert 'A'.is_whitespace  == false
+       #     assert ','.is_whitespace  == false
+       #     assert ' '.is_whitespace  == true
+       #     assert '\t'.is_whitespace == true
+       fun is_whitespace: Bool
+       do
+               var i = ascii
+               return i <= 0x20 or i == 0x7F
+       end
 end
 
 # Pointer classes are used to manipulate extern C structures.
index 3a09c9c..ba97c06 100644 (file)
@@ -12,7 +12,9 @@
  */
 
 #include <stdlib.h>
+#include <errno.h>
 
 #define address_is_null(x) ((x)==NULL)
+#define sys_errno(x) (errno)
 
 #endif
index 4b6ed35..2b55dca 100644 (file)
@@ -167,12 +167,18 @@ redef class Float
        #     #assert 0.0.pow(9.0) == 0.0
        fun pow(e: Float): Float is extern "kernel_Float_Float_pow_1"
 
-       # Returns the logarithm of `self`.
+       # Natural logarithm of `self`.
        #
        #     assert 0.0.log.is_inf == -1
        #     #assert 1.0.log == 0.0
        fun log: Float is extern "kernel_Float_Float_log_0"
 
+       # Logarithm of `self` to base `base`.
+       #
+       #     assert 100.0.log_base(10.0) == 2.0
+       #     assert 256.0.log_base(2.0) == 8.0
+       fun log_base(base: Float): Float do return log/base.log
+
        # Returns *e* raised to `self`.
        fun exp: Float is extern "kernel_Float_Float_exp_0"
 
@@ -195,7 +201,7 @@ redef class Float
        #     assert -1.34.round == -1.0
        #     assert -1.67.round == -2.0
        fun round: Float is extern "round"
-       
+
        # Returns a random `Float` in `[0.0 .. self[`.
        fun rand: Float is extern "kernel_Float_Float_rand_0"
 
@@ -220,6 +226,16 @@ redef class Float
        end
 
        private fun is_inf_extern: Bool is extern "isinf"
+
+       # Linear interpolation between `a` and `b` using `self` as weight
+       #
+       # ~~~
+       # assert  0.0.lerp(0.0, 128.0) == 0.0
+       # assert  0.5.lerp(0.0, 128.0) == 64.0
+       # assert  1.0.lerp(0.0, 128.0) == 128.0
+       # assert -0.5.lerp(0.0, 128.0) == -64.0
+       # ~~~
+       fun lerp(a, b: Float): Float do return (1.0 - self) * a + self * b
 end
 
 redef class Collection[ E ]
@@ -238,6 +254,15 @@ redef class Collection[ E ]
        end
 end
 
+redef class SequenceRead[E]
+       # Optimized for large collections using `[]`
+       redef fun rand
+       do
+               assert not is_empty
+               return self[length.rand]
+       end
+end
+
 redef class Sys
        init
        do
index 476c684..7df1bd1 100644 (file)
@@ -220,6 +220,66 @@ abstract class Reader
        # Is there something to read.
        # This function returns 'false' if there is something to read.
        fun eof: Bool is abstract
+
+       # Read the next sequence of non whitespace characters.
+       #
+       # Leading whitespace characters are skipped.
+       # The first whitespace character that follows the result is consumed.
+       #
+       # An empty string is returned if the end of the file or an error is encounter.
+       #
+       # ~~~
+       # var w = new StringReader(" Hello, \n\t World!")
+       # assert w.read_word == "Hello,"
+       # assert w.read_char == '\n'.ascii
+       # assert w.read_word == "World!"
+       # assert w.read_word == ""
+       # ~~~
+       #
+       # `Char::is_whitespace` determines what is a whitespace.
+       fun read_word: String
+       do
+               var buf = new FlatBuffer
+               var c = read_nonwhitespace
+               if c > 0 then
+                       buf.add(c.ascii)
+                       while not eof do
+                               c = read_char
+                               if c < 0 then break
+                               var a = c.ascii
+                               if a.is_whitespace then break
+                               buf.add(a)
+                       end
+               end
+               var res = buf.to_s
+               return res
+       end
+
+       # Skip whitespace characters (if any) then return the following non-whitespace character.
+       #
+       # Returns the code point of the character.
+       # Return -1 on end of file or error.
+       #
+       # In fact, this method works like `read_char` except it skips whitespace.
+       #
+       # ~~~
+       # var w = new StringReader(" \nab\tc")
+       # assert w.read_nonwhitespace == 'a'.ascii
+       # assert w.read_nonwhitespace == 'b'.ascii
+       # assert w.read_nonwhitespace == 'c'.ascii
+       # assert w.read_nonwhitespace == -1
+       # ~~~
+       #
+       # `Char::is_whitespace` determines what is a whitespace.
+       fun read_nonwhitespace: Int
+       do
+               var c = -1
+               while not eof do
+                       c = read_char
+                       if c < 0 or not c.ascii.is_whitespace then break
+               end
+               return c
+       end
 end
 
 # Iterator returned by `Reader::each_line`.
@@ -344,6 +404,7 @@ abstract class BufferedReader
                if _buffer_pos + i >= _buffer.length then
                        var from = _buffer_pos
                        _buffer_pos = _buffer.length
+                       if from == 0 then return _buffer.to_s
                        return _buffer.substring_from(from).to_s
                end
                _buffer_pos += i
index 88c4074..cd2698c 100644 (file)
@@ -350,12 +350,12 @@ abstract class Text
        #
        #     assert " \n\thello \n\t".l_trim == "hello \n\t"
        #
-       # A whitespace is defined as any character which ascii value is less than or equal to 32
+       # `Char::is_whitespace` determines what is a whitespace.
        fun l_trim: SELFTYPE
        do
                var iter = self.chars.iterator
                while iter.is_ok do
-                       if iter.item.ascii > 32 then break
+                       if not iter.item.is_whitespace then break
                        iter.next
                end
                if iter.index == length then return self.empty
@@ -366,12 +366,12 @@ abstract class Text
        #
        #     assert " \n\thello \n\t".r_trim == " \n\thello"
        #
-       # A whitespace is defined as any character which ascii value is less than or equal to 32
+       # `Char::is_whitespace` determines what is a whitespace.
        fun r_trim: SELFTYPE
        do
                var iter = self.chars.reverse_iterator
                while iter.is_ok do
-                       if iter.item.ascii > 32 then break
+                       if not iter.item.is_whitespace then break
                        iter.next
                end
                if iter.index < 0 then return self.empty
@@ -379,12 +379,29 @@ abstract class Text
        end
 
        # Trims trailing and preceding white spaces
-       # A whitespace is defined as any character which ascii value is less than or equal to 32
        #
        #     assert "  Hello  World !  ".trim   == "Hello  World !"
        #     assert "\na\nb\tc\t".trim          == "a\nb\tc"
+       #
+       # `Char::is_whitespace` determines what is a whitespace.
        fun trim: SELFTYPE do return (self.l_trim).r_trim
 
+       # Is the string non-empty but only made of whitespaces?
+       #
+       #    assert " \n\t ".is_whitespace    == true
+       #    assert "  hello  ".is_whitespace == false
+       #    assert "".is_whitespace          == false
+       #
+       # `Char::is_whitespace` determines what is a whitespace.
+       fun is_whitespace: Bool
+       do
+               if is_empty then return false
+               for c in self.chars do
+                       if not c.is_whitespace then return false
+               end
+               return true
+       end
+
        # Returns `self` removed from its last line terminator (if any).
        #
        #    assert "Hello\n".chomp == "Hello"
@@ -514,6 +531,14 @@ abstract class Text
        #
        #     assert "abAB12<>&".escape_to_c         == "abAB12<>&"
        #     assert "\n\"'\\".escape_to_c         == "\\n\\\"\\'\\\\"
+       #
+       # Most non-printable characters (bellow ASCII 32) are escaped to an octal form `\nnn`.
+       # Three digits are always used to avoid following digits to be interpreted as an element
+       # of the octal sequence.
+       #
+       #     assert "{0.ascii}{1.ascii}{8.ascii}{31.ascii}{32.ascii}".escape_to_c == "\\000\\001\\010\\037 "
+       #
+       # The exceptions are the common `\t` and `\n`.
        fun escape_to_c: String
        do
                var b = new FlatBuffer
@@ -521,8 +546,10 @@ abstract class Text
                        var c = chars[i]
                        if c == '\n' then
                                b.append("\\n")
+                       else if c == '\t' then
+                               b.append("\\t")
                        else if c == '\0' then
-                               b.append("\\0")
+                               b.append("\\000")
                        else if c == '"' then
                                b.append("\\\"")
                        else if c == '\'' then
@@ -530,7 +557,17 @@ abstract class Text
                        else if c == '\\' then
                                b.append("\\\\")
                        else if c.ascii < 32 then
-                               b.append("\\{c.ascii.to_base(8, false)}")
+                               b.add('\\')
+                               var oct = c.ascii.to_base(8, false)
+                               # Force 3 octal digits since it is the
+                               # maximum allowed in the C specification
+                               if oct.length == 1 then
+                                       b.add('0')
+                                       b.add('0')
+                               else if oct.length == 2 then
+                                       b.add('0')
+                               end
+                               b.append(oct)
                        else
                                b.add(c)
                        end
@@ -827,6 +864,23 @@ abstract class FlatText
        # Real items, used as cache for to_cstring is called
        private var real_items: nullable NativeString = null
 
+       # Returns a char* starting at position `index_from`
+       #
+       # WARNING: If you choose to use this service, be careful of the following.
+       #
+       # Strings and NativeString are *ideally* always allocated through a Garbage Collector.
+       # Since the GC tracks the use of the pointer for the beginning of the char*, it may be
+       # deallocated at any moment, rendering the pointer returned by this function invalid.
+       # Any access to freed memory may very likely cause undefined behaviour or a crash.
+       # (Failure to do so will most certainly result in long and painful debugging hours)
+       #
+       # The only safe use of this pointer is if it is ephemeral (e.g. read in a C function
+       # then immediately return).
+       #
+       # As always, do not modify the content of the String in C code, if this is what you want
+       # copy locally the char* as Nit Strings are immutable.
+       private fun fast_cstring: NativeString is abstract
+
        redef var length: Int = 0
 
        redef fun output
@@ -922,30 +976,50 @@ abstract class String
        #
        #     assert "randomMethodId".to_snake_case == "random_method_id"
        #
-       # If `self` is upper, it is returned unchanged
+       # The rules are the following:
        #
-       #     assert "RANDOM_METHOD_ID".to_snake_case == "RANDOM_METHOD_ID"
+       # An uppercase is always converted to a lowercase
        #
-       # If the identifier is prefixed by an underscore, the underscore is ignored
+       #     assert "HELLO_WORLD".to_snake_case == "hello_world"
        #
-       #     assert "_privateField".to_snake_case == "_private_field"
+       # An uppercase that follows a lowercase is prefixed with an underscore
+       #
+       #     assert "HelloTheWORLD".to_snake_case == "hello_the_world"
+       #
+       # An uppercase that follows an uppercase and is followed by a lowercase, is prefixed with an underscore
+       #
+       #     assert "HelloTHEWorld".to_snake_case == "hello_the_world"
+       #
+       # All other characters are kept as is; `self` does not need to be a proper CamelCased string.
+       #
+       #     assert "=-_H3ll0Th3W0rld_-=".to_snake_case == "=-_h3ll0th3w0rld_-="
        fun to_snake_case: SELFTYPE
        do
-               if self.is_upper then return self
+               if self.is_lower then return self
 
                var new_str = new FlatBuffer.with_capacity(self.length)
-               var is_first_char = true
+               var prev_is_lower = false
+               var prev_is_upper = false
 
                for i in [0..length[ do
                        var char = chars[i]
-                       if is_first_char then 
-                               new_str.add(char.to_lower)
-                               is_first_char = false
+                       if char.is_lower then
+                               new_str.add(char)
+                               prev_is_lower = true
+                               prev_is_upper = false
                        else if char.is_upper then
-                               new_str.add('_')
+                               if prev_is_lower then
+                                       new_str.add('_')
+                               else if prev_is_upper and i+1 < length and chars[i+1].is_lower then
+                                       new_str.add('_')
+                               end
                                new_str.add(char.to_lower)
+                               prev_is_lower = false
+                               prev_is_upper = true
                        else
                                new_str.add(char)
+                               prev_is_lower = false
+                               prev_is_upper = false
                        end
                end
                
@@ -1052,7 +1126,7 @@ class FlatString
        # Indes in _items of the last item of the string
        private var index_to: Int is noinit
 
-       redef var chars: SequenceRead[Char] = new FlatStringCharView(self)
+       redef var chars: SequenceRead[Char] = new FlatStringCharView(self) is lazy
 
        redef fun [](index)
        do
@@ -1082,6 +1156,8 @@ class FlatString
                return native.to_s_with_length(self.length)
        end
 
+       redef fun fast_cstring do return items.fast_cstring(index_from)
+
        redef fun substring(from, count)
        do
                assert count >= 0
@@ -1163,10 +1239,14 @@ class FlatString
        #              String Specific Methods           #
        ##################################################
 
-       private init with_infos(items: NativeString, len: Int, from: Int, to: Int)
+       # Low-level creation of a new string with given data.
+       #
+       # `items` will be used as is, without copy, to retrieve the characters of the string.
+       # Aliasing issues is the responsibility of the caller.
+       private init with_infos(items: NativeString, length: Int, from: Int, to: Int)
        do
                self.items = items
-               length = len
+               self.length = length
                index_from = from
                index_to = to
        end
@@ -1522,10 +1602,12 @@ class FlatBuffer
        super FlatText
        super Buffer
 
-       redef var chars: Sequence[Char] = new FlatBufferCharView(self)
+       redef var chars: Sequence[Char] = new FlatBufferCharView(self) is lazy
 
        private var capacity: Int = 0
 
+       redef fun fast_cstring do return items.fast_cstring(0)
+
        redef fun substrings do return new FlatSubstringsIter(self)
 
        # Re-copies the `NativeString` into a new one and sets it as the new `Buffer`
@@ -1610,6 +1692,20 @@ class FlatBuffer
        # Create a new empty string.
        init do end
 
+       # Low-level creation a new buffer with given data.
+       #
+       # `items` will be used as is, without copy, to store the characters of the buffer.
+       # Aliasing issues is the responsibility of the caller.
+       #
+       # If `items` is shared, `written` should be set to true after the creation
+       # so that a modification will do a copy-on-write.
+       private init with_infos(items: NativeString, capacity, length: Int)
+       do
+               self.items = items
+               self.length = length
+               self.capacity = capacity
+       end
+
        # Create a new string copied from `s`.
        init from(s: Text)
        do
@@ -1634,7 +1730,6 @@ class FlatBuffer
        init with_capacity(cap: Int)
        do
                assert cap >= 0
-               # _items = new NativeString.calloc(cap)
                items = new NativeString(cap+1)
                capacity = cap
                length = 0
@@ -1678,11 +1773,10 @@ class FlatBuffer
                if from < 0 then from = 0
                if count > length then count = length
                if from < count then
-                       var r = new FlatBuffer.with_capacity(count - from)
-                       while from < count do
-                               r.chars.push(items[from])
-                               from += 1
-                       end
+                       var len = count - from
+                       var r_items = new NativeString(len)
+                       items.copy_to(r_items, len, from, 0)
+                       var r = new FlatBuffer.with_infos(r_items, len, len)
                        return r
                else
                        return new FlatBuffer
@@ -1878,9 +1972,7 @@ end
 redef class Int
 
        # Wrapper of strerror C function
-       private fun strerror_ext: NativeString is extern `{
-               return strerror(recv);
-       `}
+       private fun strerror_ext: NativeString is extern "strerror"
 
        # Returns a string describing error number
        fun strerror: String do return strerror_ext.to_s
@@ -1920,6 +2012,10 @@ redef class Int
        #     assert 1.to_s            == "1"
        #     assert (-123).to_s       == "-123"
        redef fun to_s do
+               # Fast case for common numbers
+               if self == 0 then return "0"
+               if self == 1 then return "1"
+
                var nslen = int_to_s_len
                var ns = new NativeString(nslen + 1)
                ns[nslen] = '\0'
@@ -2147,6 +2243,48 @@ redef class Array[E]
        end
 end
 
+redef class NativeArray[E]
+       # Join all the elements using `to_s`
+       #
+       # REQUIRE: `self isa NativeArray[String]`
+       # REQUIRE: all elements are initialized
+       fun native_to_s: String
+       do
+               assert self isa NativeArray[String]
+               var l = length
+               var na = self
+               var i = 0
+               var sl = 0
+               var mypos = 0
+               while i < l do
+                       sl += na[i].length
+                       i += 1
+                       mypos += 1
+               end
+               var ns = new NativeString(sl + 1)
+               ns[sl] = '\0'
+               i = 0
+               var off = 0
+               while i < mypos do
+                       var tmp = na[i]
+                       var tpl = tmp.length
+                       if tmp isa FlatString then
+                               tmp.items.copy_to(ns, tpl, tmp.index_from, off)
+                               off += tpl
+                       else
+                               for j in tmp.substrings do
+                                       var s = j.as(FlatString)
+                                       var slen = s.length
+                                       s.items.copy_to(ns, slen, s.index_from, off)
+                                       off += slen
+                               end
+                       end
+                       i += 1
+               end
+               return ns.to_s_with_length(sl)
+       end
+end
+
 redef class Map[K,V]
        # Concatenate couple of 'key value'.
        # key and value are separated by `couple_sep`.
@@ -2190,6 +2328,12 @@ extern class NativeString `{ char* `}
        # Creates a new NativeString with a capacity of `length`
        new(length: Int) is intern
 
+       # Returns a char* starting at `index`.
+       #
+       # WARNING: Unsafe for extern code, use only for temporary
+       # pointer manipulation purposes (e.g. write to file or such)
+       fun fast_cstring(index: Int): NativeString is intern
+
        # Get char at `index`.
        fun [](index: Int): Char is intern
 
index 3a885ad..437341f 100644 (file)
@@ -388,8 +388,14 @@ redef class Text
        fun split_once_on(p: Pattern): Array[SELFTYPE]
        do
                var m = p.search_in(self, 0)
-               if m == null then return [self]
-               return new Array[SELFTYPE].with_items(substring(0, m.from), substring_from(m.after))
+               var res = new Array[SELFTYPE]
+               if m == null then
+                       res.add self
+               else
+                       res.add substring(0, m.from)
+                       res.add substring_from(m.after)
+               end
+               return res
        end
 
        # Replace all occurences of a pattern with a string
index 0fa637a..2875a8b 100644 (file)
@@ -231,7 +231,7 @@ class FlatStringIter
 
        private var it: UnicodeChar
 
-       private var is_created: Bool
+       private var is_created = false
 
        init(s: FlatString) do from(s, 0)
 
index 6160b1a..3150c5f 100644 (file)
@@ -55,8 +55,6 @@ class TmplComposer
        # Short name
        var name: String
 
-       init(name: String) do self.name = name
-
        redef fun rendering do add "- {name}\n"
 end
 
@@ -69,13 +67,6 @@ class TmplComposerDetail
        var birth: Int
        var death: Int
 
-       init(firstname, lastname: String, birth, death: Int) do
-               self.firstname = firstname
-               self.lastname = lastname
-               self.birth = birth
-               self.death = death
-       end
-
        redef fun rendering do add """
 
 COMPOSER: {{{firstname}}} {{{lastname}}}
index 181c047..9b4bf06 100644 (file)
@@ -37,6 +37,8 @@ Ensure that `~/.vimrc` contains
  * Automatic indentation
  * Syntax checker (require [Syntastic][2]).
  * Autocomplete for whole projects using module importations
+ * Show documentation in preview window
+ * Search declarations and usages of the word under the cursor
 
   [2]: https://github.com/scrooloose/syntastic
 
@@ -93,3 +95,27 @@ will use general metadata in the plugin directory.
 
 The metadata files from nitpick are stored in `~/.vim/nit/`. This location can be customized with
 the environment variable `NIT_VIM_DIR`.
+
+## Documentation in preview window
+
+The command `:Nitdoc` searches the documentation for the word under the cursor.
+The results are displayed in the preview window in order of relevance.
+You can search for any word by passing it as an argument, as in `:Nitdoc modulo`.
+The Nitdoc command uses the same metadata files as the omnifunc.
+You may want to map the function to a shortcut by adding the following code to `~/.vimrc`.
+
+~~~
+" Map displaying Nitdoc to Ctrl-D
+map <C-d> :Nitdoc<enter>
+~~~
+
+## Search declarations and usages of the word under the cursor
+
+The function `NitGitGrep` calls `git grep` to find declarations and usages of the word under the cursor.
+It displays the results in the preview window.
+You may want to map the function to a shortcut by adding the following code to `~/.vimrc`.
+
+~~~
+" Map the NitGitGrep function to Ctrl-G
+map <C-g> :call NitGitGrep()<enter>
+~~~
diff --git a/misc/jenkins/check_contrib.sh b/misc/jenkins/check_contrib.sh
new file mode 100755 (executable)
index 0000000..d43f7f5
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/bash
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Check the build and the execution of software in examples/ and contrib/
+# The script must be run from the root Nit directory.
+#
+# various .xml junit file will be generated in the root directory for jenkins.
+
+projects=`echo examples/*/Makefile contrib/*/Makefile`
+
+failed=
+for p in $projects; do
+       dir=`dirname "$p"`
+       name=`basename "$dir"`
+       echo "*** make $dir ***"
+       if misc/jenkins/unitrun.sh "run-$name-make" make -C "$dir"; then
+               # Make OK, is there a `check` rule?
+               make -C "$dir" check -n 2>/dev/null || continue
+               echo "*** makecheck $dir ***"
+               if misc/jenkins/unitrun.sh "run-$name-makecheck" make -C "$dir" check; then
+                       :
+               else
+                       failed="$failed $name-check"
+               fi
+
+       else
+               failed="$failed $name"
+       fi
+done
+grep '<error message' *-make.xml *-makecheck.xml
+if test -n "$failed"; then
+       echo "FAILED: $failed"
+       exit 1
+fi
+exit 0
index 23e557a..86d5e45 100644 (file)
@@ -81,17 +81,10 @@ function ForceNitComplete()
        call NitComplete()
 endfunction
 
-" Internal function to search for lines in `path` corresponding to the partial
-" word `base`. Adds found and formated match to `matches`.
+" Get path to the best metadata file named `name`
 "
-" Will order the results in 3 levels:
-" 1. Exact matches
-" 2. Common prefix matches
-" 3. Substring matches
-fun NitOmnifuncAddFromFile(base, matches, path)
-       let prefix_matches = []
-       let substring_matches = []
-
+" Returns an empty string if not found.
+fun s:NitMetadataFile(name)
        " Where are the generated metadata files?
        if empty($NIT_VIM_DIR)
                let metadata_dir = $HOME . '/.vim/nit'
@@ -99,17 +92,41 @@ fun NitOmnifuncAddFromFile(base, matches, path)
                let metadata_dir = $NIT_VIM_DIR
        end
 
-       let path = metadata_dir . '/' . a:path
+       let path = metadata_dir . '/' . a:name
+
        " Is there generated custom metadata files?
        if ! filereadable(path)
-               let path = s:script_dir . '/' . a:path
+               let path = s:script_dir . '/' . a:name
 
                " Is there standard metadata files?
                if ! filereadable(path)
-                       return
+                       return ''
                endif
        endif
 
+       return path
+endfun
+
+" Internal function to search for lines in `path` corresponding to the partial
+" word `base`. Adds found and formated match to `matches`.
+"
+" Will order the results in 5 levels:
+" 1. Exact matches
+" 2. Common prefix matches
+" 3. Substring matches
+" 4. Synopsis matches
+" 5. Doc matches
+fun NitOmnifuncAddFromFile(base, matches, path)
+       let prefix_matches = []
+       let substring_matches = []
+       let synopsis_matches = []
+       let doc_matches = []
+
+       let path = s:NitMetadataFile(a:path)
+       if empty(path)
+               return
+       endif
+
        for line in readfile(path)
                let words = split(line, '#====#', 1)
                let name = get(words, 0, '')
@@ -117,23 +134,31 @@ fun NitOmnifuncAddFromFile(base, matches, path)
                " Add?
                if name == a:base
                        " Exact match
-                       call NitOmnifuncAddAMatch(a:matches, words, name)
-               elseif name =~ '^'.a:base
+                       call s:NitOmnifuncAddAMatch(a:matches, words, name)
+               elseif name =~? '^'.a:base
                        " Common-prefix match
-                       call NitOmnifuncAddAMatch(prefix_matches, words, name)
-               elseif name =~ a:base
+                       call s:NitOmnifuncAddAMatch(prefix_matches, words, name)
+               elseif name =~? a:base
                        " Substring match
-                       call NitOmnifuncAddAMatch(substring_matches, words, name)
+                       call s:NitOmnifuncAddAMatch(substring_matches, words, name)
+               elseif get(words, 2, '') =~? a:base
+                       " Match in the synopsis
+                       call s:NitOmnifuncAddAMatch(synopsis_matches, words, name)
+               elseif get(words, 3, '') =~? a:base
+                       " Match in the longer doc
+                       call s:NitOmnifuncAddAMatch(doc_matches, words, name)
                endif
        endfor
 
        " Assemble the final match list
        call extend(a:matches, sort(prefix_matches))
        call extend(a:matches, sort(substring_matches))
+       call extend(a:matches, sort(synopsis_matches))
+       call extend(a:matches, sort(doc_matches))
 endfun
 
 " Internal function to search parse the information from a metadata line
-fun NitOmnifuncAddAMatch(matches, words, name)
+fun s:NitOmnifuncAddAMatch(matches, words, name)
        let pretty = get(a:words, 1, '')
        let synopsis = get(a:words, 2, '')
        let desc = get(a:words, 3, '')
@@ -159,10 +184,10 @@ fun NitOmnifunc(findstart, base)
                " find keyword matching with "a:base"
                let matches = []
 
-               " Advanced suggestions
+               " advanced suggestions
                let cursor_line = getline('.')
 
-               " Content of the line before the partial word
+               " content of the line before the partial word
                let line_prev_cursor = cursor_line[:col('.')-1]
 
                let prev_char_at = strlen(line_prev_cursor) - 1
@@ -240,7 +265,127 @@ fun NitOmnifunc(findstart, base)
        endif
 endfun
 
+" Show doc for the entity under the cursor in the preview window
+fun Nitdoc(...)
+       if a:0 == 0 || empty(a:1)
+               " Word under cursor
+               let word = expand("<cword>")
+       else
+               let word = join(a:000, ' ')
+       endif
+
+       " All possible docs (there may be more than one entity with the same name)
+       let docs = []
+       let prefix_matches = []
+       let substring_matches = []
+       let synopsis_matches = []
+       let doc_matches = []
+
+       " Search in all metadata files
+       for file in ['modules', 'classes', 'properties']
+               let path = s:NitMetadataFile(file.'.txt')
+               if empty(path)
+                       continue
+               endif
+
+               for line in readfile(path)
+                       let words = split(line, '#====#', 1)
+                       let name = get(words, 0, '')
+                       if name =~ '^'.word.'\>'
+                               " Exact match
+                               call s:NitdocAdd(docs, words)
+                       elseif name =~? '^'.word
+                               " Common-prefix match
+                               call s:NitdocAdd(prefix_matches, words)
+                       elseif name =~? word
+                               " Substring match
+                               call s:NitdocAdd(substring_matches, words)
+                       elseif get(words, 2, '') =~? word
+                               " Match in the synopsis
+                               call s:NitdocAdd(synopsis_matches, words)
+                       elseif get(words, 3, '') =~? word
+                               " Match in the longer doc
+                               call s:NitdocAdd(doc_matches, words)
+                       endif
+               endfor
+       endfor
+
+       " Unite all results in prefered order
+       call extend(docs, sort(prefix_matches))
+       call extend(docs, sort(substring_matches))
+       call extend(docs, sort(synopsis_matches))
+       call extend(docs, sort(doc_matches))
+
+       " Found no doc, give up
+       if empty(docs) || !(join(docs, '') =~ '\w')
+               echo 'Nitdoc found nothing for "' . word . '"'
+               return
+       endif
+
+       " Open the preview window on a temp file
+       execute "silent pedit " . tempname()
+
+       " Change to preview window
+       wincmd P
+
+       " Show all found doc one after another
+       for doc in docs
+               if doc =~ '\w'
+                       silent put = doc
+                       silent put = ''
+               endif
+       endfor
+       execute 0
+       delete " the first empty line
+
+       " Set options
+       setlocal buftype=nofile
+       setlocal noswapfile
+       setlocal syntax=none
+       setlocal bufhidden=delete
+
+       " Change back to the source buffer
+       wincmd p
+       redraw!
+endfun
+
+" Internal function to search parse the information from a metadata line
+fun s:NitdocAdd(matches, words)
+       let desc = get(a:words, 3, '')
+       let desc = join(split(desc, '#nnnn#', 1), "\n")
+       call add(a:matches, desc)
+endfun
+
+" Call `git grep` on the word under the cursor
+"
+" Shows declarations first, then all matches, in the preview window.
+fun NitGitGrep()
+       let word = expand("<cword>")
+       let out = tempname()
+       execute 'silent !(git grep "\\(module\\|class\\|universal\\|interface\\|var\\|fun\\) '.word.'";'.
+               \'echo; git grep '.word.') > '.out
+
+       " Open the preview window on a temp file
+       execute "silent pedit " . out
+
+       " Change to preview window
+       wincmd P
+
+       " Set options
+       setlocal buftype=nofile
+       setlocal noswapfile
+       setlocal syntax=none
+       setlocal bufhidden=delete
+
+       " Change back to the source buffer
+       wincmd p
+       redraw!
+endfun
+
 " Activate the omnifunc on Nit files
 autocmd FileType nit set omnifunc=NitOmnifunc
 
+" Define the user command Nitdoc for ease of use
+command -nargs=* Nitdoc call Nitdoc("<args>")
+
 let s:script_dir = fnamemodify(resolve(expand('<sfile>:p')), ':h')
index 5daafeb..bc21fd3 100644 (file)
@@ -356,6 +356,16 @@ Usually you do not need them since they make the generated code slower.
 `--no-shortcut-equal`
 :   Always call == in a polymorphic way.
 
+`--no-tag-primitive`
+:   Use only boxes for primitive types.
+
+The separate compiler uses tagged values to encode common primitive types like Int, Bool and Char.
+This option disables tags and forces such primitive values to be boxed.
+The drawback is that each boxing costs a memory allocation thus increases the amount of work for the garbage collector.
+
+However, in some cases, it is possible that this option improves performance since the absence of tags simplify the implementation
+of OO mechanisms like method calls or equality tests.
+
 `--no-inline-intern`
 :   Do not inline call to intern methods.
 
@@ -425,6 +435,11 @@ They are useless for a normal user.
 `--stub-man`
 :   Generate a stub manpage in pandoc markdown format.
 
+`--keep-going`
+:   Continue after errors, whatever the consequences.
+
+The tool does not stop after some errors but continue until it produces incorrect result, crashes, erases the hard drive, or just continue forever in an infinite loop.
+This option is used to test the robustness of the tools by allowing phases to progress on incorrect data.
 
 # ENVIRONMENT VARIABLES
 
index 4f45562..b43004f 100644 (file)
@@ -12,14 +12,16 @@ nitunit [*options*] FILE...
 
 Unit testing in Nit can be achieved in two ways:
 
-* using `DocUnits` in code comments
+* using `DocUnits` in code comments or in markdown files
 * using `TestSuites` with test unit files
 
-`DocUnits` are executable pieces of code found in the documentation of modules,
+`DocUnits` are executable pieces of code found in the documentation of groups, modules,
 classes and properties.
 They are used for documentation purpose, they should be kept simple and illustrative.
 More advanced unit testing can be done using TestSuites.
 
+`DocUnits` can also be used in any markdown files.
+
 `TestSuites` are test files coupled to a tested module.
 They contain a list of test methods called TestCase.
 
@@ -106,6 +108,14 @@ The `nitunit` command is used to test Nit files:
 
     $ nitunit foo.nit
 
+Groups (directories) can be given to test the documentation of the group and of all its Nit files:
+
+    $ nitunit lib/foo
+
+Finally, standard markdown documents can be checked with:
+
+    $ nitunit foo.md
+
 ## Working with `TestSuites`
 
 TestSuites are Nit files that define a set of TestCases for a particular module.
index 882b645..73c9985 100644 (file)
@@ -30,7 +30,7 @@ redef class Prod
                var res = get_annotations(name)
                if res.is_empty then return null
                if res.length > 1 then
-                       modelbuilder.error(res[1], "Error: multiple annotation `{name}`. A previous one is defined line {res[0].location.line_start}")
+                       modelbuilder.error(res[1], "Syntax Error: multiple `{name}`. A previous one is defined line {res[0].location.line_start}.")
                end
                return res.first
        end
@@ -47,7 +47,7 @@ redef class AAnnotation
                        if arg != null then return arg
                end
 
-               modelbuilder.error(self, "Annotation error: \"{name}\" expects a single String as argument.")
+               modelbuilder.error(self, "Syntax Error: `{name}` expects a single String as argument.")
                return null
        end
 
@@ -61,7 +61,7 @@ redef class AAnnotation
                        if arg != null then return arg
                end
 
-               modelbuilder.error(self, "Annotation error: \"{name}\" expects a single Int as argument.")
+               modelbuilder.error(self, "Syntax Error: `{name}` expects a single Int as argument.")
                return null
        end
 
@@ -75,7 +75,7 @@ redef class AAnnotation
                        if arg != null then return arg
                end
 
-               modelbuilder.error(self, "Annotation error: \"{name}\" expects a single identifier as argument.")
+               modelbuilder.error(self, "Syntax Error: `{name}` expects a single identifier as argument.")
                return null
        end
 end
@@ -142,7 +142,7 @@ redef class ModelBuilder
                        for annot in annotations do locs.add(annot.location)
 
                        toolcontext.error(mmodule.location,
-                               "Priority conflict on annotation {name}, it has been defined in: {locs.join(", ")}")
+                               "Error: priority conflict on annotation `{name}`, it has been defined in: {locs.join(", ")}.")
                end
                return annotations.first
        end
index 8aa0295..99c8763 100644 (file)
@@ -32,7 +32,7 @@ class ASTBuilder
        # Make a new Int literal
        fun make_int(value: Int): AIntExpr
        do
-               return new ADecIntExpr.make(value, mmodule.get_primitive_class("Int").mclass_type)
+               return new ADecIntExpr.make(value, mmodule.int_type)
        end
 
        # Make a new instatiation
index b568366..2883197 100644 (file)
@@ -22,9 +22,7 @@ class ASTValidationVisitor
        super Visitor
        redef fun visit(node)
        do
-               path.unshift(node)
                node.accept_ast_validation(self)
-               path.shift
        end
        private var path = new List[ANode]
        private var seen = new HashSet[ANode]
@@ -34,29 +32,33 @@ redef class ANode
        private fun accept_ast_validation(v: ASTValidationVisitor)
        do
                var parent = self.parent
+               var path = v.path
 
-               if v.path.length > 1 then
-                       var path_parent = v.path[1]
+               if path.length > 0 then
+                       var path_parent = v.path.first
                        if parent == null then
                                self.parent = path_parent
                                #debug "PARENT: expected parent: {path_parent}"
+                               v.seen.add(self)
                        else if parent != path_parent then
                                self.parent = path_parent
-                               debug "PARENT: expected parent: {path_parent}, got {parent}"
+                               if v.seen.has(self) then
+                                       debug "DUPLICATE (NOTATREE): already seen node with parent {parent} now with {path_parent}."
+                               else
+                                       v.seen.add(self)
+                                       debug "PARENT: expected parent: {path_parent}, got {parent}"
+                               end
                        end
                end
 
-               if v.seen.has(self) then
-                       debug "DUPLICATE: already seen node. NOTATREE"
-               end
-               v.seen.add(self)
-
                if not isset _location then
                        #debug "LOCATION: unlocated node {v.path.join(", ")}"
                        _location = self.parent.location
                end
 
+               path.unshift(self)
                visit_all(v)
+               path.shift
        end
 end
 
@@ -72,7 +74,7 @@ redef class AExpr
        do
                super
                if mtype == null and not is_typed then
-                       debug "TYPING: untyped expression"
+                       #debug "TYPING: untyped expression"
                end
        end
 end
index 01de936..f8cbee8 100644 (file)
@@ -23,6 +23,7 @@ import platform
 import c_tools
 private import annotation
 import mixin
+import counter
 
 # Add compiling options
 redef class ToolContext
@@ -94,12 +95,12 @@ redef class ToolContext
                        # Default is nitstack
                        opt_stacktrace.value = "nitstack"
                else
-                       print "Error: unknown value `{st}` for --stacktrace. Use `none`, `libunwind`, `nitstack` or `auto`."
+                       print "Option Error: unknown value `{st}` for --stacktrace. Use `none`, `libunwind`, `nitstack` or `auto`."
                        exit(1)
                end
 
                if opt_output.value != null and opt_dir.value != null then
-                       print "Error: cannot use both --dir and --output"
+                       print "Option Error: cannot use both --dir and --output"
                        exit(1)
                end
 
@@ -121,20 +122,30 @@ redef class ModelBuilder
        protected fun write_and_make(compiler: AbstractCompiler)
        do
                var platform = compiler.target_platform
-               var toolchain = platform.toolchain(toolcontext)
+               var toolchain = platform.toolchain(toolcontext, compiler)
                compile_dir = toolchain.compile_dir
-               toolchain.write_and_make compiler
+               toolchain.write_and_make
        end
 end
 
 redef class Platform
        # The specific tool-chain associated to the platform
-       fun toolchain(toolcontext: ToolContext): Toolchain do return new MakefileToolchain(toolcontext)
+       fun toolchain(toolcontext: ToolContext, compiler: AbstractCompiler): Toolchain
+       do
+               return new MakefileToolchain(toolcontext, compiler)
+       end
 end
 
+# Build toolchain for a specific target program, varies per `Platform`
 class Toolchain
+
+       # Toolcontext
        var toolcontext: ToolContext
 
+       # Compiler of the target program
+       var compiler: AbstractCompiler
+
+       # Directory where to generate all C files
        fun compile_dir: String
        do
                var compile_dir = toolcontext.opt_compile_dir.value
@@ -142,13 +153,15 @@ class Toolchain
                return compile_dir
        end
 
-       fun write_and_make(compiler: AbstractCompiler) is abstract
+       # Write all C files and compile them
+       fun write_and_make is abstract
 end
 
+# Default toolchain using a Makefile
 class MakefileToolchain
        super Toolchain
 
-       redef fun write_and_make(compiler)
+       redef fun write_and_make
        do
                var compile_dir = compile_dir
 
@@ -161,11 +174,11 @@ class MakefileToolchain
                compile_dir.mkdir
 
                var cfiles = new Array[String]
-               write_files(compiler, compile_dir, cfiles)
+               write_files(compile_dir, cfiles)
 
                # Generate the Makefile
 
-               write_makefile(compiler, compile_dir, cfiles)
+               write_makefile(compile_dir, cfiles)
 
                var time1 = get_time
                self.toolcontext.info("*** END WRITING C: {time1-time0} ***", 2)
@@ -177,13 +190,14 @@ class MakefileToolchain
                time0 = time1
                self.toolcontext.info("*** COMPILING C ***", 1)
 
-               compile_c_code(compiler, compile_dir)
+               compile_c_code(compile_dir)
 
                time1 = get_time
                self.toolcontext.info("*** END COMPILING C: {time1-time0} ***", 2)
        end
 
-       fun write_files(compiler: AbstractCompiler, compile_dir: String, cfiles: Array[String])
+       # Write all source files to the `compile_dir`
+       fun write_files(compile_dir: String, cfiles: Array[String])
        do
                var platform = compiler.target_platform
                if self.toolcontext.opt_stacktrace.value == "nitstack" and platform.supports_libunwind then compiler.build_c_to_nit_bindings
@@ -280,17 +294,14 @@ class MakefileToolchain
                self.toolcontext.info("Total C source files to compile: {cfiles.length}", 2)
        end
 
-       fun makefile_name(mainmodule: MModule): String do return "{mainmodule.c_name}.mk"
+       # Get the name of the Makefile to use
+       fun makefile_name: String do return "{compiler.mainmodule.c_name}.mk"
 
-       fun default_outname(mainmodule: MModule): String
+       # Get the default name of the executable to produce
+       fun default_outname: String
        do
-               # Search a non fictive module
-               var res = mainmodule.name
-               while mainmodule.is_fictive do
-                       mainmodule = mainmodule.in_importation.direct_greaters.first
-                       res = mainmodule.name
-               end
-               return res
+               var mainmodule = compiler.mainmodule.first_real_mmodule
+               return mainmodule.name
        end
 
        # Combine options and platform informations to get the final path of the outfile
@@ -298,13 +309,14 @@ class MakefileToolchain
        do
                var res = self.toolcontext.opt_output.value
                if res != null then return res
-               res = default_outname(mainmodule)
+               res = default_outname
                var dir = self.toolcontext.opt_dir.value
                if dir != null then return dir.join_path(res)
                return res
        end
 
-       fun write_makefile(compiler: AbstractCompiler, compile_dir: String, cfiles: Array[String])
+       # Write the Makefile
+       fun write_makefile(compile_dir: String, cfiles: Array[String])
        do
                var mainmodule = compiler.mainmodule
                var platform = compiler.target_platform
@@ -319,7 +331,7 @@ class MakefileToolchain
                        # 2. copy the binary at the right place in the `all` goal.
                        outpath = mainmodule.c_name
                end
-               var makename = makefile_name(mainmodule)
+               var makename = makefile_name
                var makepath = "{compile_dir}/{makename}"
                var makefile = new FileWriter.open(makepath)
 
@@ -444,22 +456,25 @@ endif
                makepath.file_copy_to "{compile_dir}/Makefile"
        end
 
-       fun compile_c_code(compiler: AbstractCompiler, compile_dir: String)
+       # The C code is generated, compile it to an executable
+       fun compile_c_code(compile_dir: String)
        do
-               var makename = makefile_name(compiler.mainmodule)
+               var makename = makefile_name
 
                var makeflags = self.toolcontext.opt_make_flags.value
                if makeflags == null then makeflags = ""
-               self.toolcontext.info("make -B -C {compile_dir} -f {makename} -j 4 {makeflags}", 2)
+
+               var command = "make -B -C {compile_dir} -f {makename} -j 4 {makeflags}"
+               self.toolcontext.info(command, 2)
 
                var res
                if self.toolcontext.verbose_level >= 3 then
-                       res = sys.system("make -B -C {compile_dir} -f {makename} -j 4 {makeflags} 2>&1")
+                       res = sys.system("{command} 2>&1")
                else
-                       res = sys.system("make -B -C {compile_dir} -f {makename} -j 4 {makeflags} 2>&1 >/dev/null")
+                       res = sys.system("{command} 2>&1 >/dev/null")
                end
                if res != 0 then
-                       toolcontext.error(null, "make failed! Error code: {res}.")
+                       toolcontext.error(null, "Compilation Error: `make` failed with error code: {res}. The command was `{command}`.")
                end
        end
 end
@@ -589,6 +604,8 @@ abstract class AbstractCompiler
                self.header.add_decl("#include <stdlib.h>")
                self.header.add_decl("#include <stdio.h>")
                self.header.add_decl("#include <string.h>")
+               self.header.add_decl("#include <sys/types.h>\n")
+               self.header.add_decl("#include <unistd.h>\n")
                self.header.add_decl("#include \"gc_chooser.h\"")
                self.header.add_decl("#ifdef ANDROID")
                self.header.add_decl("  #include <android/log.h>")
@@ -603,9 +620,9 @@ abstract class AbstractCompiler
                var gccd_disable = modelbuilder.toolcontext.opt_no_gcc_directive.value
                if gccd_disable.has("noreturn") or gccd_disable.has("all") then
                        # Signal handler function prototype
-                       self.header.add_decl("void show_backtrace(int);")
+                       self.header.add_decl("void fatal_exit(int);")
                else
-                       self.header.add_decl("void show_backtrace(int) __attribute__ ((noreturn));")
+                       self.header.add_decl("void fatal_exit(int) __attribute__ ((noreturn));")
                end
 
                if gccd_disable.has("likely") or gccd_disable.has("all") then
@@ -674,7 +691,7 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
                var finalize_meth = mainmodule.try_get_primitive_method("finalize", finalizable_type.mclass)
 
                if finalize_meth == null then
-                       modelbuilder.toolcontext.error(null, "The `Finalizable` class doesn't declare the `finalize` method.")
+                       modelbuilder.toolcontext.error(null, "Error: the `Finalizable` class does not declare the `finalize` method.")
                        return
                end
 
@@ -741,12 +758,7 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
                        v.compiler.header.add_decl("extern long count_isset_checks;")
                end
 
-               v.add_decl("void sig_handler(int signo)\{")
-               v.add_decl("PRINT_ERROR(\"Caught signal : %s\\n\", strsignal(signo));")
-               v.add_decl("show_backtrace(signo);")
-               v.add_decl("\}")
-
-               v.add_decl("void show_backtrace (int signo) \{")
+               v.add_decl("static void show_backtrace(void) \{")
                if ost == "nitstack" or ost == "libunwind" then
                        v.add_decl("char* opt = getenv(\"NIT_NO_STACK\");")
                        v.add_decl("unw_cursor_t cursor;")
@@ -776,7 +788,19 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
                        v.add_decl("free(procname);")
                        v.add_decl("\}")
                end
-               v.add_decl("exit(signo);")
+               v.add_decl("\}")
+
+               v.add_decl("void sig_handler(int signo)\{")
+               v.add_decl("PRINT_ERROR(\"Caught signal : %s\\n\", strsignal(signo));")
+               v.add_decl("show_backtrace();")
+               # rethrows
+               v.add_decl("signal(signo, SIG_DFL);")
+               v.add_decl("kill(getpid(), signo);")
+               v.add_decl("\}")
+
+               v.add_decl("void fatal_exit(int status) \{")
+               v.add_decl("show_backtrace();")
+               v.add_decl("exit(status);")
                v.add_decl("\}")
 
                if no_main then
@@ -1014,14 +1038,6 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref ) {
        end
 
        fun finalize_ffi_for_module(mmodule: MModule) do mmodule.finalize_ffi(self)
-
-       # Division facility
-       # Avoid division by zero by returning the string "n/a"
-       fun div(a,b:Int):String
-       do
-               if b == 0 then return "n/a"
-               return ((a*10000/b).to_f / 100.0).to_precision(2)
-       end
 end
 
 # A file unit (may be more than one file if
@@ -1078,9 +1094,6 @@ abstract class AbstractCompilerVisitor
                self.writer = new CodeWriter(compiler.files.last)
        end
 
-       # Force to get the primitive class named `name` or abort
-       fun get_class(name: String): MClass do return self.compiler.mainmodule.get_primitive_class(name)
-
        # Force to get the primitive property named `name` in the instance `recv` or abort
        fun get_property(name: String, recv: MType): MMethod
        do
@@ -1122,43 +1135,56 @@ abstract class AbstractCompilerVisitor
 
        fun native_array_def(pname: String, ret_type: nullable MType, arguments: Array[RuntimeVariable]) is abstract
 
+       # Return an element of a native array.
+       # The method is unsafe and is just a direct wrapper for the specific implementation of native arrays
+       fun native_array_get(native_array: RuntimeVariable, index: Int): RuntimeVariable is abstract
+
+       # Store an element in a native array.
+       # The method is unsafe and is just a direct wrapper for the specific implementation of native arrays
+       fun native_array_set(native_array: RuntimeVariable, index: Int, value: RuntimeVariable) is abstract
+
        # Evaluate `args` as expressions in the call of `mpropdef` on `recv`.
        # This method is used to manage varargs in signatures and returns the real array
        # of runtime variables to use in the call.
-       fun varargize(mpropdef: MMethodDef, recv: RuntimeVariable, args: SequenceRead[AExpr]): Array[RuntimeVariable]
+       fun varargize(mpropdef: MMethodDef, map: nullable SignatureMap, recv: RuntimeVariable, args: SequenceRead[AExpr]): Array[RuntimeVariable]
        do
                var msignature = mpropdef.new_msignature or else mpropdef.msignature.as(not null)
                var res = new Array[RuntimeVariable]
                res.add(recv)
 
-               if args.is_empty then return res
+               if msignature.arity == 0 then return res
 
-               var vararg_rank = msignature.vararg_rank
-               var vararg_len = args.length - msignature.arity
-               if vararg_len < 0 then vararg_len = 0
+               if map == null then
+                       assert args.length == msignature.arity
+                       for ne in args do
+                               res.add self.expr(ne, null)
+                       end
+                       return res
+               end
 
+               # Eval in order of arguments, not parameters
+               var exprs = new Array[RuntimeVariable].with_capacity(args.length)
+               for ne in args do
+                       exprs.add self.expr(ne, null)
+               end
+
+               # Fill `res` with the result of the evaluation according to the mapping
                for i in [0..msignature.arity[ do
-                       if i == vararg_rank then
-                               var ne = args[i]
-                               if ne isa AVarargExpr then
-                                       var e = self.expr(ne.n_expr, null)
-                                       res.add(e)
-                                       continue
-                               end
-                               var vararg = new Array[RuntimeVariable]
-                               for j in [vararg_rank..vararg_rank+vararg_len] do
-                                       var e = self.expr(args[j], null)
-                                       vararg.add(e)
-                               end
-                               var elttype = msignature.mparameters[vararg_rank].mtype
+                       var param = msignature.mparameters[i]
+                       var j = map.map.get_or_null(i)
+                       if j == null then
+                               # default value
+                               res.add(null_instance)
+                               continue
+                       end
+                       if param.is_vararg and map.vararg_decl > 0 then
+                               var vararg = exprs.sub(j, map.vararg_decl)
+                               var elttype = param.mtype
                                var arg = self.vararg_instance(mpropdef, recv, vararg, elttype)
                                res.add(arg)
-                       else
-                               var j = i
-                               if i > vararg_rank then j += vararg_len
-                               var e = self.expr(args[j], null)
-                               res.add(e)
+                               continue
                        end
+                       res.add exprs[j]
                end
                return res
        end
@@ -1395,7 +1421,7 @@ abstract class AbstractCompilerVisitor
                var recv
                var ctype = mtype.ctype
                assert mtype.mclass.name != "NativeArray"
-               if ctype == "val*" then
+               if not mtype.is_c_primitive then
                        recv = init_instance(mtype)
                else if ctype == "char*" then
                        recv = new_expr("NULL/*special!*/", mtype)
@@ -1416,37 +1442,64 @@ abstract class AbstractCompilerVisitor
                end
        end
 
+       # The currently processed module
+       #
+       # alias for `compiler.mainmodule`
+       fun mmodule: MModule do return compiler.mainmodule
+
        # Generate an integer value
        fun int_instance(value: Int): RuntimeVariable
        do
-               var res = self.new_var(self.get_class("Int").mclass_type)
-               self.add("{res} = {value};")
+               var t = mmodule.int_type
+               var res = new RuntimeVariable("{value.to_s}l", t, t)
+               return res
+       end
+
+       # Generate a char value
+       fun char_instance(value: Char): RuntimeVariable
+       do
+               var t = mmodule.char_type
+               var res = new RuntimeVariable("'{value.to_s.escape_to_c}'", t, t)
+               return res
+       end
+
+       # Generate a float value
+       #
+       # FIXME pass a Float, not a string
+       fun float_instance(value: String): RuntimeVariable
+       do
+               var t = mmodule.float_type
+               var res = new RuntimeVariable("{value}", t, t)
                return res
        end
 
        # Generate an integer value
        fun bool_instance(value: Bool): RuntimeVariable
        do
-               var res = self.new_var(self.get_class("Bool").mclass_type)
-               if value then
-                       self.add("{res} = 1;")
-               else
-                       self.add("{res} = 0;")
-               end
+               var s = if value then "1" else "0"
+               var res = new RuntimeVariable(s, bool_type, bool_type)
+               return res
+       end
+
+       # Generate the `null` value
+       fun null_instance: RuntimeVariable
+       do
+               var t = compiler.mainmodule.model.null_type
+               var res = new RuntimeVariable("((val*)NULL)", t, t)
                return res
        end
 
        # Generate a string value
        fun string_instance(string: String): RuntimeVariable
        do
-               var mtype = self.get_class("String").mclass_type
+               var mtype = mmodule.string_type
                var name = self.get_name("varonce")
                self.add_decl("static {mtype.ctype} {name};")
                var res = self.new_var(mtype)
-               self.add("if ({name}) \{")
+               self.add("if (likely({name}!=NULL)) \{")
                self.add("{res} = {name};")
                self.add("\} else \{")
-               var native_mtype = self.get_class("NativeString").mclass_type
+               var native_mtype = mmodule.native_string_type
                var nat = self.new_var(native_mtype)
                self.add("{nat} = \"{string.escape_to_c}\";")
                var length = self.int_instance(string.length)
@@ -1557,7 +1610,7 @@ abstract class AbstractCompilerVisitor
                else
                        self.add("PRINT_ERROR(\"\\n\");")
                end
-               self.add("show_backtrace(1);")
+               self.add("fatal_exit(1);")
        end
 
        # Add a dynamic cast
@@ -1582,6 +1635,12 @@ abstract class AbstractCompilerVisitor
        fun stmt(nexpr: nullable AExpr)
        do
                if nexpr == null then return
+               if nexpr.mtype == null and not nexpr.is_typed then
+                       # Untyped expression.
+                       # Might mean dead code
+                       # So just return
+                       return
+               end
 
                var narray = nexpr.comprehension
                if narray != null then
@@ -1601,6 +1660,13 @@ abstract class AbstractCompilerVisitor
        # `mtype` is the expected return type, pass null if no specific type is expected.
        fun expr(nexpr: AExpr, mtype: nullable MType): RuntimeVariable
        do
+               if nexpr.mtype == null then
+                       # Untyped expression.
+                       # Might mean dead code
+                       # so return a placebo result
+                       if mtype == null then mtype = compiler.mainmodule.object_type
+                       return new_var(mtype)
+               end
                var old = self.current_node
                self.current_node = nexpr
                var res = nexpr.expr(self).as(not null)
@@ -1754,12 +1820,16 @@ redef class MType
 
        # Short name of the `ctype` to use in unions
        fun ctypename: String do return "val"
+
+       # Is the associated C type a primitive one?
+       #
+       # ENSURE `result == (ctype != "val*")`
+       fun is_c_primitive: Bool do return false
 end
 
 redef class MClassType
 
-       redef fun ctype: String
-       do
+       redef var ctype is lazy do
                if mclass.name == "Int" then
                        return "long"
                else if mclass.name == "Bool" then
@@ -1777,6 +1847,8 @@ redef class MClassType
                end
        end
 
+       redef var is_c_primitive is lazy do return ctype != "val*"
+
        redef fun ctype_extern: String
        do
                if mclass.kind == extern_kind then
@@ -1834,6 +1906,15 @@ redef class MMethodDef
                var modelbuilder = v.compiler.modelbuilder
                var val = constant_value
                var node = modelbuilder.mpropdef2node(self)
+
+               if is_abstract then
+                       var cn = v.class_name_string(arguments.first)
+                       v.current_node = node
+                       v.add("PRINT_ERROR(\"Runtime error: Abstract method `%s` called on `%s`\", \"{mproperty.name.escape_to_c}\", {cn});")
+                       v.add_raw_abort
+                       return null
+               end
+
                if node isa APropdef then
                        var oldnode = v.current_node
                        v.current_node = node
@@ -1893,13 +1974,6 @@ end
 redef class AMethPropdef
        redef fun compile_to_c(v, mpropdef, arguments)
        do
-               if mpropdef.is_abstract then
-                       var cn = v.class_name_string(arguments.first)
-                       v.add("PRINT_ERROR(\"Runtime error: Abstract method `%s` called on `%s`\", \"{mpropdef.mproperty.name.escape_to_c}\", {cn});")
-                       v.add_raw_abort
-                       return
-               end
-
                # Call the implicit super-init
                var auto_super_inits = self.auto_super_inits
                if auto_super_inits != null then
@@ -1984,6 +2058,9 @@ redef class AMethPropdef
                        else if pname == "unary -" then
                                v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
                                return true
+                       else if pname == "unary +" then
+                               v.ret(arguments[0])
+                               return true
                        else if pname == "*" then
                                v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
                                return true
@@ -2095,6 +2172,9 @@ redef class AMethPropdef
                        else if pname == "unary -" then
                                v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
                                return true
+                       else if pname == "unary +" then
+                               v.ret(arguments[0])
+                               return true
                        else if pname == "succ" then
                                v.ret(v.new_expr("{arguments[0]}+1", ret.as(not null)))
                                return true
@@ -2143,6 +2223,9 @@ redef class AMethPropdef
                        else if pname == "atoi" then
                                v.ret(v.new_expr("atoi({arguments[0]});", ret.as(not null)))
                                return true
+                       else if pname == "fast_cstring" then
+                               v.ret(v.new_expr("{arguments[0]} + {arguments[1]}", ret.as(not null)))
+                               return true
                        else if pname == "new" then
                                v.ret(v.new_expr("(char*)nit_alloc({arguments[1]})", ret.as(not null)))
                                return true
@@ -2264,7 +2347,7 @@ redef class AAttrPropdef
                        if is_lazy then
                                var set
                                var ret = self.mpropdef.static_mtype
-                               var useiset = ret.ctype == "val*" and not ret isa MNullableType
+                               var useiset = not ret.is_c_primitive and not ret isa MNullableType
                                var guard = self.mlazypropdef.mproperty
                                if useiset then
                                        set = v.isset_attribute(self.mpropdef.mproperty, recv)
@@ -2279,7 +2362,7 @@ redef class AAttrPropdef
 
                                v.assign(res, value)
                                if not useiset then
-                                       var true_v = v.new_expr("1", v.bool_type)
+                                       var true_v = v.bool_instance(true)
                                        v.write_attribute(guard, arguments.first, true_v)
                                end
                                v.add("\}")
@@ -2292,9 +2375,9 @@ redef class AAttrPropdef
                        v.write_attribute(self.mpropdef.mproperty, arguments.first, arguments[1])
                        if is_lazy then
                                var ret = self.mpropdef.static_mtype
-                               var useiset = ret.ctype == "val*" and not ret isa MNullableType
+                               var useiset = not ret.is_c_primitive and not ret isa MNullableType
                                if not useiset then
-                                       v.write_attribute(self.mlazypropdef.mproperty, arguments.first, v.new_expr("1", v.bool_type))
+                                       v.write_attribute(self.mlazypropdef.mproperty, arguments.first, v.bool_instance(true))
                                end
                        end
                else
@@ -2304,7 +2387,7 @@ redef class AAttrPropdef
 
        fun init_expr(v: AbstractCompilerVisitor, recv: RuntimeVariable)
        do
-               if has_value and not is_lazy then evaluate_expr(v, recv)
+               if has_value and not is_lazy and not n_expr isa ANullExpr then evaluate_expr(v, recv)
        end
 
        # Evaluate, store and return the default value of the attribute
@@ -2313,7 +2396,7 @@ redef class AAttrPropdef
                var oldnode = v.current_node
                v.current_node = self
                var old_frame = v.frame
-               var frame = new StaticFrame(v, self.mpropdef.as(not null), recv.mcasttype.as_notnullable.as(MClassType), [recv])
+               var frame = new StaticFrame(v, self.mpropdef.as(not null), recv.mcasttype.undecorate.as(MClassType), [recv])
                v.frame = frame
 
                var value
@@ -2464,6 +2547,13 @@ redef class ASelfExpr
        redef fun expr(v) do return v.frame.arguments.first
 end
 
+redef class AImplicitSelfExpr
+       redef fun expr(v) do
+               if not is_sys then return super
+               return v.new_expr("glob_sys", mtype.as(not null))
+       end
+end
+
 redef class AEscapeExpr
        redef fun stmt(v) do v.add("goto BREAK_{v.escapemark_name(self.escapemark)};")
 end
@@ -2692,15 +2782,15 @@ redef class AOrElseExpr
 end
 
 redef class AIntExpr
-       redef fun expr(v) do return v.new_expr("{self.value.to_s}", self.mtype.as(not null))
+       redef fun expr(v) do return v.int_instance(self.value.as(not null))
 end
 
 redef class AFloatExpr
-       redef fun expr(v) do return v.new_expr("{self.n_float.text}", self.mtype.as(not null)) # FIXME use value, not n_float
+       redef fun expr(v) do return v.float_instance("{self.n_float.text}") # FIXME use value, not n_float
 end
 
 redef class ACharExpr
-       redef fun expr(v) do return v.new_expr("'{self.value.to_s.escape_to_c}'", self.mtype.as(not null))
+       redef fun expr(v) do return v.char_instance(self.value.as(not null))
 end
 
 redef class AArrayExpr
@@ -2728,14 +2818,64 @@ end
 redef class ASuperstringExpr
        redef fun expr(v)
        do
-               var array = new Array[RuntimeVariable]
+               var type_string = mtype.as(not null)
+
+               # Collect elements of the superstring
+               var array = new Array[AExpr]
                for ne in self.n_exprs do
+                       # Drop literal empty string.
+                       # They appears in things like "{a}" that is ["", a, ""]
                        if ne isa AStringFormExpr and ne.value == "" then continue # skip empty sub-strings
-                       var i = v.expr(ne, null)
-                       array.add(i)
+                       array.add(ne)
                end
-               var a = v.array_instance(array, v.object_type)
-               var res = v.send(v.get_property("to_s", a.mtype), [a])
+
+               # Store the allocated native array in a static variable
+               # For reusing later
+               var varonce = v.get_name("varonce")
+               v.add("if (unlikely({varonce}==NULL)) \{")
+
+               # The native array that will contains the elements to_s-ized.
+               # For fast concatenation.
+               var a = v.native_array_instance(type_string, v.int_instance(array.length))
+
+               v.add_decl("static {a.mtype.ctype} {varonce};")
+
+               # Pre-fill the array with the literal string parts.
+               # So they do not need to be filled again when reused
+               for i in [0..array.length[ do
+                       var ne = array[i]
+                       if not ne isa AStringFormExpr then continue
+                       var e = v.expr(ne, null)
+                       v.native_array_set(a, i, e)
+               end
+
+               v.add("\} else \{")
+               # Take the native-array from the store.
+               # The point is to prevent that some recursive execution use (and corrupt) the same native array
+               # WARNING: not thread safe! (FIXME?)
+               v.add("{a} = {varonce};")
+               v.add("{varonce} = NULL;")
+               v.add("\}")
+
+               # Stringify the elements and put them in the native array
+               var to_s_method = v.get_property("to_s", v.object_type)
+               for i in [0..array.length[ do
+                       var ne = array[i]
+                       if ne isa AStringFormExpr then continue
+                       var e = v.expr(ne, null)
+                       # Skip the `to_s` if the element is already a String
+                       if not e.mcasttype.is_subtype(v.compiler.mainmodule, null, type_string) then
+                               e = v.send(to_s_method, [e]).as(not null)
+                       end
+                       v.native_array_set(a, i, e)
+               end
+
+               # Fast join the native string to get the result
+               var res = v.send(v.get_property("native_to_s", a.mtype), [a])
+
+               # We finish to work with the native array,
+               # so store it so that it can be reused
+               v.add("{varonce} = {a};")
                return res
        end
 end
@@ -2765,15 +2905,15 @@ redef class AOrangeExpr
 end
 
 redef class ATrueExpr
-       redef fun expr(v) do return v.new_expr("1", self.mtype.as(not null))
+       redef fun expr(v) do return v.bool_instance(true)
 end
 
 redef class AFalseExpr
-       redef fun expr(v) do return v.new_expr("0", self.mtype.as(not null))
+       redef fun expr(v) do return v.bool_instance(false)
 end
 
 redef class ANullExpr
-       redef fun expr(v) do return v.new_expr("NULL", self.mtype.as(not null))
+       redef fun expr(v) do return v.null_instance
 end
 
 redef class AIsaExpr
@@ -2801,7 +2941,7 @@ redef class AAsNotnullExpr
                var i = v.expr(self.n_expr, null)
                if v.compiler.modelbuilder.toolcontext.opt_no_check_assert.value then return i
 
-               if i.mtype.ctype != "val*" then return i
+               if i.mtype.is_c_primitive then return i
 
                v.add("if (unlikely({i} == NULL)) \{")
                v.add_abort("Cast failed")
@@ -2823,7 +2963,7 @@ redef class AOnceExpr
                v.add_decl("static {mtype.ctype} {name};")
                v.add_decl("static int {guard};")
                var res = v.new_var(mtype)
-               v.add("if ({guard}) \{")
+               v.add("if (likely({guard})) \{")
                v.add("{res} = {name};")
                v.add("\} else \{")
                var i = v.expr(self.n_expr, mtype)
@@ -2840,7 +2980,7 @@ redef class ASendExpr
        do
                var recv = v.expr(self.n_expr, null)
                var callsite = self.callsite.as(not null)
-               var args = v.varargize(callsite.mpropdef, recv, self.raw_arguments)
+               var args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.raw_arguments)
                return v.compile_callsite(callsite, args)
        end
 end
@@ -2850,7 +2990,7 @@ redef class ASendReassignFormExpr
        do
                var recv = v.expr(self.n_expr, null)
                var callsite = self.callsite.as(not null)
-               var args = v.varargize(callsite.mpropdef, recv, self.raw_arguments)
+               var args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.raw_arguments)
 
                var value = v.expr(self.n_value, null)
 
@@ -2872,26 +3012,33 @@ redef class ASuperExpr
 
                var callsite = self.callsite
                if callsite != null then
-                       var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)
+                       var args
 
-                       # Add additional arguments for the super init call
-                       if args.length == 1 then
+                       if self.n_args.n_exprs.is_empty then
+                               # Add automatic arguments for the super init call
+                               args = [recv]
                                for i in [0..callsite.msignature.arity[ do
                                        args.add(v.frame.arguments[i+1])
                                end
+                       else
+                               args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.n_args.n_exprs)
                        end
+
                        # Super init call
                        var res = v.compile_callsite(callsite, args)
                        return res
                end
 
                var mpropdef = self.mpropdef.as(not null)
-               var args = v.varargize(mpropdef, recv, self.n_args.n_exprs)
-               if args.length == 1 then
+
+               var args
+               if self.n_args.n_exprs.is_empty then
                        args = v.frame.arguments
+               else
+                       args = v.varargize(mpropdef, signaturemap, recv, self.n_args.n_exprs)
                end
 
-               # stantard call-next-method
+               # Standard call-next-method
                return v.supercall(mpropdef, recv.mtype.as(MClassType), args)
        end
 end
@@ -2912,8 +3059,10 @@ redef class ANewExpr
 
                var recv = v.init_instance_or_extern(mtype)
 
-               var callsite = self.callsite.as(not null)
-               var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)
+               var callsite = self.callsite
+               if callsite == null then return recv
+
+               var args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.n_args.n_exprs)
                var res2 = v.compile_callsite(callsite, args)
                if res2 != null then
                        #self.debug("got {res2} from {mproperty}. drop {recv}")
@@ -2965,6 +3114,13 @@ redef class AIssetAttrExpr
        end
 end
 
+redef class AVarargExpr
+       redef fun expr(v)
+       do
+               return v.expr(self.n_expr, null)
+       end
+end
+
 redef class ADebugTypeExpr
        redef fun stmt(v)
        do
@@ -3030,7 +3186,7 @@ var modelbuilder = new ModelBuilder(model, toolcontext)
 
 var arguments = toolcontext.option_context.rest
 if arguments.length > 1 and toolcontext.opt_output.value != null then
-       print "Error: --output needs a single source file. Do you prefer --dir?"
+       print "Option Error: --output needs a single source file. Do you prefer --dir?"
        exit 1
 end
 
index b2f4837..e2afc48 100644 (file)
@@ -17,7 +17,7 @@ module coloring
 import poset
 
 # Build a conflict graph from a POSet
-class POSetConflictGraph[E: Object]
+class POSetConflictGraph[E]
 
        # Core is composed by:
        #  * elements that have mutiple direct parents
@@ -45,13 +45,18 @@ class POSetConflictGraph[E: Object]
        # REQUIRE: is_colored
        var conflicts = new HashMap[E, Set[E]]
 
+       # The associated poset
        var poset: POSet[E]
 
+       # The linearisation order to visit elements in the poset
+       var order: Array[E] is noinit
+
        init do
                extract_core
                extract_border
                extract_crown
                compute_conflicts
+               order = poset.linearize(poset)
        end
 
        # Compute the set of elements forming the core of the poset hierarchy.
@@ -116,10 +121,14 @@ class POSetConflictGraph[E: Object]
                #print "border: {border.join(" ")} ({border.length})"
                #print "crown: {crown.join(" ")} ({crown.length})"
                print "conflicts:"
-               for e, c in conflicts do print "  {e}: {c.join(" ")}"
+               for e, c in conflicts do print "  {e or else "NULL"}: {c.join(" ")}"
        end
 end
 
+redef class POSet[E]
+       fun to_conflict_graph: POSetConflictGraph[E] do return new POSetConflictGraph[E](self)
+end
+
 # Colorize elements from a POSet
 # Two elements from a POSet cannot have the same color if they share common subelements
 #
@@ -265,6 +274,166 @@ class POSetColorer[E: Object]
        end
 end
 
+# Colorize elements `E` introduced by holders `H` in a `POSet`.
+#
+# Two elements cannot have the same color if they are introduced or inherited by a same holder.
+class POSetGroupColorer[H: Object, E: Object]
+
+       # The associated conflict graph containing the poset.
+       #
+       # The conflict graph is used instead of the original poset so that the conflict graph can be reused
+       # in different coloration based on the same poset.
+       var graph: POSetConflictGraph[H]
+
+       # The elements to color.
+       #
+       # For each holder, the collection of introduced elements is given.
+       #
+       # A single element must not be introduced in more than one holder.
+       var buckets: Map[H, Collection[E]]
+
+       # The associated poset.
+       #
+       # alias for `graph.poset`
+       fun poset: POSet[H] do return graph.poset
+
+       # The resulting coloring
+       #
+       # Each element from buckets is associated to its own color
+       var colors: Map[E, Int] is lazy do
+               for h in graph.poset do
+                       used_colors[h] = new HashSet[Int]
+               end
+               compute_colors
+               return colors_cache
+       end
+
+       # Resulting colors
+       private var colors_cache = new HashMap[E, Int]
+
+       # Set of known used colors
+       private var used_colors = new HashMap[H, HashSet[Int]]
+
+       # Build table layout of elements `E` for the holder `h`.
+       #
+       # `null` is used to fill places without elements (holes).
+       fun build_layout(h: H): Array[nullable E]
+       do
+               var table = new Array[nullable E]
+               for s in poset[h].greaters do
+                       var bucket = buckets.get_or_null(s)
+                       if bucket == null then continue
+                       for e in bucket do
+                               var color = colors[e]
+                               if table.length <= color then
+                                       for i in [table.length .. color[ do
+                                               table[i] = null
+                                       end
+                               else
+                                       assert table[color] == null else print "in {h}, for {color}: {table[color] or else ""} vs {e}"
+                               end
+                               table[color] = e
+                       end
+               end
+               return table
+       end
+
+       # Colorize core, border and crown in that order
+       private fun compute_colors do
+               colors_cache.clear
+               colorize_core
+               colorize_set(graph.border)
+               colorize_set(graph.crown)
+       end
+
+       # Core elements cannot have the same color than:
+       #  * one of their parents
+       #  * one of their conflicting elements
+       private fun colorize_core do
+               for h in graph.order do
+                       if not graph.core.has(h) then continue
+
+                       var color = inherit_color(h)
+                       var mincolor = color
+                       var bucket = buckets.get_or_null(h)
+                       if bucket == null then continue
+                       var conflicts = graph.conflicts[h]
+                       var parents = poset[h].greaters
+                       for e in bucket do
+                               color = next_free_color(color, parents)
+                               color = next_free_color(color, conflicts)
+                               colors_cache[e] = color
+                               used_colors[h].add color
+                               #print "{h}: color[{color}] <- {e}"
+                               if mincolor == color then mincolor += 1
+                               color += 1
+                       end
+                       min_colors[h] = mincolor
+               end
+       end
+
+       # Other elements inherit color from their direct parents
+       private fun colorize_set(set: Set[H]) do
+               for h in graph.order do
+                       if not set.has(h) then continue
+
+                       var color = inherit_color(h)
+                       var mincolor = color
+                       var bucket = buckets.get_or_null(h)
+                       if bucket == null then continue
+                       var parents = poset[h].greaters
+                       for e in bucket do
+                               color = next_free_color(color, parents)
+                               colors_cache[e] = color
+                               used_colors[h].add color
+                               #print "{h}: color[{color}] <- {e} (set)"
+                               if mincolor == color then mincolor += 1
+                               color += 1
+                       end
+                       min_colors[h] = mincolor
+               end
+       end
+
+       # Get the first available free color.
+       private fun inherit_color(h: H): Int
+       do
+               var res = 0
+               for p in poset[h].direct_greaters do
+                       var m = min_colors[p]
+                       if m > res then res = m
+               end
+               min_colors[h] = res
+               return res
+       end
+
+       # The first available color for each holder.
+       #
+       # Is used by children to start their coloring.
+       #
+       # Is updated at the end of a coloring step.
+       private var min_colors = new HashMap[H, Int]
+
+       private fun next_free_color(color: Int, set: Collection[H]): Int do
+               loop
+                       for h in set do
+                               if used_colors[h].has(color) then
+                                       #print "\tin {h}, {color} is used"
+                                       color += 1
+                                       continue label
+                               end
+                       end
+                       break
+               end label
+               return color
+       end
+
+       # Used for debugging only
+       fun pretty_print do
+               print "colors:"
+               for e, c in colors do print "  {e}: {c}"
+       end
+end
+
 # Colorize a collection of buckets
 # Two elements cannot have the same color if they both appear in the same bucket
 # No coloring order is garantied
index ea60c0a..c013295 100644 (file)
@@ -22,3 +22,4 @@ import compiler_ffi
 import platform::android
 import platform::pnacl
 import platform::emscripten
+import platform::ios
index 7a0f162..ede1beb 100644 (file)
@@ -86,7 +86,7 @@ class GlobalCompiler
                self.header = new CodeWriter(file)
                self.live_primitive_types = new Array[MClassType]
                for t in runtime_type_analysis.live_types do
-                       if t.ctype != "val*" or t.mclass.name == "Pointer" then
+                       if t.is_c_primitive or t.mclass.name == "Pointer" then
                                self.live_primitive_types.add(t)
                        end
                end
@@ -109,7 +109,7 @@ class GlobalCompiler
 
                # Init instance code (allocate and init-arguments)
                for t in runtime_type_analysis.live_types do
-                       if t.ctype == "val*" then
+                       if not t.is_c_primitive then
                                compiler.generate_init_instance(t)
                                if t.mclass.kind == extern_kind then
                                        compiler.generate_box_instance(t)
@@ -228,7 +228,7 @@ class GlobalCompiler
        fun generate_init_instance(mtype: MClassType)
        do
                assert self.runtime_type_analysis.live_types.has(mtype)
-               assert mtype.ctype == "val*"
+               assert not mtype.is_c_primitive
                var v = self.new_visitor
 
                var is_native_array = mtype.mclass.name == "NativeArray"
@@ -303,16 +303,16 @@ class GlobalCompilerVisitor
        do
                if value.mtype == mtype then
                        return value
-               else if value.mtype.ctype == "val*" and mtype.ctype == "val*" then
+               else if not value.mtype.is_c_primitive and not mtype.is_c_primitive then
                        return value
-               else if value.mtype.ctype == "val*" then
+               else if not value.mtype.is_c_primitive then
                        return self.new_expr("((struct {mtype.c_name}*){value})->value; /* autounbox from {value.mtype} to {mtype} */", mtype)
-               else if mtype.ctype == "val*" then
+               else if not mtype.is_c_primitive then
                        var valtype = value.mtype.as(MClassType)
                        var res = self.new_var(mtype)
                        if not compiler.runtime_type_analysis.live_types.has(valtype) then
                                self.add("/*no autobox from {value.mtype} to {mtype}: {value.mtype} is not live! */")
-                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); fatal_exit(1);")
                                return res
                        end
                        self.add("{res} = BOX_{valtype.c_name}({value}); /* autobox from {value.mtype} to {mtype} */")
@@ -323,7 +323,7 @@ class GlobalCompilerVisitor
                        # Bad things will appen!
                        var res = self.new_var(mtype)
                        self.add("/* {res} left unintialized (cannot convert {value.mtype} to {mtype}) */")
-                       self.add("PRINT_ERROR(\"Cast error: Cannot cast %s to %s.\\n\", \"{value.mtype}\", \"{mtype}\"); show_backtrace(1);")
+                       self.add("PRINT_ERROR(\"Cast error: Cannot cast %s to %s.\\n\", \"{value.mtype}\", \"{mtype}\"); fatal_exit(1);")
                        return res
                end
        end
@@ -349,7 +349,7 @@ class GlobalCompilerVisitor
                var res = self.new_var(mtype)
                if not compiler.runtime_type_analysis.live_types.has(value.mtype.as(MClassType)) then
                        self.add("/*no boxing of {value.mtype}: {value.mtype} is not live! */")
-                       self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                       self.add("PRINT_ERROR(\"Dead code executed!\\n\"); fatal_exit(1);")
                        return res
                end
                self.add("{res} = BOX_{valtype.c_name}({value}); /* boxing {value.mtype} */")
@@ -402,11 +402,24 @@ class GlobalCompilerVisitor
 
        redef fun native_array_instance(elttype: MType, length: RuntimeVariable): RuntimeVariable
        do
-               var ret_type = self.get_class("NativeArray").get_mtype([elttype])
+               var ret_type = mmodule.native_array_type(elttype)
                ret_type = anchor(ret_type).as(MClassType)
                return self.new_expr("NEW_{ret_type.c_name}({length})", ret_type)
        end
 
+       redef fun native_array_get(nat, i)
+       do
+               var recv = "((struct {nat.mcasttype.c_name}*){nat})->values"
+               var ret_type = nat.mcasttype.as(MClassType).arguments.first
+               return self.new_expr("{recv}[{i}]", ret_type)
+       end
+
+       redef fun native_array_set(nat, i, val)
+       do
+               var recv = "((struct {nat.mcasttype.c_name}*){nat})->values"
+               self.add("{recv}[{i}]={val};")
+       end
+
        redef fun calloc_array(ret_type, arguments)
        do
                self.ret(self.new_expr("NEW_{ret_type.c_name}({arguments[1]})", ret_type))
@@ -426,7 +439,7 @@ class GlobalCompilerVisitor
                end
 
                self.add("/* send {m} on {args.first.inspect} */")
-               if args.first.mtype.ctype != "val*" then
+               if args.first.mtype.is_c_primitive then
                        var mclasstype = args.first.mtype.as(MClassType)
                        if not self.compiler.runtime_type_analysis.live_types.has(mclasstype) then
                                self.add("/* skip, no method {m} */")
@@ -477,7 +490,7 @@ class GlobalCompilerVisitor
                var defaultpropdef: nullable MMethodDef = null
                for t in types do
                        var propdef = m.lookup_first_definition(self.compiler.mainmodule, t)
-                       if propdef.mclassdef.mclass.name == "Object" and t.ctype == "val*" then
+                       if propdef.mclassdef.mclass.name == "Object" and not t.is_c_primitive then
                                defaultpropdef = propdef
                                continue
                        end
@@ -515,11 +528,6 @@ class GlobalCompilerVisitor
        private fun get_recvtype(m: MMethodDef, recvtype: MClassType, args: Array[RuntimeVariable]): MClassType
        do
                check_valid_reciever(recvtype)
-               #debug("call {m} on {recvtype} on {args.first}:{args.first.mtype}")
-               if m.mproperty.is_toplevel then
-                       # Do not customize top-level methods
-                       recvtype = m.mclassdef.bound_mtype
-               end
                return recvtype
        end
 
@@ -552,7 +560,7 @@ class GlobalCompilerVisitor
                end
 
                self.add("/* super {m} on {args.first.inspect} */")
-               if args.first.mtype.ctype != "val*" then
+               if args.first.mtype.is_c_primitive then
                        var mclasstype = args.first.mtype.as(MClassType)
                        if not self.compiler.runtime_type_analysis.live_types.has(mclasstype) then
                                self.add("/* skip, no method {m} */")
@@ -628,9 +636,9 @@ class GlobalCompilerVisitor
 
        fun bugtype(recv: RuntimeVariable)
        do
-               if recv.mtype.ctype != "val*" then return
+               if recv.mtype.is_c_primitive then return
                self.add("PRINT_ERROR(\"BTD BUG: Dynamic type is %s, static type is %s\\n\", class_names[{recv}->classid], \"{recv.mcasttype}\");")
-               self.add("show_backtrace(1);")
+               self.add("fatal_exit(1);")
        end
 
        redef fun isset_attribute(a, recv)
@@ -659,7 +667,7 @@ class GlobalCompilerVisitor
                        ta = self.resolve_for(ta, recv2)
                        var attr = self.new_expr("((struct {t.c_name}*){recv})->{a.intro.c_name}", ta)
                        if not ta isa MNullableType then
-                               if ta.ctype == "val*" then
+                               if not ta.is_c_primitive then
                                        self.add("{res} = ({attr} != NULL);")
                                else
                                        self.add("{res} = 1; /*NOTYET isset on primitive attributes*/")
@@ -705,7 +713,7 @@ class GlobalCompilerVisitor
                        ta = self.resolve_for(ta, recv2)
                        var res2 = self.new_expr("((struct {t.c_name}*){recv})->{a.intro.c_name}", ta)
                        if not ta isa MNullableType and not self.compiler.modelbuilder.toolcontext.opt_no_check_attr_isset.value then
-                               if ta.ctype == "val*" then
+                               if not ta.is_c_primitive then
                                        self.add("if ({res2} == NULL) \{")
                                        self.add_abort("Uninitialized attribute {a.name}")
                                        self.add("\}")
@@ -781,7 +789,7 @@ class GlobalCompilerVisitor
                var res = self.new_var(bool_type)
 
                self.add("/* isa {mtype} on {value.inspect} */")
-               if value.mtype.ctype != "val*" then
+               if value.mtype.is_c_primitive then
                        if value.mtype.is_subtype(self.compiler.mainmodule, null, mtype) then
                                self.add("{res} = 1;")
                        else
@@ -816,14 +824,14 @@ class GlobalCompilerVisitor
        redef fun is_same_type_test(value1, value2)
        do
                var res = self.new_var(bool_type)
-               if value2.mtype.ctype == "val*" then
-                       if value1.mtype.ctype == "val*" then
+               if not value2.mtype.is_c_primitive then
+                       if not value1.mtype.is_c_primitive then
                                self.add "{res} = {value1}->classid == {value2}->classid;"
                        else
                                self.add "{res} = {self.compiler.classid(value1.mtype.as(MClassType))} == {value2}->classid;"
                        end
                else
-                       if value1.mtype.ctype == "val*" then
+                       if not value1.mtype.is_c_primitive then
                                self.add "{res} = {value1}->classid == {self.compiler.classid(value2.mtype.as(MClassType))};"
                        else if value1.mcasttype == value2.mcasttype then
                                self.add "{res} = 1;"
@@ -838,7 +846,7 @@ class GlobalCompilerVisitor
        do
                var res = self.get_name("var_class_name")
                self.add_decl("const char* {res};")
-               if value.mtype.ctype == "val*" then
+               if not value.mtype.is_c_primitive then
                        self.add "{res} = class_names[{value}->classid];"
                else
                        self.add "{res} = class_names[{self.compiler.classid(value.mtype.as(MClassType))}];"
@@ -849,15 +857,15 @@ class GlobalCompilerVisitor
        redef fun equal_test(value1, value2)
        do
                var res = self.new_var(bool_type)
-               if value2.mtype.ctype != "val*" and value1.mtype.ctype == "val*" then
+               if value2.mtype.is_c_primitive and not value1.mtype.is_c_primitive then
                        var tmp = value1
                        value1 = value2
                        value2 = tmp
                end
-               if value1.mtype.ctype != "val*" then
+               if value1.mtype.is_c_primitive then
                        if value2.mtype == value1.mtype then
                                self.add("{res} = {value1} == {value2};")
-                       else if value2.mtype.ctype != "val*" then
+                       else if value2.mtype.is_c_primitive then
                                self.add("{res} = 0; /* incompatible types {value1.mtype} vs. {value2.mtype}*/")
                        else
                                var mtype1 = value1.mtype.as(MClassType)
@@ -894,10 +902,10 @@ class GlobalCompilerVisitor
        redef fun array_instance(array, elttype)
        do
                elttype = self.anchor(elttype)
-               var arraytype = self.get_class("Array").get_mtype([elttype])
+               var arraytype = mmodule.array_type(elttype)
                var res = self.init_instance(arraytype)
                self.add("\{ /* {res} = array_instance Array[{elttype}] */")
-               var nat = self.new_var(self.get_class("NativeArray").get_mtype([elttype]))
+               var nat = self.new_var(mmodule.native_array_type(elttype))
                nat.is_exact = true
                self.add("{nat} = NEW_{nat.mtype.c_name}({array.length});")
                for i in [0..array.length[ do
@@ -991,7 +999,7 @@ private class CustomizedRuntimeFunction
                for i in [0..mmethoddef.msignature.arity[ do
                        var mtype = mmethoddef.msignature.mparameters[i].mtype
                        if i == mmethoddef.msignature.vararg_rank then
-                               mtype = v.get_class("Array").get_mtype([mtype])
+                               mtype = v.mmodule.array_type(mtype)
                        end
                        mtype = v.resolve_for(mtype, selfvar)
                        comment.append(", {mtype}")
index da2ed1e..34e7be4 100644 (file)
@@ -29,6 +29,8 @@ redef class ToolContext
        var opt_no_union_attribute = new OptionBool("Put primitive attibutes in a box instead of an union", "--no-union-attribute")
        # --no-shortcut-equate
        var opt_no_shortcut_equate = new OptionBool("Always call == in a polymorphic way", "--no-shortcut-equal")
+       # --no-tag-primitives
+       var opt_no_tag_primitives = new OptionBool("Use only boxes for primitive types", "--no-tag-primitives")
 
        # --colors-are-symbols
        var opt_colors_are_symbols = new OptionBool("Store colors as symbols (link-boost)", "--colors-are-symbols")
@@ -57,6 +59,8 @@ redef class ToolContext
        var opt_colo_dead_methods = new OptionBool("Force colorization of dead methods", "--colo-dead-methods")
        # --tables-metrics
        var opt_tables_metrics = new OptionBool("Enable static size measuring of tables used for vft, typing and resolution", "--tables-metrics")
+       # --type-poset
+       var opt_type_poset = new OptionBool("Build a poset of types to create more condensed tables.", "--type-poset")
 
        redef init
        do
@@ -65,10 +69,12 @@ redef class ToolContext
                self.option_context.add_option(self.opt_no_inline_intern)
                self.option_context.add_option(self.opt_no_union_attribute)
                self.option_context.add_option(self.opt_no_shortcut_equate)
+               self.option_context.add_option(self.opt_no_tag_primitives)
                self.option_context.add_option(opt_colors_are_symbols, opt_trampoline_call, opt_guard_call, opt_direct_call_monomorph0, opt_substitute_monomorph, opt_link_boost)
                self.option_context.add_option(self.opt_inline_coloring_numbers, opt_inline_some_methods, opt_direct_call_monomorph, opt_skip_dead_methods, opt_semi_global)
                self.option_context.add_option(self.opt_colo_dead_methods)
                self.option_context.add_option(self.opt_tables_metrics)
+               self.option_context.add_option(self.opt_type_poset)
        end
 
        redef fun process_options(args)
@@ -143,8 +149,6 @@ class SeparateCompiler
        private var type_ids: Map[MType, Int] is noinit
        private var type_colors: Map[MType, Int] is noinit
        private var opentype_colors: Map[MType, Int] is noinit
-       protected var method_colors: Map[PropertyLayoutElement, Int] is noinit
-       protected var attr_colors: Map[MAttribute, Int] is noinit
 
        init do
                var file = new_file("nit.common")
@@ -163,6 +167,7 @@ class SeparateCompiler
                modelbuilder.toolcontext.info("Property coloring", 2)
                compiler.new_file("{c_name}.classes")
                compiler.do_property_coloring
+               compiler.compile_class_infos
                for m in mainmodule.in_importation.greaters do
                        for mclass in m.intro_mclasses do
                                #if mclass.kind == abstract_kind or mclass.kind == interface_kind then continue
@@ -217,6 +222,11 @@ class SeparateCompiler
                self.header.add_decl("struct instance \{ const struct type *type; const struct class *class; nitattribute_t attrs[]; \}; /* general C type representing a Nit instance. */")
                self.header.add_decl("struct types \{ int dummy; const struct type *types[]; \}; /* a list types (used for vts, fts and unresolved lists). */")
                self.header.add_decl("typedef struct instance val; /* general C type representing a Nit instance. */")
+
+               if not modelbuilder.toolcontext.opt_no_tag_primitives.value then
+                       self.header.add_decl("extern const struct class *class_info[];")
+                       self.header.add_decl("extern const struct type *type_info[];")
+               end
        end
 
        fun compile_header_attribute_structs
@@ -259,7 +269,7 @@ class SeparateCompiler
                if mclass.mclass_type.ctype_extern == "val*" then
                        return 0
                else if mclass.kind == extern_kind and mclass.name != "NativeString" then
-                       return self.box_kinds[self.mainmodule.get_primitive_class("Pointer")]
+                       return self.box_kinds[self.mainmodule.pointer_type.mclass]
                else
                        return self.box_kinds[mclass]
                end
@@ -296,186 +306,180 @@ class SeparateCompiler
 
        private var color_consts_done = new HashSet[Object]
 
+       # The conflict graph of classes used for coloration
+       var class_conflict_graph: POSetConflictGraph[MClass] is noinit
+
        # colorize classe properties
        fun do_property_coloring do
 
                var rta = runtime_type_analysis
 
-               # Layouts
-               var poset = mainmodule.flatten_mclass_hierarchy
-               var mclasses = new HashSet[MClass].from(poset)
-               var colorer = new POSetColorer[MClass]
-               colorer.colorize(poset)
+               # Class graph
+               var mclasses = mainmodule.flatten_mclass_hierarchy
+               class_conflict_graph = mclasses.to_conflict_graph
 
-               # The dead methods, still need to provide a dead color symbol
-               var dead_methods = new Array[MMethod]
-
-               # lookup properties to build layout with
+               # Prepare to collect elements to color and build layout with
                var mmethods = new HashMap[MClass, Set[PropertyLayoutElement]]
                var mattributes = new HashMap[MClass, Set[MAttribute]]
+
+               # The dead methods and super-call, still need to provide a dead color symbol
+               var dead_methods = new Array[PropertyLayoutElement]
+
                for mclass in mclasses do
                        mmethods[mclass] = new HashSet[PropertyLayoutElement]
                        mattributes[mclass] = new HashSet[MAttribute]
-                       for mprop in self.mainmodule.properties(mclass) do
-                               if mprop isa MMethod then
-                                       if not modelbuilder.toolcontext.opt_colo_dead_methods.value and rta != null and not rta.live_methods.has(mprop) then
-                                               dead_methods.add(mprop)
-                                               continue
-                                       end
-                                       mmethods[mclass].add(mprop)
-                               else if mprop isa MAttribute then
-                                       mattributes[mclass].add(mprop)
-                               end
+               end
+
+               # Pre-collect known live things
+               if rta != null then
+                       for m in rta.live_methods do
+                               mmethods[m.intro_mclassdef.mclass].add m
+                       end
+                       for m in rta.live_super_sends do
+                               var mclass = m.mclassdef.mclass
+                               mmethods[mclass].add m
                        end
                end
 
-               # Collect all super calls (dead or not)
-               var all_super_calls = new HashSet[MMethodDef]
-               for mmodule in self.mainmodule.in_importation.greaters do
-                       for mclassdef in mmodule.mclassdefs do
-                               for mpropdef in mclassdef.mpropdefs do
-                                       if not mpropdef isa MMethodDef then continue
-                                       if mpropdef.has_supercall then
-                                               all_super_calls.add(mpropdef)
+               for m in mainmodule.in_importation.greaters do for cd in m.mclassdefs do
+                       var mclass = cd.mclass
+                       # Collect methods ad attributes
+                       for p in cd.intro_mproperties do
+                               if p isa MMethod then
+                                       if rta == null then
+                                               mmethods[mclass].add p
+                                       else if not rta.live_methods.has(p) then
+                                               dead_methods.add p
                                        end
+                               else if p isa MAttribute then
+                                       mattributes[mclass].add p
                                end
                        end
-               end
-
-               # lookup super calls and add it to the list of mmethods to build layout with
-               var super_calls
-               if rta != null then
-                       super_calls = rta.live_super_sends
-               else
-                       super_calls = all_super_calls
-               end
 
-               for mmethoddef in super_calls do
-                       var mclass = mmethoddef.mclassdef.mclass
-                       mmethods[mclass].add(mmethoddef)
-                       for descendant in mclass.in_hierarchy(self.mainmodule).smallers do
-                               mmethods[descendant].add(mmethoddef)
+                       # Collect all super calls (dead or not)
+                       for mpropdef in cd.mpropdefs do
+                               if not mpropdef isa MMethodDef then continue
+                               if mpropdef.has_supercall then
+                                       if rta == null then
+                                               mmethods[mclass].add mpropdef
+                                       else if not rta.live_super_sends.has(mpropdef) then
+                                               dead_methods.add mpropdef
+                                       end
+                               end
                        end
                end
 
                # methods coloration
-               var meth_colorer = new POSetBucketsColorer[MClass, PropertyLayoutElement](poset, colorer.conflicts)
-               method_colors = meth_colorer.colorize(mmethods)
-               method_tables = build_method_tables(mclasses, super_calls)
+               var meth_colorer = new POSetGroupColorer[MClass, PropertyLayoutElement](class_conflict_graph, mmethods)
+               var method_colors = meth_colorer.colors
                compile_color_consts(method_colors)
 
-               # attribute null color to dead methods and supercalls
-               for mproperty in dead_methods do
-                       compile_color_const(new_visitor, mproperty, -1)
-               end
-               for mpropdef in all_super_calls do
-                       if super_calls.has(mpropdef) then continue
-                       compile_color_const(new_visitor, mpropdef, -1)
-               end
+               # give null color to dead methods and supercalls
+               for mproperty in dead_methods do compile_color_const(new_visitor, mproperty, -1)
 
-               # attributes coloration
-               var attr_colorer = new POSetBucketsColorer[MClass, MAttribute](poset, colorer.conflicts)
-               attr_colors = attr_colorer.colorize(mattributes)
-               attr_tables = build_attr_tables(mclasses)
+               # attribute coloration
+               var attr_colorer = new POSetGroupColorer[MClass, MAttribute](class_conflict_graph, mattributes)
+               var attr_colors = attr_colorer.colors#ize(poset, mattributes)
                compile_color_consts(attr_colors)
-       end
 
-       fun build_method_tables(mclasses: Set[MClass], super_calls: Set[MMethodDef]): Map[MClass, Array[nullable MPropDef]] do
-               var tables = new HashMap[MClass, Array[nullable MPropDef]]
+               # Build method and attribute tables
+               method_tables = new HashMap[MClass, Array[nullable MPropDef]]
+               attr_tables = new HashMap[MClass, Array[nullable MProperty]]
                for mclass in mclasses do
-                       var table = new Array[nullable MPropDef]
-                       tables[mclass] = table
+                       if not mclass.has_new_factory and (mclass.kind == abstract_kind or mclass.kind == interface_kind) then continue
+                       if rta != null and not rta.live_classes.has(mclass) then continue
 
-                       var mproperties = self.mainmodule.properties(mclass)
                        var mtype = mclass.intro.bound_mtype
 
-                       for mproperty in mproperties do
-                               if not mproperty isa MMethod then continue
-                               if not method_colors.has_key(mproperty) then continue
-                               var color = method_colors[mproperty]
-                               if table.length <= color then
-                                       for i in [table.length .. color[ do
-                                               table[i] = null
-                                       end
-                               end
-                               table[color] = mproperty.lookup_first_definition(mainmodule, mtype)
-                       end
-
-                       for supercall in super_calls do
-                               if not mtype.collect_mclassdefs(mainmodule).has(supercall.mclassdef) then continue
-
-                               var color = method_colors[supercall]
-                               if table.length <= color then
-                                       for i in [table.length .. color[ do
-                                               table[i] = null
-                                       end
+                       # Resolve elements in the layout to get the final table
+                       var meth_layout = meth_colorer.build_layout(mclass)
+                       var meth_table = new Array[nullable MPropDef].with_capacity(meth_layout.length)
+                       method_tables[mclass] = meth_table
+                       for e in meth_layout do
+                               if e == null then
+                                       meth_table.add null
+                               else if e isa MMethod then
+                                       # Standard method call of `e`
+                                       meth_table.add e.lookup_first_definition(mainmodule, mtype)
+                               else if e isa MMethodDef then
+                                       # Super-call in the methoddef `e`
+                                       meth_table.add e.lookup_next_definition(mainmodule, mtype)
+                               else
+                                       abort
                                end
-                               var mmethoddef = supercall.lookup_next_definition(mainmodule, mtype)
-                               table[color] = mmethoddef
                        end
 
+                       # Do not need to resolve attributes as only the position is used
+                       attr_tables[mclass] = attr_colorer.build_layout(mclass)
                end
-               return tables
-       end
-
-       fun build_attr_tables(mclasses: Set[MClass]): Map[MClass, Array[nullable MPropDef]] do
-               var tables = new HashMap[MClass, Array[nullable MPropDef]]
-               for mclass in mclasses do
-                       var table = new Array[nullable MPropDef]
-                       tables[mclass] = table
 
-                       var mproperties = self.mainmodule.properties(mclass)
-                       var mtype = mclass.intro.bound_mtype
 
-                       for mproperty in mproperties do
-                               if not mproperty isa MAttribute then continue
-                               if not attr_colors.has_key(mproperty) then continue
-                               var color = attr_colors[mproperty]
-                               if table.length <= color then
-                                       for i in [table.length .. color[ do
-                                               table[i] = null
-                                       end
-                               end
-                               table[color] = mproperty.lookup_first_definition(mainmodule, mtype)
-                       end
-               end
-               return tables
        end
 
        # colorize live types of the program
-       private fun do_type_coloring: POSet[MType] do
+       private fun do_type_coloring: Collection[MType] do
                # Collect types to colorize
                var live_types = runtime_type_analysis.live_types
                var live_cast_types = runtime_type_analysis.live_cast_types
-               var mtypes = new HashSet[MType]
-               mtypes.add_all(live_types)
-               for c in self.box_kinds.keys do
-                       mtypes.add(c.mclass_type)
-               end
 
-               # Compute colors
-               var poset = poset_from_mtypes(mtypes, live_cast_types)
-               var colorer = new POSetColorer[MType]
-               colorer.colorize(poset)
-               type_ids = colorer.ids
-               type_colors = colorer.colors
-               type_tables = build_type_tables(poset)
+               var res = new HashSet[MType]
+               res.add_all live_types
+               res.add_all live_cast_types
+
+               if modelbuilder.toolcontext.opt_type_poset.value then
+                       # Compute colors with a type poset
+                       var poset = poset_from_mtypes(live_types, live_cast_types)
+                       var colorer = new POSetColorer[MType]
+                       colorer.colorize(poset)
+                       type_ids = colorer.ids
+                       type_colors = colorer.colors
+                       type_tables = build_type_tables(poset)
+               else
+                       # Compute colors using the class poset
+                       # Faster to compute but the number of holes can degenerate
+                       compute_type_test_layouts(live_types, live_cast_types)
+
+                       type_ids = new HashMap[MType, Int]
+                       for x in res do type_ids[x] = type_ids.length + 1
+               end
 
                # VT and FT are stored with other unresolved types in the big resolution_tables
-               self.compile_resolution_tables(mtypes)
+               self.compute_resolution_tables(live_types)
 
-               return poset
+               return res
        end
 
        private fun poset_from_mtypes(mtypes, cast_types: Set[MType]): POSet[MType] do
                var poset = new POSet[MType]
+
+               # Instead of doing the full matrix mtypes X cast_types,
+               # a grouping is done by the base classes of the type so
+               # that we compare only types whose base classes are in inheritance.
+
+               var mtypes_by_class = new MultiHashMap[MClass, MType]
                for e in mtypes do
+                       var c = e.undecorate.as(MClassType).mclass
+                       mtypes_by_class[c].add(e)
                        poset.add_node(e)
-                       for o in cast_types do
-                               if e == o then continue
-                               poset.add_node(o)
-                               if e.is_subtype(mainmodule, null, o) then
-                                       poset.add_edge(e, o)
+               end
+
+               var casttypes_by_class = new MultiHashMap[MClass, MType]
+               for e in cast_types do
+                       var c = e.undecorate.as(MClassType).mclass
+                       casttypes_by_class[c].add(e)
+                       poset.add_node(e)
+               end
+
+               for c1, ts1 in mtypes_by_class do
+                       for c2 in c1.in_hierarchy(mainmodule).greaters do
+                               var ts2 = casttypes_by_class[c2]
+                               for e in ts1 do
+                                       for o in ts2 do
+                                               if e == o then continue
+                                               if e.is_subtype(mainmodule, null, o) then
+                                                       poset.add_edge(e, o)
+                                               end
+                                       end
                                end
                        end
                end
@@ -501,29 +505,75 @@ class SeparateCompiler
                return tables
        end
 
-       protected fun compile_resolution_tables(mtypes: Set[MType]) do
-               # resolution_tables is used to perform a type resolution at runtime in O(1)
 
+       private fun compute_type_test_layouts(mtypes: Set[MClassType], cast_types: Set[MType]) do
+               # Group cast_type by their classes
+               var bucklets = new HashMap[MClass, Set[MType]]
+               for e in cast_types do
+                       var c = e.undecorate.as(MClassType).mclass
+                       if not bucklets.has_key(c) then
+                               bucklets[c] = new HashSet[MType]
+                       end
+                       bucklets[c].add(e)
+               end
+
+               # Colorize cast_types from the class hierarchy
+               var colorer = new POSetGroupColorer[MClass, MType](class_conflict_graph, bucklets)
+               type_colors = colorer.colors
+
+               var layouts = new HashMap[MClass, Array[nullable MType]]
+               for c in runtime_type_analysis.live_classes do
+                       layouts[c] = colorer.build_layout(c)
+               end
+
+               # Build the table for each live type
+               for t in mtypes do
+                       # A live type use the layout of its class
+                       var c = t.mclass
+                       var layout = layouts[c]
+                       var table = new Array[nullable MType].with_capacity(layout.length)
+                       type_tables[t] = table
+
+                       # For each potential super-type in the layout
+                       for sup in layout do
+                               if sup == null then
+                                       table.add null
+                               else if t.is_subtype(mainmodule, null, sup) then
+                                       table.add sup
+                               else
+                                       table.add null
+                               end
+                       end
+               end
+       end
+
+       # resolution_tables is used to perform a type resolution at runtime in O(1)
+       private fun compute_resolution_tables(mtypes: Set[MType]) do
                # During the visit of the body of classes, live_unresolved_types are collected
                # and associated to
                # Collect all live_unresolved_types (visited in the body of classes)
 
                # Determinate fo each livetype what are its possible requested anchored types
-               var mtype2unresolved = new HashMap[MClassType, Set[MType]]
+               var mtype2unresolved = new HashMap[MClass, Set[MType]]
                for mtype in self.runtime_type_analysis.live_types do
-                       var set = new HashSet[MType]
+                       var mclass = mtype.mclass
+                       var set = mtype2unresolved.get_or_null(mclass)
+                       if set == null then
+                               set = new HashSet[MType]
+                               mtype2unresolved[mclass] = set
+                       end
                        for cd in mtype.collect_mclassdefs(self.mainmodule) do
                                if self.live_unresolved_types.has_key(cd) then
                                        set.add_all(self.live_unresolved_types[cd])
                                end
                        end
-                       mtype2unresolved[mtype] = set
                end
 
                # Compute the table layout with the prefered method
-               var colorer = new BucketsColorer[MType, MType]
+               var colorer = new BucketsColorer[MClass, MType]
+
                opentype_colors = colorer.colorize(mtype2unresolved)
-               resolution_tables = self.build_resolution_tables(mtype2unresolved)
+               resolution_tables = self.build_resolution_tables(self.runtime_type_analysis.live_types, mtype2unresolved)
 
                # Compile a C constant for each collected unresolved type.
                # Either to a color, or to -1 if the unresolved type is dead (no live receiver can require it)
@@ -548,9 +598,10 @@ class SeparateCompiler
                #print ""
        end
 
-       fun build_resolution_tables(elements: Map[MClassType, Set[MType]]): Map[MClassType, Array[nullable MType]] do
+       fun build_resolution_tables(elements: Set[MClassType], map: Map[MClass, Set[MType]]): Map[MClassType, Array[nullable MType]] do
                var tables = new HashMap[MClassType, Array[nullable MType]]
-               for mclasstype, mtypes in elements do
+               for mclasstype in elements do
+                       var mtypes = map[mclasstype.mclass]
                        var table = new Array[nullable MType]
                        for mtype in mtypes do
                                var color = opentype_colors[mtype]
@@ -691,7 +742,7 @@ class SeparateCompiler
 
                # resolution table (for receiver)
                if is_live then
-                       var mclass_type = mtype.as_notnullable
+                       var mclass_type = mtype.undecorate
                        assert mclass_type isa MClassType
                        if resolution_tables[mclass_type].is_empty then
                                v.add_decl("NULL, /*NO RESOLUTIONS*/")
@@ -724,7 +775,7 @@ class SeparateCompiler
 
        fun compile_type_resolution_table(mtype: MType) do
 
-               var mclass_type = mtype.as_notnullable.as(MClassType)
+               var mclass_type = mtype.undecorate.as(MClassType)
 
                # extern const struct resolution_table_X resolution_table_X
                self.provide_declaration("resolution_table_{mtype.c_name}", "extern const struct types resolution_table_{mtype.c_name};")
@@ -763,12 +814,10 @@ class SeparateCompiler
                var mtype = mclass.intro.bound_mtype
                var c_name = mclass.c_name
 
-               var vft = self.method_tables[mclass]
-               var attrs = self.attr_tables[mclass]
                var v = new_visitor
 
                var rta = runtime_type_analysis
-               var is_dead = rta != null and not rta.live_classes.has(mclass) and mtype.ctype == "val*" and mclass.name != "NativeArray" and mclass.name != "Pointer"
+               var is_dead = rta != null and not rta.live_classes.has(mclass) and not mtype.is_c_primitive and mclass.name != "NativeArray" and mclass.name != "Pointer"
 
                v.add_decl("/* runtime class {c_name} */")
 
@@ -778,7 +827,8 @@ class SeparateCompiler
                        v.add_decl("const struct class class_{c_name} = \{")
                        v.add_decl("{self.box_kind_of(mclass)}, /* box_kind */")
                        v.add_decl("\{")
-                       for i in [0 .. vft.length[ do
+                       var vft = self.method_tables.get_or_null(mclass)
+                       if vft != null then for i in [0 .. vft.length[ do
                                var mpropdef = vft[i]
                                if mpropdef == null then
                                        v.add_decl("NULL, /* empty */")
@@ -797,9 +847,11 @@ class SeparateCompiler
                        v.add_decl("\};")
                end
 
-               if mtype.ctype != "val*" or mtype.mclass.name == "Pointer" then
+               if mtype.is_c_primitive or mtype.mclass.name == "Pointer" then
                        # Is a primitive type or the Pointer class, not any other extern class
 
+                       if mtype.is_tagged then return
+
                        #Build instance struct
                        self.header.add_decl("struct instance_{c_name} \{")
                        self.header.add_decl("const struct type *type;")
@@ -905,18 +957,78 @@ class SeparateCompiler
                else
                        var res = v.new_named_var(mtype, "self")
                        res.is_exact = true
-                       v.add("{res} = nit_alloc(sizeof(struct instance) + {attrs.length}*sizeof(nitattribute_t));")
+                       var attrs = self.attr_tables.get_or_null(mclass)
+                       if attrs == null then
+                               v.add("{res} = nit_alloc(sizeof(struct instance));")
+                       else
+                               v.add("{res} = nit_alloc(sizeof(struct instance) + {attrs.length}*sizeof(nitattribute_t));")
+                       end
                        v.add("{res}->type = type;")
                        hardening_live_type(v, "type")
                        v.require_declaration("class_{c_name}")
                        v.add("{res}->class = &class_{c_name};")
-                       self.generate_init_attr(v, res, mtype)
-                       v.set_finalizer res
+                       if attrs != null then
+                               self.generate_init_attr(v, res, mtype)
+                               v.set_finalizer res
+                       end
                        v.add("return {res};")
                end
                v.add("\}")
        end
 
+       # Compile structures used to map tagged primitive values to their classes and types.
+       # This method also determines which class will be tagged.
+       fun compile_class_infos
+       do
+               if modelbuilder.toolcontext.opt_no_tag_primitives.value then return
+
+               # Note: if you change the tagging scheme, do not forget to update
+               # `autobox` and `extract_tag`
+               var class_info = new Array[nullable MClass].filled_with(null, 4)
+               for t in box_kinds.keys do
+                       # Note: a same class can be associated to multiple slots if one want to
+                       # use some Huffman coding.
+                       if t.name == "Int" then
+                               class_info[1] = t
+                       else if t.name == "Char" then
+                               class_info[2] = t
+                       else if t.name == "Bool" then
+                               class_info[3] = t
+                       else
+                               continue
+                       end
+                       t.mclass_type.is_tagged = true
+               end
+
+               # Compile the table for classes. The tag is used as an index
+               var v = self.new_visitor
+               v.add_decl "const struct class *class_info[4] = \{"
+               for t in class_info do
+                       if t == null then
+                               v.add_decl("NULL,")
+                       else
+                               var s = "class_{t.c_name}"
+                               v.require_declaration(s)
+                               v.add_decl("&{s},")
+                       end
+               end
+               v.add_decl("\};")
+
+               # Compile the table for types. The tag is used as an index
+               v.add_decl "const struct type *type_info[4] = \{"
+               for t in class_info do
+                       if t == null then
+                               v.add_decl("NULL,")
+                       else
+                               var s = "type_{t.c_name}"
+                               undead_types.add(t.mclass_type)
+                               v.require_declaration(s)
+                               v.add_decl("&{s},")
+                       end
+               end
+               v.add_decl("\};")
+       end
+
        # Add a dynamic test to ensure that the type referenced by `t` is a live type
        fun hardening_live_type(v: VISITOR, t: String)
        do
@@ -937,7 +1049,7 @@ class SeparateCompiler
        private var type_tables: Map[MType, Array[nullable MType]] = new HashMap[MType, Array[nullable MType]]
        private var resolution_tables: Map[MClassType, Array[nullable MType]] = new HashMap[MClassType, Array[nullable MType]]
        protected var method_tables: Map[MClass, Array[nullable MPropDef]] = new HashMap[MClass, Array[nullable MPropDef]]
-       protected var attr_tables: Map[MClass, Array[nullable MPropDef]] = new HashMap[MClass, Array[nullable MPropDef]]
+       protected var attr_tables: Map[MClass, Array[nullable MProperty]] = new HashMap[MClass, Array[nullable MProperty]]
 
        redef fun display_stats
        do
@@ -1073,11 +1185,33 @@ class SeparateCompilerVisitor
        do
                if value.mtype == mtype then
                        return value
-               else if value.mtype.ctype == "val*" and mtype.ctype == "val*" then
+               else if not value.mtype.is_c_primitive and not mtype.is_c_primitive then
                        return value
-               else if value.mtype.ctype == "val*" then
+               else if not value.mtype.is_c_primitive then
+                       if mtype.is_tagged then
+                               if mtype.name == "Int" then
+                                       return self.new_expr("(long)({value})>>2", mtype)
+                               else if mtype.name == "Char" then
+                                       return self.new_expr("(char)((long)({value})>>2)", mtype)
+                               else if mtype.name == "Bool" then
+                                       return self.new_expr("(short int)((long)({value})>>2)", mtype)
+                               else
+                                       abort
+                               end
+                       end
                        return self.new_expr("((struct instance_{mtype.c_name}*){value})->value; /* autounbox from {value.mtype} to {mtype} */", mtype)
-               else if mtype.ctype == "val*" then
+               else if not mtype.is_c_primitive then
+                       if value.mtype.is_tagged then
+                               if value.mtype.name == "Int" then
+                                       return self.new_expr("(val*)({value}<<2|1)", mtype)
+                               else if value.mtype.name == "Char" then
+                                       return self.new_expr("(val*)((long)({value})<<2|2)", mtype)
+                               else if value.mtype.name == "Bool" then
+                                       return self.new_expr("(val*)((long)({value})<<2|3)", mtype)
+                               else
+                                       abort
+                               end
+                       end
                        var valtype = value.mtype.as(MClassType)
                        if mtype isa MClassType and mtype.mclass.kind == extern_kind and mtype.mclass.name != "NativeString" then
                                valtype = compiler.mainmodule.pointer_type
@@ -1085,7 +1219,7 @@ class SeparateCompilerVisitor
                        var res = self.new_var(mtype)
                        if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(valtype) then
                                self.add("/*no autobox from {value.mtype} to {mtype}: {value.mtype} is not live! */")
-                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); fatal_exit(1);")
                                return res
                        end
                        self.require_declaration("BOX_{valtype.c_name}")
@@ -1099,7 +1233,7 @@ class SeparateCompilerVisitor
                        # Bad things will appen!
                        var res = self.new_var(mtype)
                        self.add("/* {res} left unintialized (cannot convert {value.mtype} to {mtype}) */")
-                       self.add("PRINT_ERROR(\"Cast error: Cannot cast %s to %s.\\n\", \"{value.mtype}\", \"{mtype}\"); show_backtrace(1);")
+                       self.add("PRINT_ERROR(\"Cast error: Cannot cast %s to %s.\\n\", \"{value.mtype}\", \"{mtype}\"); fatal_exit(1);")
                        return res
                end
        end
@@ -1125,7 +1259,7 @@ class SeparateCompilerVisitor
                        var res = self.new_var(mtype)
                        if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(value.mtype.as(MClassType)) then
                                self.add("/*no boxing of {value.mtype}: {value.mtype} is not live! */")
-                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); fatal_exit(1);")
                                return res
                        end
                        self.require_declaration("BOX_{valtype.c_name}")
@@ -1140,11 +1274,42 @@ class SeparateCompilerVisitor
                end
        end
 
-       # Return a C expression returning the runtime type structure of the value
-       # The point of the method is to works also with primitives types.
+       # Returns a C expression containing the tag of the value as a long.
+       #
+       # If the C expression is evaluated to 0, it means there is no tag.
+       # Thus the expression can be used as a condition.
+       fun extract_tag(value: RuntimeVariable): String
+       do
+               assert not value.mtype.is_c_primitive
+               return "((long){value}&3)" # Get the two low bits
+       end
+
+       # Returns a C expression of the runtime class structure of the value.
+       # The point of the method is to work also with primitive types.
+       fun class_info(value: RuntimeVariable): String
+       do
+               if not value.mtype.is_c_primitive then
+                       if can_be_primitive(value) and not compiler.modelbuilder.toolcontext.opt_no_tag_primitives.value then
+                               var tag = extract_tag(value)
+                               return "({tag}?class_info[{tag}]:{value}->class)"
+                       end
+                       return "{value}->class"
+               else
+                       compiler.undead_types.add(value.mtype)
+                       self.require_declaration("class_{value.mtype.c_name}")
+                       return "(&class_{value.mtype.c_name})"
+               end
+       end
+
+       # Returns a C expression of the runtime type structure of the value.
+       # The point of the method is to work also with primitive types.
        fun type_info(value: RuntimeVariable): String
        do
-               if value.mtype.ctype == "val*" then
+               if not value.mtype.is_c_primitive then
+                       if can_be_primitive(value) and not compiler.modelbuilder.toolcontext.opt_no_tag_primitives.value then
+                               var tag = extract_tag(value)
+                               return "({tag}?type_info[{tag}]:{value}->type)"
+                       end
                        return "{value}->type"
                else
                        compiler.undead_types.add(value.mtype)
@@ -1156,28 +1321,40 @@ class SeparateCompilerVisitor
        redef fun compile_callsite(callsite, args)
        do
                var rta = compiler.runtime_type_analysis
-               var mmethod = callsite.mproperty
                # TODO: Inlining of new-style constructors with initializers
                if compiler.modelbuilder.toolcontext.opt_direct_call_monomorph.value and rta != null and callsite.mpropdef.initializers.is_empty then
                        var tgs = rta.live_targets(callsite)
                        if tgs.length == 1 then
-                               # DIRECT CALL
-                               var res0 = before_send(mmethod, args)
-                               var res = call(tgs.first, tgs.first.mclassdef.bound_mtype, args)
-                               if res0 != null then
-                                       assert res != null
-                                       self.assign(res0, res)
-                                       res = res0
-                               end
-                               add("\}") # close the before_send
-                               return res
+                               return direct_call(tgs.first, args)
                        end
                end
+               # Shortcut intern methods as they are not usually redefinable
+               if callsite.mpropdef.is_intern and callsite.mproperty.name != "object_id" then
+                       # `object_id` is the only redefined intern method, so it can not be directly called.
+                       # TODO find a less ugly approach?
+                       return direct_call(callsite.mpropdef, args)
+               end
                return super
        end
+
+       # Fully and directly call a mpropdef
+       #
+       # This method is used by `compile_callsite`
+       private fun direct_call(mpropdef: MMethodDef, args: Array[RuntimeVariable]): nullable RuntimeVariable
+       do
+               var res0 = before_send(mpropdef.mproperty, args)
+               var res = call(mpropdef, mpropdef.mclassdef.bound_mtype, args)
+               if res0 != null then
+                       assert res != null
+                       self.assign(res0, res)
+                       res = res0
+               end
+               add("\}") # close the before_send
+               return res
+       end
        redef fun send(mmethod, arguments)
        do
-               if arguments.first.mcasttype.ctype != "val*" then
+               if arguments.first.mcasttype.is_c_primitive then
                        # In order to shortcut the primitive, we need to find the most specific method
                        # Howverr, because of performance (no flattening), we always work on the realmainmodule
                        var m = self.compiler.mainmodule
@@ -1305,14 +1482,14 @@ class SeparateCompilerVisitor
                                self.add "{ress}{callsym}({ss}); /* {mmethod} on {arguments.first.inspect}*/"
                        else
                                self.require_declaration(const_color)
-                               self.add "{ress}(({runtime_function.c_funptrtype})({arguments.first}->class->vft[{const_color}]))({ss}); /* {mmethod} on {arguments.first.inspect}*/"
+                               self.add "{ress}(({runtime_function.c_funptrtype})({class_info(arguments.first)}->vft[{const_color}]))({ss}); /* {mmethod} on {arguments.first.inspect}*/"
                        end
                else if mentity isa MMethod and compiler.modelbuilder.toolcontext.opt_guard_call.value then
                        var callsym = "CALL_" + const_color
                        self.require_declaration(callsym)
                        self.add "if (!{callsym}) \{"
                        self.require_declaration(const_color)
-                       self.add "{ress}(({runtime_function.c_funptrtype})({arguments.first}->class->vft[{const_color}]))({ss}); /* {mmethod} on {arguments.first.inspect}*/"
+                       self.add "{ress}(({runtime_function.c_funptrtype})({class_info(arguments.first)}->vft[{const_color}]))({ss}); /* {mmethod} on {arguments.first.inspect}*/"
                        self.add "\} else \{"
                        self.add "{ress}{callsym}({ss}); /* {mmethod} on {arguments.first.inspect}*/"
                        self.add "\}"
@@ -1322,7 +1499,7 @@ class SeparateCompilerVisitor
                        self.add "{ress}{callsym}({ss}); /* {mmethod} on {arguments.first.inspect}*/"
                else
                        self.require_declaration(const_color)
-                       self.add "{ress}(({runtime_function.c_funptrtype})({arguments.first}->class->vft[{const_color}]))({ss}); /* {mmethod} on {arguments.first.inspect}*/"
+                       self.add "{ress}(({runtime_function.c_funptrtype})({class_info(arguments.first)}->vft[{const_color}]))({ss}); /* {mmethod} on {arguments.first.inspect}*/"
                end
 
                if res0 != null then
@@ -1384,7 +1561,7 @@ class SeparateCompilerVisitor
 
        redef fun supercall(m: MMethodDef, recvtype: MClassType, arguments: Array[RuntimeVariable]): nullable RuntimeVariable
        do
-               if arguments.first.mcasttype.ctype != "val*" then
+               if arguments.first.mcasttype.is_c_primitive then
                        # In order to shortcut the primitive, we need to find the most specific method
                        # However, because of performance (no flattening), we always work on the realmainmodule
                        var main = self.compiler.mainmodule
@@ -1435,7 +1612,7 @@ class SeparateCompilerVisitor
                        self.add("{res} = {recv}->attrs[{a.const_color}] != NULL; /* {a} on {recv.inspect}*/")
                else
 
-                       if mtype.ctype == "val*" then
+                       if not mtype.is_c_primitive and not mtype.is_tagged then
                                self.add("{res} = {recv}->attrs[{a.const_color}].val != NULL; /* {a} on {recv.inspect} */")
                        else
                                self.add("{res} = 1; /* NOT YET IMPLEMENTED: isset of primitives: {a} on {recv.inspect} */")
@@ -1487,7 +1664,7 @@ class SeparateCompilerVisitor
                        self.add("{res} = {recv}->attrs[{a.const_color}].{ret.ctypename}; /* {a} on {recv.inspect} */")
 
                        # Check for Uninitialized attribute
-                       if ret.ctype == "val*" and not ret isa MNullableType and not self.compiler.modelbuilder.toolcontext.opt_no_check_attr_isset.value then
+                       if not ret.is_c_primitive and not ret isa MNullableType and not self.compiler.modelbuilder.toolcontext.opt_no_check_attr_isset.value then
                                self.add("if (unlikely({res} == NULL)) \{")
                                self.add_abort("Uninitialized attribute {a.name}")
                                self.add("\}")
@@ -1516,7 +1693,11 @@ class SeparateCompilerVisitor
                self.require_declaration(a.const_color)
                if self.compiler.modelbuilder.toolcontext.opt_no_union_attribute.value then
                        var attr = "{recv}->attrs[{a.const_color}]"
-                       if mtype.ctype != "val*" then
+                       if mtype.is_tagged then
+                               # The attribute is not primitive, thus store it as tagged
+                               var tv = autobox(value, compiler.mainmodule.object_type)
+                               self.add("{attr} = {tv}; /* {a} on {recv.inspect} */")
+                       else if mtype.is_c_primitive then
                                assert mtype isa MClassType
                                # The attribute is primitive, thus we store it in a box
                                # The trick is to create the box the first time then resuse the box
@@ -1642,7 +1823,7 @@ class SeparateCompilerVisitor
                                self.add("count_type_test_resolved_{tag}++;")
                        end
                else
-                       self.add("PRINT_ERROR(\"NOT YET IMPLEMENTED: type_test(%s, {mtype}).\\n\", \"{value.inspect}\"); show_backtrace(1);")
+                       self.add("PRINT_ERROR(\"NOT YET IMPLEMENTED: type_test(%s, {mtype}).\\n\", \"{value.inspect}\"); fatal_exit(1);")
                end
 
                # check color is in table
@@ -1668,15 +1849,15 @@ class SeparateCompilerVisitor
        do
                var res = self.new_var(bool_type)
                # Swap values to be symetric
-               if value2.mtype.ctype != "val*" and value1.mtype.ctype == "val*" then
+               if value2.mtype.is_c_primitive and not value1.mtype.is_c_primitive then
                        var tmp = value1
                        value1 = value2
                        value2 = tmp
                end
-               if value1.mtype.ctype != "val*" then
+               if value1.mtype.is_c_primitive then
                        if value2.mtype == value1.mtype then
                                self.add("{res} = 1; /* is_same_type_test: compatible types {value1.mtype} vs. {value2.mtype} */")
-                       else if value2.mtype.ctype != "val*" then
+                       else if value2.mtype.is_c_primitive then
                                self.add("{res} = 0; /* is_same_type_test: incompatible types {value1.mtype} vs. {value2.mtype}*/")
                        else
                                var mtype1 = value1.mtype.as(MClassType)
@@ -1684,7 +1865,7 @@ class SeparateCompilerVisitor
                                self.add("{res} = ({value2} != NULL) && ({value2}->class == &class_{mtype1.c_name}); /* is_same_type_test */")
                        end
                else
-                       self.add("{res} = ({value1} == {value2}) || ({value1} != NULL && {value2} != NULL && {value1}->class == {value2}->class); /* is_same_type_test */")
+                       self.add("{res} = ({value1} == {value2}) || ({value1} != NULL && {value2} != NULL && {class_info(value1)} == {class_info(value2)}); /* is_same_type_test */")
                end
                return res
        end
@@ -1693,8 +1874,8 @@ class SeparateCompilerVisitor
        do
                var res = self.get_name("var_class_name")
                self.add_decl("const char* {res};")
-               if value.mtype.ctype == "val*" then
-                       self.add "{res} = {value} == NULL ? \"null\" : {value}->type->name;"
+               if not value.mtype.is_c_primitive then
+                       self.add "{res} = {value} == NULL ? \"null\" : {type_info(value)}->name;"
                else if value.mtype isa MClassType and value.mtype.as(MClassType).mclass.kind == extern_kind and
                        value.mtype.as(MClassType).name != "NativeString" then
                        self.add "{res} = \"{value.mtype.as(MClassType).mclass}\";"
@@ -1708,16 +1889,18 @@ class SeparateCompilerVisitor
        redef fun equal_test(value1, value2)
        do
                var res = self.new_var(bool_type)
-               if value2.mtype.ctype != "val*" and value1.mtype.ctype == "val*" then
+               if value2.mtype.is_c_primitive and not value1.mtype.is_c_primitive then
                        var tmp = value1
                        value1 = value2
                        value2 = tmp
                end
-               if value1.mtype.ctype != "val*" then
+               if value1.mtype.is_c_primitive then
                        if value2.mtype == value1.mtype then
                                self.add("{res} = {value1} == {value2};")
-                       else if value2.mtype.ctype != "val*" then
+                       else if value2.mtype.is_c_primitive then
                                self.add("{res} = 0; /* incompatible types {value1.mtype} vs. {value2.mtype}*/")
+                       else if value1.mtype.is_tagged then
+                               self.add("{res} = ({value2} != NULL) && ({self.autobox(value2, value1.mtype)} == {value1});")
                        else
                                var mtype1 = value1.mtype.as(MClassType)
                                self.require_declaration("class_{mtype1.c_name}")
@@ -1747,20 +1930,34 @@ class SeparateCompilerVisitor
 
                var incompatible = false
                var primitive
-               if t1.ctype != "val*" then
+               if t1.is_c_primitive then
                        primitive = t1
                        if t1 == t2 then
                                # No need to compare class
-                       else if t2.ctype != "val*" then
+                       else if t2.is_c_primitive then
                                incompatible = true
                        else if can_be_primitive(value2) then
+                               if t1.is_tagged then
+                                       self.add("{res} = {value1} == {value2};")
+                                       return res
+                               end
+                               if not compiler.modelbuilder.toolcontext.opt_no_tag_primitives.value then
+                                       test.add("(!{extract_tag(value2)})")
+                               end
                                test.add("{value1}->class == {value2}->class")
                        else
                                incompatible = true
                        end
-               else if t2.ctype != "val*" then
+               else if t2.is_c_primitive then
                        primitive = t2
                        if can_be_primitive(value1) then
+                               if t2.is_tagged then
+                                       self.add("{res} = {value1} == {value2};")
+                                       return res
+                               end
+                               if not compiler.modelbuilder.toolcontext.opt_no_tag_primitives.value then
+                                       test.add("(!{extract_tag(value1)})")
+                               end
                                test.add("{value1}->class == {value2}->class")
                        else
                                incompatible = true
@@ -1779,13 +1976,25 @@ class SeparateCompilerVisitor
                        end
                end
                if primitive != null then
+                       if primitive.is_tagged then
+                               self.add("{res} = {value1} == {value2};")
+                               return res
+                       end
                        test.add("((struct instance_{primitive.c_name}*){value1})->value == ((struct instance_{primitive.c_name}*){value2})->value")
                else if can_be_primitive(value1) and can_be_primitive(value2) then
+                       if not compiler.modelbuilder.toolcontext.opt_no_tag_primitives.value then
+                               test.add("(!{extract_tag(value1)}) && (!{extract_tag(value2)})")
+                       end
                        test.add("{value1}->class == {value2}->class")
                        var s = new Array[String]
                        for t, v in self.compiler.box_kinds do
+                               if t.mclass_type.is_tagged then continue
                                s.add "({value1}->class->box_kind == {v} && ((struct instance_{t.c_name}*){value1})->value == ((struct instance_{t.c_name}*){value2})->value)"
                        end
+                       if s.is_empty then
+                               self.add("{res} = {value1} == {value2};")
+                               return res
+                       end
                        test.add("({s.join(" || ")})")
                else
                        self.add("{res} = {value1} == {value2};")
@@ -1797,10 +2006,10 @@ class SeparateCompilerVisitor
 
        fun can_be_primitive(value: RuntimeVariable): Bool
        do
-               var t = value.mcasttype.as_notnullable
+               var t = value.mcasttype.undecorate
                if not t isa MClassType then return false
                var k = t.mclass.kind
-               return k == interface_kind or t.ctype != "val*"
+               return k == interface_kind or t.is_c_primitive
        end
 
        fun maybe_null(value: RuntimeVariable): Bool
@@ -1811,8 +2020,8 @@ class SeparateCompilerVisitor
 
        redef fun array_instance(array, elttype)
        do
-               var nclass = self.get_class("NativeArray")
-               var arrayclass = self.get_class("Array")
+               var nclass = mmodule.native_array_class
+               var arrayclass = mmodule.array_class
                var arraytype = arrayclass.get_mtype([elttype])
                var res = self.init_instance(arraytype)
                self.add("\{ /* {res} = array_instance Array[{elttype}] */")
@@ -1829,7 +2038,7 @@ class SeparateCompilerVisitor
 
        redef fun native_array_instance(elttype: MType, length: RuntimeVariable): RuntimeVariable
        do
-               var mtype = self.get_class("NativeArray").get_mtype([elttype])
+               var mtype = mmodule.native_array_type(elttype)
                self.require_declaration("NEW_{mtype.mclass.c_name}")
                assert mtype isa MGenericType
                var compiler = self.compiler
@@ -1849,10 +2058,13 @@ class SeparateCompilerVisitor
        redef fun native_array_def(pname, ret_type, arguments)
        do
                var elttype = arguments.first.mtype
-               var nclass = self.get_class("NativeArray")
+               var nclass = mmodule.native_array_class
                var recv = "((struct instance_{nclass.c_name}*){arguments[0]})->values"
                if pname == "[]" then
-                       self.ret(self.new_expr("{recv}[{arguments[1]}]", ret_type.as(not null)))
+                       # Because the objects are boxed, return the box to avoid unnecessary (or broken) unboxing/reboxing
+                       var res = self.new_expr("{recv}[{arguments[1]}]", compiler.mainmodule.object_type)
+                       res.mcasttype = ret_type.as(not null)
+                       self.ret(res)
                        return
                else if pname == "[]=" then
                        self.add("{recv}[{arguments[1]}]={arguments[2]};")
@@ -1867,12 +2079,20 @@ class SeparateCompilerVisitor
                end
        end
 
-       redef fun calloc_array(ret_type, arguments)
+       redef fun native_array_get(nat, i)
        do
-               var mclass = self.get_class("ArrayCapable")
-               var ft = mclass.mparameters.first
-               var res = self.native_array_instance(ft, arguments[1])
-               self.ret(res)
+               var nclass = mmodule.native_array_class
+               var recv = "((struct instance_{nclass.c_name}*){nat})->values"
+               # Because the objects are boxed, return the box to avoid unnecessary (or broken) unboxing/reboxing
+               var res = self.new_expr("{recv}[{i}]", compiler.mainmodule.object_type)
+               return res
+       end
+
+       redef fun native_array_set(nat, i, val)
+       do
+               var nclass = mmodule.native_array_class
+               var recv = "((struct instance_{nclass.c_name}*){nat})->values"
+               self.add("{recv}[{i}]={val};")
        end
 
        fun link_unresolved_type(mclassdef: MClassDef, mtype: MType) do
@@ -1985,7 +2205,7 @@ class SeparateRuntimeFunction
                for i in [0..called_signature.arity[ do
                        var mtype = called_signature.mparameters[i].mtype
                        if i == called_signature.vararg_rank then
-                               mtype = mmethoddef.mclassdef.mmodule.get_primitive_class("Array").get_mtype([mtype])
+                               mtype = mmethoddef.mclassdef.mmodule.array_type(mtype)
                        end
                        sig.append(", {mtype.ctype} p{i}")
                end
@@ -2024,7 +2244,7 @@ class SeparateRuntimeFunction
                for i in [0..msignature.arity[ do
                        var mtype = msignature.mparameters[i].mtype
                        if i == msignature.vararg_rank then
-                               mtype = v.get_class("Array").get_mtype([mtype])
+                               mtype = v.mmodule.array_type(mtype)
                        end
                        comment.append(", {mtype}")
                        var argvar = new RuntimeVariable("p{i}", mtype, mtype)
@@ -2071,14 +2291,14 @@ class SeparateRuntimeFunction
                var selfvar = arguments.first
                var ret = called_signature.return_mtype
 
-               if mmethoddef.is_intro and recv.ctype == "val*" then
+               if mmethoddef.is_intro and not recv.is_c_primitive then
                        var m = mmethoddef.mproperty
                        var n2 = "CALL_" + m.const_color
                        compiler.provide_declaration(n2, "{c_ret} {n2}{c_sig};")
                        var v2 = compiler.new_visitor
                        v2.add "{c_ret} {n2}{c_sig} \{"
                        v2.require_declaration(m.const_color)
-                       var call = "(({c_funptrtype})({selfvar}->class->vft[{m.const_color}]))({arguments.join(", ")});"
+                       var call = "(({c_funptrtype})({v2.class_info(selfvar)}->vft[{m.const_color}]))({arguments.join(", ")});"
                        if ret != null then
                                v2.add "return {call}"
                        else
@@ -2088,14 +2308,14 @@ class SeparateRuntimeFunction
                        v2.add "\}"
 
                end
-               if mmethoddef.has_supercall and recv.ctype == "val*" then
+               if mmethoddef.has_supercall and not recv.is_c_primitive then
                        var m = mmethoddef
                        var n2 = "CALL_" + m.const_color
                        compiler.provide_declaration(n2, "{c_ret} {n2}{c_sig};")
                        var v2 = compiler.new_visitor
                        v2.add "{c_ret} {n2}{c_sig} \{"
                        v2.require_declaration(m.const_color)
-                       var call = "(({c_funptrtype})({selfvar}->class->vft[{m.const_color}]))({arguments.join(", ")});"
+                       var call = "(({c_funptrtype})({v2.class_info(selfvar)}->vft[{m.const_color}]))({arguments.join(", ")});"
                        if ret != null then
                                v2.add "return {call}"
                        else
@@ -2107,6 +2327,12 @@ class SeparateRuntimeFunction
        end
 end
 
+redef class MType
+       # Are values of `self` tagged?
+       # If false, it means that the type is not primitive, or is boxed.
+       var is_tagged = false
+end
+
 redef class MEntity
        var const_color: String is lazy do return "COLOR_{c_name}"
 end
@@ -2130,3 +2356,14 @@ redef class AMethPropdef
                return super
        end
 end
+
+redef class AAttrPropdef
+       redef fun init_expr(v, recv)
+       do
+               super
+               if is_lazy and v.compiler.modelbuilder.toolcontext.opt_no_union_attribute.value then
+                       var guard = self.mlazypropdef.mproperty
+                       v.write_attribute(guard, recv, v.bool_instance(false))
+               end
+       end
+end
index 2c90e65..b8b2c0a 100644 (file)
@@ -39,6 +39,11 @@ redef class ToolContext
                if opt_no_check_all.value then
                        opt_no_check_erasure_cast.value = true
                end
+
+               # Temporary disabled. TODO: implement tagging in the erasure compiler.
+               if opt_erasure.value then
+                       opt_no_tag_primitives.value = true
+               end
        end
 
        var erasure_compiler_phase = new ErasureCompilerPhase(self, null)
@@ -194,14 +199,12 @@ class SeparateErasureCompiler
                var mtype = mclass.intro.bound_mtype
                var c_name = mclass.c_name
 
-               var vft = self.method_tables[mclass]
-               var attrs = self.attr_tables[mclass]
                var class_table = self.class_tables[mclass]
                var v = self.new_visitor
 
                var rta = runtime_type_analysis
                var is_dead = false # mclass.kind == abstract_kind or mclass.kind == interface_kind
-               if not is_dead and rta != null and not rta.live_classes.has(mclass) and mtype.ctype == "val*" and mclass.name != "NativeArray" then
+               if not is_dead and rta != null and not rta.live_classes.has(mclass) and not mtype.is_c_primitive and mclass.name != "NativeArray" then
                        is_dead = true
                end
 
@@ -225,7 +228,8 @@ class SeparateErasureCompiler
                        end
                        v.add_decl("&type_table_{c_name},")
                        v.add_decl("\{")
-                       for i in [0 .. vft.length[ do
+                       var vft = self.method_tables.get_or_null(mclass)
+                       if vft != null then for i in [0 .. vft.length[ do
                                var mpropdef = vft[i]
                                if mpropdef == null then
                                        v.add_decl("NULL, /* empty */")
@@ -259,7 +263,7 @@ class SeparateErasureCompiler
                v.add_decl("\}")
                v.add_decl("\};")
 
-               if mtype.ctype != "val*" or mtype.mclass.name == "Pointer" then
+               if mtype.is_c_primitive or mtype.mclass.name == "Pointer" then
                        #Build instance struct
                        self.header.add_decl("struct instance_{c_name} \{")
                        self.header.add_decl("const struct class *class;")
@@ -350,11 +354,18 @@ class SeparateErasureCompiler
 
                        var res = v.new_named_var(mtype, "self")
                        res.is_exact = true
-                       v.add("{res} = nit_alloc(sizeof(struct instance) + {attrs.length}*sizeof(nitattribute_t));")
+                       var attrs = self.attr_tables.get_or_null(mclass)
+                       if attrs == null then
+                               v.add("{res} = nit_alloc(sizeof(struct instance));")
+                       else
+                               v.add("{res} = nit_alloc(sizeof(struct instance) + {attrs.length}*sizeof(nitattribute_t));")
+                       end
                        v.require_declaration("class_{c_name}")
                        v.add("{res}->class = &class_{c_name};")
-                       self.generate_init_attr(v, res, mtype)
-                       v.set_finalizer res
+                       if attrs != null then
+                               self.generate_init_attr(v, res, mtype)
+                               v.set_finalizer res
+                       end
                        v.add("return {res};")
                end
                v.add("\}")
@@ -524,7 +535,7 @@ class SeparateErasureCompilerVisitor
                end
 
                var class_ptr
-               if value.mtype.ctype == "val*" then
+               if not value.mtype.is_c_primitive then
                        class_ptr = "{value}->class->"
                else
                        var mclass = value.mtype.as(MClassType).mclass
@@ -543,7 +554,7 @@ class SeparateErasureCompilerVisitor
                else if mtype isa MVirtualType then
                        var recv = self.frame.arguments.first
                        var recv_ptr
-                       if recv.mtype.ctype == "val*" then
+                       if not recv.mtype.is_c_primitive then
                                recv_ptr = "{recv}->class->"
                        else
                                var mclass = recv.mtype.as(MClassType).mclass
@@ -610,7 +621,7 @@ class SeparateErasureCompilerVisitor
                        var res = self.new_var(mtype)
                        if compiler.runtime_type_analysis != null and not compiler.runtime_type_analysis.live_types.has(value.mtype.as(MClassType)) then
                                self.add("/*no boxing of {value.mtype}: {value.mtype} is not live! */")
-                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); show_backtrace(1);")
+                               self.add("PRINT_ERROR(\"Dead code executed!\\n\"); fatal_exit(1);")
                                return res
                        end
                        self.require_declaration("BOX_{valtype.c_name}")
@@ -627,7 +638,7 @@ class SeparateErasureCompilerVisitor
        do
                var res = self.get_name("var_class_name")
                self.add_decl("const char* {res};")
-               if value.mtype.ctype == "val*" then
+               if not value.mtype.is_c_primitive then
                        self.add "{res} = {value} == NULL ? \"null\" : {value}->class->name;"
                else
                        self.require_declaration("class_{value.mtype.c_name}")
@@ -638,7 +649,7 @@ class SeparateErasureCompilerVisitor
 
        redef fun native_array_instance(elttype, length)
        do
-               var nclass = self.get_class("NativeArray")
+               var nclass = mmodule.native_array_class
                var mtype = nclass.get_mtype([elttype])
                var res = self.new_var(mtype)
                res.is_exact = true
index e947ee2..64b2022 100644 (file)
@@ -68,7 +68,7 @@ end
 abstract class DocComposite
 
        # Parent element.
-       var parent: nullable DocComposite = null
+       var parent: nullable DocComposite = null is writable
 
        # Does `self` have a `parent`?
        fun is_root: Bool do return parent == null
@@ -85,6 +85,7 @@ abstract class DocComposite
        #
        # Shortcut for `children.add`.
        fun add_child(child: DocComposite) do
+               child.parent = self
                children.add child
        end
 end
index aff25d4..66ef564 100644 (file)
@@ -41,7 +41,8 @@ class GraphPhase
                        if article == null then continue
                        # FIXME avoid diff
                        # page.root.add article
-                       page.root.children[1].children.insert(article, 0)
+                       article.parent = page.root.children.first.children[1]
+                       page.root.children.first.children[1].children.insert(article, 0)
                end
        end
 end
index 39ad273..23da906 100644 (file)
@@ -47,7 +47,8 @@ redef class MModulePage
                var clients = self.clients.to_a
                v.name_sorter.sort(clients)
                section.add_child new HierarchyListArticle(mentity, "Clients", clients)
-               root.children.insert(section, 1)
+               section.parent = root.children.first
+               root.children.first.children.insert(section, 1)
        end
 end
 
@@ -66,7 +67,8 @@ redef class MClassPage
                var descendants = self.descendants.to_a
                v.name_sorter.sort(descendants)
                section.add_child new HierarchyListArticle(mentity, "Descendants", descendants)
-               root.children.insert(section, 1)
+               section.parent = root.children.first
+               root.children.first.children.insert(section, 1)
        end
 end
 
index a11e187..83b02f9 100644 (file)
@@ -87,7 +87,7 @@ redef class ToolContext
                var git_dir = opt_github_gitdir
                var opts = [upstream.value, base_sha.value, git_dir.value]
                if not opts.has_only(null) and opts.has(null) then
-                       print "Error: Options {upstream.names.first}, " +
+                       print "Option Error: options {upstream.names.first}, " +
                                "{base_sha.names.first} and {git_dir.names.first} " +
                                "are required to enable the GitHub plugin"
                        exit 1
@@ -120,7 +120,7 @@ class RenderHTMLPhase
                        var dir = ctx.nit_dir
                        sharedir = dir/"share/nitdoc"
                        if not sharedir.file_exists then
-                               print "Error: Cannot locate nitdoc share files. Uses --sharedir or envvar NIT_DIR"
+                               print "Error: cannot locate nitdoc share files. Uses --sharedir or envvar NIT_DIR"
                                abort
                        end
                end
@@ -191,7 +191,7 @@ redef class DocPage
 
        # Build top menu template if any.
        fun init_topmenu(v: RenderHTMLPhase, doc: DocModel) do
-               topmenu = new TplTopMenu(html_url)
+               topmenu = new DocTopMenu
                var brand = v.ctx.opt_custom_brand.value
                if brand != null then
                        var tpl = new Template
@@ -200,8 +200,13 @@ redef class DocPage
                        tpl.add "</span>"
                        topmenu.brand = tpl
                end
-               topmenu.add_link new TplLink("index.html", "Overview")
-               topmenu.add_link new TplLink("search.html", "Index")
+               var title = "Overview"
+               if v.ctx.opt_custom_title.value != null then
+                       title = v.ctx.opt_custom_title.value.to_s
+               end
+               topmenu.add_li new ListItem(new Link("index.html", title))
+               topmenu.add_li new ListItem(new Link("search.html", "Index"))
+               topmenu.active_item = topmenu.items.first
        end
 
        # Build page sidebar if any.
@@ -257,6 +262,12 @@ end
 redef class SearchPage
        redef var html_url = "search.html"
        redef fun init_title(v, doc) do title = "Index"
+
+       redef fun init_topmenu(v, doc) do
+               super
+               topmenu.active_item = topmenu.items.last
+       end
+
        redef fun init_sidebar(v, doc) do end
 
        # TODO this should be done in StructurePhase.
@@ -314,7 +325,7 @@ end
 
 redef class MEntityPage
        redef var html_url is lazy do return mentity.nitdoc_url
-       redef fun init_title(v, doc) do title = mentity.nitdoc_name
+       redef fun init_title(v, doc) do title = mentity.html_name
        redef fun init_content(v, doc) do add_section root.start_rendering(v, doc, self)
 end
 
@@ -327,9 +338,10 @@ redef class MGroupPage
                super
                var mproject = mentity.mproject
                if not mentity.is_root then
-                       topmenu.add_link new TplLink(mproject.nitdoc_url, mproject.nitdoc_name)
+                       topmenu.add_li new ListItem(new Link(mproject.nitdoc_url, mproject.html_name))
                end
-               topmenu.add_link new TplLink(html_url, mproject.nitdoc_name)
+               topmenu.add_li new ListItem(new Link(html_url, mproject.html_name))
+               topmenu.active_item = topmenu.items.last
        end
 
        redef fun init_sidebar(v, doc) do
@@ -366,8 +378,9 @@ redef class MModulePage
        redef fun init_topmenu(v, doc) do
                super
                var mproject = mentity.mproject
-               topmenu.add_link new TplLink(mproject.nitdoc_url, mproject.nitdoc_name)
-               topmenu.add_link new TplLink(mentity.nitdoc_url, mentity.nitdoc_name)
+               topmenu.add_li new ListItem(new Link(mproject.nitdoc_url, mproject.html_name))
+               topmenu.add_li new ListItem(new Link(mentity.nitdoc_url, mentity.html_name))
+               topmenu.active_item = topmenu.items.last
        end
 
        # Class list to display in sidebar
@@ -404,15 +417,12 @@ end
 
 redef class MClassPage
 
-       redef fun init_title(v, doc) do
-               title = "{mentity.nitdoc_name}{mentity.tpl_signature.write_to_string}"
-       end
-
        redef fun init_topmenu(v, doc) do
                super
                var mproject = mentity.intro_mmodule.mgroup.mproject
-               topmenu.add_link new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}")
-               topmenu.add_link new TplLink(html_url, mentity.nitdoc_name)
+               topmenu.add_li new ListItem(new Link(mproject.nitdoc_url, mproject.html_name))
+               topmenu.add_li new ListItem(new Link(html_url, mentity.html_name))
+               topmenu.active_item = topmenu.items.last
        end
 
        redef fun init_sidebar(v, doc) do
@@ -442,7 +452,7 @@ redef class MClassPage
                        classes.add "inherit"
                        var cls_url = mprop.intro.mclassdef.mclass.nitdoc_url
                        var def_url = "{cls_url}#{mprop.nitdoc_id}"
-                       var lnk = new TplLink(def_url, mprop.nitdoc_name)
+                       var lnk = new TplLink(def_url, mprop.html_name)
                        var mdoc = mprop.intro.mdoc_or_fallback
                        if mdoc != null then lnk.title = mdoc.short_comment
                        var item = new Template
@@ -486,7 +496,7 @@ end
 
 redef class MPropertyPage
        redef fun init_title(v, doc) do
-               title = "{mentity.nitdoc_name}{mentity.tpl_signature.write_to_string}"
+               title = "{mentity.html_name}{mentity.tpl_signature.write_to_string}"
        end
 
        redef fun init_topmenu(v, doc) do
@@ -494,9 +504,10 @@ redef class MPropertyPage
                var mmodule = mentity.intro_mclassdef.mmodule
                var mproject = mmodule.mgroup.mproject
                var mclass = mentity.intro_mclassdef.mclass
-               topmenu.add_link new TplLink("{mproject.nitdoc_url}", "{mproject.nitdoc_name}")
-               topmenu.add_link new TplLink("{mclass.nitdoc_url}", "{mclass.nitdoc_name}")
-               topmenu.add_link new TplLink(html_url, mentity.nitdoc_name)
+               topmenu.add_li new ListItem(new Link(mproject.nitdoc_url, mproject.html_name))
+               topmenu.add_li new ListItem(new Link(mclass.nitdoc_url, mclass.html_name))
+               topmenu.add_li new ListItem(new Link(html_url, mentity.html_name))
+               topmenu.active_item = topmenu.items.last
        end
 end
 
@@ -515,18 +526,16 @@ redef class DocRoot
        fun start_rendering(v: RenderHTMLPhase, doc: DocModel, page: MEntityPage): TplSection do
                var section = new TplSection("top")
                var mentity = page.mentity
-               section.title = mentity.nitdoc_name
+               section.title = mentity.html_name
                section.subtitle = mentity.tpl_declaration
                # FIXME ugly hack to avoid diff
                if mentity isa MGroup and mentity.is_root then
-                       section.title = mentity.mproject.nitdoc_name
+                       section.title = mentity.mproject.html_name
                        section.subtitle = mentity.mproject.tpl_declaration
-               else if mentity isa MClass then
-                       section.title = "{mentity.nitdoc_name}{mentity.tpl_signature.write_to_string}"
                else if mentity isa MProperty then
-                       section.title = "{mentity.nitdoc_name}{mentity.intro.tpl_signature.write_to_string}"
+                       section.title = "{mentity.html_name}{mentity.intro.tpl_signature.write_to_string}"
                        section.subtitle = mentity.tpl_namespace
-                       section.summary_title = mentity.nitdoc_name
+                       section.summary_title = mentity.html_name
                end
                render(v, doc, page, section)
                return section
@@ -561,10 +570,10 @@ redef class ConcernSection
                var title = new Template
                if mmodule == page.mentity then
                        title.add "in "
-                       section.summary_title = "in {mmodule.nitdoc_name}"
+                       section.summary_title = "in {mmodule.html_name}"
                else
                        title.add "from "
-                       section.summary_title = "from {mmodule.nitdoc_name}"
+                       section.summary_title = "from {mmodule.html_name}"
                end
                title.add mmodule.tpl_namespace
                section.title = title
@@ -575,7 +584,13 @@ redef class ConcernSection
                title.add "in "
                title.add mmodule.tpl_namespace
                section.title = title
-               section.summary_title = "in {mmodule.nitdoc_name}"
+               section.summary_title = "in {mmodule.html_name}"
+       end
+end
+
+redef class MEntitySection
+       redef fun render(v, doc, page, parent) do
+               for child in children do child.render(v, doc, page, parent)
        end
 end
 
@@ -690,14 +705,14 @@ redef class DefinitionArticle
                else
                        var cls_url = mprop.intro.mclassdef.mclass.nitdoc_url
                        var def_url = "{cls_url}#{mprop.nitdoc_id}"
-                       var lnk = new TplLink.with_title(def_url, mprop.nitdoc_name,
+                       var lnk = new TplLink.with_title(def_url, mprop.html_name,
                                        "Go to introduction")
                        title.add "redef "
                        title.add lnk
                end
                article.title = title
                article.title_classes.add "signature"
-               article.summary_title = "{mprop.nitdoc_name}"
+               article.summary_title = "{mprop.html_name}"
                article.subtitle = mpropdef.tpl_namespace
                if mpropdef.mdoc_or_fallback != null then
                        article.content = mpropdef.mdoc_or_fallback.tpl_comment
index 1e0d773..9c32c8c 100644 (file)
@@ -50,10 +50,12 @@ end
 
 redef class MGroupPage
        redef fun apply_structure(v, doc) do
+               var section = new MEntitySection(mentity)
+               root.add_child section
                if mentity.is_root then
-                       root.add_child new IntroArticle(mentity.mproject)
+                       section.add_child new IntroArticle(mentity.mproject)
                else
-                       root.add_child new IntroArticle(mentity)
+                       section.add_child new IntroArticle(mentity)
                end
                var concerns = self.concerns
                if concerns == null or concerns.is_empty then return
@@ -63,12 +65,12 @@ redef class MGroupPage
                concerns.sort_with(v.concerns_sorter)
                mentity.mproject.booster_rank = 0
                mentity.booster_rank = 0
-               root.add_child new ConcernsArticle(mentity, concerns)
+               section.add_child new ConcernsArticle(mentity, concerns)
                for mentity in concerns do
                        if mentity isa MModule then
-                               root.add_child new DefinitionArticle(mentity)
+                               section.add_child new DefinitionArticle(mentity)
                        else
-                               root.add_child new ConcernSection(mentity)
+                               section.add_child new ConcernSection(mentity)
                        end
                end
        end
@@ -76,7 +78,9 @@ end
 
 redef class MModulePage
        redef fun apply_structure(v, doc) do
-               root.add_child new IntroArticle(mentity)
+               var section = new MEntitySection(mentity)
+               root.add_child section
+               section.add_child new IntroArticle(mentity)
                var concerns = self.concerns
                if concerns == null or concerns.is_empty then return
                # FIXME avoid diff
@@ -87,10 +91,10 @@ redef class MModulePage
                mentity.mgroup.mproject.booster_rank = 0
                mentity.mgroup.booster_rank = 0
                mentity.booster_rank = 0
-               root.add_child new ConcernsArticle(mentity, concerns)
+               section.add_child new ConcernsArticle(mentity, concerns)
                # reference list
                for mentity in concerns do
-                       var section = new ConcernSection(mentity)
+                       var ssection = new ConcernSection(mentity)
                        if mentity isa MModule then
                                var mclasses = mclasses_for_mmodule(mentity).to_a
                                v.name_sorter.sort(mclasses)
@@ -104,10 +108,10 @@ redef class MModulePage
                                        for mclassdef in mclassdefs do
                                                article.add_child(new DefinitionArticle(mclassdef))
                                        end
-                                       section.add_child article
+                                       ssection.add_child article
                                end
                        end
-                       root.add_child section
+                       section.add_child ssection
                end
        end
 
@@ -136,7 +140,9 @@ end
 
 redef class MClassPage
        redef fun apply_structure(v, doc) do
-               root.add_child new IntroArticle(mentity)
+               var section = new MEntitySection(mentity)
+               root.add_child section
+               section.add_child new IntroArticle(mentity)
                var concerns = self.concerns
                if concerns == null or concerns.is_empty then return
                # FIXME diff hack
@@ -147,9 +153,9 @@ redef class MClassPage
                mentity.intro_mmodule.mgroup.mproject.booster_rank = 0
                mentity.intro_mmodule.mgroup.booster_rank = 0
                mentity.intro_mmodule.booster_rank = 0
-               root.add_child new ConcernsArticle(mentity, concerns)
+               section.add_child new ConcernsArticle(mentity, concerns)
                for mentity in concerns do
-                       var section = new ConcernSection(mentity)
+                       var ssection = new ConcernSection(mentity)
                        if mentity isa MModule then
                                var mprops = mproperties_for(mentity)
                                var by_kind = new PropertiesByKind.with_elements(mprops)
@@ -157,12 +163,12 @@ redef class MClassPage
                                        v.name_sorter.sort(group)
                                        for mprop in group do
                                                for mpropdef in mpropdefs_for(mprop, mentity) do
-                                                       section.add_child new DefinitionArticle(mpropdef)
+                                                       ssection.add_child new DefinitionArticle(mpropdef)
                                                end
                                        end
                                end
                        end
-                       root.add_child section
+                       section.add_child ssection
                end
        end
 
@@ -196,7 +202,9 @@ end
 
 redef class MPropertyPage
        redef fun apply_structure(v, doc) do
-               root.add_child new IntroArticle(mentity)
+               var section = new MEntitySection(mentity)
+               root.add_child section
+               section.add_child new IntroArticle(mentity)
                var concerns = self.concerns
                if concerns == null or concerns.is_empty then return
                # FIXME diff hack
@@ -207,18 +215,18 @@ redef class MPropertyPage
                mentity.intro.mclassdef.mmodule.mgroup.mproject.booster_rank = 0
                mentity.intro.mclassdef.mmodule.mgroup.booster_rank = 0
                mentity.intro.mclassdef.mmodule.booster_rank = 0
-               root.add_child new ConcernsArticle(mentity, concerns)
+               section.add_child new ConcernsArticle(mentity, concerns)
                for mentity in concerns do
-                       var section = new ConcernSection(mentity)
+                       var ssection = new ConcernSection(mentity)
                        if mentity isa MModule then
                                # Add mproperties
                                var mpropdefs = mpropdefs_for(mentity).to_a
                                v.name_sorter.sort(mpropdefs)
                                for mpropdef in mpropdefs do
-                                       section.add_child new DefinitionArticle(mpropdef)
+                                       ssection.add_child new DefinitionArticle(mpropdef)
                                end
                        end
-                       root.add_child section
+                       section.add_child ssection
                end
        end
 
@@ -258,6 +266,14 @@ abstract class MEntityArticle
        super DocArticle
 end
 
+# A section about a Mentity.
+#
+# Used to regroup content about a MEntity.
+class MEntitySection
+       super MEntityComposite
+       super DocSection
+end
+
 # An introduction article about a MEntity.
 #
 # Used at the top of a documentation page to introduce the documented MEntity.
index c3126f7..e65059b 100644 (file)
@@ -24,70 +24,6 @@ import json::static
 # general layout elements
 #########################
 
-# Top menu bar template
-class TplTopMenu
-       super Template
-
-       # Brand link to display in first position of the top menu
-       private var brand: nullable Writable = null is writable
-       # Elements of the topmenu
-       private var elts = new Array[Writable]
-
-       # The page url where the top menu is displayed.
-       #
-       # Used to select the active link.
-       private var current_url: String
-
-       # Add a new link to the menu.
-       fun add_link(content: TplLink) do
-               var is_active = content.href == current_url
-               add_item(content, is_active)
-       end
-
-       # Add a content between `<li>` tags
-       fun add_item(content: Writable, is_active: Bool) do
-               var tpl = new Template
-               tpl.add "<li"
-               if is_active then
-                       tpl.add " class=\"active\""
-               end
-               tpl.add ">"
-               tpl.add content
-               tpl.addn "</li>"
-               add_raw(tpl)
-       end
-
-       # Add a raw content to the menu
-       fun add_raw(content: Writable) do
-               elts.add content
-       end
-
-       redef fun rendering do
-               if brand == null and elts.is_empty then return
-               addn "<nav id='topmenu' class='navbar navbar-default navbar-fixed-top' role='navigation'>"
-               addn " <div class='container-fluid'>"
-               addn "  <div class='navbar-header'>"
-               add "   <button type='button' class='navbar-toggle' "
-               addn "       data-toggle='collapse' data-target='#topmenu-collapse'>"
-               addn "    <span class='sr-only'>Toggle menu</span>"
-               addn "    <span class='icon-bar'></span>"
-               addn "    <span class='icon-bar'></span>"
-               addn "    <span class='icon-bar'></span>"
-               addn "   </button>"
-               if brand != null then add brand.as(not null)
-               addn "  </div>"
-               addn "  <div class='collapse navbar-collapse' id='topmenu-collapse'>"
-               if not elts.is_empty then
-                       addn "<ul class='nav navbar-nav'>"
-                       for elt in elts do add elt
-                       addn "</ul>"
-               end
-               addn "  </div>"
-               addn " </div>"
-               addn "</nav>"
-       end
-end
-
 # A sidebar template
 class TplSidebar
        super Template
index 15b2963..2908fad 100644 (file)
@@ -45,9 +45,20 @@ redef class MEntity
        # URL of this entity’s Nitdoc page.
        fun nitdoc_url: String is abstract
 
+       # Returns the mentity name without short signature.
+       #
+       # * MProject: `foo`
+       # * MGroup: `foo`
+       # * MModule: `foo`
+       # * MClass: `Foo[E]`
+       # * MClassDef: `Foo[E]`
+       # * MProperty: `foo(e)`
+       # * MPropdef: `foo(e)`
+       var html_name: String is lazy do return name.html_escape
+
        # A template link to the mentity `nitdoc_id`
        fun tpl_anchor: TplLink do
-               var tpl = new TplLink("#{nitdoc_id}", nitdoc_name)
+               var tpl = new TplLink("#{nitdoc_id}", html_name)
                var mdoc = mdoc_or_fallback
                if mdoc != null then
                        tpl.title = mdoc.short_comment
@@ -57,7 +68,7 @@ redef class MEntity
 
        # A template link to the mentity `nitdoc_url`
        fun tpl_link: TplLink do
-               var tpl = new TplLink(nitdoc_url, nitdoc_name)
+               var tpl = new TplLink(nitdoc_url, html_name)
                var mdoc = mdoc_or_fallback
                if mdoc != null then
                        tpl.title = mdoc.short_comment
@@ -80,7 +91,7 @@ redef class MEntity
                var tpl = new TplArticle.with_title(nitdoc_id, tpl_title)
                tpl.title_classes.add "signature"
                tpl.subtitle = tpl_namespace
-               tpl.summary_title = nitdoc_name
+               tpl.summary_title = html_name
                return tpl
        end
 
@@ -252,6 +263,22 @@ redef class MClass
        redef fun nitdoc_url do return "class_{nitdoc_id}.html"
        redef fun mdoc_or_fallback do return intro.mdoc
 
+       # Format: `Foo[E]`
+       redef var html_name is lazy do
+               var tpl = new Template
+               tpl.add name.html_escape
+               if arity > 0 then
+                       tpl.add "["
+                       var parameter_names = new Array[String]
+                       for p in mparameters do
+                               parameter_names.add(p.html_name)
+                       end
+                       tpl.add parameter_names.join(", ")
+                       tpl.add "]"
+               end
+               return tpl.write_to_string
+       end
+
        redef fun tpl_declaration do return intro.tpl_declaration
        redef fun tpl_definition do return intro.tpl_definition
 
@@ -268,7 +295,6 @@ redef class MClass
                var title = new Template
                title.add tpl_icon
                title.add tpl_link
-               title.add tpl_signature
                return title
        end
 
@@ -280,7 +306,7 @@ redef class MClass
                        tpl.add "["
                        var parameter_names = new Array[String]
                        for p in mparameters do
-                               parameter_names.add(p.nitdoc_name)
+                               parameter_names.add(p.html_name)
                        end
                        tpl.add parameter_names.join(", ")
                        tpl.add "]"
@@ -288,12 +314,6 @@ redef class MClass
                return tpl
        end
 
-       redef fun tpl_article do
-               var tpl = super
-               tpl.summary_title = "{nitdoc_name}{tpl_signature.write_to_string}"
-               return tpl
-       end
-
        redef fun tpl_css_classes do return intro.tpl_css_classes
 end
 
@@ -314,7 +334,7 @@ redef class MClassDef
 
        redef fun tpl_article do
                var tpl = new TplArticle(nitdoc_id)
-               tpl.summary_title = "in {mmodule.nitdoc_name}"
+               tpl.summary_title = "in {mmodule.html_name}"
                tpl.title = tpl_declaration
                tpl.title_classes.add "signature"
                var title = new Template
@@ -332,7 +352,6 @@ redef class MClassDef
                var title = new Template
                title.add tpl_icon
                title.add tpl_link
-               title.add tpl_signature
                return title
        end
 
@@ -350,7 +369,7 @@ redef class MClassDef
                if not mparameters.is_empty then
                        tpl.add "["
                        for i in [0..mparameters.length[ do
-                               tpl.add "{mparameters[i].nitdoc_name}: "
+                               tpl.add "{mparameters[i].html_name}: "
                                tpl.add bound_mtype.arguments[i].tpl_signature
                                if i < mparameters.length - 1 then tpl.add ", "
                        end
@@ -428,7 +447,7 @@ redef class MPropDef
 
        redef fun tpl_article do
                var tpl = new TplArticle(nitdoc_id)
-               tpl.summary_title = "in {mclassdef.nitdoc_name}"
+               tpl.summary_title = "in {mclassdef.html_name}"
                var title = new Template
                title.add "in "
                title.add mclassdef.tpl_link
@@ -577,7 +596,9 @@ end
 redef class MGenericType
        redef fun tpl_signature do
                var tpl = new Template
-               tpl.add tpl_link
+               var lnk = tpl_link
+               lnk.text = mclass.name.html_escape
+               tpl.add lnk
                tpl.add "["
                for i in [0..arguments.length[ do
                        tpl.add arguments[i].tpl_signature
index 83c1842..53fc0cf 100644 (file)
@@ -16,6 +16,7 @@
 module html_templates
 
 import html_model
+import html::bootstrap
 
 # Renders the page as HTML.
 redef class DocPage
@@ -31,7 +32,7 @@ redef class DocPage
        var body_attrs = new Array[TagAttribute]
 
        # Top menu template if any.
-       var topmenu: TplTopMenu is writable, noinit
+       var topmenu: DocTopMenu is writable, noinit
 
        # Sidebar template if any.
        var sidebar: nullable TplSidebar = null is writable
@@ -74,13 +75,6 @@ redef class DocPage
                addn ">"
        end
 
-       # Renders the topmenu template.
-       private fun render_topmenu do
-               addn " <div class='row'>"
-               add topmenu
-               addn " </div>"
-       end
-
        # Renders the sidebar template.
        #
        # Sidebar is automatically populated with a summary of all sections
@@ -129,7 +123,9 @@ redef class DocPage
        redef fun rendering do
                render_head
                addn "<div class='container-fluid'>"
-               render_topmenu
+               addn " <div class='row'>"
+               add topmenu
+               addn " </div>"
                addn " <div class='row' id='content'>"
                if sidebar != null then
                        addn "<div class='col col-xs-3 col-lg-2'>"
@@ -148,3 +144,55 @@ redef class DocPage
                render_footer
        end
 end
+
+# Top menu bar template.
+#
+# FIXME should be a Bootstrap component template
+# At this moment, the topmenu structure stills to specific to Nitdoc to use the
+# generic component.
+class DocTopMenu
+       super UnorderedList
+
+       # Brand link to display in first position of the top menu.
+       #
+       # This is where you want to put your logo.
+       var brand: nullable Writable is noinit, writable
+
+       # Active menu item.
+       #
+       # Depends on the current page, this allows to hilighted the current item.
+       #
+       # FIXME should be using Boostrap breadcrumbs component.
+       # This will still like this to avoid diff and be changed in further fixes
+       # when we will modify the output.
+       var active_item: nullable ListItem is noinit, writable
+
+       redef fun rendering do
+               addn "<nav id='topmenu' class='navbar navbar-default navbar-fixed-top' role='navigation'>"
+               addn " <div class='container-fluid'>"
+               addn "  <div class='navbar-header'>"
+               add "   <button type='button' class='navbar-toggle' "
+               addn "       data-toggle='collapse' data-target='#topmenu-collapse'>"
+               addn "    <span class='sr-only'>Toggle menu</span>"
+               addn "    <span class='icon-bar'></span>"
+               addn "    <span class='icon-bar'></span>"
+               addn "    <span class='icon-bar'></span>"
+               addn "   </button>"
+               if brand != null then
+                       add "<span class='navbar-brand'>"
+                       add brand.write_to_string
+                       add "</span>"
+               end
+               addn "  </div>"
+               addn "  <div class='collapse navbar-collapse' id='topmenu-collapse'>"
+               addn "   <ul class='nav navbar-nav'>"
+               for item in items do
+                       if item == active_item then item.css_classes.add "active"
+                       add item.write_to_string
+               end
+               addn "   </ul>"
+               addn "  </div>"
+               addn " </div>"
+               addn "</nav>"
+       end
+end
index 10c6bc0..7781fe8 100644 (file)
@@ -52,7 +52,7 @@ redef class MEntity
        private fun field_separator: String do return "#====#"
        private fun line_separator: String do return "#nnnn#"
 
-       private fun write_to_stream(stream: Writer)
+       private fun write_doc(mainmodule: MModule, stream: Writer)
        do
                # 1. Short name for autocompletion
                stream.write complete_name
@@ -71,13 +71,14 @@ redef class MEntity
 
                # 4. Full doc with extra
                stream.write field_separator
+               stream.write "# "
+               stream.write full_name
+               write_signature_to_stream(stream)
                if mdoc != null then
-                       stream.write "# "
-                       stream.write full_name
-                       write_signature_to_stream(stream)
                        for i in 2.times do stream.write line_separator
                        stream.write mdoc.content.join(line_separator)
                end
+               write_extra_doc(mainmodule, stream)
 
                stream.write "\n"
        end
@@ -89,6 +90,9 @@ redef class MEntity
 
        # Doc to use in completion
        private fun complete_mdoc: nullable MDoc do return mdoc
+
+       # Extra auto documentation to append to the `stream`
+       private fun write_extra_doc(mainmodule: MModule, stream: Writer) do end
 end
 
 redef class MMethodDef
@@ -148,6 +152,84 @@ redef class MClassDef
        end
 end
 
+redef class MClassType
+       redef fun write_extra_doc(mainmodule, stream)
+       do
+               # Super classes
+               stream.write line_separator*2
+               stream.write "## Class hierarchy"
+
+               var direct_supers = [for s in mclass.in_hierarchy(mainmodule).direct_greaters do s.name]
+               if not direct_supers.is_empty then
+                       alpha_comparator.sort direct_supers
+                       stream.write line_separator
+                       stream.write "* Direct super classes: "
+                       stream.write direct_supers.join(", ")
+               end
+
+               var supers = [for s in mclass.in_hierarchy(mainmodule).greaters do s.name]
+               supers.remove mclass.name
+               if not supers.is_empty then
+                       alpha_comparator.sort supers
+                       stream.write line_separator
+                       stream.write "* All super classes: "
+                       stream.write supers.join(", ")
+               end
+
+               var direct_subs = [for s in mclass.in_hierarchy(mainmodule).direct_smallers do s.name]
+               if not direct_subs.is_empty then
+                       alpha_comparator.sort direct_subs
+                       stream.write line_separator
+                       stream.write "* Direct sub classes: "
+                       stream.write direct_subs.join(", ")
+               end
+
+               var subs = [for s in mclass.in_hierarchy(mainmodule).smallers do s.name]
+               subs.remove mclass.name
+               if not subs.is_empty then
+                       alpha_comparator.sort subs
+                       stream.write line_separator
+                       stream.write "* All sub classes: "
+                       stream.write subs.join(", ")
+               end
+
+               # List other properties
+               stream.write line_separator*2
+               stream.write "## Properties"
+               stream.write line_separator
+               var props = mclass.all_mproperties(mainmodule, protected_visibility).to_a
+               alpha_comparator.sort props
+               for prop in props do
+                       if mclass.name == "Object" or prop.intro.mclassdef.mclass.name != "Object" then
+
+                               if prop.visibility == public_visibility then
+                                       stream.write "+ "
+                               else stream.write "~ " # protected_visibility
+
+                               if prop isa MMethod then
+                                       if prop.is_init and prop.name != "init" then stream.write "init "
+                                       if prop.is_new and prop.name != "new" then stream.write "new "
+                               end
+
+                               stream.write prop.name
+
+                               if prop isa MMethod then
+                                       stream.write prop.intro.msignature.to_s
+                               end
+
+                               var mdoc = prop.intro.mdoc
+                               if mdoc != null then
+                                       stream.write "  # "
+                                       stream.write mdoc.content.first
+                               end
+                               stream.write line_separator
+                       end
+               end
+       end
+
+       redef fun complete_mdoc do return mclass.intro.mdoc
+end
+
 private class AutocompletePhase
        super Phase
 
@@ -168,7 +250,7 @@ private class AutocompletePhase
                # Got all known modules
                var model = mainmodule.model
                for mmodule in model.mmodules do
-                       mmodule.write_to_stream modules_stream
+                       mmodule.write_doc(mainmodule, modules_stream)
                end
 
                # TODO list other modules from the Nit lib
@@ -184,15 +266,15 @@ private class AutocompletePhase
                                for prop in mclass.all_mproperties(mainmodule, public_visibility) do
                                        if prop isa MMethod and prop.is_init then
                                                mclass_intro.target_constructor = prop.intro
-                                               mclass_intro.write_to_stream constructors_stream
+                                               mclass_intro.write_doc(mainmodule, constructors_stream)
                                        end
                                end
                                mclass_intro.target_constructor = null
                        end
 
                        # Always add to types and classes
-                       mclass.mclass_type.write_to_stream classes_stream
-                       mclass.mclass_type.write_to_stream types_stream
+                       mclass.mclass_type.write_doc(mainmodule, classes_stream)
+                       mclass.mclass_type.write_doc(mainmodule, types_stream)
                end
 
                # Get all known properties
@@ -202,7 +284,7 @@ private class AutocompletePhase
 
                        # Is it a virtual type?
                        if mproperty isa MVirtualTypeProp then
-                               mproperty.intro.write_to_stream types_stream
+                               mproperty.intro.write_doc(mainmodule, types_stream)
                                continue
                        end
 
@@ -210,7 +292,7 @@ private class AutocompletePhase
                        var first_letter = mproperty.name.chars.first
                        if first_letter == '@' or first_letter == '_' then continue
 
-                       mproperty.intro.write_to_stream properties_stream
+                       mproperty.intro.write_doc(mainmodule, properties_stream)
                end
 
                # Close streams
@@ -220,7 +302,7 @@ private class AutocompletePhase
                        stream.close
                        var error = stream.last_error
                        if error != null then
-                               toolcontext.error(null, "Failed to write Vim autocomplete file: {error}")
+                               toolcontext.error(null, "Error: failed to write Vim autocomplete file: {error}.")
                        end
                end
        end
index 878785c..1618f9e 100644 (file)
@@ -48,13 +48,13 @@ private class CCompilerOptionsPhase
                var modelbuilder = toolcontext.modelbuilder
 
                if not nmoduledecl isa AModuledecl then
-                       modelbuilder.error(nat, "Syntax error: only the declaration of modules may use \"{annotation_name}\".")
+                       modelbuilder.error(nat, "Syntax Error: only the declaration of modules may use `{annotation_name}`.")
                        return
                end
 
                var args = nat.n_args
                if args.is_empty then
-                       modelbuilder.error(nat, "Syntax error: \"{annotation_name}\" expects at least one argument.")
+                       modelbuilder.error(nat, "Syntax Error: `{annotation_name}` expects at least one argument.")
                        return
                end
 
@@ -69,14 +69,14 @@ private class CCompilerOptionsPhase
                                # We support calls to "exec" only
                                var exec_args = expr.n_args.to_a
                                if expr.n_id.text != "exec" or exec_args.is_empty then
-                                       modelbuilder.error(nat, "Syntax error: \"{annotation_name}\" accepts only calls to `exec` with the command as arguments.")
+                                       modelbuilder.error(nat, "Syntax Error: `{annotation_name}` accepts only calls to `exec` with the command as arguments.")
                                        return
                                end
 
                                var exec_args_as_strings = new Array[String]
                                for exec_arg in exec_args do
                                        if not exec_arg isa AStringFormExpr then
-                                               modelbuilder.error(nat, "Syntax error: calls to `exec` expects the arguments to be String literals.")
+                                               modelbuilder.error(nat, "Syntax Error: calls to `exec` expects the arguments to be String literals.")
                                                return
                                        else
                                                var arg_string = exec_arg.collect_text
@@ -88,7 +88,7 @@ private class CCompilerOptionsPhase
                                var opt = new ExecCCompilerOption(exec_args_as_strings, expr)
                                options.add(opt)
                        else
-                               modelbuilder.error(nat, "Syntax error: \"{annotation_name}\" expects its arguments to be the name of the package as String literals.")
+                               modelbuilder.error(nat, "Syntax Error: `{annotation_name}` expects its arguments to be the name of the package as String literals.")
                                return
                        end
                end
@@ -113,14 +113,14 @@ private class CCompilerOptionsPhase
                                # check result
                                var status = proc.status
                                if status != 0 then
-                                       modelbuilder.error(opt.exec_node, "Annotation error: Something went wrong executing the argument of annotation \"{annotation_name}\", make sure the command is valid.")
+                                       modelbuilder.error(opt.exec_node, "Error: something went wrong when executing the argument of `{annotation_name}`, make sure the command is valid.")
                                        return
                                end
 
                                # process result
                                var result = proc.read_all.replace("\n", " ")
                                if result.is_empty then
-                                       modelbuilder.error(opt.exec_node, "Annotation error: Got no result from the command, make sure it is valid.")
+                                       modelbuilder.error(opt.exec_node, "Error: got no result from the command, make sure it is valid.")
                                        return
                                end
                                simplified_options.add(new DirectCCompilerOption(result))
@@ -147,7 +147,7 @@ private class CCompilerOptionsPhase
                if annots != null then
                        var items = annots.n_items
                        if items.length > 1 then
-                               modelbuilder.error(annots, "Annotation error: `annotation_name` accepts only a single annotation, the platform name")
+                               modelbuilder.error(annots, "Syntax Error: `{annotation_name}` accepts only a single annotation, the platform name.")
                                return
                        end
                        assert items.length == 1
index bc4f0c4..6b53008 100644 (file)
@@ -38,8 +38,8 @@ private class ExternClassesTypingPhaseAst
                if code_block == null then return
 
                if nclassdef.n_kwredef != null then
-                       # A redef cannot specifiy a different extern type
-                       toolcontext.error(nclassdef.location, "Only the introduction of a class can specify an extern type.")
+                       # A redef cannot specify a different extern type
+                       toolcontext.error(nclassdef.location, "FFI Error: only the introduction of a class can declare an extern type.")
                        return
                end
 
@@ -68,10 +68,11 @@ private class ExternClassesTypingPhaseModel
                if not nclassdef isa AStdClassdef then return
 
                var mclassdef = nclassdef.mclassdef
-               var mclass = nclassdef.mclass
+               if mclassdef == null then return
+               var mclass = mclassdef.mclass
 
                # We only need to do this once per class
-               if mclass.intro != mclassdef then return
+               if not mclassdef.is_intro then return
 
                if mclass.kind != extern_kind then return
 
@@ -117,7 +118,7 @@ redef class MClass
                                        else
                                                # detect conflict
                                                if super_ftype != ftype_b then
-                                                       v.toolcontext.error(null, "Extern type conflict in {self}")
+                                                       v.toolcontext.error(null, "FFI Error: extern type conflict in `{self}`.")
                                                        return null
                                                end
                                        end
index 67a5f9d..71485cc 100644 (file)
@@ -45,13 +45,13 @@ private class JavaExtraFilesPhase
                var modelbuilder = toolcontext.modelbuilder
 
                if not nmoduledecl isa AModuledecl then
-                       modelbuilder.error(nat, "Syntax error: only the declaration of modules may use \"{annot_name}\".")
+                       modelbuilder.error(nat, "Syntax Error: only the declaration of modules may use `{annot_name}`.")
                        return
                end
 
                var args = nat.n_args
                if args.is_empty then
-                       modelbuilder.error(nat, "Syntax error: \"{annot_name}\" expects at least one argument.")
+                       modelbuilder.error(nat, "Syntax Error: `{annot_name}` expects at least one argument.")
                        return
                end
 
@@ -64,7 +64,7 @@ private class JavaExtraFilesPhase
                        mmodule.extra_java_files = java_files
                end
 
-               var format_error = "Syntax error: \"{annot_name}\" expects its arguments to be paths to java files."
+               var format_error = "Syntax Error: `{annot_name}` expects its arguments to be paths to java files."
                for arg in args do
                        var path = arg.as_string
                        if path == null then
@@ -77,7 +77,7 @@ private class JavaExtraFilesPhase
                        if source_file != null then path = "{source_file.filename.dirname}/{path}"
 
                        if not path.file_exists then
-                               modelbuilder.error(nat, "FFI with Java error: file \"{path}\" not found.")
+                               modelbuilder.error(nat, "FFI with Java Error: file `{path}` not found.")
                                continue
                        end
 
index 59f46b3..b8a8103 100644 (file)
@@ -63,14 +63,14 @@ class FFILanguageAssignationPhase
                        var identified = v.identify_language(n)
                        if identified then
                                if found and identified then
-                                       toolcontext.error(n.location, "Two languages identified as possible handlers.")
+                                       toolcontext.error(n.location, "FFI Error: two languages identified as possible handlers.")
                                end
                                n.language = v
                                found = true
                        end
                end
 
-               if not found then toolcontext.error(n.location, "Unsupported language.")
+               if not found then toolcontext.error(n.location, "FFI Error: unsupported language.")
        end
 end
 
index 7827dac..830e68c 100644 (file)
@@ -296,7 +296,7 @@ redef class AMethPropdef
                assert sys_class != null
                var sys_jni_env_meth = modelbuilder.try_get_mproperty_by_name2(self, mmodule, sys_class.mclass_type, "jni_env")
                if sys_jni_env_meth == null or not sys_jni_env_meth isa MMethod then
-                       toolcontext.error(self.location, "Java FFI error: you must import the `java` module when using the FFI with Java")
+                       toolcontext.error(self.location, "Java FFI Error: you must import the `java` module when using the FFI with Java")
                        return
                end
 
index bd62de3..7665b7a 100644 (file)
@@ -39,7 +39,7 @@ class PkgconfigPhase
                var modelbuilder = toolcontext.modelbuilder
 
                if not nmoduledecl isa AModuledecl then
-                       modelbuilder.error(nat, "Syntax error: only the declaration of modules may use \"pkgconfig\".")
+                       modelbuilder.error(nat, "Syntax Error: only the declaration of modules may use `pkgconfig`.")
                        return
                end
 
@@ -58,7 +58,7 @@ class PkgconfigPhase
                        for arg in args do
                                var pkg = arg.as_string
                                if pkg == null then
-                                       modelbuilder.error(nat, "Syntax error: \"pkgconfig\" expects its arguments to be the name of the package as String literals.")
+                                       modelbuilder.error(nat, "Syntax Error: `pkgconfig` expects its arguments to be the name of the package as String literals.")
                                        return
                                end
 
@@ -71,7 +71,7 @@ class PkgconfigPhase
                proc_which.wait
                var status = proc_which.status
                if status != 0 then
-                       modelbuilder.error(nat, "Error: program pkg-config not found, make sure it is installed.")
+                       modelbuilder.error(nat, "Error: program `pkg-config` not found, make sure it is installed.")
                        return
                end
 
@@ -80,10 +80,10 @@ class PkgconfigPhase
                        proc_exist.wait
                        status = proc_exist.status
                        if status == 1 then
-                               modelbuilder.error(nat, "Error: package \"{pkg}\" unknown by pkg-config, make sure the development package is be installed.")
+                               modelbuilder.error(nat, "Error: package `{pkg}` unknown by `pkg-config`, make sure the development package is be installed.")
                                return
                        else if status != 0 then
-                               modelbuilder.error(nat, "Error: something went wrong calling pkg-config, make sure it is correctly installed.")
+                               modelbuilder.error(nat, "Error: something went wrong calling `pkg-config`, make sure it is correctly installed.")
                                return
                        end
 
index 419c5ae..6d9bb60 100644 (file)
@@ -40,7 +40,7 @@ private class CheckAnnotationPhase
        do
                # Get the mmodule
                var mmodule = nmodule.mmodule
-               assert mmodule != null
+               if mmodule == null then return
                self.mmodule = mmodule
 
                # If no decl block then quit
@@ -61,7 +61,7 @@ private class CheckAnnotationPhase
 
                        for m in super_mmodules do
                                if declared_annotations[m].has(name) then
-                                       modelbuilder.warning(annot, "multiple-annotation-declarations", "Warning: an annotation `{name}` is already declared in module `{m}`")
+                                       modelbuilder.warning(annot, "multiple-annotation-declarations", "Warning: an annotation `{name}` is already declared in module `{m}`.")
                                        break label
                                end
                        end
@@ -91,6 +91,8 @@ intern
 extern
 no_warning
 
+auto_inspect
+
 pkgconfig
 cflags
 ldflags
@@ -110,7 +112,7 @@ platform
                if primtives_annotations.has(name) then return
 
                var mmodule = self.mmodule
-               assert mmodule != null
+               if mmodule == null then return
 
                # Lazily build the full user-list
                var annots = user_annotations.get_or_null(mmodule)
@@ -123,7 +125,7 @@ platform
 
                if annots.has(name) then return
 
-               toolcontext.modelbuilder.warning(nat, "unknown-annotation", "Warning: unknown annotation `{name}`")
+               toolcontext.modelbuilder.warning(nat, "unknown-annotation", "Warning: unknown annotation `{name}`.")
 
                annots.add(name) # to avoid multiple errors on the same name
        end
diff --git a/src/frontend/deriving.nit b/src/frontend/deriving.nit
new file mode 100644 (file)
index 0000000..3cd8718
--- /dev/null
@@ -0,0 +1,102 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Injection of automatic method definitions for standard methods, based on the attributes of the classes
+#
+# This phase is only a proof of concept and is inherently fragile:
+#
+# * syntactic code injection without semantic checking
+# * ignorance of name conflicts
+# * attributes are syntactically and locally collected
+module deriving
+
+private import parser_util
+import modelize
+private import annotation
+
+redef class ToolContext
+       # Main phase of `deriving`
+       var deriving_phase: Phase = new DerivingPhase(self, null)
+end
+
+private class DerivingPhase
+       super Phase
+
+       redef fun process_annotated_node(nclassdef, nat)
+       do
+               if nat.name == "auto_inspect" then
+                       if not nclassdef isa AStdClassdef then
+                               toolcontext.error(nclassdef.location, "Syntax Error: only a concrete class can be `{nat.name}`.")
+                       else
+                               generate_inspect_method(nclassdef)
+                       end
+               end
+
+               if nat.name == "auto_derive" then
+                       if not nclassdef isa AStdClassdef then
+                               toolcontext.error(nclassdef.location, "Syntax Error: only a concrete class can be `{nat.name}`.")
+                       else
+                               generate_derive_to_map_method(nclassdef, nat)
+                       end
+               end
+       end
+
+       fun generate_inspect_method(nclassdef: AClassdef)
+       do
+               var npropdefs = nclassdef.n_propdefs
+
+               var code = new Array[String]
+               code.add "redef fun inspect"
+               code.add "do"
+               code.add "      var res = super"
+               code.add "      res = res.substring(0,res.length-1)"
+
+               for attribute in npropdefs do if attribute isa AAttrPropdef then
+                       var name = attribute.n_id2.text
+                       code.add """    res += " {{{name}}}: {self.{{{name}}}.inspect}""""
+               end
+
+               code.add "      res += \">\""
+               code.add "      return res"
+               code.add "end"
+
+               # Create method Node and add it to the AST
+               npropdefs.push(toolcontext.parse_propdef(code.join("\n")))
+       end
+
+       fun generate_derive_to_map_method(nclassdef: AClassdef, nat: AAnnotation)
+       do
+               var npropdefs = nclassdef.n_propdefs
+
+               var sc = toolcontext.parse_superclass("Derivable")
+               sc.location = nat.location
+               nclassdef.n_propdefs.add sc
+
+               var code = new Array[String]
+               code.add "redef fun derive_to_map"
+               code.add "do"
+               code.add "      var res = super"
+
+               for attribute in npropdefs do if attribute isa AAttrPropdef then
+                       var name = attribute.n_id2.text
+                       code.add """    res["{{{name}}}"] = self.{{{name}}}"""
+               end
+
+               code.add "      return res"
+               code.add "end"
+
+               # Create method Node and add it to the AST
+               npropdefs.push(toolcontext.parse_propdef(code.join("\n")))
+       end
+end
index 4a8cfb4..1e187e2 100644 (file)
@@ -37,7 +37,8 @@ private class DivByZeroPhase
        redef fun process_nmodule(nmodule)
        do
                # The AST node is not enough, we need also the associated model element
-               var mmodule = nmodule.mmodule.as(not null)
+               var mmodule = nmodule.mmodule
+               if mmodule == null then return
                # For the specific job we have, the simpler it to launch a visitor on
                # all elements of the AST.
                var visitor = new DivByZeroVisitor(toolcontext, mmodule)
@@ -79,6 +80,6 @@ private class DivByZeroVisitor
                if not op1.mtype.is_subtype(mmodule, null, int_type) then return
 
                # Error detected
-               toolcontext.error(node.location, "Error: Definitely division by zero")
+               toolcontext.warning(node.location, "div-by-zero", "Warning: division by zero.")
        end
 end
index 8c5079f..28e36bd 100644 (file)
@@ -22,8 +22,10 @@ import modelize
 import semantize
 import div_by_zero
 import serialization_phase
+import deriving
 import check_annotation
 import glsl_validation
+import parallelization_phase
 
 redef class ToolContext
        # FIXME: there is conflict in linex in nitc, so use this trick to force invocation
@@ -41,6 +43,7 @@ redef class ToolContext
                # Code genrated by the serialization phase must be analyzed for literals
                phases.add_edge(literal_phase, serialization_phase_pre_model)
                phases.add_edge(modelize_class_phase, serialization_phase_pre_model)
+               phases.add_edge(modelize_class_phase, parallelization_phase)
                return true
        end
 end
index 692d918..6d67d2c 100644 (file)
@@ -52,7 +52,7 @@ private class GLSLValidationPhase
                # Only applicable on strings
                if not nstring isa AStringFormExpr then
                        toolcontext.error(nstring.location,
-                               "Syntax error: only a string literal can be annotated as \"{annot_name}\".")
+                               "Syntax Error: only a string literal can be annotated as `{annot_name}`.")
                        return
                end
 
@@ -70,7 +70,7 @@ private class GLSLValidationPhase
                        tool_is_in_path = in_path
                        if not in_path then
                                toolcontext.warning(nat.location, "glslvalidator",
-                                       "Warning: program \"glslangValidator\" not in PATH, cannot validate this shader.")
+                                       "Warning: program `glslangValidator` not in PATH, cannot validate this shader.")
                                return
                        end
                end
index 931440e..b3cfd30 100644 (file)
@@ -30,7 +30,7 @@ private class NoWarningPhase
        do
                # Get the mmodule
                var mmodule = nmodule.mmodule
-               assert mmodule != null
+               if mmodule == null then return
 
                var source = nmodule.location.file
 
@@ -58,20 +58,20 @@ private class NoWarningPhase
                if annots.is_empty then return
 
                if source == null then
-                       modelbuilder.warning(annots.first, "file-less-module", "Warning: annotation `{name}` does not currently work on file-less modules.")
+                       modelbuilder.warning(annots.first, "file-less-module", "Warning: `{name}` does not currently work on file-less modules.")
                        return
                end
 
                for annot in annots do
                        var args = annot.n_args
                        if args.is_empty then
-                               modelbuilder.error(annot, "Annotation error: `{name}` needs a list of warnings. Use `\"all\"` to disable all warnings.")
+                               modelbuilder.error(annot, "Syntax Error: `{name}` expects a list of warnings. Use `\"all\"` to disable all warnings.")
                                continue
                        end
                        for arg in args do
                                var tag = arg.as_string
                                if tag == null then
-                                       modelbuilder.error(arg, "Annotation error: `{name}` expects String as arguments.")
+                                       modelbuilder.error(arg, "Syntax Error: `{name}` expects String as arguments.")
                                        continue
                                end
 
diff --git a/src/frontend/parallelization_phase.nit b/src/frontend/parallelization_phase.nit
new file mode 100644 (file)
index 0000000..2d15d82
--- /dev/null
@@ -0,0 +1,135 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Romain Chanoir <romain.chanoir@viacesi.fr>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# Phase generating threads for functions annotated with `threaded` annotation
+module parallelization_phase
+
+private import parser_util
+import modelize
+import astbuilder
+private import annotation
+
+redef class ToolContext
+       # Transforms a function annotated with "threaded"
+       var parallelization_phase: Phase = new ParallelizationPhase(self, null)
+end
+
+private class ParallelizationPhase
+       super Phase
+
+       redef fun process_annotated_node(nmethdef, nat)
+       do
+               if nat.n_atid.n_id.text != "threaded" then return
+
+               if not nmethdef isa AMethPropdef then
+                       toolcontext.error(nat.location, "Syntax Error: only a method can be threaded.")
+                       return
+               end
+
+               #TODO: check for self calls
+
+               if nmethdef.n_signature.n_type != null then
+                       toolcontext.error(nat.location, "Error: functions not supported yet.")
+                       return
+               end
+
+               # Get the module associated with this method
+               var amod = nmethdef.parent.parent
+               assert amod isa AModule
+
+               # Construct the name of the generated class
+               var modulename = amod.n_moduledecl.n_name.n_id.text
+               var classname = "Threaded" + modulename
+
+               # Try to get the name of the class
+               if nmethdef.parent isa AStdClassdef then
+                       classname += nmethdef.parent.as(AStdClassdef).n_id.text
+               end
+
+               # Try to get the name of the method
+               if nmethdef.n_methid isa AIdMethid then
+                       classname += nmethdef.n_methid.as(AIdMethid).n_id.text
+               end
+
+
+               var params = new Array[String]
+               # case if the method has parameters
+               if nmethdef.n_signature.n_params.not_empty then
+                       for param in nmethdef.n_signature.n_params do
+                               params.add("""
+var {{{param.n_id.text}}} : {{{param.n_type.n_id.text}}}
+
+""")
+                       end
+               end
+
+               # String corresponding to the generated class
+               var s="""
+class {{{classname}}}
+       super Thread
+
+       {{{params.join("\n")}}}
+       redef fun main do
+       end
+end
+"""
+
+               # Parse newly obtained classdef
+               var classdef = toolcontext.parse_classdef(s).as(AStdClassdef)
+
+               # Get the `main` fun of the class
+               var mainfun : nullable AMethPropdef = null
+               for prop in classdef.n_propdefs do
+                       if prop isa AMethPropdef then mainfun = prop
+               end
+               assert mainfun != null
+
+               # Make the statements from `main` fun be the statements from the "threaded" fun
+               mainfun.n_block = nmethdef.n_block
+
+               # Add "return null" to the end of the `main` function
+               var s_nullreturn = "return null"
+               var nullreturn = toolcontext.parse_something(s_nullreturn)
+               assert nullreturn isa AExpr
+               mainfun.n_block.as(ABlockExpr).n_expr.add(nullreturn)
+
+
+               # Create new body for the annotated fun
+               var s_newbody : String
+               if nmethdef.n_signature.n_params.not_empty then
+                       var init_params = new Array[String]
+                       for param in nmethdef.n_signature.n_params do
+                               init_params.add(param.n_id.text)
+                       end
+                       s_newbody ="""
+var thread = new {{{classname}}}({{{init_params.join(",")}}})
+thread.start
+"""
+               else
+                       s_newbody = """
+var thread = new {{{classname}}}
+thread.start
+"""
+               end
+
+               var newbody = toolcontext.parse_something(s_newbody)
+               nmethdef.n_block = newbody.as(ABlockExpr)
+
+               # Add the new class to the module
+               amod.n_classdefs.add(classdef)
+       end
+end
index 75863d9..976d532 100644 (file)
@@ -43,7 +43,7 @@ private class SerializationPhasePreModel
                # Skip if we are not interested
                if nat.n_atid.n_id.text != "auto_serializable" then return
                if not nclassdef isa AStdClassdef then
-                       toolcontext.error(nclassdef.location, "Syntax error: only a concrete class can be automatically serialized.")
+                       toolcontext.error(nclassdef.location, "Syntax Error: only a concrete class can be automatically serialized.")
                        return
                end
 
@@ -97,8 +97,11 @@ private class SerializationPhasePreModel
        end
 
        # Add a constructor to the automated nclassdef
-       fun generate_deserialization_init(nclassdef: AClassdef)
+       fun generate_deserialization_init(nclassdef: AStdClassdef)
        do
+               # Do not generate constructors for abstract classes
+               if nclassdef.n_classkind isa AAbstractClasskind then return
+
                var npropdefs = nclassdef.n_propdefs
 
                var code = new Array[String]
@@ -150,13 +153,15 @@ private class SerializationPhasePreModel
                        code.add "      redef fun deserialize_class(name)"
                        code.add "      do"
                else
-                       toolcontext.error(deserializer_npropdef.location, "Annotation error: you cannot define Deserializer::deserialize_class in a module where you use \"auto_serializable\".")
+                       toolcontext.error(deserializer_npropdef.location, "Error: you cannot define `Deserializer::deserialize_class` in a module where you use `auto_serializable`.")
                        return
                end
 
                for nclassdef in nclassdefs do
                        var name = nclassdef.n_id.text
-                       if nclassdef.n_formaldefs.is_empty then
+                       if nclassdef.n_formaldefs.is_empty and
+                               not nclassdef.n_classkind isa AAbstractClasskind then
+
                                code.add "              if name == \"{name}\" then return new {name}.from_deserializer(self)"
                        end
                end
@@ -179,7 +184,9 @@ private class SerializationPhasePostModel
        redef fun process_nmodule(nmodule)
        do
                for npropdef in nmodule.inits_to_retype do
-                       var v = new PreciseTypeVisitor(npropdef, npropdef.mpropdef.mclassdef, toolcontext)
+                       var mpropdef = npropdef.mpropdef
+                       if mpropdef == null then continue # skip error
+                       var v = new PreciseTypeVisitor(npropdef, mpropdef.mclassdef, toolcontext)
                        npropdef.accept_precise_type_visitor v
                end
        end
index ecc4c7d..00ed2bf 100644 (file)
@@ -57,6 +57,37 @@ class HighlightVisitor
                htmlize(s.first_token.as(not null), s.last_token.as(not null))
        end
 
+       private fun full_tag(anode: ANode, hv: HighlightVisitor): nullable HTMLTag
+       do
+               var tag = anode.make_tag(hv)
+               if tag == null then return null
+               var infobox = anode.infobox(hv)
+               if infobox == null and anode isa Token then
+                       var pa = anode.parent
+                       if pa != null then
+                               var c = anode
+                               if c isa TId or c isa TClassid or c isa TAttrid or c isa TokenLiteral or c isa TokenOperator or c isa TComment and pa isa ADoc then
+                                       infobox = pa.decorate_tag(hv, tag, anode)
+                               end
+                       end
+               end
+               var messages = anode.location.messages
+               if messages != null then
+                       tag.css("border-bottom", "solid 2px red")
+                       if infobox == null then
+                               infobox = new HInfoBox(hv, "Messages")
+                       end
+                       var c = infobox.new_dropdown("{messages.length} message(s)", "")
+                       for m in messages do
+                               c.open("li").append(m.text)
+                       end
+               end
+               if infobox != null then
+                       tag.attach_infobox(infobox)
+               end
+               return tag
+       end
+
        # Produce HTML between two tokens
        protected fun htmlize(first_token, last_token: Token)
        do
@@ -79,11 +110,9 @@ class HighlightVisitor
                                if c0 != null then starting = c0.starting_prods
                                if starting != null then for p in starting do
                                        if not p.is_block then continue
-                                       var tag = p.make_tag(hv)
+                                       var tag = full_tag(p, hv)
                                        if tag == null then continue
                                        tag.add_class("foldable")
-                                       var infobox = p.infobox(hv)
-                                       if infobox != null then tag.attach_infobox(infobox)
                                        stack2.add(html)
                                        html.add tag
                                        html = tag
@@ -108,10 +137,8 @@ class HighlightVisitor
                        starting = c.starting_prods
                        if starting != null then for p in starting do
                                if not p.is_span then continue
-                               var tag = p.make_tag(hv)
+                               var tag = full_tag(p, hv)
                                if tag == null then continue
-                               var infobox = p.infobox(hv)
-                               if infobox != null then tag.attach_infobox(infobox)
                                stack2.add(html)
                                html.add tag
                                html = tag
@@ -122,17 +149,8 @@ class HighlightVisitor
                        if c isa TEol then 
                                html.append "\n"
                        else
-                               var tag = c.make_tag(hv)
-                               var pa = c.parent
-                               var infobox = null
-                               if c isa TId or c isa TClassid or c isa TAttrid or c isa TokenLiteral or c isa TokenOperator then
-                                       assert c != null
-                                       if pa != null then infobox = pa.decorate_tag(hv, tag, c)
-                               else if c isa TComment and pa isa ADoc then
-                                       infobox = pa.decorate_tag(hv, tag, c)
-                               end
-                               if infobox != null then tag.attach_infobox(infobox)
-                               html.add tag
+                               var tag = full_tag(c, hv)
+                               if tag != null then html.add tag
                        end
 
                        # Handle ending span productions
@@ -165,8 +183,8 @@ class HighlightVisitor
 
                        c = n
                end
-               assert stack.is_empty
-               assert stack2.is_empty
+               #assert stack.is_empty
+               #assert stack2.is_empty
        end
 
        # Return a default CSS content related to CSS classes used in the `html` tree.
@@ -510,6 +528,33 @@ redef class MNullableType
        end
 end
 
+redef class MNotNullType
+       redef fun infobox(v)
+       do
+               return mtype.infobox(v)
+       end
+       redef fun linkto
+       do
+               var res = new HTMLTag("span")
+               res.append("not null ").add(mtype.linkto)
+               return res
+       end
+end
+
+redef class MNullType
+       redef fun infobox(v)
+       do
+               var res = new HInfoBox(v, to_s)
+               return res
+       end
+       redef fun linkto
+       do
+               var res = new HTMLTag("span")
+               res.append("null")
+               return res
+       end
+end
+
 redef class MSignature
        redef fun linkto
        do
@@ -611,6 +656,7 @@ redef class AStdClassdef
        end
        redef fun decorate_tag(v, res, token)
        do
+               if not token isa TClassid then return null
                res.add_class("nc_def")
 
                var md = mclassdef
@@ -870,8 +916,8 @@ redef class AType
        do
                var mt = mtype
                if mt == null then return null
-               mt = mt.as_notnullable
-               if mt isa MVirtualType or mt isa MParameterType then
+               mt = mt.undecorate
+               if mt isa MFormalType then
                        res.add_class("nc_vt")
                end
                return mt.infobox(v)
index 58a49d1..1765d9e 100644 (file)
@@ -225,6 +225,8 @@ class Debugger
        # Auto continues the execution until the end or until an error is encountered
        var autocontinue = false
 
+       redef type FRAME: InterpreterFrame
+
        #######################################################################
        ##                  Execution of statement function                  ##
        #######################################################################
@@ -867,7 +869,7 @@ class Debugger
        # If the variable *variable_name* is an argument of the function being executed in the frame *frame*
        # The function returns its position in the arguments
        # Else, it returns -1
-       private fun get_position_of_variable_in_arguments(frame: Frame, variable_name: String): Int
+       private fun get_position_of_variable_in_arguments(frame: FRAME, variable_name: String): Int
        do
                var identifiers = get_identifiers_in_current_instruction(get_function_arguments(frame.mpropdef.location.text))
                for i in [0 .. identifiers.length-1] do
@@ -1053,7 +1055,7 @@ class Debugger
        #######################################################################
 
        # Seeks a variable from the current frame called 'variable_path', can introspect complex objects using function get_variable_in_mutable_instance
-       private fun seek_variable(variable_path: String, frame: Frame): nullable Instance
+       private fun seek_variable(variable_path: String, frame: FRAME): nullable Instance
        do
                var full_variable = variable_path.split_with(".")
 
@@ -1073,7 +1075,7 @@ class Debugger
        end
 
        # Gets a variable 'variable_name' contained in the frame 'frame'
-       private fun get_variable_in_frame(variable_name: String, frame: Frame): nullable Instance
+       private fun get_variable_in_frame(variable_name: String, frame: FRAME): nullable Instance
        do
                if variable_name == "self" then
                        if frame.arguments.length >= 1 then return frame.arguments.first
@@ -1409,7 +1411,7 @@ redef class AMethPropdef
        # Not supposed to be used by anyone else than the Debugger.
        private fun rt_call(v: Debugger, mpropdef: MMethodDef, args: Array[Instance]): nullable Instance
        do
-               var f = new Frame(self, self.mpropdef.as(not null), args)
+               var f = new InterpreterFrame(self, self.mpropdef.as(not null), args)
                var curr_instances = v.frame.map
                for i in curr_instances.keys do
                        f.map[i] = curr_instances[i]
index bb0b3b3..9b821e4 100644 (file)
@@ -115,7 +115,7 @@ class NaiveInterpreter
 
        # Is a return executed?
        # Set this mark to skip the evaluation until the end of the specified method frame
-       var returnmark: nullable Frame = null
+       var returnmark: nullable FRAME = null
 
        # Is a break or a continue executed?
        # Set this mark to skip the evaluation until a labeled statement catch it with `is_escape`
@@ -201,8 +201,8 @@ class NaiveInterpreter
        # Return the integer instance associated with `val`.
        fun int_instance(val: Int): Instance
        do
-               var ic = get_primitive_class("Int")
-               var instance = new PrimitiveInstance[Int](ic.mclass_type, val)
+               var t = mainmodule.int_type
+               var instance = new PrimitiveInstance[Int](t, val)
                init_instance_primitive(instance)
                return instance
        end
@@ -210,8 +210,8 @@ class NaiveInterpreter
        # Return the char instance associated with `val`.
        fun char_instance(val: Char): Instance
        do
-               var ic = get_primitive_class("Char")
-               var instance = new PrimitiveInstance[Char](ic.mclass_type, val)
+               var t = mainmodule.char_type
+               var instance = new PrimitiveInstance[Char](t, val)
                init_instance_primitive(instance)
                return instance
        end
@@ -219,8 +219,8 @@ class NaiveInterpreter
        # Return the float instance associated with `val`.
        fun float_instance(val: Float): Instance
        do
-               var ic = get_primitive_class("Float")
-               var instance = new PrimitiveInstance[Float](ic.mclass_type, val)
+               var t = mainmodule.float_type
+               var instance = new PrimitiveInstance[Float](t, val)
                init_instance_primitive(instance)
                return instance
        end
@@ -239,9 +239,9 @@ class NaiveInterpreter
        fun array_instance(values: Array[Instance], elttype: MType): Instance
        do
                assert not elttype.need_anchor
-               var nat = new PrimitiveInstance[Array[Instance]](get_primitive_class("NativeArray").get_mtype([elttype]), values)
+               var nat = new PrimitiveInstance[Array[Instance]](mainmodule.native_array_type(elttype), values)
                init_instance_primitive(nat)
-               var mtype = get_primitive_class("Array").get_mtype([elttype])
+               var mtype = mainmodule.array_type(elttype)
                var res = new MutableInstance(mtype)
                self.init_instance(res)
                self.send(self.force_get_primitive_method("with_native", mtype), [res, nat, self.int_instance(values.length)])
@@ -268,8 +268,8 @@ class NaiveInterpreter
        do
                var val = new FlatBuffer.from(txt)
                val.add('\0')
-               var ic = get_primitive_class("NativeString")
-               var instance = new PrimitiveInstance[Buffer](ic.mclass_type, val)
+               var t = mainmodule.native_string_type
+               var instance = new PrimitiveInstance[Buffer](t, val)
                init_instance_primitive(instance)
                return instance
        end
@@ -283,11 +283,14 @@ class NaiveInterpreter
                return res
        end
 
+       # The virtual type of the frames used in the execution engine
+       type FRAME: Frame
+
        # The current frame used to store local variables of the current method executed
-       fun frame: Frame do return frames.first
+       fun frame: FRAME do return frames.first
 
        # The stack of all frames. The first one is the current one.
-       var frames = new List[Frame]
+       var frames = new List[FRAME]
 
        # Return a stack trace. One line per function
        fun stack_trace: String
@@ -314,6 +317,15 @@ class NaiveInterpreter
                return frames.first.arguments.first.mtype.as(MClassType)
        end
 
+       # Initialize the environment for a call and return a new Frame
+       # *`node` The AST node
+       # *`mpropdef` The corresponding mpropdef
+       # *`args` Arguments of the call
+       fun new_frame(node: ANode, mpropdef: MPropDef, args: Array[Instance]): FRAME
+       do
+               return new InterpreterFrame(node, mpropdef, args)
+       end
+
        # Exit the program with a message
        fun fatal(message: String)
        do
@@ -340,14 +352,14 @@ class NaiveInterpreter
        # Retrieve the value of the variable in the current frame
        fun read_variable(v: Variable): Instance
        do
-               var f = frames.first
+               var f = frames.first.as(InterpreterFrame)
                return f.map[v]
        end
 
        # Assign the value of the variable in the current frame
        fun write_variable(v: Variable, value: Instance)
        do
-               var f = frames.first
+               var f = frames.first.as(InterpreterFrame)
                f.map[v] = value
        end
 
@@ -358,42 +370,50 @@ class NaiveInterpreter
        # This method is used to manage varargs in signatures and returns the real array
        # of instances to use in the call.
        # Return `null` if one of the evaluation of the arguments return null.
-       fun varargize(mpropdef: MMethodDef, recv: Instance, args: SequenceRead[AExpr]): nullable Array[Instance]
+       fun varargize(mpropdef: MMethodDef, map: nullable SignatureMap, recv: Instance, args: SequenceRead[AExpr]): nullable Array[Instance]
        do
                var msignature = mpropdef.new_msignature or else mpropdef.msignature.as(not null)
                var res = new Array[Instance]
                res.add(recv)
 
-               if args.is_empty then return res
+               if msignature.arity == 0 then return res
+
+               if map == null then
+                       assert args.length == msignature.arity else debug("Expected {msignature.arity} args, got {args.length}")
+                       for ne in args do
+                               var e = self.expr(ne)
+                               if e == null then return null
+                               res.add e
+                       end
+                       return res
+               end
+
+               # Eval in order of arguments, not parameters
+               var exprs = new Array[Instance].with_capacity(args.length)
+               for ne in args do
+                       var e = self.expr(ne)
+                       if e == null then return null
+                       exprs.add e
+               end
 
-               var vararg_rank = msignature.vararg_rank
-               var vararg_len = args.length - msignature.arity
-               if vararg_len < 0 then vararg_len = 0
 
+               # Fill `res` with the result of the evaluation according to the mapping
                for i in [0..msignature.arity[ do
-                       if i == vararg_rank then
-                               var ne = args[i]
-                               if ne isa AVarargExpr then
-                                       var e = self.expr(ne.n_expr)
-                                       if e == null then return null
-                                       res.add(e)
-                                       continue
-                               end
-                               var vararg = new Array[Instance]
-                               for j in [vararg_rank..vararg_rank+vararg_len] do
-                                       var e = self.expr(args[j])
-                                       if e == null then return null
-                                       vararg.add(e)
-                               end
-                               var elttype = msignature.mparameters[vararg_rank].mtype.anchor_to(self.mainmodule, recv.mtype.as(MClassType))
-                               res.add(self.array_instance(vararg, elttype))
-                       else
-                               var j = i
-                               if i > vararg_rank then j += vararg_len
-                               var e = self.expr(args[j])
-                               if e == null then return null
-                               res.add(e)
+                       var param = msignature.mparameters[i]
+                       var j = map.map.get_or_null(i)
+                       if j == null then
+                               # default value
+                               res.add(null_instance)
+                               continue
+                       end
+                       if param.is_vararg and map.vararg_decl > 0 then
+                               var vararg = exprs.sub(j, map.vararg_decl)
+                               var elttype = param.mtype.anchor_to(self.mainmodule, recv.mtype.as(MClassType))
+                               var arg = self.array_instance(vararg, elttype)
+                               res.add(arg)
+                               continue
                        end
+                       res.add exprs[j]
                end
                return res
        end
@@ -413,6 +433,14 @@ class NaiveInterpreter
                var val = mpropdef.constant_value
 
                var node = modelbuilder.mpropdef2node(mpropdef)
+               if mpropdef.is_abstract then
+                       if node != null then
+                               self.frames.unshift new_frame(node, mpropdef, args)
+                       end
+                       fatal("Abstract method `{mpropdef.mproperty.name}` called on `{args.first.mtype}`")
+                       abort
+               end
+
                if node isa APropdef then
                        self.parameter_check(node, mpropdef, args)
                        return node.call(self, mpropdef, args)
@@ -568,13 +596,6 @@ class NaiveInterpreter
        # A hook to initialize a `PrimitiveInstance`
        fun init_instance_primitive(recv: Instance) do end
 
-       # Return the primitive `MClass` corresponding to the `name` given in parameter
-       # `name` : name of the primitive class
-       fun get_primitive_class(name: String): MClass
-       do
-               return mainmodule.get_primitive_class(name)
-       end
-
        # This function determines the correct type according to the receiver of the current propdef (self).
        fun unanchor_type(mtype: MType): MType
        do
@@ -659,7 +680,7 @@ class PrimitiveInstance[E]
 end
 
 # Information about local variables in a running method
-class Frame
+abstract class Frame
        # The current visited node
        # The node is stored by frame to keep a stack trace
        var current_node: ANode
@@ -668,9 +689,16 @@ class Frame
        var mpropdef: MPropDef
        # Arguments of the method (the first is the receiver)
        var arguments: Array[Instance]
+       # Indicate if the expression has an array comprehension form
+       var comprehension: nullable Array[Instance] = null
+end
+
+# Implementation of a Frame with a Hashmap to store local variables
+class InterpreterFrame
+       super Frame
+
        # Mapping between a variable and the current value
        private var map: Map[Variable, Instance] = new HashMap[Variable, Instance]
-       var comprehension: nullable Array[Instance] = null
 end
 
 redef class ANode
@@ -703,7 +731,7 @@ redef class AMethPropdef
 
        redef fun call(v, mpropdef, args)
        do
-               var f = new Frame(self, self.mpropdef.as(not null), args)
+               var f = v.new_frame(self, mpropdef, args)
                var res = call_commons(v, mpropdef, args, f)
                v.frames.shift
                if v.returnmark == f then
@@ -725,11 +753,6 @@ redef class AMethPropdef
                        v.write_variable(variable, arguments[i+1])
                end
 
-               if mpropdef.is_abstract then
-                       v.fatal("Abstract method `{mpropdef.mproperty.name}` called on `{arguments.first.mtype}`")
-                       abort
-               end
-
                # Call the implicit super-init
                var auto_super_inits = self.auto_super_inits
                if auto_super_inits != null then
@@ -818,6 +841,8 @@ redef class AMethPropdef
                        var recvval = args[0].to_i
                        if pname == "unary -" then
                                return v.int_instance(-args[0].to_i)
+                       else if pname == "unary +" then
+                               return args[0]
                        else if pname == "+" then
                                return v.int_instance(args[0].to_i + args[1].to_i)
                        else if pname == "-" then
@@ -892,6 +917,8 @@ redef class AMethPropdef
                        var recv = args[0].to_f
                        if pname == "unary -" then
                                return v.float_instance(-recv)
+                       else if pname == "unary +" then
+                               return args[0]
                        else if pname == "+" then
                                return v.float_instance(recv + args[1].to_f)
                        else if pname == "-" then
@@ -986,11 +1013,11 @@ redef class AMethPropdef
                        else if pname == "file_exists" then
                                return v.bool_instance(recvval.to_s.file_exists)
                        else if pname == "file_mkdir" then
-                               recvval.to_s.mkdir
-                               return null
+                               var res = recvval.to_s.mkdir
+                               return v.bool_instance(res == null)
                        else if pname == "file_chdir" then
-                               recvval.to_s.chdir
-                               return null
+                               var res = recvval.to_s.chdir
+                               return v.bool_instance(res == null)
                        else if pname == "file_realpath" then
                                return v.native_string_instance(recvval.to_s.realpath)
                        else if pname == "get_environ" then
@@ -1001,6 +1028,9 @@ redef class AMethPropdef
                                return v.int_instance(res)
                        else if pname == "atof" then
                                return v.float_instance(recvval.to_f)
+                       else if pname == "fast_cstring" then
+                               var ns = recvval.to_cstring.to_s.substring_from(args[1].to_i)
+                               return v.native_string_instance(ns)
                        end
                else if cname == "String" then
                        var cs = v.send(v.force_get_primitive_method("to_cstring", args.first.mtype), [args.first])
@@ -1008,7 +1038,7 @@ redef class AMethPropdef
                        if pname == "files" then
                                var res = new Array[Instance]
                                for f in str.files do res.add v.string_instance(f)
-                               return v.array_instance(res, v.get_primitive_class("String").mclass_type)
+                               return v.array_instance(res, v.mainmodule.string_type)
                        end
                else if pname == "calloc_string" then
                        return v.native_string_instance("!" * args[1].to_i)
@@ -1082,15 +1112,6 @@ redef class AMethPropdef
                        else if pname == "set_buffering_type" then
                                return v.int_instance(recvval.as(PrimitiveNativeFile).set_buffering_type(args[1].to_i, args[2].to_i))
                        end
-               else if pname == "calloc_array" then
-                       var recvtype = args.first.mtype.as(MClassType)
-                       var mtype: MType
-                       mtype = recvtype.supertype_to(v.mainmodule, recvtype, v.get_primitive_class("ArrayCapable"))
-                       mtype = mtype.arguments.first
-                       var val = new Array[Instance].filled_with(v.null_instance, args[1].to_i)
-                       var instance = new PrimitiveInstance[Array[Instance]](v.get_primitive_class("NativeArray").get_mtype([mtype]), val)
-                       v.init_instance_primitive(instance)
-                       return instance
                else if pname == "native_argc" then
                        return v.int_instance(v.arguments.length)
                else if pname == "native_argv" then
@@ -1145,7 +1166,8 @@ redef class AAttrPropdef
                if mpropdef == mreadpropdef then
                        assert args.length == 1
                        if not is_lazy or v.isset_attribute(attr, recv) then return v.read_attribute(attr, recv)
-                       return evaluate_expr(v, recv)
+                       var f = v.new_frame(self, mpropdef, args)
+                       return evaluate_expr(v, recv, f)
                else if mpropdef == mwritepropdef then
                        assert args.length == 2
                        v.write_attribute(attr, recv, args[1])
@@ -1160,20 +1182,22 @@ redef class AAttrPropdef
        do
                if is_lazy then return
                if has_value then
-                       evaluate_expr(v, recv)
+                       var f = v.new_frame(self, mpropdef.as(not null), [recv])
+                       evaluate_expr(v, recv, f)
                        return
                end
-               var mtype = self.mpropdef.static_mtype.as(not null)
+               var mpropdef = self.mpropdef
+               if mpropdef == null then return
+               var mtype = mpropdef.static_mtype.as(not null)
                mtype = mtype.anchor_to(v.mainmodule, recv.mtype.as(MClassType))
                if mtype isa MNullableType then
                        v.write_attribute(self.mpropdef.mproperty, recv, v.null_instance)
                end
        end
 
-       private fun evaluate_expr(v: NaiveInterpreter, recv: Instance): Instance
+       private fun evaluate_expr(v: NaiveInterpreter, recv: Instance, f: Frame): Instance
        do
                assert recv isa MutableInstance
-               var f = new Frame(self, self.mpropdef.as(not null), [recv])
                v.frames.unshift(f)
 
                var val
@@ -1261,14 +1285,16 @@ redef class ABlockExpr
 end
 
 redef class AVardeclExpr
-       redef fun stmt(v)
+       redef fun expr(v)
        do
                var ne = self.n_expr
                if ne != null then
                        var i = v.expr(ne)
-                       if i == null then return
+                       if i == null then return null
                        v.write_variable(self.variable.as(not null), i)
+                       return i
                end
+               return null
        end
 end
 
@@ -1309,6 +1335,14 @@ redef class ASelfExpr
        end
 end
 
+redef class AImplicitSelfExpr
+       redef fun expr(v)
+       do
+               if not is_sys then return super
+               return v.mainobj
+       end
+end
+
 redef class AEscapeExpr
        redef fun stmt(v)
        do
@@ -1453,6 +1487,19 @@ redef class AForExpr
        end
 end
 
+redef class AWithExpr
+       redef fun stmt(v)
+       do
+               var expr = v.expr(self.n_expr)
+               if expr == null then return
+
+               v.callsite(method_start, [expr])
+               v.stmt(self.n_block)
+               v.is_escape(self.break_mark) # Clear the break
+               v.callsite(method_finish, [expr])
+       end
+end
+
 redef class AAssertExpr
        redef fun stmt(v)
        do
@@ -1581,7 +1628,7 @@ redef class ASuperstringExpr
                        if i == null then return null
                        array.add(i)
                end
-               var i = v.array_instance(array, v.get_primitive_class("Object").mclass_type)
+               var i = v.array_instance(array, v.mainmodule.object_type)
                var res = v.send(v.force_get_primitive_method("to_s", i.mtype), [i])
                assert res != null
                return res
@@ -1701,7 +1748,7 @@ redef class ASendExpr
        do
                var recv = v.expr(self.n_expr)
                if recv == null then return null
-               var args = v.varargize(callsite.mpropdef, recv, self.raw_arguments)
+               var args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.raw_arguments)
                if args == null then return null
 
                var res = v.callsite(callsite, args)
@@ -1714,7 +1761,7 @@ redef class ASendReassignFormExpr
        do
                var recv = v.expr(self.n_expr)
                if recv == null then return
-               var args = v.varargize(callsite.mpropdef, recv, self.raw_arguments)
+               var args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.raw_arguments)
                if args == null then return
                var value = v.expr(self.n_value)
                if value == null then return
@@ -1738,29 +1785,35 @@ redef class ASuperExpr
 
                var callsite = self.callsite
                if callsite != null then
-                       var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)
-                       if args == null then return null
-                       # Add additional arguments for the super init call
-                       if args.length == 1 then
+                       var args
+                       if self.n_args.n_exprs.is_empty then
+                               # Add automatic arguments for the super init call
+                               args = [recv]
                                for i in [0..callsite.msignature.arity[ do
                                        args.add(v.frame.arguments[i+1])
                                end
+                       else
+                               args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.n_args.n_exprs)
+                               if args == null then return null
                        end
+
                        # Super init call
                        var res = v.callsite(callsite, args)
                        return res
                end
 
-               # standard call-next-method
+               # Standard call-next-method
                var mpropdef = self.mpropdef
                mpropdef = mpropdef.lookup_next_definition(v.mainmodule, recv.mtype)
 
-               var args = v.varargize(mpropdef, recv, self.n_args.n_exprs)
-               if args == null then return null
-
-               if args.length == 1 then
+               var args
+               if self.n_args.n_exprs.is_empty then
                        args = v.frame.arguments
+               else
+                       args = v.varargize(mpropdef, signaturemap, recv, self.n_args.n_exprs)
+                       if args == null then return null
                end
+
                var res = v.call(mpropdef, args)
                return res
        end
@@ -1772,7 +1825,10 @@ redef class ANewExpr
                var mtype = v.unanchor_type(self.recvtype.as(not null))
                var recv: Instance = new MutableInstance(mtype)
                v.init_instance(recv)
-               var args = v.varargize(callsite.mpropdef, recv, self.n_args.n_exprs)
+               var callsite = self.callsite
+               if callsite == null then return recv
+
+               var args = v.varargize(callsite.mpropdef, callsite.signaturemap, recv, self.n_args.n_exprs)
                if args == null then return null
                var res2 = v.callsite(callsite, args)
                if res2 != null then
@@ -1834,6 +1890,13 @@ redef class AIssetAttrExpr
        end
 end
 
+redef class AVarargExpr
+       redef fun expr(v)
+       do
+               return v.expr(self.n_expr)
+       end
+end
+
 redef class ADebugTypeExpr
        redef fun stmt(v)
        do
index bc361ab..d6cb84e 100644 (file)
@@ -123,7 +123,7 @@ redef class ACharExpr
        do
                var txt = self.n_char.text.unescape_nit
                if txt.length != 3 then
-                       v.toolcontext.error(self.hot_location, "Invalid character literal {txt}")
+                       v.toolcontext.error(self.hot_location, "Syntax Error: invalid character literal `{txt}`.")
                        return
                end
                self.value = txt.chars[1]
index 65e7c67..0e6878b 100644 (file)
@@ -72,8 +72,9 @@ redef class ModelBuilder
                        if nmodule == null then continue # Skip error
                        # Load imported module
                        build_module_importation(nmodule)
-
-                       mmodules.add(nmodule.mmodule.as(not null))
+                       var mmodule = nmodule.mmodule
+                       if mmodule == null then continue # skip error
+                       mmodules.add mmodule
                end
                var time1 = get_time
                self.toolcontext.info("*** END PARSE: {time1-time0} ***", 2)
@@ -100,16 +101,28 @@ redef class ModelBuilder
                                if nmodule == null then continue # Skip error
                                # Load imported module
                                build_module_importation(nmodule)
-
-                               res.add(nmodule.mmodule.as(not null))
+                               var mmodule = nmodule.mmodule
+                               if mmodule == null then continue # Skip error
+                               res.add mmodule
                        end
                end
                return res
        end
 
        # Load a bunch of modules and groups.
-       # Each name can be a module or a group.
-       # If it is a group then recursively all its modules are parsed.
+       #
+       # Each name can be:
+       #
+       # * a path to a module, a group or a directory of projects.
+       # * a short name of a module or a group that are looked in the `paths` (-I)
+       #
+       # Then, for each entry, if it is:
+       #
+       # * a module, then is it parser and returned.
+       # * a group then recursively all its modules are parsed.
+       # * a directory of projects then all the modules of all projects are parsed.
+       # * else an error is displayed.
+       #
        # See `parse` for details.
        fun parse_full(names: Sequence[String]): Array[MModule]
        do
@@ -118,17 +131,48 @@ redef class ModelBuilder
                self.toolcontext.info("*** PARSE ***", 1)
                var mmodules = new ArraySet[MModule]
                for a in names do
+                       # Case of a group
                        var mgroup = self.get_mgroup(a)
                        if mgroup != null then
                                mmodules.add_all parse_group(mgroup)
                                continue
                        end
+
+                       # Case of a directory that is not a group
+                       var stat = a.to_path.stat
+                       if stat != null and stat.is_dir then
+                               self.toolcontext.info("look in directory {a}", 2)
+                               var fs = a.files
+                               # Try each entry as a group or a module
+                               for f in fs do
+                                       var af = a/f
+                                       mgroup = get_mgroup(af)
+                                       if mgroup != null then
+                                               mmodules.add_all parse_group(mgroup)
+                                               continue
+                                       end
+                                       var mp = identify_file(af)
+                                       if mp != null then
+                                               var nmodule = self.load_module(af)
+                                               if nmodule == null then continue # Skip error
+                                               build_module_importation(nmodule)
+                                               var mmodule = nmodule.mmodule
+                                               if mmodule == null then continue # Skip error
+                                               mmodules.add mmodule
+                                       else
+                                               self.toolcontext.info("ignore file {af}", 2)
+                                       end
+                               end
+                               continue
+                       end
+
                        var nmodule = self.load_module(a)
                        if nmodule == null then continue # Skip error
                        # Load imported module
                        build_module_importation(nmodule)
-
-                       mmodules.add(nmodule.mmodule.as(not null))
+                       var mmodule = nmodule.mmodule
+                       if mmodule == null then continue # Skip error
+                       mmodules.add mmodule
                end
                var time1 = get_time
                self.toolcontext.info("*** END PARSE: {time1-time0} ***", 2)
@@ -201,9 +245,9 @@ redef class ModelBuilder
 
                if candidate == null then
                        if mgroup != null then
-                               error(anode, "Error: cannot find module {name} from {mgroup.name}. tried {lookpaths.join(", ")}")
+                               error(anode, "Error: cannot find module `{name}` from `{mgroup.name}`. Tried: {lookpaths.join(", ")}.")
                        else
-                               error(anode, "Error: cannot find module {name}. tried {lookpaths.join(", ")}")
+                               error(anode, "Error: cannot find module `{name}`. Tried: {lookpaths.join(", ")}.")
                        end
                        return null
                end
@@ -222,7 +266,7 @@ redef class ModelBuilder
                if res == null then return null # Forward error
                # Load imported module
                build_module_importation(res)
-               return res.mmodule.as(not null)
+               return res.mmodule
        end
 
        # Search a module `name` from path `lookpaths`.
@@ -240,7 +284,7 @@ redef class ModelBuilder
                                        var abs_candidate = module_absolute_path(candidate)
                                        var abs_try_file = module_absolute_path(try_file)
                                        if abs_candidate != abs_try_file then
-                                               toolcontext.error(location, "Error: conflicting module file for {name}: {candidate} {try_file}")
+                                               toolcontext.error(location, "Error: conflicting module file for `{name}`: `{candidate}` `{try_file}`")
                                        end
                                end
                        end
@@ -253,7 +297,7 @@ redef class ModelBuilder
                                        var abs_candidate = module_absolute_path(candidate)
                                        var abs_try_file = module_absolute_path(try_file)
                                        if abs_candidate != abs_try_file then
-                                               toolcontext.error(location, "Error: conflicting module file for {name}: {candidate} {try_file}")
+                                               toolcontext.error(location, "Error: conflicting module file for `{name}`: `{candidate}` `{try_file}`")
                                        end
                                end
                        end
@@ -350,12 +394,15 @@ redef class ModelBuilder
                        return mgroups[rdp]
                end
 
-               # Hack, a group is determined by:
+               # Hack, a group is determined by one of the following:
                # * the presence of a honomymous nit file
                # * the fact that the directory is named `src`
+               # * the fact that there is a sub-directory named `src`
                var pn = rdp.basename(".nit")
                var mp = dirpath.join_path(pn + ".nit").simplify_path
 
+               # dirpath2 is the root directory
+               # dirpath is the src subdirectory directory, if any, else it is the same that dirpath2
                var dirpath2 = dirpath
                if not mp.file_exists then
                        if pn == "src" then
@@ -363,12 +410,17 @@ redef class ModelBuilder
                                dirpath2 = rdp.dirname
                                pn = dirpath2.basename("")
                        else
-                               return null
+                               # Check a `src` subdirectory
+                               dirpath = dirpath2 / "src"
+                               if not dirpath.file_exists then
+                                       # All rules failed, so return null
+                                       return null
+                               end
                        end
                end
 
                # check parent directory
-               var parentpath = dirpath.join_path("..").simplify_path
+               var parentpath = dirpath2.join_path("..").simplify_path
                var parent = get_mgroup(parentpath)
 
                var mgroup
@@ -382,22 +434,36 @@ redef class ModelBuilder
                        mgroup = new MGroup(pn, parent.mproject, parent)
                        toolcontext.info("found sub group `{mgroup.full_name}` at {dirpath}", 2)
                end
-               var readme = dirpath2.join_path("README.md")
+
+               # search documentation
+               # in src first so the documentation of the project code can be distinct for the documentation of the project usage
+               var readme = dirpath.join_path("README.md")
+               if not readme.file_exists then readme = dirpath.join_path("README")
+               if not readme.file_exists then readme = dirpath2.join_path("README.md")
                if not readme.file_exists then readme = dirpath2.join_path("README")
                if readme.file_exists then
-                       var mdoc = new MDoc
-                       var s = new FileReader.open(readme)
-                       while not s.eof do
-                               mdoc.content.add(s.read_line)
-                       end
+                       var mdoc = load_markdown(readme)
                        mgroup.mdoc = mdoc
                        mdoc.original_mentity = mgroup
                end
+
                mgroup.filepath = dirpath
-               mgroups[rdp] = mgroup
+               mgroups[module_absolute_path(dirpath)] = mgroup
+               mgroups[module_absolute_path(dirpath2)] = mgroup
                return mgroup
        end
 
+       # Load a markdown file as a documentation object
+       fun load_markdown(filepath: String): MDoc
+       do
+               var mdoc = new MDoc(new Location(new SourceFile.from_string(filepath, ""),0,0,0,0))
+               var s = new FileReader.open(filepath)
+               while not s.eof do
+                       mdoc.content.add(s.read_line)
+               end
+               return mdoc
+       end
+
        # Force the identification of all ModulePath of the group and sub-groups.
        fun visit_group(mgroup: MGroup) do
                var p = mgroup.filepath
@@ -419,11 +485,11 @@ redef class ModelBuilder
        fun load_module_ast(filename: String): nullable AModule
        do
                if filename.file_extension != "nit" then
-                       self.toolcontext.error(null, "Error: file {filename} is not a valid nit module.")
+                       self.toolcontext.error(null, "Error: file `{filename}` is not a valid nit module.")
                        return null
                end
                if not filename.file_exists then
-                       self.toolcontext.error(null, "Error: file {filename} not found.")
+                       self.toolcontext.error(null, "Error: file `{filename}` not found.")
                        return null
                end
 
@@ -448,6 +514,26 @@ redef class ModelBuilder
                return nmodule
        end
 
+       # Remove Nit source files from a list of arguments.
+       #
+       # Items of `args` that can be loaded as a nit file will be removed from `args` and returned.
+       fun filter_nit_source(args: Array[String]): Array[String]
+       do
+               var keep = new Array[String]
+               var res = new Array[String]
+               for a in args do
+                       var l = identify_file(a)
+                       if l == null then
+                               keep.add a
+                       else
+                               res.add a
+                       end
+               end
+               args.clear
+               args.add_all(keep)
+               return res
+       end
+
        # Try to load a module using a path.
        # Display an error if there is a problem (IO / lexer / parser) and return null.
        # Note: usually, you do not need this method, use `get_mmodule_by_name` instead.
@@ -459,7 +545,11 @@ redef class ModelBuilder
                # Look for the module
                var file = identify_file(filename)
                if file == null then
-                       toolcontext.error(null, "Error: cannot find module `{filename}`.")
+                       if filename.file_exists then
+                               toolcontext.error(null, "Error: `{filename}` is not a Nit source file.")
+                       else
+                               toolcontext.error(null, "Error: cannot find module `{filename}`.")
+                       end
                        return null
                end
 
@@ -517,7 +607,7 @@ redef class ModelBuilder
                if decl != null then
                        var decl_name = decl.n_name.n_id.text
                        if decl_name != mod_name then
-                               error(decl.n_name, "Error: module name missmatch; declared {decl_name} file named {mod_name}")
+                               error(decl.n_name, "Error: module name mismatch; declared {decl_name} file named {mod_name}.")
                        end
                end
 
@@ -528,7 +618,7 @@ redef class ModelBuilder
                                if other.mgroup!= null and other.mgroup.mproject == mgroup.mproject then
                                        var node: ANode
                                        if decl == null then node = nmodule else node = decl.n_name
-                                       error(node, "Error: A module named `{other.full_name}` already exists at {other.location}")
+                                       error(node, "Error: a module named `{other.full_name}` already exists at {other.location}.")
                                        break
                                end
                        end
@@ -582,24 +672,33 @@ redef class ModelBuilder
                        if aimport.n_name.n_quad != null then mgroup = null # Start from top level
                        for grp in aimport.n_name.n_path do
                                var path = search_mmodule_by_name(grp, mgroup, grp.text)
-                               if path == null then return # Skip error
+                               if path == null then
+                                       nmodule.mmodule = null # invalidate the module
+                                       return # Skip error
+                               end
                                mgroup = path.mgroup
                        end
                        var mod_name = aimport.n_name.n_id.text
                        var sup = self.get_mmodule_by_name(aimport.n_name, mgroup, mod_name)
-                       if sup == null then continue # Skip error
+                       if sup == null then
+                               nmodule.mmodule = null # invalidate the module
+                               continue # Skip error
+                       end
                        aimport.mmodule = sup
                        imported_modules.add(sup)
                        var mvisibility = aimport.n_visibility.mvisibility
                        if mvisibility == protected_visibility then
                                error(aimport.n_visibility, "Error: only properties can be protected.")
+                               nmodule.mmodule = null # invalidate the module
                                return
                        end
                        if sup == mmodule then
-                               error(aimport.n_name, "Error: Dependency loop in module {mmodule}.")
+                               error(aimport.n_name, "Error: dependency loop in module {mmodule}.")
+                               nmodule.mmodule = null # invalidate the module
                        end
                        if sup.in_importation < mmodule then
-                               error(aimport.n_name, "Error: Dependency loop between modules {mmodule} and {sup}.")
+                               error(aimport.n_name, "Error: dependency loop between modules {mmodule} and {sup}.")
+                               nmodule.mmodule = null # invalidate the module
                                return
                        end
                        mmodule.set_visibility_for(sup, mvisibility)
@@ -607,7 +706,9 @@ redef class ModelBuilder
                if stdimport then
                        var mod_name = "standard"
                        var sup = self.get_mmodule_by_name(nmodule, null, mod_name)
-                       if sup != null then # Skip error
+                       if sup == null then
+                               nmodule.mmodule = null # invalidate the module
+                       else # Skip error
                                imported_modules.add(sup)
                                mmodule.set_visibility_for(sup, public_visibility)
                        end
index 83ed72f..b65511d 100644 (file)
@@ -55,6 +55,8 @@ class Location
        var file: nullable SourceFile
 
        # The starting line number (starting from 1)
+       #
+       # If `line_start==0` then the whole file is considered
        var line_start: Int
 
        # The stopping line number (starting from 1)
@@ -129,9 +131,12 @@ class Location
                var file_part = ""
                if file != null then
                        file_part = file.filename
-                       if file.filename.length > 0 then file_part += ":"
                end
 
+               if line_start <= 0 then return file_part
+
+               if file != null and file.filename.length > 0 then file_part += ":"
+
                if line_start == line_end then
                        if column_start == column_end then
                                return "{file_part}{line_start},{column_start}"
@@ -181,6 +186,8 @@ class Location
 
                var l = self
                var i = l.line_start
+               if i <= 0 then return ""
+
                var line_start = l.file.line_starts[i-1]
                var line_end = line_start
                var string = l.file.string
index dd7c36d..1ab719b 100644 (file)
@@ -130,8 +130,8 @@ private class DetectCovariancePhase
        # Returns true if the test concern real generic covariance
        fun count_types(node, elem: ANode, sub, sup: MType, mmodule: MModule, anchor: nullable MClassType): Bool
        do
-               sub = sub.as_notnullable
-               sup = sup.as_notnullable
+               sub = sub.undecorate
+               sup = sup.undecorate
 
                # Category of the target type
                if sub isa MGenericType then
@@ -254,8 +254,8 @@ private class DetectCovariancePhase
        fun count_cast(node: ANode, sub, sup: MType, mmodule: MModule, anchor: nullable MClassType)
        do
                var nsup = sup
-               sup = sup.as_notnullable
-               sub = sub.as_notnullable
+               sup = sup.undecorate
+               sub = sub.undecorate
 
                if sub == nsup then
                        cpt_cast_pattern.inc("monomorphic cast!?!")
@@ -343,7 +343,7 @@ redef class TypeVisitor
                return sub
        end
 
-       redef fun check_subtype(node: ANode, sub, sup: MType): nullable MType
+       redef fun check_subtype(node: ANode, sub, sup: MType, autocast: Bool): nullable MType
        do
                var res = super
 
@@ -361,6 +361,9 @@ redef class TypeVisitor
                        if node isa AAsCastExpr then
                                return res
                        end
+                       if not autocast then
+                               return res
+                       end
                        sup = supx.resolve_for(anchor.mclass.mclass_type, anchor, mmodule, true)
                        if self.is_subtype(sub, sup) then
                                dcp.cpt_autocast.inc("vt")
@@ -371,7 +374,7 @@ redef class TypeVisitor
                                        dcp.cpt_autocast.inc("vt+pt")
                                        dcp.count_cast(node, supx, sub, mmodule, anchor)
                                else
-                                       self.modelbuilder.error(node, "Type error: expected {sup}, got {sub}")
+                                       self.modelbuilder.error(node, "Type Error: expected `{sup}`, got `{sub}`")
                                        return null
                                end
                        end
@@ -445,7 +448,7 @@ redef class MType
                # Now the case of direct null and nullable is over.
 
                # If `sub` is a formal type, then it is accepted if its bound is accepted
-               while sub isa MParameterType or sub isa MVirtualType do
+               while sub isa MFormalType do
                        #print "3.is {sub} a {sup}?"
 
                        # A unfixed formal type can only accept itself
@@ -469,7 +472,7 @@ redef class MType
                assert sub isa MClassType # It is the only remaining type
 
                # A unfixed formal type can only accept itself
-               if sup isa MParameterType or sup isa MVirtualType then
+               if sup isa MFormalType then
                        return false
                end
 
index 3665376..1f0205e 100644 (file)
@@ -113,7 +113,7 @@ class DetectVarianceConstraints
                                        if pd isa MMethodDef then
                                                # Parameters (contravariant)
                                                for p in pd.msignature.mparameters do
-                                                       var t = p.mtype.as_notnullable
+                                                       var t = p.mtype.undecorate
                                                        if not t.need_anchor then
                                                                # OK
                                                        else if t isa MParameterType then
@@ -129,7 +129,7 @@ class DetectVarianceConstraints
                                                # Return (covariant)
                                                var t = pd.msignature.return_mtype
                                                if t != null and t.need_anchor then
-                                                       t = t.as_notnullable
+                                                       t = t.undecorate
                                                        if t isa MParameterType then
                                                                covar_pt.add(t)
                                                        else if t isa MVirtualType then
@@ -144,7 +144,7 @@ class DetectVarianceConstraints
                                                # Attribute (invariant)
                                                var t = pd.static_mtype
                                                if t != null and t.need_anchor then
-                                                       t = t.as_notnullable
+                                                       t = t.undecorate
                                                        if t isa MParameterType then
                                                                covar_pt.add t
                                                                contravar_pt.add t
@@ -161,7 +161,7 @@ class DetectVarianceConstraints
                                                # Virtual type bound (covariant)
                                                var t = pd.bound
                                                if t != null and t.need_anchor then
-                                                       t = t.as_notnullable
+                                                       t = t.undecorate
                                                        if t isa MParameterType then
                                                                covar_pt.add t
                                                        else if t isa MVirtualType then
@@ -223,7 +223,7 @@ class DetectVarianceConstraints
                        # Process the generic types in a covariant position
                        for c in covar_classes do for i in [0..c.mclass.arity[ do
                                # The type used in the argument
-                               var ta = c.arguments[i].as_notnullable
+                               var ta = c.arguments[i].undecorate
                                # The associated formal parameter
                                var tp = c.mclass.mparameters[i]
 
@@ -259,7 +259,7 @@ class DetectVarianceConstraints
                        # Process the generic types in a contravariant position
                        for c in contravar_classes do for i in [0..c.mclass.arity[ do
                                # The type used in the argument
-                               var ta = c.arguments[i].as_notnullable
+                               var ta = c.arguments[i].undecorate
                                # The associated formal parameter
                                var tp = c.mclass.mparameters[i]
 
index 1527731..00f9d02 100644 (file)
@@ -374,7 +374,7 @@ redef class RapidTypeAnalysis
                super
                tnlc.values.inc(mtype)
 
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
                if mtype isa MClassType then
                        cnlc.values.inc(mtype.mclass)
                end
@@ -385,7 +385,7 @@ end
 
 redef class MType
        private fun signature_depth: Int do
-               var mtype = self.as_notnullable
+               var mtype = self.undecorate
                if not mtype isa MGenericType then return 0
 
                var depth = 0
index 94d0c32..d70313d 100644 (file)
@@ -52,7 +52,8 @@ redef class ToolContext
                                mainmodule.is_fictive = true
                        end
 
-                       var recv = mainmodule.object_type
+                       var recv = mainmodule.sys_type
+                       assert recv != null
                        var mclassdef = new MClassDef(mainmodule, recv, location)
                        mclassdef.add_in_hierarchy
 
@@ -63,13 +64,13 @@ redef class ToolContext
                                if spl.length > 1 then val = spl[1]
                                var prop = mainmodule.try_get_primitive_method(name, recv.mclass)
                                if prop == null then
-                                       error(null, "Error: --define: no top-level function `{name}`")
+                                       error(null, "Error: --define: no top-level function `{name}`.")
                                        continue
                                end
                                var ret = prop.intro.msignature.return_mtype
                                var v
                                if ret == null then
-                                       error(null, "Error: --define: Method `{prop}` is not a function")
+                                       error(null, "Error: --define: method `{prop}` is not a function.")
                                        continue
                                else if ret.to_s == "Bool" then
                                        if val == null or val == "true" then
@@ -77,25 +78,25 @@ redef class ToolContext
                                        else if val == "false" then
                                                v = false
                                        else
-                                               error(null, "Error: --define: Method `{prop}` need a Bool.")
+                                               error(null, "Error: --define: method `{prop}` needs a Bool.")
                                                continue
                                        end
                                else if ret.to_s == "Int" then
                                        if val != null and val.is_numeric then
                                                v = val.to_i
                                        else
-                                               error(null, "Error: --define: Method `{prop}` need a Int.")
+                                               error(null, "Error: --define: method `{prop}` needs a Int.")
                                                continue
                                        end
                                else if ret.to_s == "String" then
                                        if val != null then
                                                v = val
                                        else
-                                               error(null, "Error: --define: Method `{prop}` need a String.")
+                                               error(null, "Error: --define: method `{prop}` needs a String.")
                                                continue
                                        end
                                else
-                                       error(null, "Error: --define: Method `{prop}` return an unmanaged type {ret}.")
+                                       error(null, "Error: --define: method `{prop}` returns an unsupported type `{ret}`.")
                                        continue
                                end
                                var pd = new MMethodDef(mclassdef, prop, location)
index 2f8d045..4e8c565 100644 (file)
@@ -16,6 +16,7 @@
 module mdoc
 
 import model_base
+import location
 
 # Structured documentation of a `MEntity` object
 class MDoc
@@ -27,6 +28,9 @@ class MDoc
        # The entity where the documentation is originally attached to.
        # This gives some context to resolve identifiers or to run examples.
        var original_mentity: nullable MEntity = null is writable
+
+       # The original location of the doc for error messages
+       var location: Location
 end
 
 redef class MEntity
index d88a0ba..ef548a8 100644 (file)
@@ -243,5 +243,15 @@ class MModule
        # Is `self` a unit test module used by `nitunit`?
        var is_test_suite: Bool = false is writable
 
+       # Get the first non `is_fictive` module greater than self
+       fun first_real_mmodule: MModule
+       do
+               var mmodule = self
+               while mmodule.is_fictive do
+                       mmodule = mmodule.in_importation.direct_greaters.first
+               end
+               return mmodule
+       end
+
        redef fun parent_concern do return mgroup
 end
index f0f4ff9..4395cee 100644 (file)
@@ -195,31 +195,40 @@ redef class MModule
        private var flatten_mclass_hierarchy_cache: nullable POSet[MClass] = null
 
        # The primitive type `Object`, the root of the class hierarchy
-       fun object_type: MClassType
-       do
-               var res = self.object_type_cache
-               if res != null then return res
-               res = self.get_primitive_class("Object").mclass_type
-               self.object_type_cache = res
-               return res
-       end
-
-       private var object_type_cache: nullable MClassType
+       var object_type: MClassType = self.get_primitive_class("Object").mclass_type is lazy
 
        # The type `Pointer`, super class to all extern classes
        var pointer_type: MClassType = self.get_primitive_class("Pointer").mclass_type is lazy
 
        # The primitive type `Bool`
-       fun bool_type: MClassType
-       do
-               var res = self.bool_type_cache
-               if res != null then return res
-               res = self.get_primitive_class("Bool").mclass_type
-               self.bool_type_cache = res
-               return res
-       end
+       var bool_type: MClassType = self.get_primitive_class("Bool").mclass_type is lazy
+
+       # The primitive type `Int`
+       var int_type: MClassType = self.get_primitive_class("Int").mclass_type is lazy
+
+       # The primitive type `Char`
+       var char_type: MClassType = self.get_primitive_class("Char").mclass_type is lazy
+
+       # The primitive type `Float`
+       var float_type: MClassType = self.get_primitive_class("Float").mclass_type is lazy
+
+       # The primitive type `String`
+       var string_type: MClassType = self.get_primitive_class("String").mclass_type is lazy
+
+       # The primitive type `NativeString`
+       var native_string_type: MClassType = self.get_primitive_class("NativeString").mclass_type is lazy
+
+       # A primitive type of `Array`
+       fun array_type(elt_type: MType): MClassType do return array_class.get_mtype([elt_type])
 
-       private var bool_type_cache: nullable MClassType
+       # The primitive class `Array`
+       var array_class: MClass = self.get_primitive_class("Array") is lazy
+
+       # A primitive type of `NativeArray`
+       fun native_array_type(elt_type: MType): MClassType do return native_array_class.get_mtype([elt_type])
+
+       # The primitive class `NativeArray`
+       var native_array_class: MClass = self.get_primitive_class("NativeArray") is lazy
 
        # The primitive type `Sys`, the main type of the program, if any
        fun sys_type: nullable MClassType
@@ -242,7 +251,9 @@ redef class MModule
        fun get_primitive_class(name: String): MClass
        do
                var cla = self.model.get_mclasses_by_name(name)
-               if cla == null then
+               # Filter classes by introducing module
+               if cla != null then cla = [for c in cla do if self.in_importation <= c.intro_mmodule then c]
+               if cla == null or cla.is_empty then
                        if name == "Bool" and self.model.get_mclasses_by_name("Object") != null then
                                # Bool is injected because it is needed by engine to code the result
                                # of the implicit casts.
@@ -252,11 +263,11 @@ redef class MModule
                                cladef.add_in_hierarchy
                                return c
                        end
-                       print("Fatal Error: no primitive class {name}")
+                       print("Fatal Error: no primitive class {name} in {self}")
                        exit(1)
                end
                if cla.length != 1 then
-                       var msg = "Fatal Error: more than one primitive class {name}:"
+                       var msg = "Fatal Error: more than one primitive class {name} in {self}:"
                        for c in cla do msg += " {c.full_name}"
                        print msg
                        #exit(1)
@@ -369,6 +380,29 @@ class MClass
        # is empty if the class is not generic
        var mparameters = new Array[MParameterType]
 
+       # A string version of the signature a generic class.
+       #
+       # eg. `Map[K: nullable Object, V: nullable Object]`
+       #
+       # If the class in non generic the name is just given.
+       #
+       # eg. `Object`
+       fun signature_to_s: String
+       do
+               if arity == 0 then return name
+               var res = new FlatBuffer
+               res.append name
+               res.append "["
+               for i in [0..arity[ do
+                       if i > 0 then res.append ", "
+                       res.append mparameters[i].name
+                       res.append ": "
+                       res.append intro.bound_mtype.arguments[i].to_s
+               end
+               res.append "]"
+               return res.to_s
+       end
+
        # Initialize `mparameters` from their names.
        protected fun setup_parameter_names(parameter_names: nullable Array[String]) is
                autoinit
@@ -424,8 +458,17 @@ class MClass
        #
        # Warning: such a definition may not exist in the early life of the object.
        # In this case, the method will abort.
+       #
+       # Use `try_intro` instead
        var intro: MClassDef is noinit
 
+       # The definition that introduces the class or null if not yet known.
+       #
+       # See `intro`
+       fun try_intro: nullable MClassDef do
+               if isset _intro then return _intro else return null
+       end
+
        # Return the class `self` in the class hierarchy of the module `mmodule`.
        #
        # SEE: `MModule::flatten_mclass_hierarchy`
@@ -468,6 +511,9 @@ class MClass
        end
 
        private var get_mtype_cache = new HashMap[Array[MType], MGenericType]
+
+       # Is there a `new` factory to allow the pseudo instantiation?
+       var has_new_factory = false is writable
 end
 
 
@@ -615,7 +661,7 @@ class MClassDef
        var in_hierarchy: nullable POSetElement[MClassDef] = null
 
        # Is the definition the one that introduced `mclass`?
-       fun is_intro: Bool do return mclass.intro == self
+       fun is_intro: Bool do return isset mclass._intro and mclass.intro == self
 
        # All properties introduced by the classdef
        var intro_mproperties = new Array[MProperty]
@@ -685,6 +731,8 @@ abstract class MType
                if sup isa MNullableType then
                        sup_accept_null = true
                        sup = sup.mtype
+               else if sup isa MNotNullType then
+                       sup = sup.mtype
                else if sup isa MNullType then
                        sup_accept_null = true
                end
@@ -692,16 +740,20 @@ abstract class MType
                # Can `sub` provide null or not?
                # Thus we can match with `sup_accept_null`
                # Also discard the nullable marker if it exists
+               var sub_reject_null = false
                if sub isa MNullableType then
                        if not sup_accept_null then return false
                        sub = sub.mtype
+               else if sub isa MNotNullType then
+                       sub_reject_null = true
+                       sub = sub.mtype
                else if sub isa MNullType then
                        return sup_accept_null
                end
                # Now the case of direct null and nullable is over.
 
                # If `sub` is a formal type, then it is accepted if its bound is accepted
-               while sub isa MParameterType or sub isa MVirtualType do
+               while sub isa MFormalType do
                        #print "3.is {sub} a {sup}?"
 
                        # A unfixed formal type can only accept itself
@@ -709,12 +761,16 @@ abstract class MType
 
                        assert anchor != null
                        sub = sub.lookup_bound(mmodule, anchor)
+                       if sub_reject_null then sub = sub.as_notnull
 
                        #print "3.is {sub} a {sup}?"
 
                        # Manage the second layer of null/nullable
                        if sub isa MNullableType then
-                               if not sup_accept_null then return false
+                               if not sup_accept_null and not sub_reject_null then return false
+                               sub = sub.mtype
+                       else if sub isa MNotNullType then
+                               sub_reject_null = true
                                sub = sub.mtype
                        else if sub isa MNullType then
                                return sup_accept_null
@@ -722,10 +778,10 @@ abstract class MType
                end
                #print "4.is {sub} a {sup}? <- no more resolution"
 
-               assert sub isa MClassType # It is the only remaining type
+               assert sub isa MClassType else print "{sub} <? {sub}" # It is the only remaining type
 
                # A unfixed formal type can only accept itself
-               if sup isa MParameterType or sup isa MVirtualType then
+               if sup isa MFormalType then
                        return false
                end
 
@@ -976,16 +1032,25 @@ abstract class MType
                return res
        end
 
-       # Return the not nullable version of the type
-       # Is the type is already not nullable, then self is returned.
+       # Remove the base type of a decorated (proxy) type.
+       # Is the type is not decorated, then self is returned.
        #
-       # Note: this just remove the `nullable` notation, but the result can still contains null.
+       # Most of the time it is used to return the not nullable version of a nullable type.
+       # In this case, this just remove the `nullable` notation, but the result can still contains null.
        # For instance if `self isa MNullType` or self is a formal type bounded by a nullable type.
-       fun as_notnullable: MType
+       # If you really want to exclude the `null` value, then use `as_notnull`
+       fun undecorate: MType
        do
                return self
        end
 
+       # Returns the not null version of the type.
+       # That is `self` minus the `null` value.
+       #
+       # For most types, this return `self`.
+       # For formal types, this returns a special `MNotNullType`
+       fun as_notnull: MType do return self
+
        private var as_nullable_cache: nullable MType = null
 
 
@@ -1191,7 +1256,7 @@ class MGenericType
                for t in arguments do
                        args.add t.full_name
                end
-               return "{mclass.full_name}[{args.join(", ")}]}"
+               return "{mclass.full_name}[{args.join(", ")}]"
        end
 
        redef var c_name is lazy do
@@ -1247,9 +1312,19 @@ class MGenericType
        end
 end
 
+# A formal type (either virtual of parametric).
+#
+# The main issue with formal types is that they offer very little information on their own
+# and need a context (anchor and mmodule) to be useful.
+abstract class MFormalType
+       super MType
+
+       redef var as_notnull = new MNotNullType(self) is lazy
+end
+
 # A virtual formal type.
 class MVirtualType
-       super MType
+       super MFormalType
 
        # The property associated with the type.
        # Its the definitions of this property that determine the bound or the virtual type.
@@ -1290,7 +1365,7 @@ class MVirtualType
        redef fun lookup_fixed(mmodule: MModule, resolved_receiver: MType): MType
        do
                assert not resolved_receiver.need_anchor
-               resolved_receiver = resolved_receiver.as_notnullable
+               resolved_receiver = resolved_receiver.undecorate
                assert resolved_receiver isa MClassType # It is the only remaining type
 
                var prop = lookup_single_definition(mmodule, resolved_receiver)
@@ -1377,7 +1452,7 @@ end
 # Note that parameter types are shared among class refinements.
 # Therefore parameter only have an internal name (see `to_s` for details).
 class MParameterType
-       super MType
+       super MFormalType
 
        # The generic class where the parameter belong
        var mclass: MClass
@@ -1399,7 +1474,7 @@ class MParameterType
        redef fun lookup_bound(mmodule: MModule, resolved_receiver: MType): MType
        do
                assert not resolved_receiver.need_anchor
-               resolved_receiver = resolved_receiver.as_notnullable
+               resolved_receiver = resolved_receiver.undecorate
                assert resolved_receiver isa MClassType # It is the only remaining type
                var goalclass = self.mclass
                if resolved_receiver.mclass == goalclass then
@@ -1427,7 +1502,7 @@ class MParameterType
        redef fun lookup_fixed(mmodule: MModule, resolved_receiver: MType): MType
        do
                assert not resolved_receiver.need_anchor
-               resolved_receiver = resolved_receiver.as_notnullable
+               resolved_receiver = resolved_receiver.undecorate
                assert resolved_receiver isa MClassType # It is the only remaining type
                var res = self.resolve_for(resolved_receiver.mclass.mclass_type, resolved_receiver, mmodule, false)
                return res
@@ -1499,33 +1574,24 @@ class MParameterType
        end
 end
 
-# A type prefixed with "nullable"
-class MNullableType
+# A type that decorates another type.
+#
+# The point of this class is to provide a common implementation of sevices that just forward to the original type.
+# Specific decorator are expected to redefine (or to extend) the default implementation as this suit them.
+abstract class MProxyType
        super MType
-
-       # The base type of the nullable type
+       # The base type
        var mtype: MType
 
        redef fun model do return self.mtype.model
-
-       init
-       do
-               self.to_s = "nullable {mtype}"
-       end
-
-       redef var to_s: String is noinit
-
-       redef var full_name is lazy do return "nullable {mtype.full_name}"
-
-       redef var c_name is lazy do return "nullable__{mtype.c_name}"
-
        redef fun need_anchor do return mtype.need_anchor
-       redef fun as_nullable do return self
-       redef fun as_notnullable do return mtype
+       redef fun as_nullable do return mtype.as_nullable
+       redef fun as_notnull do return mtype.as_notnull
+       redef fun undecorate do return mtype.undecorate
        redef fun resolve_for(mtype, anchor, mmodule, cleanup_virtual)
        do
                var res = self.mtype.resolve_for(mtype, anchor, mmodule, cleanup_virtual)
-               return res.as_nullable
+               return res
        end
 
        redef fun can_resolve_for(mtype, anchor, mmodule)
@@ -1533,12 +1599,10 @@ class MNullableType
                return self.mtype.can_resolve_for(mtype, anchor, mmodule)
        end
 
-       # Efficiently returns `mtype.lookup_fixed(mmodule, resolved_receiver).as_nullable`
        redef fun lookup_fixed(mmodule, resolved_receiver)
        do
                var t = mtype.lookup_fixed(mmodule, resolved_receiver)
-               if t == mtype then return self
-               return t.as_nullable
+               return t
        end
 
        redef fun depth do return self.mtype.depth
@@ -1564,6 +1628,64 @@ class MNullableType
        end
 end
 
+# A type prefixed with "nullable"
+class MNullableType
+       super MProxyType
+
+       init
+       do
+               self.to_s = "nullable {mtype}"
+       end
+
+       redef var to_s: String is noinit
+
+       redef var full_name is lazy do return "nullable {mtype.full_name}"
+
+       redef var c_name is lazy do return "nullable__{mtype.c_name}"
+
+       redef fun as_nullable do return self
+       redef fun resolve_for(mtype, anchor, mmodule, cleanup_virtual)
+       do
+               var res = super
+               return res.as_nullable
+       end
+
+       # Efficiently returns `mtype.lookup_fixed(mmodule, resolved_receiver).as_nullable`
+       redef fun lookup_fixed(mmodule, resolved_receiver)
+       do
+               var t = super
+               if t == mtype then return self
+               return t.as_nullable
+       end
+end
+
+# A non-null version of a formal type.
+#
+# When a formal type in bounded to a nullable type, this is the type of the not null version of it.
+class MNotNullType
+       super MProxyType
+
+       redef fun to_s do return "not null {mtype}"
+       redef var full_name is lazy do return "not null {mtype.full_name}"
+       redef var c_name is lazy do return "notnull__{mtype.c_name}"
+
+       redef fun as_notnull do return self
+
+       redef fun resolve_for(mtype, anchor, mmodule, cleanup_virtual)
+       do
+               var res = super
+               return res.as_notnull
+       end
+
+       # Efficiently returns `mtype.lookup_fixed(mmodule, resolved_receiver).as_notnull`
+       redef fun lookup_fixed(mmodule, resolved_receiver)
+       do
+               var t = super
+               if t == mtype then return self
+               return t.as_notnull
+       end
+end
+
 # The type of the only value null
 #
 # The is only one null type per model, see `MModel::null_type`.
@@ -1574,6 +1696,9 @@ class MNullType
        redef fun full_name do return "null"
        redef fun c_name do return "null"
        redef fun as_nullable do return self
+
+       # Aborts on `null`
+       redef fun as_notnull do abort # sorry...
        redef fun need_anchor do return false
        redef fun resolve_for(mtype, anchor, mmodule, cleanup_virtual) do return self
        redef fun can_resolve_for(mtype, anchor, mmodule) do return true
@@ -1637,9 +1762,25 @@ class MSignature
        # Example: for "(a: Int, b: Bool..., c: Char)" #-> vararg_rank=1
        var vararg_rank: Int is noinit
 
-       # The number or parameters
+       # The number of parameters
        fun arity: Int do return mparameters.length
 
+       # The number of non-default parameters
+       #
+       # The number of default parameters is then `arity-min_arity`.
+       #
+       # Note that there cannot be both varargs and default prameters, thus
+       # if `vararg_rank != -1` then `min_arity` == `arity`
+       fun min_arity: Int
+       do
+               if vararg_rank != -1 then return arity
+               var res = 0
+               for p in mparameters do
+                       if not p.is_default then res += 1
+               end
+               return res
+       end
+
        redef fun to_s
        do
                var b = new FlatBuffer
@@ -1693,6 +1834,9 @@ class MParameter
        # Is the parameter a vararg?
        var is_vararg: Bool
 
+       # Is the parameter a default one?
+       var is_default: Bool
+
        redef fun to_s
        do
                if is_vararg then
@@ -1708,7 +1852,7 @@ class MParameter
        do
                if not self.mtype.need_anchor then return self
                var newtype = self.mtype.resolve_for(mtype, anchor, mmodule, cleanup_virtual)
-               var res = new MParameter(self.name, newtype, self.is_vararg)
+               var res = new MParameter(self.name, newtype, self.is_vararg, self.is_default)
                return res
        end
 
@@ -1796,7 +1940,7 @@ abstract class MProperty
        fun lookup_definitions(mmodule: MModule, mtype: MType): Array[MPROPDEF]
        do
                assert not mtype.need_anchor
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
 
                var cache = self.lookup_definitions_cache[mmodule, mtype]
                if cache != null then return cache
@@ -1836,7 +1980,7 @@ abstract class MProperty
        fun lookup_super_definitions(mmodule: MModule, mtype: MType): Array[MPROPDEF]
        do
                assert not mtype.need_anchor
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
 
                # First, select all candidates
                var candidates = new Array[MPROPDEF]
@@ -1914,7 +2058,7 @@ abstract class MProperty
        # REQUIRE: `mtype.has_mproperty(mmodule, self)`
        fun lookup_all_definitions(mmodule: MModule, mtype: MType): Array[MPROPDEF]
        do
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
 
                var cache = self.lookup_all_definitions_cache[mmodule, mtype]
                if cache != null then return cache
index 30f5885..23f7d49 100644 (file)
@@ -52,11 +52,16 @@ redef class ToolContext
        # Run `process_mainmodule` on all phases
        fun run_global_phases(mmodules: Array[MModule])
        do
-               var mainmodule = make_main_module(mmodules)
-               for phase in phases_list do
-                       if phase.disabled then continue
-                       phase.process_mainmodule(mainmodule, mmodules)
+               if not mmodules.is_empty then
+                       var mainmodule = make_main_module(mmodules)
+                       for phase in phases_list do
+                               if phase.disabled then continue
+                               phase.process_mainmodule(mainmodule, mmodules)
+                       end
                end
+
+               check_errors
+               errors_info
        end
 end
 
index 6cbcbef..8e1e7c6 100644 (file)
@@ -74,13 +74,23 @@ class ModelBuilder
                        if res == null then
                                res = mclass
                        else
-                               error(anode, "Ambigous class name '{name}'; conflict between {mclass.full_name} and {res.full_name}")
+                               error(anode, "Error: ambiguous class name `{name}`; conflict between `{mclass.full_name}` and `{res.full_name}`.")
                                return null
                        end
                end
                return res
        end
 
+       # Like `try_get_mclass_by_name` but display an error message when the class is not found
+       fun get_mclass_by_name(node: ANode, mmodule: MModule, name: String): nullable MClass
+       do
+               var mclass = try_get_mclass_by_name(node, mmodule, name)
+               if mclass == null then
+                       error(node, "Type Error: missing primitive class `{name}'.")
+               end
+               return mclass
+       end
+
        # Return a property named `name` on the type `mtype` visible in the module `mmodule`.
        # Visibility in modules is correctly handled.
        # Protected properties are returned (it is up to the caller to check and reject protected properties).
@@ -158,7 +168,7 @@ class ModelBuilder
                        assert ress.length > 1
                        var s = new Array[String]
                        for mprop in ress do s.add mprop.full_name
-                       self.error(anode, "Ambigous property name '{name}' for {mtype}; conflict between {s.join(" and ")}")
+                       self.error(anode, "Error: ambiguous property name `{name}` for `{mtype}`; conflict between {s.join(" and ")}.")
                end
 
                self.try_get_mproperty_by_name2_cache[mmodule, mtype, name] = res
@@ -208,7 +218,7 @@ class ModelBuilder
                if res == null then
                        var l = null
                        if n != null then l = n.hot_location
-                       self.toolcontext.fatal_error(l, "Fatal Error: {recv} must have a property named {name}.")
+                       self.toolcontext.fatal_error(l, "Fatal Error: `{recv}` must have a property named `{name}`.")
                        abort
                end
                return res
@@ -228,7 +238,7 @@ class ModelBuilder
                        var prop = try_get_mproperty_by_name(ntype, mclassdef, name).as(nullable MVirtualTypeProp)
                        if prop != null then
                                if not ntype.n_types.is_empty then
-                                       error(ntype, "Type error: formal type {name} cannot have formal parameters.")
+                                       error(ntype, "Type Error: formal type `{name}` cannot have formal parameters.")
                                end
                                res = prop.mvirtualtype
                                if ntype.n_kwnullable != null then res = res.as_nullable
@@ -243,7 +253,7 @@ class ModelBuilder
                                if p.name != name then continue
 
                                if not ntype.n_types.is_empty then
-                                       error(ntype, "Type error: formal type {name} cannot have formal parameters.")
+                                       error(ntype, "Type Error: formal type `{name}` cannot have formal parameters.")
                                end
 
                                res = p
@@ -259,11 +269,11 @@ class ModelBuilder
                        var arity = ntype.n_types.length
                        if arity != mclass.arity then
                                if arity == 0 then
-                                       error(ntype, "Type error: '{name}' is a generic class.")
+                                       error(ntype, "Type Error: `{mclass.signature_to_s}` is a generic class.")
                                else if mclass.arity == 0 then
-                                       error(ntype, "Type error: '{name}' is not a generic class.")
+                                       error(ntype, "Type Error: `{name}` is not a generic class.")
                                else
-                                       error(ntype, "Type error: '{name}' has {mclass.arity} parameters ({arity} are provided).")
+                                       error(ntype, "Type Error: expected {mclass.arity} formal argument(s) for `{mclass.signature_to_s}`; got {arity}.")
                                end
                                return null
                        end
@@ -287,7 +297,7 @@ class ModelBuilder
                end
 
                # If everything fail, then give up :(
-               error(ntype, "Type error: class {name} not found in module {mmodule}.")
+               error(ntype, "Error: class `{name}` not found in module `{mmodule}`.")
                return null
        end
 
@@ -305,14 +315,16 @@ class ModelBuilder
                if mtype isa MGenericType then
                        var mclass = mtype.mclass
                        for i in [0..mclass.arity[ do
-                               var bound = mclass.intro.bound_mtype.arguments[i]
+                               var intro = mclass.try_intro
+                               if intro == null then return null # skip error
+                               var bound = intro.bound_mtype.arguments[i]
                                var nt = ntype.n_types[i]
                                var mt = resolve_mtype(mmodule, mclassdef, nt)
                                if mt == null then return null # forward error
                                var anchor
                                if mclassdef != null then anchor = mclassdef.bound_mtype else anchor = null
                                if not check_subtype(nt, mmodule, anchor, mt, bound) then
-                                       error(nt, "Type error: expected {bound}, got {mt}")
+                                       error(nt, "Type Error: expected `{bound}`, got `{mt}`.")
                                        return null
                                end
                        end
@@ -375,7 +387,7 @@ redef class ADoc
        do
                var res = mdoc_cache
                if res != null then return res
-               res = new MDoc
+               res = new MDoc(location)
                for c in n_comment do
                        var text = c.text
                        if text.length < 2 then
index c779df9..3503bd0 100644 (file)
@@ -65,36 +65,37 @@ redef class ModelBuilder
                                var nfd = nclassdef.n_formaldefs[i]
                                var ptname = nfd.n_id.text
                                if names.has(ptname) then
-                                       error(nfd, "Error: A formal parameter type `{ptname}' already exists")
+                                       error(nfd, "Error: a formal parameter type `{ptname}` already exists.")
                                        return
                                end
                                for c in ptname.chars do if c >= 'a' and c<= 'z' then
-                                       warning(nfd, "formal-type-name", "Warning: lowercase in the formal parameter type {ptname}")
+                                       warning(nfd, "formal-type-name", "Warning: lowercase in the formal parameter type `{ptname}`.")
                                        break
                                end
                                names.add(ptname)
                        end
 
-               else if nclassdef isa ATopClassdef then
+               else if nclassdef isa ATopClassdef and nclassdef.n_propdefs.first.as(AMethPropdef).n_methid.collect_text == "sys" then
+                       # Special case to keep `sys` in object.
+                       # Needed to keep working bootstrap and a working java FFI together.
+                       # TODO: remove once safe to remove
                        name = "Object"
                        nkind = null
                        mkind = interface_kind
                        nvisibility = null
                        mvisibility = public_visibility
-               else if nclassdef isa AMainClassdef then
+               else
                        name = "Sys"
                        nkind = null
                        mkind = concrete_kind
                        nvisibility = null
                        mvisibility = public_visibility
-               else
-                       abort
                end
 
                var mclass = try_get_mclass_by_name(nclassdef, mmodule, name)
                if mclass == null then
                        if nclassdef isa AStdClassdef and nclassdef.n_kwredef != null then
-                               error(nclassdef, "Redef error: No imported class {name} to refine.")
+                               error(nclassdef, "Redef Error: no imported class `{name}` to refine.")
                                return
                        end
 
@@ -103,7 +104,9 @@ redef class ModelBuilder
                                var mclasses = model.get_mclasses_by_name(name)
                                if mclasses != null then for other in mclasses do
                                        if other.intro_mmodule.mgroup != null and other.intro_mmodule.mgroup.mproject == mmodule.mgroup.mproject then
-                                               error(nclassdef, "Error: A class named `{other.full_name}` is already defined in module `{other.intro_mmodule}` at {other.intro.location}.")
+                                               # Skip classes that are buggy
+                                               if other.try_intro == null then continue
+                                               warning(nclassdef, "full-name-conflict", "Error: a class named `{other.full_name}` is already defined in module `{other.intro_mmodule}` at {other.intro.location}.")
                                                break
                                        end
                                end
@@ -112,18 +115,18 @@ redef class ModelBuilder
                        mclass = new MClass(mmodule, name, names, mkind, mvisibility)
                        #print "new class {mclass}"
                else if nclassdef isa AStdClassdef and nmodule.mclass2nclassdef.has_key(mclass) then
-                       error(nclassdef, "Error: A class {name} is already defined at line {nmodule.mclass2nclassdef[mclass].location.line_start}.")
+                       error(nclassdef, "Error: a class `{name}` is already defined at line {nmodule.mclass2nclassdef[mclass].location.line_start}.")
                        return
                else if nclassdef isa AStdClassdef and nclassdef.n_kwredef == null then
-                       error(nclassdef, "Redef error: {name} is an imported class. Add the redef keyword to refine it.")
+                       error(nclassdef, "Redef Error: `{name}` is an imported class. Add the `redef` keyword to refine it.")
                        return
                else if arity != 0 and mclass.arity != arity then
-                       error(nclassdef, "Redef error: Formal parameter arity missmatch; got {arity}, expected {mclass.arity}.")
+                       error(nclassdef, "Redef Error: expected {mclass.arity} formal parameter(s) for {mclass.signature_to_s}; got {arity}.")
                        return
                else if nkind != null and mkind != concrete_kind and mclass.kind != mkind then
-                       error(nkind, "Error: refinement changed the kind from a {mclass.kind} to a {mkind}")
+                       error(nkind, "Redef Error: refinement changed the kind from `{mclass.kind}` to `{mkind}`.")
                else if nvisibility != null and mvisibility != public_visibility and mclass.visibility != mvisibility then
-                       error(nvisibility, "Error: refinement changed the visibility from a {mclass.visibility} to a {mvisibility}")
+                       error(nvisibility, "Redef Error: refinement changed the visibility from `{mclass.visibility}` to `{mvisibility}`")
                end
                nclassdef.mclass = mclass
                if not nmodule.mclass2nclassdef.has_key(mclass) then
@@ -164,7 +167,7 @@ redef class ModelBuilder
                                var nfd = nclassdef.n_formaldefs[i]
                                var pname = mclass.mparameters[i].name
                                if nfd.n_id.text != pname then
-                                       error(nfd.n_id, "Error: Formal parameter type #{i} `{nfd.n_id.text}` must be named `{pname}' as in the original definition in module `{mclass.intro.mmodule}`.")
+                                       error(nfd.n_id, "Error: formal parameter type #{i} `{nfd.n_id.text}` must be named `{pname}` as in the original definition in module `{mclass.intro.mmodule}`.")
                                end
                                var nfdt = nfd.n_type
                                if nfdt != null then
@@ -172,17 +175,17 @@ redef class ModelBuilder
                                        if bound == null then return # Forward error
                                        if bound.need_anchor then
                                                # No F-bounds!
-                                               error(nfd, "Error: Formal parameter type `{pname}' bounded with a formal parameter type")
+                                               error(nfd, "Error: formal parameter type `{pname}` bounded with a formal parameter type.")
                                        else
                                                bounds.add(bound)
                                                nfd.bound = bound
                                        end
                                        if bound isa MClassType and bound.mclass.kind == enum_kind then
-                                               warning(nfdt, "useless-bound", "Warning: Useless formal parameter type since `{bound}` cannnot have subclasses.")
+                                               warning(nfdt, "useless-bound", "Warning: useless formal parameter type since `{bound}` cannot have subclasses.")
                                        end
                                else if mclass.mclassdefs.is_empty then
                                        if objectclass == null then
-                                               error(nfd, "Error: Formal parameter type `{pname}' unbounded but no Object class exist.")
+                                               error(nfd, "Error: formal parameter type `{pname}` unbounded but no `Object` class exists.")
                                                return
                                        end
                                        # No bound, then implicitely bound by nullable Object
@@ -224,11 +227,14 @@ redef class ModelBuilder
        # Visit the AST and set the super-types of the `MClassDef` objects
        private fun collect_a_mclassdef_inheritance(nmodule: AModule, nclassdef: AClassdef)
        do
-               var mmodule = nmodule.mmodule.as(not null)
+               var mmodule = nmodule.mmodule
+               if mmodule == null then return
                var objectclass = try_get_mclass_by_name(nmodule, mmodule, "Object")
                var pointerclass = try_get_mclass_by_name(nmodule, mmodule, "Pointer")
-               var mclass = nclassdef.mclass.as(not null)
-               var mclassdef = nclassdef.mclassdef.as(not null)
+               var mclass = nclassdef.mclass
+               if mclass == null then return
+               var mclassdef = nclassdef.mclassdef
+               if mclassdef == null then return
 
                # Do we need to specify Object as a super class?
                var specobject = true
@@ -245,11 +251,11 @@ redef class ModelBuilder
                                var mtype = resolve_mtype_unchecked(mmodule, mclassdef, ntype, false)
                                if mtype == null then continue # Skip because of error
                                if not mtype isa MClassType then
-                                       error(ntype, "Error: supertypes cannot be a formal type")
+                                       error(ntype, "Error: supertypes cannot be a formal type.")
                                        return
                                end
                                if not mclass.kind.can_specialize(mtype.mclass.kind) then
-                                       error(ntype, "Error: {mclass.kind} {mclass} cannot specialize {mtype.mclass.kind} {mtype.mclass}")
+                                       error(ntype, "Error: {mclass.kind} `{mclass}` cannot specialize {mtype.mclass.kind} `{mtype.mclass}`.")
                                end
                                supertypes.add mtype
                                #print "new super : {mclass} < {mtype}"
@@ -274,13 +280,16 @@ redef class ModelBuilder
        # Check the validity of the specialization heirarchy
        private fun check_supertypes(nmodule: AModule, nclassdef: AClassdef)
        do
-               var mmodule = nmodule.mmodule.as(not null)
-               var mclass = nclassdef.mclass.as(not null)
-               var mclassdef = nclassdef.mclassdef.as(not null)
+               var mmodule = nmodule.mmodule
+               if mmodule == null then return
+               var mclass = nclassdef.mclass
+               if mclass == null then return
+               var mclassdef = nclassdef.mclassdef
+               if mclassdef == null then return
 
                for s in mclassdef.supertypes do
                        if s.is_subtype(mmodule, mclassdef.bound_mtype, mclassdef.bound_mtype) then
-                               error(nclassdef, "Error: Inheritance loop for class {mclass} with type {s}")
+                               error(nclassdef, "Error: inheritance loop for class `{mclass}` with type `{s}`.")
                        end
                end
        end
@@ -293,7 +302,8 @@ redef class ModelBuilder
                # Force building recursively
                if nmodule.build_classes_is_done then return
                nmodule.build_classes_is_done = true
-               var mmodule = nmodule.mmodule.as(not null)
+               var mmodule = nmodule.mmodule
+               if mmodule == null then return
                for imp in mmodule.in_importation.direct_greaters do
                        var nimp = mmodule2node(imp)
                        if nimp != null then build_classes(nimp)
@@ -302,7 +312,13 @@ redef class ModelBuilder
                if errcount != toolcontext.error_count then return
 
                # Create all classes
+               # process AStdClassdef before so that non-AStdClassdef classes can be attached to existing ones, if any
                for nclassdef in nmodule.n_classdefs do
+                       if not nclassdef isa AStdClassdef then continue
+                       self.build_a_mclass(nmodule, nclassdef)
+               end
+               for nclassdef in nmodule.n_classdefs do
+                       if nclassdef isa AStdClassdef then continue
                        self.build_a_mclass(nmodule, nclassdef)
                end
 
@@ -310,6 +326,11 @@ redef class ModelBuilder
 
                # Create all classdefs
                for nclassdef in nmodule.n_classdefs do
+                       if not nclassdef isa AStdClassdef then continue
+                       self.build_a_mclassdef(nmodule, nclassdef)
+               end
+               for nclassdef in nmodule.n_classdefs do
+                       if nclassdef isa AStdClassdef then continue
                        self.build_a_mclassdef(nmodule, nclassdef)
                end
 
@@ -363,7 +384,8 @@ redef class ModelBuilder
 
                # Check clash of ancestors
                for nclassdef in nmodule.n_classdefs do
-                       var mclassdef = nclassdef.mclassdef.as(not null)
+                       var mclassdef = nclassdef.mclassdef
+                       if mclassdef == null then continue
                        var superclasses = new HashMap[MClass, MClassType]
                        for scd in mclassdef.in_hierarchy.greaters do
                                for st in scd.supertypes do
@@ -373,7 +395,7 @@ redef class ModelBuilder
                                                var st1 = superclasses[st.mclass].resolve_for(mclassdef.mclass.mclass_type, mclassdef.bound_mtype, mmodule, false)
                                                var st2 = st.resolve_for(mclassdef.mclass.mclass_type, mclassdef.bound_mtype, mmodule, false)
                                                if st1 != st2 then
-                                                       error(nclassdef, "Error: Incompatibles ancestors for {mclassdef.mclass}: {st1}, {st2}")
+                                                       error(nclassdef, "Error: incompatible ancestors for `{mclassdef.mclass}`; conflict: `{st1}` and `{st2}`")
                                                end
                                        end
                                end
@@ -387,7 +409,8 @@ redef class ModelBuilder
                # Check that the superclasses are not already known (by transitivity)
                for nclassdef in nmodule.n_classdefs do
                        if not nclassdef isa AStdClassdef then continue
-                       var mclassdef = nclassdef.mclassdef.as(not null)
+                       var mclassdef = nclassdef.mclassdef
+                       if mclassdef == null then continue
 
                        # Get the direct superclasses
                        # Since we are a mclassdef, just look at the mclassdef hierarchy
@@ -412,12 +435,12 @@ redef class ModelBuilder
                                if not parents.has(sc) or sc == objectclass then
                                        # Skip the warning on generated code
                                        if ntype.location.file != null and not ntype.location.file.filename.is_empty then
-                                               warning(ntype, "useless-superclass", "Warning: superfluous super-class {mtype} in class {mclassdef.mclass}.")
+                                               warning(ntype, "useless-superclass", "Warning: superfluous super-class `{mtype}` in class `{mclassdef.mclass}`.")
                                        end
                                else if not seen_parents.has_key(sc) then
                                        seen_parents[sc] = ntype
                                else
-                                       warning(ntype, "useless-superclass", "Warning: duplicated super-class {mtype} in class {mclassdef.mclass}.")
+                                       warning(ntype, "useless-superclass", "Warning: duplicated super-class `{mtype}` in class `{mclassdef.mclass}`.")
                                end
                        end
                end
index 35a50c3..3243f96 100644 (file)
@@ -86,7 +86,8 @@ redef class ModelBuilder
                # Force building recursively
                if nclassdef.build_properties_is_done then return
                nclassdef.build_properties_is_done = true
-               var mclassdef = nclassdef.mclassdef.as(not null)
+               var mclassdef = nclassdef.mclassdef
+               if mclassdef == null then return # skip error
                if mclassdef.in_hierarchy == null then return # Skip error
                for superclassdef in mclassdef.in_hierarchy.direct_greaters do
                        if not mclassdef2nclassdef.has_key(superclassdef) then continue
@@ -102,6 +103,24 @@ redef class ModelBuilder
                                npropdef.build_signature(self)
                        end
                        for npropdef in nclassdef2.n_propdefs do
+                               if not npropdef isa ATypePropdef then continue
+                               # Check circularity
+                               var mpropdef = npropdef.mpropdef
+                               if mpropdef == null then continue
+                               if mpropdef.bound == null then continue
+                               if not check_virtual_types_circularity(npropdef, mpropdef.mproperty, mclassdef.bound_mtype, mclassdef.mmodule) then
+                                       # Invalidate the bound
+                                       mpropdef.bound = mclassdef.mmodule.model.null_type
+                               end
+                       end
+                       for npropdef in nclassdef2.n_propdefs do
+                               # Check ATypePropdef first since they may be required for the other properties
+                               if not npropdef isa ATypePropdef then continue
+                               npropdef.check_signature(self)
+                       end
+
+                       for npropdef in nclassdef2.n_propdefs do
+                               if npropdef isa ATypePropdef then continue
                                npropdef.check_signature(self)
                        end
                end
@@ -171,13 +190,13 @@ redef class ModelBuilder
                                if sig == null then continue # Skip broken method
 
                                if not npropdef.mpropdef.is_intro then
-                                       self.error(at, "Error: `autoinit` cannot be set on redefinitions")
+                                       self.error(at, "Error: `autoinit` cannot be set on redefinitions.")
                                        continue
                                end
 
                                for param in sig.mparameters do
                                        var ret_type = param.mtype
-                                       var mparameter = new MParameter(param.name, ret_type, false)
+                                       var mparameter = new MParameter(param.name, ret_type, false, ret_type isa MNullableType)
                                        mparameters.add(mparameter)
                                end
                                initializers.add(npropdef.mpropdef.mproperty)
@@ -198,7 +217,7 @@ redef class ModelBuilder
                                var paramname = npropdef.mpropdef.mproperty.name.substring_from(1)
                                var ret_type = npropdef.mpropdef.static_mtype
                                if ret_type == null then return
-                               var mparameter = new MParameter(paramname, ret_type, false)
+                               var mparameter = new MParameter(paramname, ret_type, false, ret_type isa MNullableType)
                                mparameters.add(mparameter)
                                var msetter = npropdef.mwritepropdef
                                if msetter == null then
@@ -218,7 +237,7 @@ redef class ModelBuilder
                # Look for most-specific new-stype init definitions
                var spropdefs = the_root_init_mmethod.lookup_super_definitions(mclassdef.mmodule, mclassdef.bound_mtype)
                if spropdefs.is_empty then
-                       toolcontext.error(nclassdef.location, "Error: {mclassdef} does not specialize {the_root_init_mmethod.intro_mclassdef}. Possible duplication of the root class `Object`?")
+                       toolcontext.error(nclassdef.location, "Error: `{mclassdef}` does not specialize `{the_root_init_mmethod.intro_mclassdef}`. Possible duplication of the root class `Object`?")
                        return
                end
 
@@ -235,14 +254,14 @@ redef class ModelBuilder
                        end
 
                        if autoinit.n_args.is_empty then
-                               error(autoinit, "Syntax error: `autoinit` expects method identifiers, use `noautoinit` to clear all autoinits.")
+                               error(autoinit, "Syntax Error: `autoinit` expects method identifiers, use `noautoinit` to clear all autoinits.")
                        end
 
                        # Get and check each argument
                        for narg in autoinit.n_args do
                                var id = narg.as_id
                                if id == null then
-                                       error(narg, "Syntax error: `autoinit` expects method identifiers.")
+                                       error(narg, "Syntax Error: `autoinit` expects method identifiers.")
                                        return
                                end
 
@@ -267,7 +286,13 @@ redef class ModelBuilder
                                if pd isa MMethodDef then
                                        # Get the signature resolved for the current receiver
                                        var sig = pd.msignature.resolve_for(mclassdef.mclass.mclass_type, mclassdef.bound_mtype, mclassdef.mmodule, false)
-                                       mparameters.add_all sig.mparameters
+                                       # Because the last parameter of setters is never default, try to default them for the autoinit.
+                                       for param in sig.mparameters do
+                                               if not param.is_default and param.mtype isa MNullableType then
+                                                       param = new MParameter(param.name, param.mtype, param.is_vararg, true)
+                                               end
+                                               mparameters.add(param)
+                                       end
                                else
                                        # TODO attributes?
                                        abort
@@ -296,6 +321,7 @@ redef class ModelBuilder
                                        for p in spd.initializers do
                                                if p != longest.initializers[i] then
                                                        self.error(nclassdef, "Error: conflict for inherited inits {spd}({spd.initializers.join(", ")}) and {longest}({longest.initializers.join(", ")})")
+                                                       # TODO: invalidate the initializer to avoid more errors
                                                        return
                                                end
                                                i += 1
@@ -350,7 +376,7 @@ redef class ModelBuilder
                # It is a case-by case
                var vis_type: nullable MVisibility = null # The own visibility of the type
                var mmodule_type: nullable MModule = null # The original module of the type
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
                if mtype isa MClassType then
                        vis_type = mtype.mclass.visibility
                        mmodule_type = mtype.mclass.intro.mmodule
@@ -359,6 +385,8 @@ redef class ModelBuilder
                        mmodule_type = mtype.mproperty.intro_mclassdef.mmodule
                else if mtype isa MParameterType then
                        # nothing, always visible
+               else if mtype isa MNullType then
+                       # nothing to do.
                else
                        node.debug "Unexpected type {mtype}"
                        abort
@@ -368,10 +396,10 @@ redef class ModelBuilder
                        assert mmodule_type != null
                        var vis_module_type = mmodule.visibility_for(mmodule_type) # the visibility of the original module
                        if mproperty.visibility > vis_type then
-                               error(node, "Error: The {mproperty.visibility} property `{mproperty}` cannot contain the {vis_type} type `{mtype}`")
+                               error(node, "Error: the {mproperty.visibility} property `{mproperty}` cannot contain the {vis_type} type `{mtype}`.")
                                return
                        else if mproperty.visibility > vis_module_type then
-                               error(node, "Error: The {mproperty.visibility} property `{mproperty}` cannot contain the type `{mtype}` from the {vis_module_type} module `{mmodule_type}`")
+                               error(node, "Error: the {mproperty.visibility} property `{mproperty}` cannot contain the type `{mtype}` from the {vis_module_type} module `{mmodule_type}`.")
                                return
                        end
                end
@@ -387,6 +415,72 @@ redef class ModelBuilder
                        for t in mtype.arguments do check_visibility(node, t, mpropdef)
                end
        end
+
+       # Detect circularity errors for virtual types.
+       fun check_virtual_types_circularity(node: ANode, mproperty: MVirtualTypeProp, recv: MType, mmodule: MModule): Bool
+       do
+               # Check circularity
+               # Slow case: progress on each resolution until we visit all without getting a loop
+
+               # The graph used to detect loops
+               var mtype = mproperty.mvirtualtype
+               var poset = new POSet[MType]
+
+               # The work-list of types to resolve
+               var todo = new List[MType]
+               todo.add mtype
+
+               while not todo.is_empty do
+                       # The visited type
+                       var t = todo.pop
+
+                       if not t.need_anchor then continue
+
+                       # Get the types derived of `t` (subtypes and bounds)
+                       var nexts
+                       if t isa MNullableType then
+                               nexts = [t.mtype]
+                       else if t isa MGenericType then
+                               nexts = t.arguments
+                       else if t isa MVirtualType then
+                               var vt = t.mproperty
+                               # Because `vt` is possibly unchecked, we have to do the bound-lookup manually
+                               var defs = vt.lookup_definitions(mmodule, recv)
+                               # TODO something to manage correctly bound conflicts
+                               assert not defs.is_empty
+                               nexts = new Array[MType]
+                               for d in defs do
+                                       var next = defs.first.bound
+                                       if next == null then return false
+                                       nexts.add next
+                               end
+                       else if t isa MClassType then
+                               # Basic type, nothing to to
+                               continue
+                       else if t isa MParameterType then
+                               # Parameter types cannot depend on virtual types, so nothing to do
+                               continue
+                       else
+                               abort
+                       end
+
+                       # For each one
+                       for next in nexts do
+                               if poset.has_edge(next, t) then
+                                       if mtype == next then
+                                               error(node, "Error: circularity of virtual type definition: {next} <-> {t}.")
+                                       else
+                                               error(node, "Error: circularity of virtual type definition: {mtype} -> {next} <-> {t}.")
+                                       end
+                                       return false
+                               else
+                                       poset.add_edge(t, next)
+                                       todo.add next
+                               end
+                       end
+               end
+               return true
+       end
 end
 
 redef class MPropDef
@@ -439,17 +533,17 @@ redef class MClassDef
 
                        # SELF must be declared in Object, otherwise this will create conflicts
                        if intro_mclassdef.mclass.name != "Object" then
-                               modelbuilder.error(nintro, "Error: the virtual type SELF must be declared in Object.")
+                               modelbuilder.error(nintro, "Error: the virtual type `SELF` must be declared in `Object`.")
                        end
 
                        # SELF must be public
                        if mprop.visibility != public_visibility then
-                               modelbuilder.error(nintro, "Error: the virtual type SELF must be public.")
+                               modelbuilder.error(nintro, "Error: the virtual type `SELF` must be public.")
                        end
 
                        # SELF must not be fixed
                        if intro.is_fixed then
-                               modelbuilder.error(nintro, "Error: the virtual type SELF cannot be fixed.")
+                               modelbuilder.error(nintro, "Error: the virtual type `SELF` cannot be fixed.")
                        end
 
                        return
@@ -478,17 +572,17 @@ redef class APropdef
                if nvisibility != null then
                        mvisibility = nvisibility.mvisibility
                        if mvisibility == intrude_visibility then
-                               modelbuilder.error(nvisibility, "Error: intrude is not a legal visibility for properties.")
+                               modelbuilder.error(nvisibility, "Error: `intrude` is not a legal visibility for properties.")
                                mvisibility = public_visibility
                        end
                end
                if mclassdef.mclass.visibility == private_visibility then
                        if mvisibility == protected_visibility then
                                assert nvisibility != null
-                               modelbuilder.error(nvisibility, "Error: The only legal visibility for properties in a private class is private.")
+                               modelbuilder.error(nvisibility, "Error: `private` is the only legal visibility for properties in a private class.")
                        else if mvisibility == private_visibility then
                                assert nvisibility != null
-                               modelbuilder.advice(nvisibility, "useless-visibility", "Warning: private is superfluous since the only legal visibility for properties in a private class is private.")
+                               modelbuilder.advice(nvisibility, "useless-visibility", "Warning: `private` is superfluous since the only legal visibility for properties in a private class is private.")
                        end
                        mvisibility = private_visibility
                end
@@ -524,29 +618,20 @@ redef class APropdef
                if nvisibility == null then return
                var mvisibility = nvisibility.mvisibility
                if mvisibility != mprop.visibility and mvisibility != public_visibility then
-                               modelbuilder.error(nvisibility, "Error: redefinition changed the visibility from a {mprop.visibility} to a {mvisibility}")
+                               modelbuilder.error(nvisibility, "Error: redefinition changed the visibility from `{mprop.visibility}` to `{mvisibility}`.")
                end
        end
 
        private fun check_redef_keyword(modelbuilder: ModelBuilder, mclassdef: MClassDef, kwredef: nullable Token, need_redef: Bool, mprop: MProperty): Bool
        do
                if mclassdef.mprop2npropdef.has_key(mprop) then
-                       modelbuilder.error(self, "Error: A property {mprop} is already defined in class {mclassdef.mclass} at line {mclassdef.mprop2npropdef[mprop].location.line_start}.")
+                       modelbuilder.error(self, "Error: a property `{mprop}` is already defined in class `{mclassdef.mclass}` at line {mclassdef.mprop2npropdef[mprop].location.line_start}.")
                        return false
                end
-               if mprop isa MMethod and mprop.is_toplevel != (parent isa ATopClassdef) then
-                       if mprop.is_toplevel then
-                               modelbuilder.error(self, "Error: {mprop} is a top level method.")
-                       else
-                               modelbuilder.error(self, "Error: {mprop} is not a top level method.")
-                       end
-                       return false
-
-               end
                if mprop isa MMethod and mprop.is_root_init then return true
                if kwredef == null then
                        if need_redef then
-                               modelbuilder.error(self, "Redef error: {mclassdef.mclass}::{mprop.name} is an inherited property. To redefine it, add the redef keyword.")
+                               modelbuilder.error(self, "Redef Error: `{mclassdef.mclass}::{mprop.name}` is an inherited property. To redefine it, add the `redef` keyword.")
                                return false
                        end
 
@@ -563,7 +648,7 @@ redef class APropdef
                        end
                else
                        if not need_redef then
-                               modelbuilder.error(self, "Error: No property {mclassdef.mclass}::{mprop.name} is inherited. Remove the redef keyword to define a new property.")
+                               modelbuilder.error(self, "Error: no property `{mclassdef.mclass}::{mprop.name}` is inherited. Remove the `redef` keyword to define a new property.")
                                return false
                        end
                end
@@ -597,14 +682,14 @@ redef class ASignature
                        param_names.add(np.n_id.text)
                        var ntype = np.n_type
                        if ntype != null then
-                               var mtype = modelbuilder.resolve_mtype(mmodule, mclassdef, ntype)
+                               var mtype = modelbuilder.resolve_mtype_unchecked(mmodule, mclassdef, ntype, true)
                                if mtype == null then return false # Skip error
                                for i in [0..param_names.length-param_types.length[ do
                                        param_types.add(mtype)
                                end
                                if np.n_dotdotdot != null then
                                        if self.vararg_rank != -1 then
-                                               modelbuilder.error(np, "Error: {param_names[self.vararg_rank]} is already a vararg")
+                                               modelbuilder.error(np, "Error: `{param_names[self.vararg_rank]}` is already a vararg")
                                                return false
                                        else
                                                self.vararg_rank = param_names.length - 1
@@ -614,7 +699,7 @@ redef class ASignature
                end
                var ntype = self.n_type
                if ntype != null then
-                       self.ret_type = modelbuilder.resolve_mtype(mmodule, mclassdef, ntype)
+                       self.ret_type = modelbuilder.resolve_mtype_unchecked(mmodule, mclassdef, ntype, true)
                        if self.ret_type == null then return false # Skip error
                end
 
@@ -622,24 +707,24 @@ redef class ASignature
                return true
        end
 
-       # Build a visited signature
-       fun build_signature(modelbuilder: ModelBuilder): nullable MSignature
+       private fun check_signature(modelbuilder: ModelBuilder, mclassdef: MClassDef): Bool
        do
-               if param_names.length != param_types.length then
-                       # Some parameters are typed, other parameters are not typed.
-                       modelbuilder.error(self.n_params[param_types.length], "Error: Untyped parameter `{param_names[param_types.length]}'.")
-                       return null
+               var res = true
+               for np in self.n_params do
+                       var ntype = np.n_type
+                       if ntype != null then
+                               if modelbuilder.resolve_mtype(mclassdef.mmodule, mclassdef, ntype) == null then
+                                       res = false
+                               end
+                       end
                end
-
-               var mparameters = new Array[MParameter]
-               for i in [0..param_names.length[ do
-                       var mparameter = new MParameter(param_names[i], param_types[i], i == vararg_rank)
-                       self.n_params[i].mparameter = mparameter
-                       mparameters.add(mparameter)
+               var ntype = self.n_type
+               if ntype != null then
+                       if modelbuilder.resolve_mtype(mclassdef.mmodule, mclassdef, ntype) == null then
+                               res = false
+                       end
                end
-
-               var msignature = new MSignature(mparameters, ret_type)
-               return msignature
+               return res
        end
 end
 
@@ -711,8 +796,17 @@ redef class AMethPropdef
                        name = amethodid.collect_text
                        name_node = amethodid
 
-                       if name == "-" and self.n_signature.n_params.length == 0 then
+                       var arity = self.n_signature.n_params.length
+                       if name == "+" and arity == 0 then
+                               name = "unary +"
+                       else if name == "-" and arity == 0 then
                                name = "unary -"
+                       else
+                               if amethodid.is_binary and arity != 1 then
+                                       modelbuilder.error(self.n_signature, "Syntax Error: binary operator `{name}` requires exactly one parameter; got {arity}.")
+                               else if amethodid.min_arity > arity then
+                                       modelbuilder.error(self.n_signature, "Syntax Error: `{name}` requires at least {amethodid.min_arity} parameter(s); got {arity}.")
+                               end
                        end
                end
 
@@ -735,7 +829,8 @@ redef class AMethPropdef
                        end
                        mprop.is_init = is_init
                        mprop.is_new = n_kwnew != null
-                       if parent isa ATopClassdef then mprop.is_toplevel = true
+                       if mprop.is_new then mclassdef.mclass.has_new_factory = true
+                       if name == "sys" then mprop.is_toplevel = true # special case for sys allowed in `new` factories
                        self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mprop)
                else
                        if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, not self isa AMainMethPropdef, mprop) then return
@@ -785,6 +880,9 @@ redef class AMethPropdef
                        end
                end
 
+               var accept_special_last_parameter = self.n_methid == null or self.n_methid.accept_special_last_parameter
+               var return_is_mandatory = self.n_methid != null and self.n_methid.return_is_mandatory
+
                # Retrieve info from the signature AST
                var param_names = new Array[String] # Names of parameters from the AST
                var param_types = new Array[MType] # Types of parameters from the AST
@@ -812,7 +910,7 @@ redef class AMethPropdef
                        if param_names.length != msignature.arity then
                                var node: ANode
                                if nsig != null then node = nsig else node = self
-                               modelbuilder.error(node, "Redef error: {mpropdef} redefines {mpropdef.mproperty.intro} with {param_names.length} parameter(s), {msignature.arity} expected. Signature is {mpropdef}{msignature}")
+                               modelbuilder.error(node, "Redef Error: expected {msignature.arity} parameter(s) for `{mpropdef.mproperty.name}{msignature}`; got {param_names.length}. See introduction at `{mpropdef.mproperty.full_name}`.")
                                return
                        end
                else if mpropdef.mproperty.is_init and not mpropdef.mproperty.is_new then
@@ -844,13 +942,19 @@ redef class AMethPropdef
 
                if param_names.length != param_types.length then
                        # Some parameters are typed, other parameters are not typed.
-                       modelbuilder.error(nsig.n_params[param_types.length], "Error: Untyped parameter `{param_names[param_types.length]}'.")
+                       modelbuilder.error(nsig.n_params[param_types.length], "Error: untyped parameter `{param_names[param_types.length]}'.")
                        return
                end
 
                var mparameters = new Array[MParameter]
                for i in [0..param_names.length[ do
-                       var mparameter = new MParameter(param_names[i], param_types[i], i == vararg_rank)
+                       var is_default = false
+                       if vararg_rank == -1 and param_types[i] isa MNullableType then
+                               if i < param_names.length-1 or accept_special_last_parameter then
+                                       is_default = true
+                               end
+                       end
+                       var mparameter = new MParameter(param_names[i], param_types[i], i == vararg_rank, is_default)
                        if nsig != null then nsig.n_params[i].mparameter = mparameter
                        mparameters.add(mparameter)
                end
@@ -858,6 +962,14 @@ redef class AMethPropdef
                # In `new`-factories, the return type is by default the classtype.
                if ret_type == null and mpropdef.mproperty.is_new then ret_type = mclassdef.mclass.mclass_type
 
+               # Special checks for operator methods
+               if not accept_special_last_parameter and mparameters.not_empty and mparameters.last.is_vararg then
+                       modelbuilder.error(self.n_signature.n_params.last, "Error: illegal variadic parameter `{mparameters.last}` for `{mpropdef.mproperty.name}`.")
+               end
+               if ret_type == null and return_is_mandatory then
+                       modelbuilder.error(self.n_methid, "Error: mandatory return type for `{mpropdef.mproperty.name}`.")
+               end
+
                msignature = new MSignature(mparameters, ret_type)
                mpropdef.msignature = msignature
                mpropdef.is_abstract = self.get_single_annotation("abstract", modelbuilder) != null
@@ -866,7 +978,7 @@ redef class AMethPropdef
 
                # Check annotations
                var at = self.get_single_annotation("lazy", modelbuilder)
-               if at != null then modelbuilder.error(at, "Syntax error: `lazy` must be used on attributes.")
+               if at != null then modelbuilder.error(at, "Syntax Error: `lazy` must be used on attributes.")
        end
 
        redef fun check_signature(modelbuilder)
@@ -879,6 +991,14 @@ redef class AMethPropdef
                var mysignature = self.mpropdef.msignature
                if mysignature == null then return # Error thus skiped
 
+               # Check
+               if nsig != null then
+                       if not nsig.check_signature(modelbuilder, mclassdef) then
+                               self.mpropdef.msignature = null # invalidate
+                               return # Forward error
+                       end
+               end
+
                # Lookup for signature in the precursor
                # FIXME all precursors should be considered
                if not mpropdef.is_intro then
@@ -888,7 +1008,8 @@ redef class AMethPropdef
                        var precursor_ret_type = msignature.return_mtype
                        var ret_type = mysignature.return_mtype
                        if ret_type != null and precursor_ret_type == null then
-                               modelbuilder.error(nsig.n_type.as(not null), "Redef Error: {mpropdef.mproperty} is a procedure, not a function.")
+                               modelbuilder.error(nsig.n_type.as(not null), "Redef Error: `{mpropdef.mproperty}` is a procedure, not a function.")
+                               self.mpropdef.msignature = null
                                return
                        end
 
@@ -899,7 +1020,8 @@ redef class AMethPropdef
                                        var prt = msignature.mparameters[i].mtype
                                        var node = nsig.n_params[i]
                                        if not modelbuilder.check_sametype(node, mmodule, mclassdef.bound_mtype, myt, prt) then
-                                               modelbuilder.error(node, "Redef Error: Wrong type for parameter `{mysignature.mparameters[i].name}'. found {myt}, expected {prt} as in {mpropdef.mproperty.intro}.")
+                                               modelbuilder.error(node, "Redef Error: expected `{prt}` for parameter `{mysignature.mparameters[i].name}'; got `{myt}`.")
+                                               self.mpropdef.msignature = null
                                        end
                                end
                        end
@@ -911,7 +1033,8 @@ redef class AMethPropdef
                                        # Inherit the return type
                                        ret_type = precursor_ret_type
                                else if not modelbuilder.check_subtype(node, mmodule, mclassdef.bound_mtype, ret_type, precursor_ret_type) then
-                                       modelbuilder.error(node, "Redef Error: Wrong return type. found {ret_type}, expected {precursor_ret_type} as in {mpropdef.mproperty.intro}.")
+                                       modelbuilder.error(node, "Redef Error: expected `{precursor_ret_type}` for return type; got `{ret_type}`.")
+                                       self.mpropdef.msignature = null
                                end
                        end
                end
@@ -928,6 +1051,56 @@ redef class AMethPropdef
        end
 end
 
+redef class AMethid
+       # Is a return required?
+       #
+       # * True for operators and brackets.
+       # * False for id and assignment.
+       fun return_is_mandatory: Bool do return true
+
+       # Can the last parameter be special like a vararg?
+       #
+       # * False for operators: the last one is in fact the only one.
+       # * False for assignments: it is the right part of the assignment.
+       # * True for ids and brackets.
+       fun accept_special_last_parameter: Bool do return false
+
+       # The minimum required number of parameters.
+       #
+       # * 1 for binary operators
+       # * 1 for brackets
+       # * 1 for assignments
+       # * 2 for bracket assignments
+       # * 0 for ids
+       fun min_arity: Int do return 1
+
+       # Is the `self` a binary operator?
+       fun is_binary: Bool do return true
+end
+
+redef class AIdMethid
+       redef fun return_is_mandatory do return false
+       redef fun accept_special_last_parameter do return true
+       redef fun min_arity do return 0
+       redef fun is_binary do return false
+end
+
+redef class ABraMethid
+       redef fun accept_special_last_parameter do return true
+       redef fun is_binary do return false
+end
+
+redef class ABraassignMethid
+       redef fun return_is_mandatory do return false
+       redef fun min_arity do return 2
+       redef fun is_binary do return false
+end
+
+redef class AAssignMethid
+       redef fun return_is_mandatory do return false
+       redef fun is_binary do return false
+end
+
 redef class AAttrPropdef
        redef type MPROPDEF: MAttributeDef
 
@@ -955,32 +1128,27 @@ redef class AAttrPropdef
        redef fun build_property(modelbuilder, mclassdef)
        do
                var mclass = mclassdef.mclass
+               var nid2 = n_id2
+               var name = nid2.text
 
-               var name: String
-               name = self.n_id2.text
+               var atabstract = self.get_single_annotation("abstract", modelbuilder)
+               if atabstract == null then
+                       if not mclass.kind.need_init then
+                               modelbuilder.error(self, "Error: attempt to define attribute `{name}` in the {mclass.kind} `{mclass}`.")
+                       end
 
-               if mclass.kind == interface_kind or mclassdef.mclass.kind == enum_kind then
-                       modelbuilder.error(self, "Error: Attempt to define attribute {name} in the interface {mclass}.")
-               else if mclass.kind == enum_kind then
-                       modelbuilder.error(self, "Error: Attempt to define attribute {name} in the enum class {mclass}.")
-               else if mclass.kind == extern_kind then
-                       modelbuilder.error(self, "Error: Attempt to define attribute {name} in the extern class {mclass}.")
+                       var mprop = new MAttribute(mclassdef, "_" + name, private_visibility)
+                       var mpropdef = new MAttributeDef(mclassdef, mprop, self.location)
+                       self.mpropdef = mpropdef
+                       modelbuilder.mpropdef2npropdef[mpropdef] = self
                end
 
-               # New attribute style
-               var nid2 = self.n_id2
-               var mprop = new MAttribute(mclassdef, "_" + name, private_visibility)
-               var mpropdef = new MAttributeDef(mclassdef, mprop, self.location)
-               self.mpropdef = mpropdef
-               modelbuilder.mpropdef2npropdef[mpropdef] = self
-
                var readname = name
                var mreadprop = modelbuilder.try_get_mproperty_by_name(nid2, mclassdef, readname).as(nullable MMethod)
                if mreadprop == null then
                        var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
                        mreadprop = new MMethod(mclassdef, readname, mvisibility)
                        if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, false, mreadprop) then return
-                       mreadprop.deprecation = mprop.deprecation
                else
                        if not self.check_redef_keyword(modelbuilder, mclassdef, n_kwredef, true, mreadprop) then return
                        check_redef_property_visibility(modelbuilder, self.n_visibility, mreadprop)
@@ -991,16 +1159,26 @@ redef class AAttrPropdef
                self.mreadpropdef = mreadpropdef
                modelbuilder.mpropdef2npropdef[mreadpropdef] = self
                set_doc(mreadpropdef, modelbuilder)
-               mpropdef.mdoc = mreadpropdef.mdoc
+               if mpropdef != null then mpropdef.mdoc = mreadpropdef.mdoc
+               if atabstract != null then mreadpropdef.is_abstract = true
 
                has_value = n_expr != null or n_block != null
 
+               if atabstract != null and has_value then
+                       modelbuilder.error(atabstract, "Error: `abstract` attributes cannot have an initial value.")
+                       return
+               end
+
                var atnoinit = self.get_single_annotation("noinit", modelbuilder)
                if atnoinit == null then atnoinit = self.get_single_annotation("noautoinit", modelbuilder)
                if atnoinit != null then
                        noinit = true
                        if has_value then
-                               modelbuilder.error(atnoinit, "Error: `noautoinit` attributes cannot have an initial value")
+                               modelbuilder.error(atnoinit, "Error: `noautoinit` attributes cannot have an initial value.")
+                               return
+                       end
+                       if atabstract != null then
+                               modelbuilder.error(atnoinit, "Error: `noautoinit` attributes cannot be abstract.")
                                return
                        end
                end
@@ -1009,15 +1187,16 @@ redef class AAttrPropdef
                var atautoinit = self.get_single_annotation("autoinit", modelbuilder)
                if atlazy != null or atautoinit != null then
                        if atlazy != null and atautoinit != null then
-                               modelbuilder.error(atlazy, "Error: lazy incompatible with autoinit")
+                               modelbuilder.error(atlazy, "Error: `lazy` incompatible with `autoinit`.")
                                return
                        end
                        if not has_value then
                                if atlazy != null then
-                                       modelbuilder.error(atlazy, "Error: a lazy attribute needs a value")
+                                       modelbuilder.error(atlazy, "Error: `lazy` attributes need a value.")
                                else if atautoinit != null then
-                                       modelbuilder.error(atautoinit, "Error: a autoinit attribute needs a value")
+                                       modelbuilder.error(atautoinit, "Error: `autoinit` attributes need a value.")
                                end
+                               has_value = true
                                return
                        end
                        is_lazy = true
@@ -1029,7 +1208,7 @@ redef class AAttrPropdef
                var atreadonly = self.get_single_annotation("readonly", modelbuilder)
                if atreadonly != null then
                        if not has_value then
-                               modelbuilder.error(atreadonly, "Error: a readonly attribute needs a value")
+                               modelbuilder.error(atreadonly, "Error: `readonly` attributes need a value.")
                        end
                        # No setter, so just leave
                        return
@@ -1054,7 +1233,7 @@ redef class AAttrPropdef
                        end
                        mwriteprop = new MMethod(mclassdef, writename, mvisibility)
                        if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef, false, mwriteprop) then return
-                       mwriteprop.deprecation = mprop.deprecation
+                       mwriteprop.deprecation = mreadprop.deprecation
                else
                        if not self.check_redef_keyword(modelbuilder, mclassdef, nwkwredef or else n_kwredef, true, mwriteprop) then return
                        if atwritable != null then
@@ -1066,28 +1245,29 @@ redef class AAttrPropdef
                var mwritepropdef = new MMethodDef(mclassdef, mwriteprop, self.location)
                self.mwritepropdef = mwritepropdef
                modelbuilder.mpropdef2npropdef[mwritepropdef] = self
-               mwritepropdef.mdoc = mpropdef.mdoc
+               mwritepropdef.mdoc = mreadpropdef.mdoc
+               if atabstract != null then mwritepropdef.is_abstract = true
        end
 
        redef fun build_signature(modelbuilder)
        do
+               var mreadpropdef = self.mreadpropdef
                var mpropdef = self.mpropdef
-               if mpropdef == null then return # Error thus skipped
-               var mclassdef = mpropdef.mclassdef
+               if mreadpropdef == null then return # Error thus skipped
+               var mclassdef = mreadpropdef.mclassdef
                var mmodule = mclassdef.mmodule
                var mtype: nullable MType = null
 
-               var mreadpropdef = self.mreadpropdef
 
                var ntype = self.n_type
                if ntype != null then
-                       mtype = modelbuilder.resolve_mtype(mmodule, mclassdef, ntype)
+                       mtype = modelbuilder.resolve_mtype_unchecked(mmodule, mclassdef, ntype, true)
                        if mtype == null then return
                end
 
                var inherited_type: nullable MType = null
                # Inherit the type from the getter (usually an abstract getter)
-               if mreadpropdef != null and not mreadpropdef.is_intro then
+               if not mreadpropdef.is_intro then
                        var msignature = mreadpropdef.mproperty.intro.msignature
                        if msignature == null then return # Error, thus skipped
                        inherited_type = msignature.return_mtype
@@ -1102,7 +1282,7 @@ redef class AAttrPropdef
                if mtype == null then
                        if nexpr != null then
                                if nexpr isa ANewExpr then
-                                       mtype = modelbuilder.resolve_mtype(mmodule, mclassdef, nexpr.n_type)
+                                       mtype = modelbuilder.resolve_mtype_unchecked(mmodule, mclassdef, nexpr.n_type, true)
                                else if nexpr isa AIntExpr then
                                        var cla = modelbuilder.try_get_mclass_by_name(nexpr, mmodule, "Int")
                                        if cla != null then mtype = cla.mclass_type
@@ -1122,14 +1302,14 @@ redef class AAttrPropdef
                                        var cla = modelbuilder.try_get_mclass_by_name(nexpr, mmodule, "String")
                                        if cla != null then mtype = cla.mclass_type
                                else
-                                       modelbuilder.error(self, "Error: Untyped attribute {mpropdef}. Implicit typing allowed only for literals and new.")
+                                       modelbuilder.error(self, "Error: untyped attribute `{mreadpropdef}`. Implicit typing allowed only for literals and new.")
                                end
 
                                if mtype == null then return
                        end
                else if ntype != null and inherited_type == mtype then
                        if nexpr isa ANewExpr then
-                               var xmtype = modelbuilder.resolve_mtype(mmodule, mclassdef, nexpr.n_type)
+                               var xmtype = modelbuilder.resolve_mtype_unchecked(mmodule, mclassdef, nexpr.n_type, true)
                                if xmtype == mtype then
                                        modelbuilder.advice(ntype, "useless-type", "Warning: useless type definition")
                                end
@@ -1137,13 +1317,15 @@ redef class AAttrPropdef
                end
 
                if mtype == null then
-                       modelbuilder.error(self, "Error: Untyped attribute {mpropdef}")
+                       modelbuilder.error(self, "Error: untyped attribute `{mreadpropdef}`.")
                        return
                end
 
-               mpropdef.static_mtype = mtype
+               if mpropdef != null then
+                       mpropdef.static_mtype = mtype
+               end
 
-               if mreadpropdef != null then
+               do
                        var msignature = new MSignature(new Array[MParameter], mtype)
                        mreadpropdef.msignature = msignature
                end
@@ -1152,7 +1334,7 @@ redef class AAttrPropdef
                if mwritepropdef != null then
                        var name: String
                        name = n_id2.text
-                       var mparameter = new MParameter(name, mtype, false)
+                       var mparameter = new MParameter(name, mtype, false, false)
                        var msignature = new MSignature([mparameter], null)
                        mwritepropdef.msignature = msignature
                end
@@ -1171,6 +1353,18 @@ redef class AAttrPropdef
                var mtype = self.mpropdef.static_mtype
                if mtype == null then return # Error thus skipped
 
+               var mclassdef = mpropdef.mclassdef
+               var mmodule = mclassdef.mmodule
+
+               # Check types
+               if ntype != null then
+                       if modelbuilder.resolve_mtype(mmodule, mclassdef, ntype) == null then return
+               end
+               var nexpr = n_expr
+               if nexpr isa ANewExpr then
+                       if modelbuilder.resolve_mtype(mmodule, mclassdef, nexpr.n_type) == null then return
+               end
+
                # Lookup for signature in the precursor
                # FIXME all precursors should be considered
                if not mpropdef.is_intro then
@@ -1178,7 +1372,7 @@ redef class AAttrPropdef
                        if precursor_type == null then return
 
                        if mtype != precursor_type then
-                               modelbuilder.error(ntype.as(not null), "Redef Error: Wrong static type. found {mtype}, expected {precursor_type}.")
+                               modelbuilder.error(ntype.as(not null), "Redef Error: expected `{precursor_type}` type as a bound; got `{mtype}`.")
                                return
                        end
                end
@@ -1217,7 +1411,7 @@ redef class AAttrPropdef
                        if mysignature.arity != msignature.arity then
                                var node: ANode
                                if nsig != null then node = nsig else node = self
-                               modelbuilder.error(node, "Redef Error: {mysignature.arity} parameters found, {msignature.arity} expected. Signature is {mpropdef}{msignature}")
+                               modelbuilder.error(node, "Redef Error: expected {msignature.arity} parameter(s) for `{mpropdef.mproperty.name}{msignature}`; got {mysignature.arity}. See introduction at `{mpropdef.mproperty.full_name}`.")
                                return
                        end
                        var precursor_ret_type = msignature.return_mtype
@@ -1225,7 +1419,7 @@ redef class AAttrPropdef
                        if ret_type != null and precursor_ret_type == null then
                                var node: ANode
                                if nsig != null then node = nsig else node = self
-                               modelbuilder.error(node, "Redef Error: {mpropdef.mproperty} is a procedure, not a function.")
+                               modelbuilder.error(node, "Redef Error: `{mpropdef.mproperty}` is a procedure, not a function.")
                                return
                        end
 
@@ -1237,7 +1431,7 @@ redef class AAttrPropdef
                                        var node: ANode
                                        if nsig != null then node = nsig else node = self
                                        if not modelbuilder.check_sametype(node, mmodule, mclassdef.bound_mtype, myt, prt) then
-                                               modelbuilder.error(node, "Redef Error: Wrong type for parameter `{mysignature.mparameters[i].name}'. found {myt}, expected {prt}.")
+                                               modelbuilder.error(node, "Redef Error: expected `{prt}` type for parameter `{mysignature.mparameters[i].name}'; got `{myt}`.")
                                        end
                                end
                        end
@@ -1248,7 +1442,7 @@ redef class AAttrPropdef
                                        # Inherit the return type
                                        ret_type = precursor_ret_type
                                else if not modelbuilder.check_subtype(node, mmodule, mclassdef.bound_mtype, ret_type, precursor_ret_type) then
-                                       modelbuilder.error(node, "Redef Error: Wrong return type. found {ret_type}, expected {precursor_ret_type}.")
+                                       modelbuilder.error(node, "Redef Error: expected `{precursor_ret_type}` return type; got `{ret_type}`.")
                                end
                        end
                end
@@ -1266,7 +1460,7 @@ redef class ATypePropdef
                        var mvisibility = new_property_visibility(modelbuilder, mclassdef, self.n_visibility)
                        mprop = new MVirtualTypeProp(mclassdef, name, mvisibility)
                        for c in name.chars do if c >= 'a' and c<= 'z' then
-                               modelbuilder.warning(n_id, "bad-type-name", "Warning: lowercase in the virtual type {name}")
+                               modelbuilder.warning(n_id, "bad-type-name", "Warning: lowercase in the virtual type `{name}`.")
                                break
                        end
                        if not self.check_redef_keyword(modelbuilder, mclassdef, self.n_kwredef, false, mprop) then return
@@ -1302,7 +1496,7 @@ redef class ATypePropdef
                var mtype: nullable MType = null
 
                var ntype = self.n_type
-               mtype = modelbuilder.resolve_mtype(mmodule, mclassdef, ntype)
+               mtype = modelbuilder.resolve_mtype_unchecked(mmodule, mclassdef, ntype, true)
                if mtype == null then return
 
                mpropdef.bound = mtype
@@ -1314,7 +1508,7 @@ redef class ATypePropdef
                var mpropdef = self.mpropdef
                if mpropdef == null then return # Error thus skipped
 
-               var bound = self.mpropdef.bound
+               var bound = mpropdef.bound
                if bound == null then return # Error thus skipped
 
                modelbuilder.check_visibility(n_type, bound, mpropdef)
@@ -1323,30 +1517,18 @@ redef class ATypePropdef
                var mmodule = mclassdef.mmodule
                var anchor = mclassdef.bound_mtype
 
-               # Check circularity
-               if bound isa MVirtualType then
-                       # Slow case: progress on each resolution until: (i) we loop, or (ii) we found a non formal type
-                       var seen = [self.mpropdef.mproperty.mvirtualtype]
-                       loop
-                               if seen.has(bound) then
-                                       seen.add(bound)
-                                       modelbuilder.error(self, "Error: circularity of virtual type definition: {seen.join(" -> ")}")
-                                       return
-                               end
-                               seen.add(bound)
-                               var next = bound.lookup_bound(mmodule, anchor)
-                               if not next isa MVirtualType then break
-                               bound = next
-                       end
+               var ntype = self.n_type
+               if modelbuilder.resolve_mtype(mmodule, mclassdef, ntype) == null then
+                       mpropdef.bound = null
+                       return
                end
 
                # Check redefinitions
-               bound = mpropdef.bound.as(not null)
                for p in mpropdef.mproperty.lookup_super_definitions(mmodule, anchor) do
                        var supbound = p.bound
                        if supbound == null then break # broken super bound, skip error
                        if p.is_fixed then
-                               modelbuilder.error(self, "Redef Error: Virtual type {mpropdef.mproperty} is fixed in super-class {p.mclassdef.mclass}")
+                               modelbuilder.error(self, "Redef Error: virtual type `{mpropdef.mproperty}` is fixed in super-class `{p.mclassdef.mclass}`.")
                                break
                        end
                        if p.mclassdef.mclass == mclassdef.mclass then
@@ -1355,7 +1537,7 @@ redef class ATypePropdef
                                break
                        end
                        if not modelbuilder.check_subtype(n_type, mmodule, anchor, bound, supbound) then
-                               modelbuilder.error(n_type, "Redef Error: Wrong bound type. Found {bound}, expected a subtype of {supbound}, as in {p}.")
+                               modelbuilder.error(n_type, "Redef Error: expected `{supbound}` bound type; got `{bound}`.")
                                break
                        end
                end
index ce683de..f0e2911 100644 (file)
@@ -365,7 +365,10 @@ class NeoModel
                node.labels.add "MEntity"
                node.labels.add model_name
                node["name"] = mentity.name
-               if mentity.mdoc != null then node["mdoc"] = new JsonArray.from(mentity.mdoc.content)
+               if mentity.mdoc != null then
+                       node["mdoc"] = new JsonArray.from(mentity.mdoc.content)
+                       node["mdoc_location"] = mentity.mdoc.location.to_s
+               end
                return node
        end
 
@@ -842,6 +845,7 @@ class NeoModel
                node.labels.add "MParameter"
                node["name"] = mparameter.name
                node["is_vararg"] = mparameter.is_vararg
+               node["is_default"] = mparameter.is_default
                node.out_edges.add(new NeoEdge(node, "TYPE", to_node(mparameter.mtype)))
                return node
        end
@@ -857,7 +861,8 @@ class NeoModel
                var name = node["name"].to_s
                var mtype = to_mtype(model, node.out_nodes("TYPE").first)
                var is_vararg = node["is_vararg"].as(Bool)
-               var mparameter = new MParameter(name, mtype, is_vararg)
+               var is_default = node["is_default"].as(Bool)
+               var mparameter = new MParameter(name, mtype, is_vararg, is_default)
                mentities[node.id.as(Int)] = mparameter
                return mparameter
        end
@@ -867,6 +872,9 @@ class NeoModel
                #TODO filepath
                var parts = loc.split_with(":")
                var file = new SourceFile.from_string(parts[0], "")
+               if parts.length == 1 then
+                       return new Location(file, 0, 0, 0, 0)
+               end
                var pos = parts[1].split_with("--")
                var pos1 = pos[0].split_with(",")
                var pos2 = pos[1].split_with(",")
@@ -919,7 +927,8 @@ class NeoModel
                        for e in node["mdoc"].as(JsonArray) do
                                lines.add e.to_s#.replace("\n", "\\n")
                        end
-                       var mdoc = new MDoc
+                       var location = to_location(node["mdoc_location"].to_s)
+                       var mdoc = new MDoc(location)
                        mdoc.content.add_all(lines)
                        mdoc.original_mentity = mentity
                        mentity.mdoc = mdoc
index 8be9ae2..5a74d48 100644 (file)
@@ -21,7 +21,6 @@ import interpreter
 import frontend
 import parser_util
 import vm
-import vm_optimizations
 
 # Create a tool context to handle options and paths
 var toolcontext = new ToolContext
index 349f53c..b12e1e9 100644 (file)
@@ -81,7 +81,7 @@ else
 end
 
 print "[HOST ADDRESS] : {debug.address}"
-print "[HOST] : {debug.host or else "unamed"}"
+print "[HOST] : {debug.host}"
 print "[PORT] : {debug.port}"
 print "Connecting ... {debug.connected}"
 
index 7ffc58c..8755bfe 100644 (file)
@@ -129,7 +129,7 @@ end
 
 var sum = opt_tree.value.to_i + opt_source.value.to_i + opt_project.value.to_i
 if sum > 1 then
-       print "Error: options --tree, --source, and --project are exclusives."
+       print "Error: options --tree, --source, and --project are exclusive."
        print tc.tooldescription
        exit 1
 end
index 6685029..5e3b7a6 100644 (file)
@@ -31,6 +31,7 @@ redef class MMethod
                if nit_name == "+" then return "_plus"
                if nit_name == "-" then return "_minus"
                if nit_name == "unary -" then return "_unary_minus"
+               if nit_name == "unary +" then return "_unary_plus"
                if nit_name == "*" then return "_star"
                if nit_name == "/" then return "_slash"
                if nit_name == "%" then return "_percent"
index f53466c..823f624 100644 (file)
@@ -111,7 +111,7 @@ redef class AMethPropdef
                # return type
                var rmt = mpropdef.msignature.return_mtype
                if rmt != null then
-                       if rmt isa MParameterType or rmt isa MVirtualType then
+                       if rmt isa MFormalType then
                                var mclass_type = mpropdef.mclassdef.bound_mtype
                                rmt = rmt.anchor_to(mmodule, mclass_type)
                        end
@@ -122,7 +122,7 @@ redef class AMethPropdef
                # params
                for p in mpropdef.msignature.mparameters do
                        var mtype = p.mtype.resolve_for(recv_type, recv_type, mmodule, true)
-                       if mtype isa MParameterType or mtype isa MVirtualType then
+                       if mtype isa MFormalType then
                                var mclass_type = mpropdef.mclassdef.bound_mtype
                                mtype = mtype.anchor_to(mmodule, mclass_type)
                        end
@@ -287,7 +287,7 @@ redef class ALocalPropExternCall
                        mmodule, mclass_type, m_name )
 
                if method == null then
-                       toolcontext.error(location, "Local method {m_name} not found.")
+                       toolcontext.error(location, "Error: local method `{m_name}` not found.")
                        return
                end
 
@@ -308,12 +308,12 @@ redef class AFullPropExternCall
 
                if mtype == null then return
 
-               if mtype isa MParameterType or mtype isa MVirtualType then
+               if mtype isa MFormalType then
                        mtype = mtype.anchor_to(mmodule, mclass_type)
                end
 
                if mtype isa MNullableType then
-                       toolcontext.error(location, "Type {n_type.collect_text} is nullable and thus cannot be the receiver." )
+                       toolcontext.error(location, "Error: type `{n_type.collect_text}` is nullable and thus cannot be the receiver." )
                        return
                end
 
@@ -322,7 +322,7 @@ redef class AFullPropExternCall
                        mmodule, mtype, m_name )
 
                if method == null then
-                       toolcontext.error(location, "Method {m_name} not found in {n_type.collect_text}." )
+                       toolcontext.error(location, "Error: method `{m_name}` not found in `{n_type.collect_text}`." )
                        return
                end
 
@@ -341,7 +341,7 @@ redef class AInitPropExternCall
                if mtype == null then return
 
                if not mtype isa MClassType then
-                       toolcontext.error(location, "Type {n_type.collect_text} is not a class and thus cannot be used to instanciate a new instance." )
+                       toolcontext.error(location, "Error: type `{n_type.collect_text}` is not a class and thus cannot be used to instantiate a new instance." )
                        return
                end
 
@@ -356,7 +356,7 @@ redef class AInitPropExternCall
                end
 
                if meth == null then
-                       toolcontext.error(location, "Method {meth_name} not found in {n_type.collect_text}." )
+                       toolcontext.error(location, "Error: method `{meth_name}` not found in `{n_type.collect_text}`." )
                        return
                end
 
@@ -422,7 +422,7 @@ redef class AAsNotNullableExternCall
        redef fun from_mtype do return n_type.mtype.as_nullable
        redef fun to_mtype do
                var mtype = n_type.mtype.as(not null)
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
                return mtype
        end
 
index ea2e4b4..0b60a1b 100644 (file)
@@ -18,7 +18,7 @@
 #
 # Executing on the module `game_logic` will create the module `game_logic_serial`
 # in the local directory. Mixing the generated module to the main module with
-# `nitg game_logic.nit -m game_logic_serial` will create a program supporting
+# `nitc game_logic.nit -m game_logic_serial` will create a program supporting
 # deserialization of all generic types visible from the main module.
 #
 # Because the generation is limited to the visible types, a module author might want
@@ -69,9 +69,13 @@ redef class ToolContext
        # Where do we put the result?
        var opt_dir: OptionString = new OptionString("Output directory", "--dir")
 
+       # Depth of the visit and generation
+       var opt_depth = new OptionEnum(["module", "group", "project"],
+               "Depth of the visit and generation", 0, "-d", "--depth")
+
        redef init
        do
-               option_context.add_option(opt_output, opt_dir)
+               option_context.add_option(opt_output, opt_dir, opt_depth)
                super
        end
 end
@@ -130,10 +134,8 @@ var modelbuilder = new ModelBuilder(model, toolcontext)
 var mmodules = modelbuilder.parse_full(arguments)
 modelbuilder.run_phases
 
-# Create a distinct support module per targetted modules
+# Create a distinct support module per target modules
 for mmodule in mmodules do
-       var rta = modelbuilder.do_rapid_type_analysis(mmodule)
-
        # Name of the support module
        var module_name
 
@@ -155,13 +157,47 @@ for mmodule in mmodules do
                module_path += ".nit"
        end
 
+       var target_modules = null
+       var importations = null
+       var mgroup = mmodule.mgroup
+       if toolcontext.opt_depth.value == 1 and mgroup != null then
+               modelbuilder.visit_group mgroup
+               target_modules = mgroup.mmodules
+       else if toolcontext.opt_depth.value == 2 then
+               # project
+               target_modules = new Array[MModule]
+               importations = new Array[MModule]
+               if mgroup != null then
+                       for g in mgroup.mproject.mgroups do
+                               target_modules.add_all g.mmodules
+                       end
+
+                       for g in mgroup.in_nesting.direct_smallers do
+                               var dm = g.default_mmodule
+                               if dm != null then
+                                       importations.add dm
+                               end
+                       end
+
+                       for m in mgroup.mmodules do
+                               importations.add m
+                       end
+               end
+       end
+
+       if target_modules == null then target_modules = [mmodule]
+       if importations == null then importations = target_modules
+
        var nit_module = new NitModule(module_name)
        nit_module.header = """
 # This file is generated by nitserial
 # Do not modify, but you can redef
 """
 
-       nit_module.imports.add mmodule.name
+       for importation in importations do
+               nit_module.imports.add importation.name
+       end
+
        nit_module.imports.add "serialization"
 
        nit_module.content.add """
@@ -170,15 +206,25 @@ redef class Deserializer
        do"""
 
        var serializable_type = mmodule.serializable_type
-       for mtype in rta.live_types do
-               # We are only interested in instanciated generics, subtypes of Serializable
-               # and which are visibles.
-               if mtype isa MGenericType and
-                  mtype.is_subtype(mmodule, null, serializable_type) and
-                  mtype.is_visible_from(mmodule) then
-
-                       nit_module.content.add """
+       var compiled_types = new Array[MType]
+       for m in target_modules do
+               nit_module.content.add """
+               # Module: {{{m.to_s}}}"""
+
+               var rta = modelbuilder.do_rapid_type_analysis(m)
+
+               for mtype in rta.live_types do
+                       # We are only interested in instanciated generics, subtypes of Serializable
+                       # and which are visible.
+                       if mtype isa MGenericType and
+                          mtype.is_subtype(m, null, serializable_type) and
+                          mtype.is_visible_from(mmodule) and
+                          not compiled_types.has(mtype) then
+
+                               compiled_types.add mtype
+                               nit_module.content.add """
                if name == \"{{{mtype}}}\" then return new {{{mtype}}}.from_deserializer(self)"""
+                       end
                end
        end
 
index 7969f29..e86f92f 100644 (file)
@@ -53,7 +53,9 @@ end
 var model = new Model
 var modelbuilder = new ModelBuilder(model, toolcontext)
 
-var mmodules = modelbuilder.parse_full(args)
+var module_files = modelbuilder.filter_nit_source(args)
+
+var mmodules = modelbuilder.parse_full(module_files)
 modelbuilder.run_phases
 
 if toolcontext.opt_gen_unit.value then
@@ -65,6 +67,21 @@ var page = new HTMLTag("testsuites")
 
 if toolcontext.opt_full.value then mmodules = model.mmodules
 
+for a in args do
+       if not a.file_exists then
+               toolcontext.fatal_error(null, "Error: cannot load file or module `{a}`.")
+       end
+       # Try to load the file as a markdown document
+       var mdoc = modelbuilder.load_markdown(a)
+       page.add modelbuilder.test_mdoc(mdoc)
+end
+
+for a in module_files do
+       var g = modelbuilder.get_mgroup(a)
+       if g == null then continue
+       page.add modelbuilder.test_group(g)
+end
+
 for m in mmodules do
        page.add modelbuilder.test_markdown(m)
        page.add modelbuilder.test_unit(m)
index 5e5dde3..088cd92 100644 (file)
@@ -18,7 +18,6 @@
 module nitvm
 
 import vm
-import vm_optimizations
 import frontend
 
 # Create a tool context to handle options and paths
diff --git a/src/parser/.gitignore b/src/parser/.gitignore
new file mode 100644 (file)
index 0000000..50e6ab8
--- /dev/null
@@ -0,0 +1,5 @@
+*.class
+org/nitlanguage/gen/analysis/
+org/nitlanguage/gen/lexer/
+org/nitlanguage/gen/node/
+org/nitlanguage/gen/parser/
index db69b26..04657cc 100644 (file)
@@ -38,3 +38,8 @@ maintainer-clean: clean
        @echo "This command is intended for maintainers to use;"
        @echo "it deletes files that may require special tools to rebuild."
        rm -f -- parser.nit parser_abs.nit parser_prod.nit lexer.nit || true
+
+java: .nit.sablecc3
+       rm -r org/nitlanguage/gen/analysis/ org/nitlanguage/gen/lexer/ org/nitlanguage/gen/node/ org/nitlanguage/gen/parser/
+       ${SABLECC3ALTGEN} .nit.sablecc3 -c .nit.sablecc3.dump
+       javac org/nitlanguage/gen/TestParser.java
index 29b46bc..64ceecf 100644 (file)
@@ -27,7 +27,7 @@ In order to simplify the development of the Nit tools, files produced by the par
 * parser_nodes.nit: token and nodes classes hierarchy used by the parser and the lexer
 * tables.nit, tables_nit.h: Interfaces to access the tables needed by the parser and the lexer
 * xss/*.xss: alternate SableCC3 template files for the Nit language
-
+* org/nitlanguage/gen: A Nit parser in Java, used for tests. use the `make java` rule to build it.
 
 The following are generated but present to avoid the need of sablecc3:
 
index 2335cd3..610823a 100644 (file)
@@ -606,7 +606,7 @@ redef class TKwlabel
     end
 end
 
-redef class TKwdebug
+redef class TKwwith
     redef fun parser_index: Int
     do
        return 50
@@ -618,7 +618,7 @@ redef class TKwdebug
     end
 end
 
-redef class TOpar
+redef class TKwdebug
     redef fun parser_index: Int
     do
        return 51
@@ -630,7 +630,7 @@ redef class TOpar
     end
 end
 
-redef class TCpar
+redef class TOpar
     redef fun parser_index: Int
     do
        return 52
@@ -642,7 +642,7 @@ redef class TCpar
     end
 end
 
-redef class TObra
+redef class TCpar
     redef fun parser_index: Int
     do
        return 53
@@ -654,7 +654,7 @@ redef class TObra
     end
 end
 
-redef class TCbra
+redef class TObra
     redef fun parser_index: Int
     do
        return 54
@@ -666,7 +666,7 @@ redef class TCbra
     end
 end
 
-redef class TComma
+redef class TCbra
     redef fun parser_index: Int
     do
        return 55
@@ -678,7 +678,7 @@ redef class TComma
     end
 end
 
-redef class TColumn
+redef class TComma
     redef fun parser_index: Int
     do
        return 56
@@ -690,7 +690,7 @@ redef class TColumn
     end
 end
 
-redef class TQuad
+redef class TColumn
     redef fun parser_index: Int
     do
        return 57
@@ -702,7 +702,7 @@ redef class TQuad
     end
 end
 
-redef class TAssign
+redef class TQuad
     redef fun parser_index: Int
     do
        return 58
@@ -714,7 +714,7 @@ redef class TAssign
     end
 end
 
-redef class TPluseq
+redef class TAssign
     redef fun parser_index: Int
     do
        return 59
@@ -726,7 +726,7 @@ redef class TPluseq
     end
 end
 
-redef class TMinuseq
+redef class TPluseq
     redef fun parser_index: Int
     do
        return 60
@@ -738,7 +738,7 @@ redef class TMinuseq
     end
 end
 
-redef class TDotdotdot
+redef class TMinuseq
     redef fun parser_index: Int
     do
        return 61
@@ -750,7 +750,7 @@ redef class TDotdotdot
     end
 end
 
-redef class TDotdot
+redef class TStareq
     redef fun parser_index: Int
     do
        return 62
@@ -762,7 +762,7 @@ redef class TDotdot
     end
 end
 
-redef class TDot
+redef class TSlasheq
     redef fun parser_index: Int
     do
        return 63
@@ -774,7 +774,7 @@ redef class TDot
     end
 end
 
-redef class TPlus
+redef class TPercenteq
     redef fun parser_index: Int
     do
        return 64
@@ -786,7 +786,7 @@ redef class TPlus
     end
 end
 
-redef class TMinus
+redef class TStarstareq
     redef fun parser_index: Int
     do
        return 65
@@ -798,7 +798,7 @@ redef class TMinus
     end
 end
 
-redef class TStar
+redef class TLleq
     redef fun parser_index: Int
     do
        return 66
@@ -810,7 +810,7 @@ redef class TStar
     end
 end
 
-redef class TStarstar
+redef class TGgeq
     redef fun parser_index: Int
     do
        return 67
@@ -822,7 +822,7 @@ redef class TStarstar
     end
 end
 
-redef class TSlash
+redef class TDotdotdot
     redef fun parser_index: Int
     do
        return 68
@@ -834,7 +834,7 @@ redef class TSlash
     end
 end
 
-redef class TPercent
+redef class TDotdot
     redef fun parser_index: Int
     do
        return 69
@@ -846,7 +846,7 @@ redef class TPercent
     end
 end
 
-redef class TEq
+redef class TDot
     redef fun parser_index: Int
     do
        return 70
@@ -858,7 +858,7 @@ redef class TEq
     end
 end
 
-redef class TNe
+redef class TPlus
     redef fun parser_index: Int
     do
        return 71
@@ -870,7 +870,7 @@ redef class TNe
     end
 end
 
-redef class TLt
+redef class TMinus
     redef fun parser_index: Int
     do
        return 72
@@ -882,7 +882,7 @@ redef class TLt
     end
 end
 
-redef class TLe
+redef class TStar
     redef fun parser_index: Int
     do
        return 73
@@ -894,7 +894,7 @@ redef class TLe
     end
 end
 
-redef class TLl
+redef class TStarstar
     redef fun parser_index: Int
     do
        return 74
@@ -906,7 +906,7 @@ redef class TLl
     end
 end
 
-redef class TGt
+redef class TSlash
     redef fun parser_index: Int
     do
        return 75
@@ -918,7 +918,7 @@ redef class TGt
     end
 end
 
-redef class TGe
+redef class TPercent
     redef fun parser_index: Int
     do
        return 76
@@ -930,7 +930,7 @@ redef class TGe
     end
 end
 
-redef class TGg
+redef class TEq
     redef fun parser_index: Int
     do
        return 77
@@ -942,7 +942,7 @@ redef class TGg
     end
 end
 
-redef class TStarship
+redef class TNe
     redef fun parser_index: Int
     do
        return 78
@@ -954,7 +954,7 @@ redef class TStarship
     end
 end
 
-redef class TBang
+redef class TLt
     redef fun parser_index: Int
     do
        return 79
@@ -966,7 +966,7 @@ redef class TBang
     end
 end
 
-redef class TAt
+redef class TLe
     redef fun parser_index: Int
     do
        return 80
@@ -978,7 +978,7 @@ redef class TAt
     end
 end
 
-redef class TClassid
+redef class TLl
     redef fun parser_index: Int
     do
        return 81
@@ -990,7 +990,7 @@ redef class TClassid
     end
 end
 
-redef class TId
+redef class TGt
     redef fun parser_index: Int
     do
        return 82
@@ -1002,7 +1002,7 @@ redef class TId
     end
 end
 
-redef class TAttrid
+redef class TGe
     redef fun parser_index: Int
     do
        return 83
@@ -1014,7 +1014,7 @@ redef class TAttrid
     end
 end
 
-redef class TNumber
+redef class TGg
     redef fun parser_index: Int
     do
        return 84
@@ -1026,7 +1026,7 @@ redef class TNumber
     end
 end
 
-redef class THexNumber
+redef class TStarship
     redef fun parser_index: Int
     do
        return 85
@@ -1038,7 +1038,7 @@ redef class THexNumber
     end
 end
 
-redef class TFloat
+redef class TBang
     redef fun parser_index: Int
     do
        return 86
@@ -1050,7 +1050,7 @@ redef class TFloat
     end
 end
 
-redef class TString
+redef class TAt
     redef fun parser_index: Int
     do
        return 87
@@ -1062,7 +1062,7 @@ redef class TString
     end
 end
 
-redef class TStartString
+redef class TClassid
     redef fun parser_index: Int
     do
        return 88
@@ -1074,7 +1074,7 @@ redef class TStartString
     end
 end
 
-redef class TMidString
+redef class TId
     redef fun parser_index: Int
     do
        return 89
@@ -1086,7 +1086,7 @@ redef class TMidString
     end
 end
 
-redef class TEndString
+redef class TAttrid
     redef fun parser_index: Int
     do
        return 90
@@ -1098,7 +1098,7 @@ redef class TEndString
     end
 end
 
-redef class TChar
+redef class TNumber
     redef fun parser_index: Int
     do
        return 91
@@ -1110,7 +1110,7 @@ redef class TChar
     end
 end
 
-redef class TBadString
+redef class THexNumber
     redef fun parser_index: Int
     do
        return 92
@@ -1122,7 +1122,7 @@ redef class TBadString
     end
 end
 
-redef class TBadChar
+redef class TFloat
     redef fun parser_index: Int
     do
        return 93
@@ -1134,7 +1134,7 @@ redef class TBadChar
     end
 end
 
-redef class TExternCodeSegment
+redef class TString
     redef fun parser_index: Int
     do
        return 94
@@ -1146,11 +1146,95 @@ redef class TExternCodeSegment
     end
 end
 
+redef class TStartString
+    redef fun parser_index: Int
+    do
+       return 95
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TMidString
+    redef fun parser_index: Int
+    do
+       return 96
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TEndString
+    redef fun parser_index: Int
+    do
+       return 97
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TChar
+    redef fun parser_index: Int
+    do
+       return 98
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TBadString
+    redef fun parser_index: Int
+    do
+       return 99
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TBadChar
+    redef fun parser_index: Int
+    do
+       return 100
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
+redef class TExternCodeSegment
+    redef fun parser_index: Int
+    do
+       return 101
+    end
+
+    init init_tk(loc: Location)
+    do
+               _location = loc
+    end
+end
+
 
 redef class EOF
     redef fun parser_index: Int
     do
-       return 95
+       return 102
     end
 end
 
@@ -1308,138 +1392,159 @@ redef class Lexer
                        return new TKwlabel.init_tk(location)
                end
                if accept_token == 51 then
-                       return new TKwdebug.init_tk(location)
+                       return new TKwwith.init_tk(location)
                end
                if accept_token == 52 then
-                       return new TOpar.init_tk(location)
+                       return new TKwdebug.init_tk(location)
                end
                if accept_token == 53 then
-                       return new TCpar.init_tk(location)
+                       return new TOpar.init_tk(location)
                end
                if accept_token == 54 then
-                       return new TObra.init_tk(location)
+                       return new TCpar.init_tk(location)
                end
                if accept_token == 55 then
-                       return new TCbra.init_tk(location)
+                       return new TObra.init_tk(location)
                end
                if accept_token == 56 then
-                       return new TComma.init_tk(location)
+                       return new TCbra.init_tk(location)
                end
                if accept_token == 57 then
-                       return new TColumn.init_tk(location)
+                       return new TComma.init_tk(location)
                end
                if accept_token == 58 then
-                       return new TQuad.init_tk(location)
+                       return new TColumn.init_tk(location)
                end
                if accept_token == 59 then
-                       return new TAssign.init_tk(location)
+                       return new TQuad.init_tk(location)
                end
                if accept_token == 60 then
-                       return new TPluseq.init_tk(location)
+                       return new TAssign.init_tk(location)
                end
                if accept_token == 61 then
-                       return new TMinuseq.init_tk(location)
+                       return new TPluseq.init_tk(location)
                end
                if accept_token == 62 then
-                       return new TDotdotdot.init_tk(location)
+                       return new TMinuseq.init_tk(location)
                end
                if accept_token == 63 then
-                       return new TDotdot.init_tk(location)
+                       return new TStareq.init_tk(location)
                end
                if accept_token == 64 then
-                       return new TDot.init_tk(location)
+                       return new TSlasheq.init_tk(location)
                end
                if accept_token == 65 then
-                       return new TPlus.init_tk(location)
+                       return new TPercenteq.init_tk(location)
                end
                if accept_token == 66 then
-                       return new TMinus.init_tk(location)
+                       return new TStarstareq.init_tk(location)
                end
                if accept_token == 67 then
-                       return new TStar.init_tk(location)
+                       return new TLleq.init_tk(location)
                end
                if accept_token == 68 then
-                       return new TStarstar.init_tk(location)
+                       return new TGgeq.init_tk(location)
                end
                if accept_token == 69 then
-                       return new TSlash.init_tk(location)
+                       return new TDotdotdot.init_tk(location)
                end
                if accept_token == 70 then
-                       return new TPercent.init_tk(location)
+                       return new TDotdot.init_tk(location)
                end
                if accept_token == 71 then
-                       return new TEq.init_tk(location)
+                       return new TDot.init_tk(location)
                end
                if accept_token == 72 then
-                       return new TNe.init_tk(location)
+                       return new TPlus.init_tk(location)
                end
                if accept_token == 73 then
-                       return new TLt.init_tk(location)
+                       return new TMinus.init_tk(location)
                end
                if accept_token == 74 then
-                       return new TLe.init_tk(location)
+                       return new TStar.init_tk(location)
                end
                if accept_token == 75 then
-                       return new TLl.init_tk(location)
+                       return new TStarstar.init_tk(location)
                end
                if accept_token == 76 then
-                       return new TGt.init_tk(location)
+                       return new TSlash.init_tk(location)
                end
                if accept_token == 77 then
-                       return new TGe.init_tk(location)
+                       return new TPercent.init_tk(location)
                end
                if accept_token == 78 then
-                       return new TGg.init_tk(location)
+                       return new TEq.init_tk(location)
                end
                if accept_token == 79 then
-                       return new TStarship.init_tk(location)
+                       return new TNe.init_tk(location)
                end
                if accept_token == 80 then
-                       return new TBang.init_tk(location)
+                       return new TLt.init_tk(location)
                end
                if accept_token == 81 then
-                       return new TAt.init_tk(location)
+                       return new TLe.init_tk(location)
                end
                if accept_token == 82 then
-                       return new TClassid.init_tk(location)
+                       return new TLl.init_tk(location)
                end
                if accept_token == 83 then
-                       return new TId.init_tk(location)
+                       return new TGt.init_tk(location)
                end
                if accept_token == 84 then
-                       return new TAttrid.init_tk(location)
+                       return new TGe.init_tk(location)
                end
                if accept_token == 85 then
-                       return new TNumber.init_tk(location)
+                       return new TGg.init_tk(location)
                end
                if accept_token == 86 then
-                       return new THexNumber.init_tk(location)
+                       return new TStarship.init_tk(location)
                end
                if accept_token == 87 then
-                       return new TFloat.init_tk(location)
+                       return new TBang.init_tk(location)
                end
                if accept_token == 88 then
-                       return new TString.init_tk(location)
+                       return new TAt.init_tk(location)
                end
                if accept_token == 89 then
-                       return new TStartString.init_tk(location)
+                       return new TClassid.init_tk(location)
                end
                if accept_token == 90 then
-                       return new TMidString.init_tk(location)
+                       return new TId.init_tk(location)
                end
                if accept_token == 91 then
-                       return new TEndString.init_tk(location)
+                       return new TAttrid.init_tk(location)
                end
                if accept_token == 92 then
-                       return new TChar.init_tk(location)
+                       return new TNumber.init_tk(location)
                end
                if accept_token == 93 then
-                       return new TBadString.init_tk(location)
+                       return new THexNumber.init_tk(location)
                end
                if accept_token == 94 then
-                       return new TBadChar.init_tk(location)
+                       return new TFloat.init_tk(location)
                end
                if accept_token == 95 then
+                       return new TString.init_tk(location)
+               end
+               if accept_token == 96 then
+                       return new TStartString.init_tk(location)
+               end
+               if accept_token == 97 then
+                       return new TMidString.init_tk(location)
+               end
+               if accept_token == 98 then
+                       return new TEndString.init_tk(location)
+               end
+               if accept_token == 99 then
+                       return new TChar.init_tk(location)
+               end
+               if accept_token == 100 then
+                       return new TBadString.init_tk(location)
+               end
+               if accept_token == 101 then
+                       return new TBadChar.init_tk(location)
+               end
+               if accept_token == 102 then
                        return new TExternCodeSegment.init_tk(location)
                end
                abort # unknown token index `accept_token`
index b933208..0f06bce 100644 (file)
@@ -234,20 +234,21 @@ class Lexer
                                end
                        else
                                if accept_state != -1 then
-                                       var location = new Location(file, start_line + 1, accept_line + 1, start_pos + 1, accept_pos)
                                        _pos = accept_pos
                                        _line = accept_line
                                        _stream_pos = start_stream_pos + accept_length
                                        if accept_token == 0 then
+                                               # Ignored token (whitespaces)
                                                return null
                                        end
+                                       var location = new Location(file, start_line + 1, accept_line + 1, start_pos + 1, accept_pos)
                                        return make_token(accept_token, location)
                                else
                                        _stream_pos = sp
                                        var location = new Location(file, start_line + 1, start_line + 1, start_pos + 1, start_pos + 1)
                                        if sp > start_stream_pos then
                                                var text = string.substring(start_stream_pos, sp-start_stream_pos)
-                                               var token = new ALexerError.init_lexer_error("Syntax error: unknown token {text}.", location, text)
+                                               var token = new ALexerError.init_lexer_error("Syntax Error: unknown token `{text}`.", location, text)
                                                file.last_token = token
                                                return token
                                        else
index 7d92ae8..5ca0e37 100644 (file)
@@ -145,6 +145,7 @@ kwas = 'as';
 kwnullable = 'nullable';
 kwisset = 'isset';
 kwlabel = 'label';
+kwwith = 'with';
 kwdebug = '__debug__';
 
 opar = '(';
@@ -157,6 +158,12 @@ quad = '::';
 assign = '=';
 pluseq = '+=';
 minuseq = '-=';
+stareq = '*=';
+slasheq = '/=';
+percenteq = '%=';
+starstareq = '**=';
+lleq = '<<=';
+ggeq = '>>=';
 dotdotdot = '...';
 dotdot = '..';
 dot = '.';
@@ -416,6 +423,7 @@ stmt~withelse~noexpr~nopar {-> expr}
        | {while} while~withelse {-> while~withelse.expr}
        | {loop} loop~withelse {-> loop~withelse.expr}
        | {for} for~withelse {-> for~withelse.expr}
+       | {with} with~withelse {-> with~withelse.expr}
        | {assert} assert~withelse {-> assert~withelse.expr}
 !noexpr        | {call} recv qid args_nopar {-> New expr.call(recv.expr, qid.id, args_nopar.exprs)}
 !noexpr        | {super} qualified_o kwsuper args_nopar {-> New expr.super(qualified_o.qualified, kwsuper, args_nopar.exprs)}
@@ -441,6 +449,12 @@ assignment~nopar {-> expr}
 assign_op
        = {plus} pluseq
        | {minus} minuseq
+       | {star} stareq
+       | {slash} slasheq
+       | {percent} percenteq
+       | {starstar} starstareq
+       | {ll} lleq
+       | {gg} ggeq
        ;
 
 do~withelse {-> expr}
@@ -474,6 +488,16 @@ for~withelse {-> expr}
        | {nolabel} kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso~withelse {-> New expr.for(kwfor, [ids.id], expr, kwdo, stmtso~withelse.expr, Null)}
        ;
 
+with~withelse {-> expr}
+       = kwwith no withexpr [n4]:no kwdo stmtso_withend label {-> New expr.with(kwwith, withexpr.expr, kwdo, stmtso_withend.expr, label)}
+       | {nolabel} kwwith no withexpr [n4]:no kwdo stmtso~withelse {-> New expr.with(kwwith, withexpr.expr, kwdo, stmtso~withelse.expr, Null)}
+       ;
+
+withexpr {-> expr}
+       = {assign} id annotations? typing_o assign no expr {-> New expr.vardecl(Null, id, typing_o.type, assign, expr.expr, annotations)}
+       | expr {-> expr}
+       ;
+
 assert~withelse {-> expr}
        = {else} kwassert assertid? expr kwelse stmtso~withelse {-> New expr.assert(kwassert, assertid.id, expr, stmtso~withelse.expr)}
 !withelse| {noelse} kwassert assertid? expr {-> New expr.assert(kwassert, assertid.id, expr, Null)}
@@ -489,10 +513,10 @@ expr~nopar~nobra {-> expr}
 
 expr_and~nopar~nobra {-> expr}
        = expr_not~nopar~nobra {-> expr_not~nopar~nobra.expr}
-       | {:or} expr_and~nopar~nobra :kwor :no expr_not~nopar~nobra
-       | {:and} expr_and~nopar~nobra :kwand :no expr_not~nopar~nobra
-       | {:or_else} expr_and~nopar~nobra :kwor :kwelse :no expr_not~nopar~nobra
-       | {:implies} expr_and~nopar~nobra :kwimplies :no expr_not~nopar~nobra
+       | {:or} expr_and~nopar~nobra kwor :no expr_not~nopar~nobra
+       | {:and} expr_and~nopar~nobra kwand :no expr_not~nopar~nobra
+       | {:or_else} expr_and~nopar~nobra kwor kwelse :no expr_not~nopar~nobra
+       | {:implies} expr_and~nopar~nobra kwimplies :no expr_not~nopar~nobra
        ;
 
 expr_not~nopar~nobra {-> expr}
@@ -502,39 +526,40 @@ expr_not~nopar~nobra {-> expr}
 
 expr_eq~nopar~nobra {-> expr}
        = expr_add~nopar~nobra {-> expr_add~nopar~nobra.expr}
-       | {:eq} expr_add~nopar~nobra :eq :no [expr2]:expr_add~nopar~nobra
-       | {:ne} expr_add~nopar~nobra :ne :no [expr2]:expr_add~nopar~nobra
-       | {:lt} expr_add~nopar~nobra :lt :no [expr2]:expr_add~nopar~nobra
-       | {:le} expr_add~nopar~nobra :le :no [expr2]:expr_add~nopar~nobra
-       | {:ll} expr_eq~nopar~nobra :ll :no [expr2]:expr_add~nopar~nobra
-       | {:gt} expr_add~nopar~nobra :gt :no [expr2]:expr_add~nopar~nobra
-       | {:ge} expr_add~nopar~nobra :ge :no [expr2]:expr_add~nopar~nobra
-       | {:gg} expr_eq~nopar~nobra :gg :no [expr2]:expr_add~nopar~nobra
-       | {:starship} expr_add~nopar~nobra :starship :no [expr2]:expr_add~nopar~nobra
-       | {:isa} expr_add~nopar~nobra :kwisa :no type~nobra
+       | {:eq} expr_add~nopar~nobra eq :no [expr2]:expr_add~nopar~nobra
+       | {:ne} expr_add~nopar~nobra ne :no [expr2]:expr_add~nopar~nobra
+       | {:lt} expr_add~nopar~nobra lt :no [expr2]:expr_add~nopar~nobra
+       | {:le} expr_add~nopar~nobra le :no [expr2]:expr_add~nopar~nobra
+       | {:ll} expr_eq~nopar~nobra ll :no [expr2]:expr_add~nopar~nobra
+       | {:gt} expr_add~nopar~nobra gt :no [expr2]:expr_add~nopar~nobra
+       | {:ge} expr_add~nopar~nobra ge :no [expr2]:expr_add~nopar~nobra
+       | {:gg} expr_eq~nopar~nobra gg :no [expr2]:expr_add~nopar~nobra
+       | {:starship} expr_add~nopar~nobra starship :no [expr2]:expr_add~nopar~nobra
+       | {:isa} expr_add~nopar~nobra kwisa :no type~nobra
        ;
 
 expr_add~nopar~nobra {-> expr}
        =  expr_mul~nopar~nobra {-> expr_mul~nopar~nobra.expr}
-       | {:plus} expr_add~nopar~nobra :plus :no [expr2]:expr_mul~nopar~nobra
-       | {:minus} expr_add~nopar~nobra :minus :no [expr2]:expr_mul~nopar~nobra
+       | {:plus} expr_add~nopar~nobra plus :no [expr2]:expr_mul~nopar~nobra
+       | {:minus} expr_add~nopar~nobra minus :no [expr2]:expr_mul~nopar~nobra
        ;
 
 expr_mul~nopar~nobra {-> expr}
        = expr_pow~nopar~nobra {-> expr_pow~nopar~nobra.expr}
-       | {:star} expr_mul~nopar~nobra :star :no [expr2]:expr_pow~nopar~nobra
-       | {:slash} expr_mul~nopar~nobra :slash :no [expr2]:expr_pow~nopar~nobra
-       | {:percent} expr_mul~nopar~nobra :percent :no [expr2]:expr_pow~nopar~nobra
+       | {:star} expr_mul~nopar~nobra star :no [expr2]:expr_pow~nopar~nobra
+       | {:slash} expr_mul~nopar~nobra slash :no [expr2]:expr_pow~nopar~nobra
+       | {:percent} expr_mul~nopar~nobra percent :no [expr2]:expr_pow~nopar~nobra
        ;
 
 expr_pow~nopar~nobra {-> expr}
        = expr_minus~nopar~nobra {-> expr_minus~nopar~nobra.expr}
-       | {:starstar} expr_minus~nopar~nobra :starstar :no [expr2]:expr_pow~nopar~nobra
+       | {:starstar} expr_minus~nopar~nobra starstar :no [expr2]:expr_pow~nopar~nobra
        ;
 
 expr_minus~nopar~nobra {-> expr}
        = expr_new~nopar~nobra {-> expr_new~nopar~nobra.expr}
        | {:uminus} minus expr_minus~nobra
+       | {:uplus} plus expr_minus~nobra
        | {:once} kwonce :no expr_minus~nobra
        ;
 
@@ -833,7 +858,7 @@ type        = kwnullable? [id]:classid [types]:type* annotations?;
 label = kwlabel id?;
 
 expr   = {block} expr* kwend? 
-       | {vardecl} kwvar id type? assign? expr? annotations?
+       | {vardecl} kwvar? id type? assign? expr? annotations?
        | {return} kwreturn? expr?
        | {break} kwbreak label?
        | {abort} kwabort
@@ -844,32 +869,34 @@ expr      = {block} expr* kwend?
        | {while} kwwhile expr kwdo [block]:expr? label?
        | {loop} kwloop [block]:expr? label?
        | {for} kwfor [ids]:id* expr kwdo [block]:expr? label?
+       | {with} kwwith expr kwdo [block]:expr? label?
        | {assert} kwassert id? expr [else]:expr?
        | {once} kwonce expr 
        | {send} expr 
        | {binop} expr [expr2]:expr 
-       | {or} expr [expr2]:expr 
-       | {and} expr [expr2]:expr 
-       | {or_else} expr [expr2]:expr
-       | {implies} expr [expr2]:expr
-       | {not} kwnot expr 
-       | {eq} expr [expr2]:expr 
-       | {ne} expr [expr2]:expr 
-       | {lt} expr [expr2]:expr 
-       | {le} expr [expr2]:expr 
-       | {ll} expr [expr2]:expr
-       | {gt} expr [expr2]:expr 
-       | {ge} expr [expr2]:expr 
-       | {gg} expr [expr2]:expr
-       | {isa} expr type 
-       | {plus} expr [expr2]:expr 
-       | {minus} expr [expr2]:expr 
-       | {starship} expr [expr2]:expr 
-       | {star} expr [expr2]:expr 
-       | {starstar} expr [expr2]:expr
-       | {slash} expr [expr2]:expr 
-       | {percent} expr [expr2]:expr 
+       | {or} expr [op]:kwor [expr2]:expr
+       | {and} expr [op]:kwand [expr2]:expr
+       | {or_else} expr [op]:kwor kwelse [expr2]:expr
+       | {implies} expr [op]:kwimplies [expr2]:expr
+       | {not} kwnot expr
+       | {eq} expr [op]:eq [expr2]:expr
+       | {ne} expr [op]:ne [expr2]:expr
+       | {lt} expr [op]:lt [expr2]:expr
+       | {le} expr [op]:le [expr2]:expr
+       | {ll} expr [op]:ll [expr2]:expr
+       | {gt} expr [op]:gt [expr2]:expr
+       | {ge} expr [op]:ge [expr2]:expr
+       | {gg} expr [op]:gg [expr2]:expr
+       | {isa} expr kwisa type
+       | {plus} expr [op]:plus [expr2]:expr
+       | {minus} expr [op]:minus [expr2]:expr
+       | {starship} expr [op]:starship [expr2]:expr
+       | {star} expr [op]:star [expr2]:expr
+       | {starstar} expr [op]:starstar [expr2]:expr
+       | {slash} expr [op]:slash [expr2]:expr
+       | {percent} expr [op]:percent [expr2]:expr
        | {uminus} minus expr 
+       | {uplus} plus expr
        | {new} kwnew type id? [args]:exprs
        | {attr} expr [id]:attrid 
        | {attr_assign} expr [id]:attrid assign [value]:expr 
@@ -920,8 +947,14 @@ exprs
        | {bra} obra [exprs]:expr* cbra
        ;
 assign_op
-       = {plus} pluseq
-       | {minus} minuseq
+       = {plus} [op]:pluseq
+       | {minus}[op]:minuseq
+       | {star} [op]:stareq
+       | {slash} [op]:slasheq
+       | {percent} [op]:percenteq
+       | {starstar} [op]:starstareq
+       | {ll} [op]:lleq
+       | {gg} [op]:ggeq
        ;
 
 module_name = quad? [path]:id* id;
diff --git a/src/parser/org/nitlanguage/gen/TestParser.java b/src/parser/org/nitlanguage/gen/TestParser.java
new file mode 100644 (file)
index 0000000..06ec83f
--- /dev/null
@@ -0,0 +1,56 @@
+/* This file is part of NIT ( http://www.nitlanguage.org ).
+ *
+ * This file is free software, which comes along with NIT.  This software is
+ * distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without  even  the implied warranty of  MERCHANTABILITY or  FITNESS FOR A
+ * PARTICULAR PURPOSE.  You can modify it is you want,  provided this header
+ * is kept unaltered, and a notification of the changes is added.
+ * You  are  allowed  to  redistribute it and sell it, alone or is a part of
+ * another product.
+ */
+
+package org.nitlanguage.gen;
+
+import java.io.*;
+import java.nio.file.*;
+
+import org.nitlanguage.gen.lexer.*;
+import org.nitlanguage.gen.parser.*;
+import org.nitlanguage.gen.analysis.*;
+import org.nitlanguage.gen.node.*;
+
+public class TestParser extends DepthFirstAdapter {
+       public static void main(String[] args) throws Exception {
+               if (args.length == 0) {
+                       BufferedReader ir = new BufferedReader(new InputStreamReader(System.in));
+                       work(ir);
+               } else {
+                       for(int i=0; i<args.length; i++) {
+                               //System.out.println(args[i]);
+
+                               //Here we use "ISO-8859-1" because we want to opaquely treat Bytes as characters.
+                               //Unfortunately "US-ASCII" does not seems to do the job for values>127.
+                               BufferedReader ir = new BufferedReader(new InputStreamReader(new FileInputStream(args[i]), "ISO-8859-1"));
+
+                               work(ir);
+                       }
+               }
+       }
+
+       public static void work(BufferedReader ir) {
+               TestParser testParser = new TestParser();
+               try {
+                       PushbackReader r = new PushbackReader(ir, 1024);
+                       Parser parser = new Parser(new Lexer(r));
+                       Node syntaxTree = parser.parse();
+                       syntaxTree.apply(testParser);
+               } catch (LexerException e) {
+                       System.out.println(e.getMessage() + ".");
+               } catch (ParserException e) {
+                       System.out.println(e.getMessage() + ".");
+               } catch (IOException e) {
+                       System.out.println(e.getMessage() + ".");
+                       System.exit(1);
+               }
+       }
+}
index 733ceef..a5172f7 100644 (file)
@@ -186,31 +186,31 @@ redef class Parser
                        new ReduceAction153(44),
                        new ReduceAction153(44),
                        new ReduceAction153(44),
-                       new ReduceAction176(44),
+                       new ReduceAction153(44),
                        new ReduceAction177(44),
                        new ReduceAction178(44),
-                       new ReduceAction177(44),
-                       new ReduceAction180(44),
+                       new ReduceAction179(44),
+                       new ReduceAction178(44),
                        new ReduceAction181(44),
                        new ReduceAction182(44),
-                       new ReduceAction181(44),
-                       new ReduceAction184(44),
+                       new ReduceAction183(44),
+                       new ReduceAction182(44),
                        new ReduceAction185(44),
                        new ReduceAction186(44),
                        new ReduceAction187(44),
                        new ReduceAction188(44),
-                       new ReduceAction187(44),
-                       new ReduceAction190(44),
+                       new ReduceAction189(44),
+                       new ReduceAction188(44),
+                       new ReduceAction191(44),
+                       new ReduceAction192(44),
                        new ReduceAction191(44),
-                       new ReduceAction190(44),
-                       new ReduceAction193(44),
-                       new ReduceAction194(45),
+                       new ReduceAction194(44),
                        new ReduceAction195(45),
-                       new ReduceAction196(46),
+                       new ReduceAction196(45),
                        new ReduceAction197(46),
                        new ReduceAction198(46),
                        new ReduceAction199(46),
-                       new ReduceAction200(47),
+                       new ReduceAction200(46),
                        new ReduceAction201(47),
                        new ReduceAction202(47),
                        new ReduceAction203(47),
@@ -218,17 +218,17 @@ redef class Parser
                        new ReduceAction205(47),
                        new ReduceAction206(47),
                        new ReduceAction207(47),
-                       new ReduceAction204(47),
+                       new ReduceAction208(47),
                        new ReduceAction205(47),
-                       new ReduceAction210(47),
+                       new ReduceAction206(47),
                        new ReduceAction211(47),
                        new ReduceAction212(47),
                        new ReduceAction213(47),
                        new ReduceAction214(47),
                        new ReduceAction215(47),
-                       new ReduceAction212(47),
+                       new ReduceAction216(47),
                        new ReduceAction213(47),
-                       new ReduceAction218(47),
+                       new ReduceAction214(47),
                        new ReduceAction219(47),
                        new ReduceAction220(47),
                        new ReduceAction221(47),
@@ -237,681 +237,662 @@ redef class Parser
                        new ReduceAction224(47),
                        new ReduceAction225(47),
                        new ReduceAction226(47),
-                       new ReduceAction223(47),
+                       new ReduceAction227(47),
                        new ReduceAction224(47),
-                       new ReduceAction229(47),
+                       new ReduceAction225(47),
                        new ReduceAction230(47),
                        new ReduceAction231(47),
                        new ReduceAction232(47),
                        new ReduceAction233(47),
                        new ReduceAction234(47),
-                       new ReduceAction231(47),
+                       new ReduceAction235(47),
                        new ReduceAction232(47),
-                       new ReduceAction237(47),
-                       new ReduceAction238(48),
+                       new ReduceAction233(47),
+                       new ReduceAction238(47),
                        new ReduceAction239(48),
-                       new ReduceAction240(49),
-                       new ReduceAction241(49),
-                       new ReduceAction242(50),
-                       new ReduceAction243(50),
-                       new ReduceAction244(50),
-                       new ReduceAction245(50),
-                       new ReduceAction246(50),
+                       new ReduceAction240(48),
+                       new ReduceAction241(48),
+                       new ReduceAction242(48),
+                       new ReduceAction243(48),
+                       new ReduceAction244(48),
+                       new ReduceAction245(48),
+                       new ReduceAction246(48),
+                       new ReduceAction247(49),
+                       new ReduceAction248(49),
+                       new ReduceAction249(50),
+                       new ReduceAction250(50),
+                       new ReduceAction251(50),
+                       new ReduceAction252(50),
+                       new ReduceAction253(50),
                        new ReduceAction150(51),
                        new ReduceAction152(51),
-                       new ReduceAction249(52),
-                       new ReduceAction250(52),
-                       new ReduceAction251(53),
-                       new ReduceAction252(53),
-                       new ReduceAction253(54),
-                       new ReduceAction254(54),
-                       new ReduceAction255(55),
-                       new ReduceAction256(55),
-                       new ReduceAction257(55),
-                       new ReduceAction258(55),
-                       new ReduceAction259(56),
-                       new ReduceAction153(57),
-                       new ReduceAction261(57),
-                       new ReduceAction153(58),
-                       new ReduceAction263(58),
-                       new ReduceAction264(58),
-                       new ReduceAction265(58),
-                       new ReduceAction266(58),
+                       new ReduceAction256(52),
+                       new ReduceAction257(52),
+                       new ReduceAction258(53),
+                       new ReduceAction259(53),
+                       new ReduceAction260(54),
+                       new ReduceAction261(54),
+                       new ReduceAction262(55),
+                       new ReduceAction263(55),
+                       new ReduceAction264(56),
+                       new ReduceAction265(56),
+                       new ReduceAction153(56),
+                       new ReduceAction267(57),
+                       new ReduceAction268(57),
+                       new ReduceAction269(57),
+                       new ReduceAction270(57),
+                       new ReduceAction271(58),
                        new ReduceAction153(59),
-                       new ReduceAction268(59),
+                       new ReduceAction273(59),
                        new ReduceAction153(60),
-                       new ReduceAction270(60),
-                       new ReduceAction271(60),
-                       new ReduceAction272(60),
-                       new ReduceAction273(60),
-                       new ReduceAction274(60),
                        new ReduceAction275(60),
                        new ReduceAction276(60),
                        new ReduceAction277(60),
                        new ReduceAction278(60),
-                       new ReduceAction279(60),
                        new ReduceAction153(61),
-                       new ReduceAction281(61),
-                       new ReduceAction282(61),
+                       new ReduceAction280(61),
                        new ReduceAction153(62),
+                       new ReduceAction282(62),
+                       new ReduceAction283(62),
                        new ReduceAction284(62),
                        new ReduceAction285(62),
                        new ReduceAction286(62),
+                       new ReduceAction287(62),
+                       new ReduceAction288(62),
+                       new ReduceAction289(62),
+                       new ReduceAction290(62),
+                       new ReduceAction291(62),
                        new ReduceAction153(63),
-                       new ReduceAction288(63),
+                       new ReduceAction293(63),
+                       new ReduceAction294(63),
                        new ReduceAction153(64),
-                       new ReduceAction290(64),
-                       new ReduceAction291(64),
+                       new ReduceAction296(64),
+                       new ReduceAction297(64),
+                       new ReduceAction298(64),
                        new ReduceAction153(65),
-                       new ReduceAction293(65),
-                       new ReduceAction294(65),
-                       new ReduceAction295(65),
-                       new ReduceAction296(65),
+                       new ReduceAction300(65),
                        new ReduceAction153(66),
-                       new ReduceAction298(66),
-                       new ReduceAction299(66),
-                       new ReduceAction176(66),
-                       new ReduceAction301(66),
-                       new ReduceAction177(66),
+                       new ReduceAction302(66),
                        new ReduceAction303(66),
-                       new ReduceAction178(66),
-                       new ReduceAction305(66),
-                       new ReduceAction177(66),
-                       new ReduceAction303(66),
-                       new ReduceAction180(66),
-                       new ReduceAction309(66),
-                       new ReduceAction181(66),
-                       new ReduceAction311(66),
-                       new ReduceAction182(66),
-                       new ReduceAction313(66),
-                       new ReduceAction181(66),
-                       new ReduceAction311(66),
-                       new ReduceAction184(66),
-                       new ReduceAction317(66),
-                       new ReduceAction185(66),
-                       new ReduceAction319(66),
-                       new ReduceAction186(66),
-                       new ReduceAction321(66),
-                       new ReduceAction322(66),
-                       new ReduceAction323(66),
-                       new ReduceAction324(66),
-                       new ReduceAction325(66),
-                       new ReduceAction326(66),
-                       new ReduceAction327(66),
-                       new ReduceAction328(66),
-                       new ReduceAction325(66),
-                       new ReduceAction326(66),
-                       new ReduceAction331(66),
-                       new ReduceAction332(66),
-                       new ReduceAction333(66),
-                       new ReduceAction334(66),
-                       new ReduceAction335(67),
-                       new ReduceAction336(67),
-                       new ReduceAction337(67),
-                       new ReduceAction338(67),
-                       new ReduceAction339(67),
-                       new ReduceAction340(67),
-                       new ReduceAction341(67),
-                       new ReduceAction342(67),
-                       new ReduceAction343(67),
-                       new ReduceAction153(67),
+                       new ReduceAction304(66),
                        new ReduceAction153(67),
-                       new ReduceAction346(67),
-                       new ReduceAction347(67),
-                       new ReduceAction348(67),
-                       new ReduceAction349(68),
-                       new ReduceAction349(68),
+                       new ReduceAction306(67),
+                       new ReduceAction307(67),
+                       new ReduceAction308(67),
+                       new ReduceAction309(67),
+                       new ReduceAction153(68),
+                       new ReduceAction311(68),
+                       new ReduceAction312(68),
+                       new ReduceAction177(68),
+                       new ReduceAction314(68),
+                       new ReduceAction178(68),
+                       new ReduceAction316(68),
+                       new ReduceAction179(68),
+                       new ReduceAction318(68),
+                       new ReduceAction178(68),
+                       new ReduceAction316(68),
+                       new ReduceAction181(68),
+                       new ReduceAction322(68),
+                       new ReduceAction182(68),
+                       new ReduceAction324(68),
+                       new ReduceAction183(68),
+                       new ReduceAction326(68),
+                       new ReduceAction182(68),
+                       new ReduceAction324(68),
+                       new ReduceAction185(68),
+                       new ReduceAction330(68),
+                       new ReduceAction186(68),
+                       new ReduceAction332(68),
+                       new ReduceAction187(68),
+                       new ReduceAction334(68),
+                       new ReduceAction335(68),
+                       new ReduceAction336(68),
+                       new ReduceAction337(68),
+                       new ReduceAction338(68),
+                       new ReduceAction339(68),
+                       new ReduceAction340(68),
+                       new ReduceAction341(68),
+                       new ReduceAction338(68),
+                       new ReduceAction339(68),
+                       new ReduceAction344(68),
+                       new ReduceAction345(68),
+                       new ReduceAction346(68),
+                       new ReduceAction347(68),
+                       new ReduceAction348(69),
+                       new ReduceAction349(69),
+                       new ReduceAction350(69),
                        new ReduceAction351(69),
-                       new ReduceAction352(70),
-                       new ReduceAction353(71),
-                       new ReduceAction354(71),
-                       new ReduceAction352(72),
-                       new ReduceAction356(73),
-                       new ReduceAction254(73),
-                       new ReduceAction358(73),
-                       new ReduceAction359(74),
-                       new ReduceAction360(74),
-                       new ReduceAction361(75),
-                       new ReduceAction362(75),
-                       new ReduceAction363(76),
-                       new ReduceAction361(77),
-                       new ReduceAction362(77),
-                       new ReduceAction366(78),
-                       new ReduceAction367(79),
-                       new ReduceAction368(80),
-                       new ReduceAction369(80),
-                       new ReduceAction370(81),
-                       new ReduceAction22(81),
-                       new ReduceAction372(82),
-                       new ReduceAction373(82),
-                       new ReduceAction374(83),
-                       new ReduceAction375(84),
-                       new ReduceAction376(84),
-                       new ReduceAction372(85),
-                       new ReduceAction373(85),
-                       new ReduceAction379(85),
-                       new ReduceAction153(86),
-                       new ReduceAction381(87),
-                       new ReduceAction374(88),
-                       new ReduceAction383(89),
-                       new ReduceAction384(89),
-                       new ReduceAction385(89),
-                       new ReduceAction386(89),
-                       new ReduceAction387(89),
-                       new ReduceAction388(90),
-                       new ReduceAction389(90),
-                       new ReduceAction390(90),
-                       new ReduceAction391(90),
-                       new ReduceAction392(90),
-                       new ReduceAction353(91),
-                       new ReduceAction354(91),
-                       new ReduceAction352(92),
-                       new ReduceAction396(93),
-                       new ReduceAction153(93),
-                       new ReduceAction153(93),
-                       new ReduceAction399(93),
-                       new ReduceAction400(93),
-                       new ReduceAction401(93),
-                       new ReduceAction402(94),
-                       new ReduceAction403(94),
-                       new ReduceAction404(94),
-                       new ReduceAction405(95),
-                       new ReduceAction406(95),
-                       new ReduceAction405(96),
-                       new ReduceAction408(96),
-                       new ReduceAction406(96),
-                       new ReduceAction410(96),
-                       new ReduceAction411(97),
-                       new ReduceAction412(98),
-                       new ReduceAction362(99),
-                       new ReduceAction414(99),
-                       new ReduceAction415(100),
-                       new ReduceAction416(101),
-                       new ReduceAction417(101),
-                       new ReduceAction418(102),
-                       new ReduceAction419(102),
-                       new ReduceAction420(103),
-                       new ReduceAction421(103),
-                       new ReduceAction422(103),
-                       new ReduceAction423(103),
-                       new ReduceAction424(104),
-                       new ReduceAction425(104),
-                       new ReduceAction426(104),
-                       new ReduceAction22(104),
-                       new ReduceAction428(105),
-                       new ReduceAction429(105),
-                       new ReduceAction430(105),
-                       new ReduceAction429(105),
-                       new ReduceAction432(106),
-                       new ReduceAction433(106),
-                       new ReduceAction434(106),
-                       new ReduceAction433(106),
-                       new ReduceAction436(107),
-                       new ReduceAction437(108),
-                       new ReduceAction22(109),
-                       new ReduceAction439(109),
-                       new ReduceAction440(110),
-                       new ReduceAction440(110),
-                       new ReduceAction442(111),
-                       new ReduceAction443(111),
-                       new ReduceAction23(111),
-                       new ReduceAction22(112),
-                       new ReduceAction446(112),
-                       new ReduceAction447(113),
-                       new ReduceAction448(113),
-                       new ReduceAction440(113),
-                       new ReduceAction46(114),
-                       new ReduceAction47(114),
-                       new ReduceAction48(114),
-                       new ReduceAction55(114),
-                       new ReduceAction56(114),
-                       new ReduceAction74(115),
-                       new ReduceAction75(115),
-                       new ReduceAction84(116),
-                       new ReduceAction85(116),
-                       new ReduceAction86(116),
-                       new ReduceAction87(116),
-                       new ReduceAction88(116),
-                       new ReduceAction89(116),
-                       new ReduceAction90(116),
-                       new ReduceAction91(116),
-                       new ReduceAction92(116),
-                       new ReduceAction93(116),
-                       new ReduceAction94(116),
-                       new ReduceAction95(116),
-                       new ReduceAction96(116),
-                       new ReduceAction97(116),
-                       new ReduceAction98(116),
-                       new ReduceAction99(116),
-                       new ReduceAction100(116),
-                       new ReduceAction101(116),
-                       new ReduceAction432(117),
-                       new ReduceAction433(117),
-                       new ReduceAction434(117),
-                       new ReduceAction433(117),
-                       new ReduceAction140(118),
-                       new ReduceAction141(118),
-                       new ReduceAction153(119),
-                       new ReduceAction261(119),
-                       new ReduceAction153(120),
-                       new ReduceAction263(120),
-                       new ReduceAction264(120),
-                       new ReduceAction265(120),
-                       new ReduceAction266(120),
+                       new ReduceAction352(69),
+                       new ReduceAction353(69),
+                       new ReduceAction354(69),
+                       new ReduceAction355(69),
+                       new ReduceAction356(69),
+                       new ReduceAction153(69),
+                       new ReduceAction153(69),
+                       new ReduceAction359(69),
+                       new ReduceAction360(69),
+                       new ReduceAction361(69),
+                       new ReduceAction362(70),
+                       new ReduceAction362(70),
+                       new ReduceAction364(71),
+                       new ReduceAction365(72),
+                       new ReduceAction366(73),
+                       new ReduceAction367(73),
+                       new ReduceAction365(74),
+                       new ReduceAction369(75),
+                       new ReduceAction261(75),
+                       new ReduceAction371(75),
+                       new ReduceAction372(76),
+                       new ReduceAction373(76),
+                       new ReduceAction374(77),
+                       new ReduceAction375(77),
+                       new ReduceAction376(78),
+                       new ReduceAction374(79),
+                       new ReduceAction375(79),
+                       new ReduceAction379(80),
+                       new ReduceAction380(81),
+                       new ReduceAction381(82),
+                       new ReduceAction382(82),
+                       new ReduceAction383(83),
+                       new ReduceAction22(83),
+                       new ReduceAction385(84),
+                       new ReduceAction386(84),
+                       new ReduceAction387(85),
+                       new ReduceAction388(86),
+                       new ReduceAction389(86),
+                       new ReduceAction385(87),
+                       new ReduceAction386(87),
+                       new ReduceAction392(87),
+                       new ReduceAction153(88),
+                       new ReduceAction394(89),
+                       new ReduceAction387(90),
+                       new ReduceAction396(91),
+                       new ReduceAction397(91),
+                       new ReduceAction398(91),
+                       new ReduceAction399(91),
+                       new ReduceAction400(91),
+                       new ReduceAction401(92),
+                       new ReduceAction402(92),
+                       new ReduceAction403(92),
+                       new ReduceAction404(92),
+                       new ReduceAction405(92),
+                       new ReduceAction366(93),
+                       new ReduceAction367(93),
+                       new ReduceAction365(94),
+                       new ReduceAction409(95),
+                       new ReduceAction153(95),
+                       new ReduceAction153(95),
+                       new ReduceAction412(95),
+                       new ReduceAction413(95),
+                       new ReduceAction414(95),
+                       new ReduceAction415(96),
+                       new ReduceAction416(96),
+                       new ReduceAction417(96),
+                       new ReduceAction418(97),
+                       new ReduceAction419(97),
+                       new ReduceAction418(98),
+                       new ReduceAction421(98),
+                       new ReduceAction419(98),
+                       new ReduceAction423(98),
+                       new ReduceAction424(99),
+                       new ReduceAction425(100),
+                       new ReduceAction375(101),
+                       new ReduceAction427(101),
+                       new ReduceAction428(102),
+                       new ReduceAction429(103),
+                       new ReduceAction430(103),
+                       new ReduceAction431(104),
+                       new ReduceAction432(104),
+                       new ReduceAction433(105),
+                       new ReduceAction434(105),
+                       new ReduceAction435(105),
+                       new ReduceAction436(105),
+                       new ReduceAction437(106),
+                       new ReduceAction438(106),
+                       new ReduceAction439(106),
+                       new ReduceAction22(106),
+                       new ReduceAction441(107),
+                       new ReduceAction442(107),
+                       new ReduceAction443(107),
+                       new ReduceAction442(107),
+                       new ReduceAction445(108),
+                       new ReduceAction446(108),
+                       new ReduceAction447(108),
+                       new ReduceAction446(108),
+                       new ReduceAction449(109),
+                       new ReduceAction450(110),
+                       new ReduceAction22(111),
+                       new ReduceAction452(111),
+                       new ReduceAction453(112),
+                       new ReduceAction453(112),
+                       new ReduceAction455(113),
+                       new ReduceAction456(113),
+                       new ReduceAction23(113),
+                       new ReduceAction22(114),
+                       new ReduceAction459(114),
+                       new ReduceAction460(115),
+                       new ReduceAction461(115),
+                       new ReduceAction453(115),
+                       new ReduceAction46(116),
+                       new ReduceAction47(116),
+                       new ReduceAction48(116),
+                       new ReduceAction55(116),
+                       new ReduceAction56(116),
+                       new ReduceAction74(117),
+                       new ReduceAction75(117),
+                       new ReduceAction84(118),
+                       new ReduceAction85(118),
+                       new ReduceAction86(118),
+                       new ReduceAction87(118),
+                       new ReduceAction88(118),
+                       new ReduceAction89(118),
+                       new ReduceAction90(118),
+                       new ReduceAction91(118),
+                       new ReduceAction92(118),
+                       new ReduceAction93(118),
+                       new ReduceAction94(118),
+                       new ReduceAction95(118),
+                       new ReduceAction96(118),
+                       new ReduceAction97(118),
+                       new ReduceAction98(118),
+                       new ReduceAction99(118),
+                       new ReduceAction100(118),
+                       new ReduceAction101(118),
+                       new ReduceAction445(119),
+                       new ReduceAction446(119),
+                       new ReduceAction447(119),
+                       new ReduceAction446(119),
+                       new ReduceAction140(120),
+                       new ReduceAction141(120),
                        new ReduceAction153(121),
-                       new ReduceAction268(121),
+                       new ReduceAction273(121),
                        new ReduceAction153(122),
-                       new ReduceAction270(122),
-                       new ReduceAction271(122),
-                       new ReduceAction272(122),
-                       new ReduceAction273(122),
-                       new ReduceAction274(122),
                        new ReduceAction275(122),
                        new ReduceAction276(122),
                        new ReduceAction277(122),
                        new ReduceAction278(122),
-                       new ReduceAction279(122),
                        new ReduceAction153(123),
-                       new ReduceAction281(123),
-                       new ReduceAction282(123),
+                       new ReduceAction280(123),
                        new ReduceAction153(124),
+                       new ReduceAction282(124),
+                       new ReduceAction283(124),
                        new ReduceAction284(124),
                        new ReduceAction285(124),
                        new ReduceAction286(124),
+                       new ReduceAction287(124),
+                       new ReduceAction288(124),
+                       new ReduceAction289(124),
+                       new ReduceAction290(124),
+                       new ReduceAction291(124),
                        new ReduceAction153(125),
-                       new ReduceAction288(125),
+                       new ReduceAction293(125),
+                       new ReduceAction294(125),
                        new ReduceAction153(126),
-                       new ReduceAction290(126),
-                       new ReduceAction291(126),
+                       new ReduceAction296(126),
+                       new ReduceAction297(126),
+                       new ReduceAction298(126),
                        new ReduceAction153(127),
-                       new ReduceAction293(127),
-                       new ReduceAction294(127),
-                       new ReduceAction295(127),
-                       new ReduceAction296(127),
+                       new ReduceAction300(127),
                        new ReduceAction153(128),
-                       new ReduceAction298(128),
-                       new ReduceAction299(128),
-                       new ReduceAction176(128),
-                       new ReduceAction180(128),
-                       new ReduceAction301(128),
-                       new ReduceAction309(128),
-                       new ReduceAction177(128),
-                       new ReduceAction181(128),
+                       new ReduceAction302(128),
                        new ReduceAction303(128),
-                       new ReduceAction311(128),
-                       new ReduceAction178(128),
-                       new ReduceAction182(128),
-                       new ReduceAction305(128),
-                       new ReduceAction313(128),
-                       new ReduceAction177(128),
-                       new ReduceAction181(128),
-                       new ReduceAction303(128),
-                       new ReduceAction311(128),
-                       new ReduceAction184(128),
-                       new ReduceAction317(128),
-                       new ReduceAction185(128),
-                       new ReduceAction186(128),
-                       new ReduceAction319(128),
-                       new ReduceAction321(128),
-                       new ReduceAction323(128),
-                       new ReduceAction324(128),
-                       new ReduceAction325(128),
-                       new ReduceAction326(128),
-                       new ReduceAction327(128),
-                       new ReduceAction328(128),
-                       new ReduceAction325(128),
-                       new ReduceAction326(128),
-                       new ReduceAction331(128),
-                       new ReduceAction332(128),
-                       new ReduceAction333(128),
-                       new ReduceAction334(128),
-                       new ReduceAction335(129),
-                       new ReduceAction336(129),
-                       new ReduceAction337(129),
-                       new ReduceAction338(129),
-                       new ReduceAction339(129),
-                       new ReduceAction340(129),
-                       new ReduceAction341(129),
-                       new ReduceAction342(129),
-                       new ReduceAction343(129),
-                       new ReduceAction153(129),
+                       new ReduceAction304(128),
                        new ReduceAction153(129),
-                       new ReduceAction140(130),
-                       new ReduceAction141(130),
-                       new ReduceAction142(130),
-                       new ReduceAction143(130),
-                       new ReduceAction153(131),
-                       new ReduceAction153(131),
-                       new ReduceAction163(131),
-                       new ReduceAction164(131),
-                       new ReduceAction165(131),
-                       new ReduceAction166(131),
-                       new ReduceAction167(131),
-                       new ReduceAction168(131),
-                       new ReduceAction169(131),
-                       new ReduceAction153(131),
-                       new ReduceAction153(131),
+                       new ReduceAction306(129),
+                       new ReduceAction307(129),
+                       new ReduceAction308(129),
+                       new ReduceAction309(129),
+                       new ReduceAction153(130),
+                       new ReduceAction311(130),
+                       new ReduceAction312(130),
+                       new ReduceAction177(130),
+                       new ReduceAction181(130),
+                       new ReduceAction314(130),
+                       new ReduceAction322(130),
+                       new ReduceAction178(130),
+                       new ReduceAction182(130),
+                       new ReduceAction316(130),
+                       new ReduceAction324(130),
+                       new ReduceAction179(130),
+                       new ReduceAction183(130),
+                       new ReduceAction318(130),
+                       new ReduceAction326(130),
+                       new ReduceAction178(130),
+                       new ReduceAction182(130),
+                       new ReduceAction316(130),
+                       new ReduceAction324(130),
+                       new ReduceAction185(130),
+                       new ReduceAction330(130),
+                       new ReduceAction186(130),
+                       new ReduceAction187(130),
+                       new ReduceAction332(130),
+                       new ReduceAction334(130),
+                       new ReduceAction336(130),
+                       new ReduceAction337(130),
+                       new ReduceAction338(130),
+                       new ReduceAction339(130),
+                       new ReduceAction340(130),
+                       new ReduceAction341(130),
+                       new ReduceAction338(130),
+                       new ReduceAction339(130),
+                       new ReduceAction344(130),
+                       new ReduceAction345(130),
+                       new ReduceAction346(130),
+                       new ReduceAction347(130),
+                       new ReduceAction348(131),
+                       new ReduceAction349(131),
+                       new ReduceAction350(131),
+                       new ReduceAction351(131),
+                       new ReduceAction352(131),
+                       new ReduceAction353(131),
+                       new ReduceAction354(131),
+                       new ReduceAction355(131),
+                       new ReduceAction356(131),
                        new ReduceAction153(131),
                        new ReduceAction153(131),
-                       new ReduceAction153(131),
-                       new ReduceAction153(131),
-                       new ReduceAction176(131),
-                       new ReduceAction177(131),
-                       new ReduceAction178(131),
-                       new ReduceAction177(131),
-                       new ReduceAction180(131),
-                       new ReduceAction181(131),
-                       new ReduceAction182(131),
-                       new ReduceAction181(131),
-                       new ReduceAction184(131),
-                       new ReduceAction185(131),
-                       new ReduceAction186(131),
-                       new ReduceAction187(131),
-                       new ReduceAction188(131),
-                       new ReduceAction187(131),
-                       new ReduceAction190(131),
-                       new ReduceAction191(131),
-                       new ReduceAction190(131),
-                       new ReduceAction193(131),
-                       new ReduceAction200(132),
-                       new ReduceAction201(132),
-                       new ReduceAction202(132),
-                       new ReduceAction203(132),
-                       new ReduceAction204(132),
-                       new ReduceAction205(132),
-                       new ReduceAction206(132),
-                       new ReduceAction207(132),
-                       new ReduceAction204(132),
-                       new ReduceAction205(132),
-                       new ReduceAction210(132),
-                       new ReduceAction211(132),
-                       new ReduceAction212(132),
-                       new ReduceAction213(132),
-                       new ReduceAction214(132),
-                       new ReduceAction215(132),
-                       new ReduceAction212(132),
-                       new ReduceAction213(132),
-                       new ReduceAction218(132),
-                       new ReduceAction219(132),
-                       new ReduceAction220(132),
-                       new ReduceAction221(132),
-                       new ReduceAction222(132),
-                       new ReduceAction223(132),
-                       new ReduceAction224(132),
-                       new ReduceAction225(132),
-                       new ReduceAction226(132),
-                       new ReduceAction223(132),
-                       new ReduceAction224(132),
-                       new ReduceAction229(132),
-                       new ReduceAction230(132),
-                       new ReduceAction231(132),
-                       new ReduceAction232(132),
-                       new ReduceAction233(132),
-                       new ReduceAction234(132),
-                       new ReduceAction231(132),
-                       new ReduceAction232(132),
-                       new ReduceAction237(132),
+                       new ReduceAction140(132),
+                       new ReduceAction141(132),
+                       new ReduceAction142(132),
+                       new ReduceAction143(132),
+                       new ReduceAction153(133),
+                       new ReduceAction153(133),
+                       new ReduceAction163(133),
+                       new ReduceAction164(133),
+                       new ReduceAction165(133),
+                       new ReduceAction166(133),
+                       new ReduceAction167(133),
+                       new ReduceAction168(133),
+                       new ReduceAction169(133),
+                       new ReduceAction153(133),
+                       new ReduceAction153(133),
+                       new ReduceAction153(133),
+                       new ReduceAction153(133),
                        new ReduceAction153(133),
-                       new ReduceAction261(133),
-                       new ReduceAction153(134),
-                       new ReduceAction263(134),
-                       new ReduceAction264(134),
-                       new ReduceAction265(134),
-                       new ReduceAction266(134),
+                       new ReduceAction153(133),
+                       new ReduceAction153(133),
+                       new ReduceAction177(133),
+                       new ReduceAction178(133),
+                       new ReduceAction179(133),
+                       new ReduceAction178(133),
+                       new ReduceAction181(133),
+                       new ReduceAction182(133),
+                       new ReduceAction183(133),
+                       new ReduceAction182(133),
+                       new ReduceAction185(133),
+                       new ReduceAction186(133),
+                       new ReduceAction187(133),
+                       new ReduceAction188(133),
+                       new ReduceAction189(133),
+                       new ReduceAction188(133),
+                       new ReduceAction191(133),
+                       new ReduceAction192(133),
+                       new ReduceAction191(133),
+                       new ReduceAction194(133),
+                       new ReduceAction201(134),
+                       new ReduceAction202(134),
+                       new ReduceAction203(134),
+                       new ReduceAction204(134),
+                       new ReduceAction205(134),
+                       new ReduceAction206(134),
+                       new ReduceAction207(134),
+                       new ReduceAction208(134),
+                       new ReduceAction205(134),
+                       new ReduceAction206(134),
+                       new ReduceAction211(134),
+                       new ReduceAction212(134),
+                       new ReduceAction213(134),
+                       new ReduceAction214(134),
+                       new ReduceAction215(134),
+                       new ReduceAction216(134),
+                       new ReduceAction213(134),
+                       new ReduceAction214(134),
+                       new ReduceAction219(134),
+                       new ReduceAction220(134),
+                       new ReduceAction221(134),
+                       new ReduceAction222(134),
+                       new ReduceAction223(134),
+                       new ReduceAction224(134),
+                       new ReduceAction225(134),
+                       new ReduceAction226(134),
+                       new ReduceAction227(134),
+                       new ReduceAction224(134),
+                       new ReduceAction225(134),
+                       new ReduceAction230(134),
+                       new ReduceAction231(134),
+                       new ReduceAction232(134),
+                       new ReduceAction233(134),
+                       new ReduceAction234(134),
+                       new ReduceAction235(134),
+                       new ReduceAction232(134),
+                       new ReduceAction233(134),
+                       new ReduceAction238(134),
                        new ReduceAction153(135),
-                       new ReduceAction268(135),
+                       new ReduceAction273(135),
                        new ReduceAction153(136),
-                       new ReduceAction270(136),
-                       new ReduceAction271(136),
-                       new ReduceAction272(136),
-                       new ReduceAction273(136),
-                       new ReduceAction274(136),
                        new ReduceAction275(136),
                        new ReduceAction276(136),
                        new ReduceAction277(136),
                        new ReduceAction278(136),
-                       new ReduceAction279(136),
                        new ReduceAction153(137),
-                       new ReduceAction281(137),
-                       new ReduceAction282(137),
+                       new ReduceAction280(137),
                        new ReduceAction153(138),
+                       new ReduceAction282(138),
+                       new ReduceAction283(138),
                        new ReduceAction284(138),
                        new ReduceAction285(138),
                        new ReduceAction286(138),
+                       new ReduceAction287(138),
+                       new ReduceAction288(138),
+                       new ReduceAction289(138),
+                       new ReduceAction290(138),
+                       new ReduceAction291(138),
                        new ReduceAction153(139),
-                       new ReduceAction288(139),
+                       new ReduceAction293(139),
+                       new ReduceAction294(139),
                        new ReduceAction153(140),
-                       new ReduceAction290(140),
-                       new ReduceAction291(140),
+                       new ReduceAction296(140),
+                       new ReduceAction297(140),
+                       new ReduceAction298(140),
                        new ReduceAction153(141),
-                       new ReduceAction293(141),
-                       new ReduceAction294(141),
-                       new ReduceAction295(141),
-                       new ReduceAction296(141),
+                       new ReduceAction300(141),
                        new ReduceAction153(142),
-                       new ReduceAction298(142),
-                       new ReduceAction299(142),
-                       new ReduceAction176(142),
-                       new ReduceAction301(142),
-                       new ReduceAction177(142),
+                       new ReduceAction302(142),
                        new ReduceAction303(142),
-                       new ReduceAction178(142),
-                       new ReduceAction305(142),
-                       new ReduceAction177(142),
-                       new ReduceAction303(142),
-                       new ReduceAction180(142),
-                       new ReduceAction309(142),
-                       new ReduceAction181(142),
-                       new ReduceAction311(142),
-                       new ReduceAction182(142),
-                       new ReduceAction313(142),
-                       new ReduceAction181(142),
-                       new ReduceAction311(142),
-                       new ReduceAction184(142),
-                       new ReduceAction317(142),
-                       new ReduceAction185(142),
-                       new ReduceAction319(142),
-                       new ReduceAction186(142),
-                       new ReduceAction321(142),
-                       new ReduceAction322(142),
-                       new ReduceAction323(142),
-                       new ReduceAction324(142),
-                       new ReduceAction325(142),
-                       new ReduceAction326(142),
-                       new ReduceAction327(142),
-                       new ReduceAction328(142),
-                       new ReduceAction325(142),
-                       new ReduceAction326(142),
-                       new ReduceAction331(142),
-                       new ReduceAction332(142),
-                       new ReduceAction333(142),
-                       new ReduceAction334(142),
-                       new ReduceAction335(143),
-                       new ReduceAction336(143),
-                       new ReduceAction337(143),
-                       new ReduceAction338(143),
-                       new ReduceAction339(143),
-                       new ReduceAction340(143),
-                       new ReduceAction341(143),
-                       new ReduceAction342(143),
-                       new ReduceAction343(143),
+                       new ReduceAction304(142),
                        new ReduceAction153(143),
-                       new ReduceAction368(144),
-                       new ReduceAction369(144),
-                       new ReduceAction370(145),
-                       new ReduceAction22(145),
-                       new ReduceAction372(146),
-                       new ReduceAction372(147),
-                       new ReduceAction353(148),
-                       new ReduceAction354(148),
-                       new ReduceAction396(149),
-                       new ReduceAction153(149),
-                       new ReduceAction153(149),
-                       new ReduceAction399(149),
-                       new ReduceAction400(149),
-                       new ReduceAction140(150),
-                       new ReduceAction141(150),
+                       new ReduceAction306(143),
+                       new ReduceAction307(143),
+                       new ReduceAction308(143),
+                       new ReduceAction309(143),
+                       new ReduceAction153(144),
+                       new ReduceAction311(144),
+                       new ReduceAction312(144),
+                       new ReduceAction177(144),
+                       new ReduceAction314(144),
+                       new ReduceAction178(144),
+                       new ReduceAction316(144),
+                       new ReduceAction179(144),
+                       new ReduceAction318(144),
+                       new ReduceAction178(144),
+                       new ReduceAction316(144),
+                       new ReduceAction181(144),
+                       new ReduceAction322(144),
+                       new ReduceAction182(144),
+                       new ReduceAction324(144),
+                       new ReduceAction183(144),
+                       new ReduceAction326(144),
+                       new ReduceAction182(144),
+                       new ReduceAction324(144),
+                       new ReduceAction185(144),
+                       new ReduceAction330(144),
+                       new ReduceAction186(144),
+                       new ReduceAction332(144),
+                       new ReduceAction187(144),
+                       new ReduceAction334(144),
+                       new ReduceAction335(144),
+                       new ReduceAction336(144),
+                       new ReduceAction337(144),
+                       new ReduceAction338(144),
+                       new ReduceAction339(144),
+                       new ReduceAction340(144),
+                       new ReduceAction341(144),
+                       new ReduceAction338(144),
+                       new ReduceAction339(144),
+                       new ReduceAction344(144),
+                       new ReduceAction345(144),
+                       new ReduceAction346(144),
+                       new ReduceAction347(144),
+                       new ReduceAction348(145),
+                       new ReduceAction349(145),
+                       new ReduceAction350(145),
+                       new ReduceAction351(145),
+                       new ReduceAction352(145),
+                       new ReduceAction353(145),
+                       new ReduceAction354(145),
+                       new ReduceAction355(145),
+                       new ReduceAction356(145),
+                       new ReduceAction153(145),
+                       new ReduceAction381(146),
+                       new ReduceAction382(146),
+                       new ReduceAction383(147),
+                       new ReduceAction22(147),
+                       new ReduceAction385(148),
+                       new ReduceAction385(149),
+                       new ReduceAction366(150),
+                       new ReduceAction367(150),
+                       new ReduceAction409(151),
+                       new ReduceAction153(151),
                        new ReduceAction153(151),
-                       new ReduceAction261(151),
-                       new ReduceAction153(152),
-                       new ReduceAction263(152),
-                       new ReduceAction264(152),
-                       new ReduceAction265(152),
-                       new ReduceAction266(152),
+                       new ReduceAction412(151),
+                       new ReduceAction413(151),
+                       new ReduceAction140(152),
+                       new ReduceAction141(152),
                        new ReduceAction153(153),
-                       new ReduceAction268(153),
+                       new ReduceAction273(153),
                        new ReduceAction153(154),
-                       new ReduceAction270(154),
-                       new ReduceAction271(154),
-                       new ReduceAction272(154),
-                       new ReduceAction273(154),
-                       new ReduceAction274(154),
                        new ReduceAction275(154),
                        new ReduceAction276(154),
                        new ReduceAction277(154),
                        new ReduceAction278(154),
-                       new ReduceAction279(154),
                        new ReduceAction153(155),
-                       new ReduceAction281(155),
-                       new ReduceAction282(155),
+                       new ReduceAction280(155),
                        new ReduceAction153(156),
+                       new ReduceAction282(156),
+                       new ReduceAction283(156),
                        new ReduceAction284(156),
                        new ReduceAction285(156),
                        new ReduceAction286(156),
+                       new ReduceAction287(156),
+                       new ReduceAction288(156),
+                       new ReduceAction289(156),
+                       new ReduceAction290(156),
+                       new ReduceAction291(156),
                        new ReduceAction153(157),
-                       new ReduceAction288(157),
+                       new ReduceAction293(157),
+                       new ReduceAction294(157),
                        new ReduceAction153(158),
-                       new ReduceAction290(158),
-                       new ReduceAction291(158),
+                       new ReduceAction296(158),
+                       new ReduceAction297(158),
+                       new ReduceAction298(158),
                        new ReduceAction153(159),
-                       new ReduceAction293(159),
-                       new ReduceAction294(159),
-                       new ReduceAction776(159),
+                       new ReduceAction300(159),
                        new ReduceAction153(160),
-                       new ReduceAction778(160),
-                       new ReduceAction779(160),
-                       new ReduceAction780(160),
-                       new ReduceAction781(160),
-                       new ReduceAction782(160),
-                       new ReduceAction176(160),
-                       new ReduceAction301(160),
-                       new ReduceAction781(160),
-                       new ReduceAction782(160),
-                       new ReduceAction184(160),
-                       new ReduceAction317(160),
-                       new ReduceAction789(160),
-                       new ReduceAction790(160),
-                       new ReduceAction323(160),
-                       new ReduceAction324(160),
-                       new ReduceAction325(160),
-                       new ReduceAction326(160),
-                       new ReduceAction327(160),
-                       new ReduceAction328(160),
-                       new ReduceAction325(160),
-                       new ReduceAction326(160),
-                       new ReduceAction331(160),
-                       new ReduceAction332(160),
-                       new ReduceAction333(160),
-                       new ReduceAction334(160),
-                       new ReduceAction335(161),
-                       new ReduceAction336(161),
-                       new ReduceAction337(161),
-                       new ReduceAction338(161),
-                       new ReduceAction339(161),
-                       new ReduceAction340(161),
-                       new ReduceAction341(161),
-                       new ReduceAction342(161),
-                       new ReduceAction343(161),
+                       new ReduceAction302(160),
+                       new ReduceAction303(160),
+                       new ReduceAction304(160),
                        new ReduceAction153(161),
-                       new ReduceAction813(162),
-                       new ReduceAction814(162),
-                       new ReduceAction150(163),
-                       new ReduceAction151(163),
-                       new ReduceAction152(163),
+                       new ReduceAction306(161),
+                       new ReduceAction307(161),
+                       new ReduceAction793(161),
+                       new ReduceAction153(162),
+                       new ReduceAction795(162),
+                       new ReduceAction796(162),
+                       new ReduceAction797(162),
+                       new ReduceAction798(162),
+                       new ReduceAction799(162),
+                       new ReduceAction177(162),
+                       new ReduceAction314(162),
+                       new ReduceAction798(162),
+                       new ReduceAction799(162),
+                       new ReduceAction185(162),
+                       new ReduceAction330(162),
+                       new ReduceAction806(162),
+                       new ReduceAction807(162),
+                       new ReduceAction336(162),
+                       new ReduceAction337(162),
+                       new ReduceAction338(162),
+                       new ReduceAction339(162),
+                       new ReduceAction340(162),
+                       new ReduceAction341(162),
+                       new ReduceAction338(162),
+                       new ReduceAction339(162),
+                       new ReduceAction344(162),
+                       new ReduceAction345(162),
+                       new ReduceAction346(162),
+                       new ReduceAction347(162),
+                       new ReduceAction348(163),
+                       new ReduceAction349(163),
+                       new ReduceAction350(163),
+                       new ReduceAction351(163),
+                       new ReduceAction352(163),
+                       new ReduceAction353(163),
+                       new ReduceAction354(163),
+                       new ReduceAction355(163),
+                       new ReduceAction356(163),
                        new ReduceAction153(163),
-                       new ReduceAction153(164),
-                       new ReduceAction153(164),
-                       new ReduceAction163(164),
-                       new ReduceAction164(164),
-                       new ReduceAction165(164),
-                       new ReduceAction166(164),
-                       new ReduceAction167(164),
-                       new ReduceAction168(164),
-                       new ReduceAction169(164),
-                       new ReduceAction153(164),
-                       new ReduceAction153(164),
-                       new ReduceAction153(164),
-                       new ReduceAction153(164),
-                       new ReduceAction153(164),
-                       new ReduceAction153(164),
-                       new ReduceAction176(164),
-                       new ReduceAction177(164),
-                       new ReduceAction178(164),
-                       new ReduceAction177(164),
-                       new ReduceAction180(164),
-                       new ReduceAction181(164),
-                       new ReduceAction182(164),
-                       new ReduceAction181(164),
-                       new ReduceAction184(164),
-                       new ReduceAction185(164),
-                       new ReduceAction186(164),
-                       new ReduceAction187(164),
-                       new ReduceAction188(164),
-                       new ReduceAction187(164),
-                       new ReduceAction190(164),
-                       new ReduceAction191(164),
-                       new ReduceAction190(164),
-                       new ReduceAction193(164),
-                       new ReduceAction240(165),
-                       new ReduceAction241(165),
-                       new ReduceAction242(166),
-                       new ReduceAction249(167),
-                       new ReduceAction250(167),
-                       new ReduceAction251(168),
-                       new ReduceAction252(168),
-                       new ReduceAction253(169),
-                       new ReduceAction254(169),
-                       new ReduceAction255(170),
-                       new ReduceAction256(170),
-                       new ReduceAction153(171),
-                       new ReduceAction153(171),
-                       new ReduceAction163(171),
-                       new ReduceAction164(171),
-                       new ReduceAction165(171),
-                       new ReduceAction166(171),
-                       new ReduceAction167(171),
-                       new ReduceAction168(171),
-                       new ReduceAction169(171),
-                       new ReduceAction153(171),
-                       new ReduceAction153(171),
-                       new ReduceAction153(171),
-                       new ReduceAction153(171),
-                       new ReduceAction153(171),
-                       new ReduceAction153(171),
-                       new ReduceAction176(171),
-                       new ReduceAction177(171),
-                       new ReduceAction178(171),
-                       new ReduceAction177(171),
-                       new ReduceAction180(171),
-                       new ReduceAction181(171),
-                       new ReduceAction182(171),
-                       new ReduceAction181(171),
-                       new ReduceAction184(171),
-                       new ReduceAction185(171),
-                       new ReduceAction186(171),
-                       new ReduceAction187(171),
-                       new ReduceAction188(171),
-                       new ReduceAction187(171),
-                       new ReduceAction190(171),
-                       new ReduceAction191(171),
-                       new ReduceAction190(171),
-                       new ReduceAction193(171),
-                       new ReduceAction150(172),
-                       new ReduceAction151(172),
-                       new ReduceAction152(172),
-                       new ReduceAction150(173),
-                       new ReduceAction151(173),
-                       new ReduceAction152(173),
+                       new ReduceAction830(164),
+                       new ReduceAction831(164),
+                       new ReduceAction150(165),
+                       new ReduceAction151(165),
+                       new ReduceAction152(165),
+                       new ReduceAction153(165),
+                       new ReduceAction153(166),
+                       new ReduceAction153(166),
+                       new ReduceAction163(166),
+                       new ReduceAction164(166),
+                       new ReduceAction165(166),
+                       new ReduceAction166(166),
+                       new ReduceAction167(166),
+                       new ReduceAction168(166),
+                       new ReduceAction169(166),
+                       new ReduceAction153(166),
+                       new ReduceAction153(166),
+                       new ReduceAction153(166),
+                       new ReduceAction153(166),
+                       new ReduceAction153(166),
+                       new ReduceAction153(166),
+                       new ReduceAction153(166),
+                       new ReduceAction177(166),
+                       new ReduceAction178(166),
+                       new ReduceAction179(166),
+                       new ReduceAction178(166),
+                       new ReduceAction181(166),
+                       new ReduceAction182(166),
+                       new ReduceAction183(166),
+                       new ReduceAction182(166),
+                       new ReduceAction185(166),
+                       new ReduceAction186(166),
+                       new ReduceAction187(166),
+                       new ReduceAction188(166),
+                       new ReduceAction189(166),
+                       new ReduceAction188(166),
+                       new ReduceAction191(166),
+                       new ReduceAction192(166),
+                       new ReduceAction191(166),
+                       new ReduceAction194(166),
+                       new ReduceAction247(167),
+                       new ReduceAction248(167),
+                       new ReduceAction249(168),
+                       new ReduceAction256(169),
+                       new ReduceAction257(169),
+                       new ReduceAction258(170),
+                       new ReduceAction259(170),
+                       new ReduceAction260(171),
+                       new ReduceAction261(171),
+                       new ReduceAction262(172),
+                       new ReduceAction263(172),
+                       new ReduceAction267(173),
+                       new ReduceAction268(173),
                        new ReduceAction153(174),
                        new ReduceAction153(174),
                        new ReduceAction163(174),
@@ -926,37 +907,32 @@ redef class Parser
                        new ReduceAction153(174),
                        new ReduceAction153(174),
                        new ReduceAction153(174),
-                       new ReduceAction193(174),
-                       new ReduceAction153(175),
-                       new ReduceAction153(175),
-                       new ReduceAction163(175),
-                       new ReduceAction164(175),
-                       new ReduceAction165(175),
-                       new ReduceAction166(175),
-                       new ReduceAction167(175),
-                       new ReduceAction168(175),
-                       new ReduceAction169(175),
-                       new ReduceAction153(175),
-                       new ReduceAction153(175),
-                       new ReduceAction153(175),
-                       new ReduceAction153(175),
-                       new ReduceAction153(175),
-                       new ReduceAction193(175),
-                       new ReduceAction153(176),
-                       new ReduceAction153(176),
-                       new ReduceAction163(176),
-                       new ReduceAction164(176),
-                       new ReduceAction165(176),
-                       new ReduceAction166(176),
-                       new ReduceAction167(176),
-                       new ReduceAction168(176),
-                       new ReduceAction169(176),
-                       new ReduceAction153(176),
-                       new ReduceAction153(176),
-                       new ReduceAction153(176),
-                       new ReduceAction153(176),
-                       new ReduceAction153(176),
-                       new ReduceAction193(176),
+                       new ReduceAction153(174),
+                       new ReduceAction153(174),
+                       new ReduceAction177(174),
+                       new ReduceAction178(174),
+                       new ReduceAction179(174),
+                       new ReduceAction178(174),
+                       new ReduceAction181(174),
+                       new ReduceAction182(174),
+                       new ReduceAction183(174),
+                       new ReduceAction182(174),
+                       new ReduceAction185(174),
+                       new ReduceAction186(174),
+                       new ReduceAction187(174),
+                       new ReduceAction188(174),
+                       new ReduceAction189(174),
+                       new ReduceAction188(174),
+                       new ReduceAction191(174),
+                       new ReduceAction192(174),
+                       new ReduceAction191(174),
+                       new ReduceAction194(174),
+                       new ReduceAction150(175),
+                       new ReduceAction151(175),
+                       new ReduceAction152(175),
+                       new ReduceAction150(176),
+                       new ReduceAction151(176),
+                       new ReduceAction152(176),
                        new ReduceAction153(177),
                        new ReduceAction153(177),
                        new ReduceAction163(177),
@@ -971,47 +947,96 @@ redef class Parser
                        new ReduceAction153(177),
                        new ReduceAction153(177),
                        new ReduceAction153(177),
-                       new ReduceAction193(177),
-                       new ReduceAction402(178),
-                       new ReduceAction404(178),
-                       new ReduceAction964(179),
-                       new ReduceAction965(179),
-                       new ReduceAction966(180),
-                       new ReduceAction967(180),
-                       new ReduceAction968(181),
-                       new ReduceAction969(181),
-                       new ReduceAction970(182),
-                       new ReduceAction971(182),
-                       new ReduceAction43(183),
-                       new ReduceAction973(183),
-                       new ReduceAction974(184),
-                       new ReduceAction975(184),
-                       new ReduceAction976(185),
-                       new ReduceAction977(185),
-                       new ReduceAction144(186),
-                       new ReduceAction979(186),
-                       new ReduceAction353(187),
-                       new ReduceAction981(187),
-                       new ReduceAction353(188),
-                       new ReduceAction981(188),
-                       new ReduceAction353(189),
-                       new ReduceAction981(189),
-                       new ReduceAction417(190),
-                       new ReduceAction987(190),
-                       new ReduceAction375(191),
-                       new ReduceAction989(191),
-                       new ReduceAction375(192),
-                       new ReduceAction989(192),
-                       new ReduceAction353(193),
-                       new ReduceAction981(193),
-                       new ReduceAction353(194),
-                       new ReduceAction981(194),
-                       new ReduceAction418(195),
-                       new ReduceAction997(195),
-                       new ReduceAction998(196),
-                       new ReduceAction999(196),
-                       new ReduceAction1000(197),
-                       new ReduceAction1001(197)
+                       new ReduceAction153(177),
+                       new ReduceAction194(177),
+                       new ReduceAction153(178),
+                       new ReduceAction153(178),
+                       new ReduceAction163(178),
+                       new ReduceAction164(178),
+                       new ReduceAction165(178),
+                       new ReduceAction166(178),
+                       new ReduceAction167(178),
+                       new ReduceAction168(178),
+                       new ReduceAction169(178),
+                       new ReduceAction153(178),
+                       new ReduceAction153(178),
+                       new ReduceAction153(178),
+                       new ReduceAction153(178),
+                       new ReduceAction153(178),
+                       new ReduceAction153(178),
+                       new ReduceAction194(178),
+                       new ReduceAction153(179),
+                       new ReduceAction153(179),
+                       new ReduceAction163(179),
+                       new ReduceAction164(179),
+                       new ReduceAction165(179),
+                       new ReduceAction166(179),
+                       new ReduceAction167(179),
+                       new ReduceAction168(179),
+                       new ReduceAction169(179),
+                       new ReduceAction153(179),
+                       new ReduceAction153(179),
+                       new ReduceAction153(179),
+                       new ReduceAction153(179),
+                       new ReduceAction153(179),
+                       new ReduceAction153(179),
+                       new ReduceAction194(179),
+                       new ReduceAction153(180),
+                       new ReduceAction153(180),
+                       new ReduceAction163(180),
+                       new ReduceAction164(180),
+                       new ReduceAction165(180),
+                       new ReduceAction166(180),
+                       new ReduceAction167(180),
+                       new ReduceAction168(180),
+                       new ReduceAction169(180),
+                       new ReduceAction153(180),
+                       new ReduceAction153(180),
+                       new ReduceAction153(180),
+                       new ReduceAction153(180),
+                       new ReduceAction153(180),
+                       new ReduceAction153(180),
+                       new ReduceAction194(180),
+                       new ReduceAction415(181),
+                       new ReduceAction417(181),
+                       new ReduceAction989(182),
+                       new ReduceAction990(182),
+                       new ReduceAction991(183),
+                       new ReduceAction992(183),
+                       new ReduceAction993(184),
+                       new ReduceAction994(184),
+                       new ReduceAction995(185),
+                       new ReduceAction996(185),
+                       new ReduceAction43(186),
+                       new ReduceAction998(186),
+                       new ReduceAction999(187),
+                       new ReduceAction1000(187),
+                       new ReduceAction1001(188),
+                       new ReduceAction1002(188),
+                       new ReduceAction144(189),
+                       new ReduceAction1004(189),
+                       new ReduceAction366(190),
+                       new ReduceAction1006(190),
+                       new ReduceAction366(191),
+                       new ReduceAction1006(191),
+                       new ReduceAction366(192),
+                       new ReduceAction1006(192),
+                       new ReduceAction430(193),
+                       new ReduceAction1012(193),
+                       new ReduceAction388(194),
+                       new ReduceAction1014(194),
+                       new ReduceAction388(195),
+                       new ReduceAction1014(195),
+                       new ReduceAction366(196),
+                       new ReduceAction1006(196),
+                       new ReduceAction366(197),
+                       new ReduceAction1006(197),
+                       new ReduceAction431(198),
+                       new ReduceAction1022(198),
+                       new ReduceAction1023(199),
+                       new ReduceAction1024(199),
+                       new ReduceAction1025(200),
+                       new ReduceAction1026(200)
                )
        end
 end
@@ -4850,7 +4875,7 @@ private class ReduceAction169
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction176
+private class ReduceAction177
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4875,7 +4900,7 @@ private class ReduceAction176
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction177
+private class ReduceAction178
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4901,7 +4926,7 @@ private class ReduceAction177
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction178
+private class ReduceAction179
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4928,7 +4953,7 @@ private class ReduceAction178
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction180
+private class ReduceAction181
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4949,7 +4974,7 @@ private class ReduceAction180
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction181
+private class ReduceAction182
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4971,7 +4996,7 @@ private class ReduceAction181
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction182
+private class ReduceAction183
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4994,7 +5019,7 @@ private class ReduceAction182
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction184
+private class ReduceAction185
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5017,7 +5042,7 @@ private class ReduceAction184
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction185
+private class ReduceAction186
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5042,7 +5067,7 @@ private class ReduceAction185
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction186
+private class ReduceAction187
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5063,7 +5088,7 @@ private class ReduceAction186
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction187
+private class ReduceAction188
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5089,7 +5114,7 @@ private class ReduceAction187
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction188
+private class ReduceAction189
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5116,7 +5141,7 @@ private class ReduceAction188
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction190
+private class ReduceAction191
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5138,7 +5163,7 @@ private class ReduceAction190
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction191
+private class ReduceAction192
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5161,7 +5186,7 @@ private class ReduceAction191
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction193
+private class ReduceAction194
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5189,7 +5214,7 @@ private class ReduceAction193
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction194
+private class ReduceAction195
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5205,7 +5230,7 @@ private class ReduceAction194
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction195
+private class ReduceAction196
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5224,7 +5249,7 @@ private class ReduceAction195
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction196
+private class ReduceAction197
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5250,7 +5275,7 @@ private class ReduceAction196
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction197
+private class ReduceAction198
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5279,7 +5304,7 @@ private class ReduceAction197
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction198
+private class ReduceAction199
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5312,7 +5337,7 @@ private class ReduceAction198
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction199
+private class ReduceAction200
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5348,7 +5373,7 @@ private class ReduceAction199
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction200
+private class ReduceAction201
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5378,7 +5403,7 @@ private class ReduceAction200
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction201
+private class ReduceAction202
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5404,7 +5429,7 @@ private class ReduceAction201
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction202
+private class ReduceAction203
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5437,7 +5462,7 @@ private class ReduceAction202
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction203
+private class ReduceAction204
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5471,7 +5496,7 @@ private class ReduceAction203
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction204
+private class ReduceAction205
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5505,7 +5530,7 @@ private class ReduceAction204
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction205
+private class ReduceAction206
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5540,7 +5565,7 @@ private class ReduceAction205
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction206
+private class ReduceAction207
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5575,7 +5600,7 @@ private class ReduceAction206
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction207
+private class ReduceAction208
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5611,7 +5636,7 @@ private class ReduceAction207
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction210
+private class ReduceAction211
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5640,7 +5665,7 @@ private class ReduceAction210
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction211
+private class ReduceAction212
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5670,7 +5695,7 @@ private class ReduceAction211
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction212
+private class ReduceAction213
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5700,7 +5725,7 @@ private class ReduceAction212
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction213
+private class ReduceAction214
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5731,7 +5756,7 @@ private class ReduceAction213
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction214
+private class ReduceAction215
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5762,7 +5787,7 @@ private class ReduceAction214
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction215
+private class ReduceAction216
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5794,7 +5819,7 @@ private class ReduceAction215
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction218
+private class ReduceAction219
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5821,7 +5846,7 @@ private class ReduceAction218
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction219
+private class ReduceAction220
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5851,7 +5876,7 @@ private class ReduceAction219
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction220
+private class ReduceAction221
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5877,7 +5902,7 @@ private class ReduceAction220
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction221
+private class ReduceAction222
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5910,7 +5935,7 @@ private class ReduceAction221
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction222
+private class ReduceAction223
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5944,7 +5969,7 @@ private class ReduceAction222
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction223
+private class ReduceAction224
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5978,7 +6003,7 @@ private class ReduceAction223
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction224
+private class ReduceAction225
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6013,7 +6038,7 @@ private class ReduceAction224
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction225
+private class ReduceAction226
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6048,7 +6073,7 @@ private class ReduceAction225
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction226
+private class ReduceAction227
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6084,7 +6109,7 @@ private class ReduceAction226
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction229
+private class ReduceAction230
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6113,7 +6138,7 @@ private class ReduceAction229
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction230
+private class ReduceAction231
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6143,7 +6168,7 @@ private class ReduceAction230
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction231
+private class ReduceAction232
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6173,7 +6198,7 @@ private class ReduceAction231
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction232
+private class ReduceAction233
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6204,7 +6229,7 @@ private class ReduceAction232
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction233
+private class ReduceAction234
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6235,7 +6260,7 @@ private class ReduceAction233
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction234
+private class ReduceAction235
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6267,7 +6292,7 @@ private class ReduceAction234
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction237
+private class ReduceAction238
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6294,7 +6319,7 @@ private class ReduceAction237
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction238
+private class ReduceAction239
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6309,7 +6334,7 @@ private class ReduceAction238
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction239
+private class ReduceAction240
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6324,7 +6349,97 @@ private class ReduceAction239
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction240
+private class ReduceAction241
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var tstareqnode2 = nodearraylist1
+                                       assert tstareqnode2 isa nullable TStareq
+                                       var passignopnode1: nullable AStarAssignOp = new AStarAssignOp.init_astarassignop(
+                                               tstareqnode2
+                                       )
+                                       node_list = passignopnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction242
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var tslasheqnode2 = nodearraylist1
+                                       assert tslasheqnode2 isa nullable TSlasheq
+                                       var passignopnode1: nullable ASlashAssignOp = new ASlashAssignOp.init_aslashassignop(
+                                               tslasheqnode2
+                                       )
+                                       node_list = passignopnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction243
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var tpercenteqnode2 = nodearraylist1
+                                       assert tpercenteqnode2 isa nullable TPercenteq
+                                       var passignopnode1: nullable APercentAssignOp = new APercentAssignOp.init_apercentassignop(
+                                               tpercenteqnode2
+                                       )
+                                       node_list = passignopnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction244
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var tstarstareqnode2 = nodearraylist1
+                                       assert tstarstareqnode2 isa nullable TStarstareq
+                                       var passignopnode1: nullable AStarstarAssignOp = new AStarstarAssignOp.init_astarstarassignop(
+                                               tstarstareqnode2
+                                       )
+                                       node_list = passignopnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction245
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var tlleqnode2 = nodearraylist1
+                                       assert tlleqnode2 isa nullable TLleq
+                                       var passignopnode1: nullable ALlAssignOp = new ALlAssignOp.init_allassignop(
+                                               tlleqnode2
+                                       )
+                                       node_list = passignopnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction246
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist1 = p.pop
+                                       var tggeqnode2 = nodearraylist1
+                                       assert tggeqnode2 isa nullable TGgeq
+                                       var passignopnode1: nullable AGgAssignOp = new AGgAssignOp.init_aggassignop(
+                                               tggeqnode2
+                                       )
+                                       node_list = passignopnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction247
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6347,7 +6462,7 @@ private class ReduceAction240
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction241
+private class ReduceAction248
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6367,7 +6482,7 @@ private class ReduceAction241
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction242
+private class ReduceAction249
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6398,7 +6513,7 @@ private class ReduceAction242
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction243
+private class ReduceAction250
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6425,7 +6540,7 @@ private class ReduceAction243
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction244
+private class ReduceAction251
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6456,7 +6571,7 @@ private class ReduceAction244
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction245
+private class ReduceAction252
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6483,7 +6598,7 @@ private class ReduceAction245
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction246
+private class ReduceAction253
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6511,7 +6626,7 @@ private class ReduceAction246
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction249
+private class ReduceAction256
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6534,7 +6649,7 @@ private class ReduceAction249
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction250
+private class ReduceAction257
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6554,7 +6669,7 @@ private class ReduceAction250
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction251
+private class ReduceAction258
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6587,7 +6702,7 @@ private class ReduceAction251
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction252
+private class ReduceAction259
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6617,7 +6732,7 @@ private class ReduceAction252
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction253
+private class ReduceAction260
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6659,7 +6774,7 @@ private class ReduceAction253
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction254
+private class ReduceAction261
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6698,52 +6813,150 @@ private class ReduceAction254
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction255
+private class ReduceAction262
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist7 = p.pop
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
                                        var nodearraylist4 = p.pop
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var tkwassertnode2 = nodearraylist1
-                                       assert tkwassertnode2 isa nullable TKwassert
-                                       var pexprnode4 = nodearraylist2
-                                       assert pexprnode4 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist4
+                                       var tkwwithnode2 = nodearraylist1
+                                       assert tkwwithnode2 isa nullable TKwwith
+                                       var pexprnode3 = nodearraylist3
+                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwdonode4 = nodearraylist5
+                                       assert tkwdonode4 isa nullable TKwdo
+                                       var pexprnode5 = nodearraylist6
                                        assert pexprnode5 isa nullable AExpr
-                                       var pexprnode1: nullable AAssertExpr = new AAssertExpr.init_aassertexpr(
-                                               tkwassertnode2,
-                                               null,
-                                               pexprnode4,
-                                               pexprnode5
+                                       var plabelnode6 = nodearraylist7
+                                       assert plabelnode6 isa nullable ALabel
+                                       var pexprnode1: nullable AWithExpr = new AWithExpr.init_awithexpr(
+                                               tkwwithnode2,
+                                               pexprnode3,
+                                               tkwdonode4,
+                                               pexprnode5,
+                                               plabelnode6
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction256
+private class ReduceAction263
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
                                        var nodearraylist4 = p.pop
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var tkwassertnode2 = nodearraylist1
-                                       assert tkwassertnode2 isa nullable TKwassert
-                                       var tidnode3 = nodearraylist2
-                                       assert tidnode3 isa nullable TId
-                                       var pexprnode4 = nodearraylist3
-                                       assert pexprnode4 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist5
+                                       var tkwwithnode2 = nodearraylist1
+                                       assert tkwwithnode2 isa nullable TKwwith
+                                       var pexprnode3 = nodearraylist3
+                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwdonode4 = nodearraylist5
+                                       assert tkwdonode4 isa nullable TKwdo
+                                       var pexprnode5 = nodearraylist6
                                        assert pexprnode5 isa nullable AExpr
-                                       var pexprnode1: nullable AAssertExpr = new AAssertExpr.init_aassertexpr(
-                                               tkwassertnode2,
-                                               tidnode3,
+                                       var pexprnode1: nullable AWithExpr = new AWithExpr.init_awithexpr(
+                                               tkwwithnode2,
+                                               pexprnode3,
+                                               tkwdonode4,
+                                               pexprnode5,
+                                               null
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction264
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tidnode3 = nodearraylist1
+                                       assert tidnode3 isa nullable TId
+                                       var ptypenode4 = nodearraylist2
+                                       assert ptypenode4 isa nullable AType
+                                       var tassignnode5 = nodearraylist3
+                                       assert tassignnode5 isa nullable TAssign
+                                       var pexprnode6 = nodearraylist5
+                                       assert pexprnode6 isa nullable AExpr
+                                       var pexprnode1: nullable AVardeclExpr = new AVardeclExpr.init_avardeclexpr(
+                                               null,
+                                               tidnode3,
+                                               ptypenode4,
+                                               tassignnode5,
+                                               pexprnode6,
+                                               null
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction265
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tidnode3 = nodearraylist1
+                                       assert tidnode3 isa nullable TId
+                                       var ptypenode4 = nodearraylist3
+                                       assert ptypenode4 isa nullable AType
+                                       var tassignnode5 = nodearraylist4
+                                       assert tassignnode5 isa nullable TAssign
+                                       var pexprnode6 = nodearraylist6
+                                       assert pexprnode6 isa nullable AExpr
+                                       var pannotationsnode7 = nodearraylist2
+                                       assert pannotationsnode7 isa nullable AAnnotations
+                                       var pexprnode1: nullable AVardeclExpr = new AVardeclExpr.init_avardeclexpr(
+                                               null,
+                                               tidnode3,
+                                               ptypenode4,
+                                               tassignnode5,
+                                               pexprnode6,
+                                               pannotationsnode7
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction267
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tkwassertnode2 = nodearraylist1
+                                       assert tkwassertnode2 isa nullable TKwassert
+                                       var pexprnode4 = nodearraylist2
+                                       assert pexprnode4 isa nullable AExpr
+                                       var pexprnode5 = nodearraylist4
+                                       assert pexprnode5 isa nullable AExpr
+                                       var pexprnode1: nullable AAssertExpr = new AAssertExpr.init_aassertexpr(
+                                               tkwassertnode2,
+                                               null,
                                                pexprnode4,
                                                pexprnode5
                                        )
@@ -6751,7 +6964,35 @@ private class ReduceAction256
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction257
+private class ReduceAction268
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tkwassertnode2 = nodearraylist1
+                                       assert tkwassertnode2 isa nullable TKwassert
+                                       var tidnode3 = nodearraylist2
+                                       assert tidnode3 isa nullable TId
+                                       var pexprnode4 = nodearraylist3
+                                       assert pexprnode4 isa nullable AExpr
+                                       var pexprnode5 = nodearraylist5
+                                       assert pexprnode5 isa nullable AExpr
+                                       var pexprnode1: nullable AAssertExpr = new AAssertExpr.init_aassertexpr(
+                                               tkwassertnode2,
+                                               tidnode3,
+                                               pexprnode4,
+                                               pexprnode5
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction269
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6772,7 +7013,7 @@ private class ReduceAction257
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction258
+private class ReduceAction270
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6796,7 +7037,7 @@ private class ReduceAction258
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction259
+private class ReduceAction271
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6808,7 +7049,7 @@ private class ReduceAction259
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction261
+private class ReduceAction273
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6848,7 +7089,7 @@ private class ReduceAction261
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction263
+private class ReduceAction275
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6859,17 +7100,20 @@ private class ReduceAction263
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwornode3 = nodearraylist2
+                                       assert tkwornode3 isa nullable TKwor
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AOrExpr = new AOrExpr.init_aorexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tkwornode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction264
+private class ReduceAction276
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6880,17 +7124,20 @@ private class ReduceAction264
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwandnode3 = nodearraylist2
+                                       assert tkwandnode3 isa nullable TKwand
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AAndExpr = new AAndExpr.init_aandexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tkwandnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction265
+private class ReduceAction277
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6902,17 +7149,23 @@ private class ReduceAction265
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist5
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwornode3 = nodearraylist2
+                                       assert tkwornode3 isa nullable TKwor
+                                       var tkwelsenode4 = nodearraylist3
+                                       assert tkwelsenode4 isa nullable TKwelse
+                                       var pexprnode5 = nodearraylist5
+                                       assert pexprnode5 isa nullable AExpr
                                        var pexprnode1: nullable AOrElseExpr = new AOrElseExpr.init_aorelseexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tkwornode3,
+                                               tkwelsenode4,
+                                               pexprnode5
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction266
+private class ReduceAction278
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6923,17 +7176,20 @@ private class ReduceAction266
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwimpliesnode3 = nodearraylist2
+                                       assert tkwimpliesnode3 isa nullable TKwimplies
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AImpliesExpr = new AImpliesExpr.init_aimpliesexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tkwimpliesnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction268
+private class ReduceAction280
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6953,7 +7209,7 @@ private class ReduceAction268
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction270
+private class ReduceAction282
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6964,17 +7220,20 @@ private class ReduceAction270
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var teqnode3 = nodearraylist2
+                                       assert teqnode3 isa nullable TEq
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AEqExpr = new AEqExpr.init_aeqexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               teqnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction271
+private class ReduceAction283
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6985,17 +7244,20 @@ private class ReduceAction271
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tnenode3 = nodearraylist2
+                                       assert tnenode3 isa nullable TNe
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable ANeExpr = new ANeExpr.init_aneexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tnenode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction272
+private class ReduceAction284
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7006,17 +7268,20 @@ private class ReduceAction272
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tltnode3 = nodearraylist2
+                                       assert tltnode3 isa nullable TLt
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable ALtExpr = new ALtExpr.init_altexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tltnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction273
+private class ReduceAction285
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7027,17 +7292,20 @@ private class ReduceAction273
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tlenode3 = nodearraylist2
+                                       assert tlenode3 isa nullable TLe
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable ALeExpr = new ALeExpr.init_aleexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tlenode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction274
+private class ReduceAction286
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7048,17 +7316,20 @@ private class ReduceAction274
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tllnode3 = nodearraylist2
+                                       assert tllnode3 isa nullable TLl
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable ALlExpr = new ALlExpr.init_allexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tllnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction275
+private class ReduceAction287
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7069,17 +7340,20 @@ private class ReduceAction275
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tgtnode3 = nodearraylist2
+                                       assert tgtnode3 isa nullable TGt
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AGtExpr = new AGtExpr.init_agtexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tgtnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction276
+private class ReduceAction288
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7090,17 +7364,20 @@ private class ReduceAction276
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tgenode3 = nodearraylist2
+                                       assert tgenode3 isa nullable TGe
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AGeExpr = new AGeExpr.init_ageexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tgenode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction277
+private class ReduceAction289
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7111,17 +7388,20 @@ private class ReduceAction277
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tggnode3 = nodearraylist2
+                                       assert tggnode3 isa nullable TGg
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AGgExpr = new AGgExpr.init_aggexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tggnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction278
+private class ReduceAction290
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7132,17 +7412,20 @@ private class ReduceAction278
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tstarshipnode3 = nodearraylist2
+                                       assert tstarshipnode3 isa nullable TStarship
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AStarshipExpr = new AStarshipExpr.init_astarshipexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tstarshipnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction279
+private class ReduceAction291
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7153,17 +7436,20 @@ private class ReduceAction279
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var ptypenode3 = nodearraylist4
-                                       assert ptypenode3 isa nullable AType
+                                       var tkwisanode3 = nodearraylist2
+                                       assert tkwisanode3 isa nullable TKwisa
+                                       var ptypenode4 = nodearraylist4
+                                       assert ptypenode4 isa nullable AType
                                        var pexprnode1: nullable AIsaExpr = new AIsaExpr.init_aisaexpr(
                                                pexprnode2,
-                                               ptypenode3
+                                               tkwisanode3,
+                                               ptypenode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction281
+private class ReduceAction293
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7174,17 +7460,20 @@ private class ReduceAction281
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tplusnode3 = nodearraylist2
+                                       assert tplusnode3 isa nullable TPlus
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable APlusExpr = new APlusExpr.init_aplusexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tplusnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction282
+private class ReduceAction294
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7195,17 +7484,20 @@ private class ReduceAction282
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tminusnode3 = nodearraylist2
+                                       assert tminusnode3 isa nullable TMinus
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AMinusExpr = new AMinusExpr.init_aminusexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tminusnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction284
+private class ReduceAction296
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7216,17 +7508,20 @@ private class ReduceAction284
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tstarnode3 = nodearraylist2
+                                       assert tstarnode3 isa nullable TStar
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AStarExpr = new AStarExpr.init_astarexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tstarnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction285
+private class ReduceAction297
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7237,17 +7532,20 @@ private class ReduceAction285
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tslashnode3 = nodearraylist2
+                                       assert tslashnode3 isa nullable TSlash
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable ASlashExpr = new ASlashExpr.init_aslashexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tslashnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction286
+private class ReduceAction298
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7258,17 +7556,20 @@ private class ReduceAction286
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tpercentnode3 = nodearraylist2
+                                       assert tpercentnode3 isa nullable TPercent
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable APercentExpr = new APercentExpr.init_apercentexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tpercentnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction288
+private class ReduceAction300
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7279,17 +7580,20 @@ private class ReduceAction288
                                        var nodearraylist1 = p.pop
                                        var pexprnode2 = nodearraylist1
                                        assert pexprnode2 isa nullable AExpr
-                                       var pexprnode3 = nodearraylist4
-                                       assert pexprnode3 isa nullable AExpr
+                                       var tstarstarnode3 = nodearraylist2
+                                       assert tstarstarnode3 isa nullable TStarstar
+                                       var pexprnode4 = nodearraylist4
+                                       assert pexprnode4 isa nullable AExpr
                                        var pexprnode1: nullable AStarstarExpr = new AStarstarExpr.init_astarstarexpr(
                                                pexprnode2,
-                                               pexprnode3
+                                               tstarstarnode3,
+                                               pexprnode4
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction290
+private class ReduceAction302
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7308,7 +7612,26 @@ private class ReduceAction290
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction291
+private class ReduceAction303
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tplusnode2 = nodearraylist1
+                                       assert tplusnode2 isa nullable TPlus
+                                       var pexprnode3 = nodearraylist2
+                                       assert pexprnode3 isa nullable AExpr
+                                       var pexprnode1: nullable AUplusExpr = new AUplusExpr.init_auplusexpr(
+                                               tplusnode2,
+                                               pexprnode3
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction304
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7328,7 +7651,7 @@ private class ReduceAction291
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction293
+private class ReduceAction306
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7353,7 +7676,7 @@ private class ReduceAction293
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction294
+private class ReduceAction307
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7379,7 +7702,7 @@ private class ReduceAction294
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction295
+private class ReduceAction308
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7405,7 +7728,7 @@ private class ReduceAction295
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction296
+private class ReduceAction309
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7427,7 +7750,7 @@ private class ReduceAction296
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction298
+private class ReduceAction311
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7449,7 +7772,7 @@ private class ReduceAction298
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction299
+private class ReduceAction312
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7467,7 +7790,7 @@ private class ReduceAction299
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction301
+private class ReduceAction314
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7493,7 +7816,7 @@ private class ReduceAction301
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction303
+private class ReduceAction316
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7520,7 +7843,7 @@ private class ReduceAction303
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction305
+private class ReduceAction318
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7548,7 +7871,7 @@ private class ReduceAction305
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction309
+private class ReduceAction322
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7570,7 +7893,7 @@ private class ReduceAction309
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction311
+private class ReduceAction324
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7593,7 +7916,7 @@ private class ReduceAction311
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction313
+private class ReduceAction326
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7617,7 +7940,7 @@ private class ReduceAction313
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction317
+private class ReduceAction330
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7641,7 +7964,7 @@ private class ReduceAction317
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction319
+private class ReduceAction332
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7667,7 +7990,7 @@ private class ReduceAction319
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction321
+private class ReduceAction334
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7689,7 +8012,7 @@ private class ReduceAction321
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction322
+private class ReduceAction335
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7708,7 +8031,7 @@ private class ReduceAction322
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction323
+private class ReduceAction336
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7738,7 +8061,7 @@ private class ReduceAction323
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction324
+private class ReduceAction337
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7769,7 +8092,7 @@ private class ReduceAction324
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction325
+private class ReduceAction338
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7800,7 +8123,7 @@ private class ReduceAction325
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction326
+private class ReduceAction339
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7832,7 +8155,7 @@ private class ReduceAction326
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction327
+private class ReduceAction340
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7864,7 +8187,7 @@ private class ReduceAction327
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction328
+private class ReduceAction341
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7897,7 +8220,7 @@ private class ReduceAction328
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction331
+private class ReduceAction344
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7933,7 +8256,7 @@ private class ReduceAction331
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction332
+private class ReduceAction345
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7974,7 +8297,7 @@ private class ReduceAction332
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction333
+private class ReduceAction346
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8007,7 +8330,7 @@ private class ReduceAction333
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction334
+private class ReduceAction347
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8026,7 +8349,7 @@ private class ReduceAction334
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction335
+private class ReduceAction348
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8045,7 +8368,7 @@ private class ReduceAction335
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction336
+private class ReduceAction349
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8064,7 +8387,7 @@ private class ReduceAction336
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction337
+private class ReduceAction350
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8083,7 +8406,7 @@ private class ReduceAction337
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction338
+private class ReduceAction351
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8102,7 +8425,7 @@ private class ReduceAction338
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction339
+private class ReduceAction352
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8121,7 +8444,7 @@ private class ReduceAction339
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction340
+private class ReduceAction353
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8140,7 +8463,7 @@ private class ReduceAction340
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction341
+private class ReduceAction354
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8159,7 +8482,7 @@ private class ReduceAction341
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction342
+private class ReduceAction355
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8178,7 +8501,7 @@ private class ReduceAction342
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction343
+private class ReduceAction356
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8197,7 +8520,7 @@ private class ReduceAction343
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction346
+private class ReduceAction359
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8233,7 +8556,7 @@ private class ReduceAction346
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction347
+private class ReduceAction360
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8269,7 +8592,7 @@ private class ReduceAction347
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction348
+private class ReduceAction361
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8303,7 +8626,7 @@ private class ReduceAction348
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction349
+private class ReduceAction362
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8332,7 +8655,7 @@ private class ReduceAction349
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction351
+private class ReduceAction364
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8355,7 +8678,7 @@ private class ReduceAction351
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction352
+private class ReduceAction365
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8368,7 +8691,7 @@ private class ReduceAction352
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction353
+private class ReduceAction366
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8383,7 +8706,7 @@ private class ReduceAction353
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction354
+private class ReduceAction367
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8402,7 +8725,7 @@ private class ReduceAction354
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction356
+private class ReduceAction369
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8414,7 +8737,7 @@ private class ReduceAction356
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction358
+private class ReduceAction371
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8442,7 +8765,7 @@ private class ReduceAction358
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction359
+private class ReduceAction372
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8469,7 +8792,7 @@ private class ReduceAction359
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction360
+private class ReduceAction373
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8500,7 +8823,7 @@ private class ReduceAction360
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction361
+private class ReduceAction374
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8522,7 +8845,7 @@ private class ReduceAction361
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction362
+private class ReduceAction375
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8538,7 +8861,7 @@ private class ReduceAction362
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction363
+private class ReduceAction376
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8553,7 +8876,7 @@ private class ReduceAction363
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction366
+private class ReduceAction379
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8568,7 +8891,7 @@ private class ReduceAction366
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction367
+private class ReduceAction380
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8583,7 +8906,7 @@ private class ReduceAction367
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction368
+private class ReduceAction381
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8608,7 +8931,7 @@ private class ReduceAction368
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction369
+private class ReduceAction382
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8639,7 +8962,7 @@ private class ReduceAction369
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction370
+private class ReduceAction383
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8650,7 +8973,7 @@ private class ReduceAction370
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction372
+private class ReduceAction385
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8682,7 +9005,7 @@ private class ReduceAction372
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction373
+private class ReduceAction386
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8726,7 +9049,7 @@ private class ReduceAction373
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction374
+private class ReduceAction387
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8746,7 +9069,7 @@ private class ReduceAction374
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction375
+private class ReduceAction388
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8761,7 +9084,7 @@ private class ReduceAction375
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction376
+private class ReduceAction389
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8780,7 +9103,7 @@ private class ReduceAction376
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction379
+private class ReduceAction392
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8815,7 +9138,7 @@ private class ReduceAction379
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction381
+private class ReduceAction394
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8828,7 +9151,7 @@ private class ReduceAction381
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction383
+private class ReduceAction396
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8861,7 +9184,7 @@ private class ReduceAction383
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction384
+private class ReduceAction397
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8897,7 +9220,7 @@ private class ReduceAction384
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction385
+private class ReduceAction398
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8941,7 +9264,7 @@ private class ReduceAction385
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction386
+private class ReduceAction399
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8988,7 +9311,7 @@ private class ReduceAction386
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction387
+private class ReduceAction400
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9025,7 +9348,7 @@ private class ReduceAction387
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction388
+private class ReduceAction401
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9051,7 +9374,7 @@ private class ReduceAction388
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction389
+private class ReduceAction402
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9080,7 +9403,7 @@ private class ReduceAction389
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction390
+private class ReduceAction403
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9117,7 +9440,7 @@ private class ReduceAction390
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction391
+private class ReduceAction404
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9157,7 +9480,7 @@ private class ReduceAction391
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction392
+private class ReduceAction405
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9187,7 +9510,7 @@ private class ReduceAction392
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction396
+private class ReduceAction409
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9202,7 +9525,7 @@ private class ReduceAction396
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction399
+private class ReduceAction412
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9223,7 +9546,7 @@ private class ReduceAction399
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction400
+private class ReduceAction413
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9240,7 +9563,7 @@ private class ReduceAction400
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction401
+private class ReduceAction414
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9255,7 +9578,7 @@ private class ReduceAction401
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction402
+private class ReduceAction415
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9270,7 +9593,7 @@ private class ReduceAction402
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction403
+private class ReduceAction416
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9285,7 +9608,7 @@ private class ReduceAction403
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction404
+private class ReduceAction417
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9300,7 +9623,7 @@ private class ReduceAction404
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction405
+private class ReduceAction418
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9326,7 +9649,7 @@ private class ReduceAction405
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction406
+private class ReduceAction419
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9348,7 +9671,7 @@ private class ReduceAction406
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction408
+private class ReduceAction421
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9367,7 +9690,7 @@ private class ReduceAction408
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction410
+private class ReduceAction423
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9380,7 +9703,7 @@ private class ReduceAction410
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction411
+private class ReduceAction424
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9406,7 +9729,7 @@ private class ReduceAction411
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction412
+private class ReduceAction425
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9423,7 +9746,7 @@ private class ReduceAction412
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction414
+private class ReduceAction427
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9443,7 +9766,7 @@ private class ReduceAction414
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction415
+private class ReduceAction428
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9457,7 +9780,7 @@ private class ReduceAction415
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction416
+private class ReduceAction429
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9475,7 +9798,7 @@ private class ReduceAction416
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction417
+private class ReduceAction430
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9489,7 +9812,7 @@ private class ReduceAction417
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction418
+private class ReduceAction431
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9504,7 +9827,7 @@ private class ReduceAction418
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction419
+private class ReduceAction432
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9525,7 +9848,7 @@ private class ReduceAction419
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction420
+private class ReduceAction433
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9543,7 +9866,7 @@ private class ReduceAction420
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction421
+private class ReduceAction434
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9565,7 +9888,7 @@ private class ReduceAction421
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction422
+private class ReduceAction435
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9587,7 +9910,7 @@ private class ReduceAction422
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction423
+private class ReduceAction436
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9613,7 +9936,7 @@ private class ReduceAction423
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction424
+private class ReduceAction437
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9630,7 +9953,7 @@ private class ReduceAction424
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction425
+private class ReduceAction438
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9651,7 +9974,7 @@ private class ReduceAction425
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction426
+private class ReduceAction439
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9669,7 +9992,7 @@ private class ReduceAction426
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction428
+private class ReduceAction441
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9680,7 +10003,7 @@ private class ReduceAction428
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction429
+private class ReduceAction442
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9692,7 +10015,7 @@ private class ReduceAction429
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction430
+private class ReduceAction443
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9705,7 +10028,7 @@ private class ReduceAction430
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction432
+private class ReduceAction445
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9716,7 +10039,7 @@ private class ReduceAction432
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction433
+private class ReduceAction446
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9728,7 +10051,7 @@ private class ReduceAction433
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction434
+private class ReduceAction447
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9741,7 +10064,7 @@ private class ReduceAction434
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction436
+private class ReduceAction449
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9754,7 +10077,7 @@ private class ReduceAction436
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction437
+private class ReduceAction450
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9767,7 +10090,7 @@ private class ReduceAction437
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction439
+private class ReduceAction452
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9778,7 +10101,7 @@ private class ReduceAction439
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction440
+private class ReduceAction453
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9787,7 +10110,7 @@ private class ReduceAction440
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction442
+private class ReduceAction455
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9804,7 +10127,7 @@ private class ReduceAction442
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction443
+private class ReduceAction456
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9822,7 +10145,7 @@ private class ReduceAction443
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction446
+private class ReduceAction459
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9833,7 +10156,7 @@ private class ReduceAction446
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction447
+private class ReduceAction460
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9843,7 +10166,7 @@ private class ReduceAction447
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction448
+private class ReduceAction461
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9854,7 +10177,7 @@ private class ReduceAction448
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction776
+private class ReduceAction793
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9878,7 +10201,7 @@ private class ReduceAction776
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction778
+private class ReduceAction795
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9898,7 +10221,7 @@ private class ReduceAction778
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction779
+private class ReduceAction796
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9921,7 +10244,7 @@ private class ReduceAction779
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction780
+private class ReduceAction797
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9945,7 +10268,7 @@ private class ReduceAction780
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction781
+private class ReduceAction798
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9969,7 +10292,7 @@ private class ReduceAction781
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction782
+private class ReduceAction799
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9994,7 +10317,7 @@ private class ReduceAction782
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction789
+private class ReduceAction806
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10017,7 +10340,7 @@ private class ReduceAction789
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction790
+private class ReduceAction807
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10041,7 +10364,7 @@ private class ReduceAction790
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction813
+private class ReduceAction830
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10054,7 +10377,7 @@ private class ReduceAction813
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction814
+private class ReduceAction831
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10064,7 +10387,7 @@ private class ReduceAction814
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction964
+private class ReduceAction989
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10079,7 +10402,7 @@ private class ReduceAction964
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction965
+private class ReduceAction990
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10098,7 +10421,7 @@ private class ReduceAction965
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction966
+private class ReduceAction991
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10113,7 +10436,7 @@ private class ReduceAction966
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction967
+private class ReduceAction992
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10132,7 +10455,7 @@ private class ReduceAction967
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction968
+private class ReduceAction993
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10147,7 +10470,7 @@ private class ReduceAction968
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction969
+private class ReduceAction994
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10166,7 +10489,7 @@ private class ReduceAction969
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction970
+private class ReduceAction995
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10181,7 +10504,7 @@ private class ReduceAction970
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction971
+private class ReduceAction996
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10200,7 +10523,7 @@ private class ReduceAction971
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction973
+private class ReduceAction998
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10219,7 +10542,7 @@ private class ReduceAction973
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction974
+private class ReduceAction999
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10234,7 +10557,7 @@ private class ReduceAction974
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction975
+private class ReduceAction1000
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10253,7 +10576,7 @@ private class ReduceAction975
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction976
+private class ReduceAction1001
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10268,7 +10591,7 @@ private class ReduceAction976
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction977
+private class ReduceAction1002
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10287,7 +10610,7 @@ private class ReduceAction977
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction979
+private class ReduceAction1004
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10306,7 +10629,7 @@ private class ReduceAction979
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction981
+private class ReduceAction1006
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10325,7 +10648,7 @@ private class ReduceAction981
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction987
+private class ReduceAction1012
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10343,7 +10666,7 @@ private class ReduceAction987
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction989
+private class ReduceAction1014
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10362,7 +10685,7 @@ private class ReduceAction989
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction997
+private class ReduceAction1022
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10381,7 +10704,7 @@ private class ReduceAction997
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction998
+private class ReduceAction1023
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10396,7 +10719,7 @@ private class ReduceAction998
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction999
+private class ReduceAction1024
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10415,7 +10738,7 @@ private class ReduceAction999
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1000
+private class ReduceAction1025
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10430,7 +10753,7 @@ private class ReduceAction1000
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1001
+private class ReduceAction1026
        super ReduceAction
        redef fun action(p: Parser)
        do
index 0b4e24e..f2917d4 100644 (file)
@@ -154,6 +154,9 @@ end
 class TKwlabel
        super Token
 end
+class TKwwith
+       super Token
+end
 class TKwdebug
        super Token
 end
@@ -187,6 +190,24 @@ end
 class TMinuseq
        super Token
 end
+class TStareq
+       super Token
+end
+class TSlasheq
+       super Token
+end
+class TPercenteq
+       super Token
+end
+class TStarstareq
+       super Token
+end
+class TLleq
+       super Token
+end
+class TGgeq
+       super Token
+end
 class TDotdotdot
        super Token
 end
@@ -597,7 +618,7 @@ class ABlockExpr
 end
 class AVardeclExpr
        super AExpr
-       var n_kwvar: TKwvar is writable, noinit
+       var n_kwvar: nullable TKwvar = null is writable
        var n_id: TId is writable, noinit
        var n_type: nullable AType = null is writable
        var n_assign: nullable TAssign = null is writable
@@ -668,6 +689,14 @@ class AForExpr
        var n_block: nullable AExpr = null is writable
        var n_label: nullable ALabel = null is writable
 end
+class AWithExpr
+       super AExpr
+       var n_kwwith: TKwwith is writable, noinit
+       var n_expr: AExpr is writable, noinit
+       var n_kwdo: TKwdo is writable, noinit
+       var n_block: nullable AExpr = null is writable
+       var n_label: nullable ALabel = null is writable
+end
 class AAssertExpr
        super AExpr
        var n_kwassert: TKwassert is writable, noinit
@@ -692,21 +721,26 @@ end
 class AOrExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TKwor is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AAndExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TKwand is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AOrElseExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TKwor is writable, noinit
+       var n_kwelse: TKwelse is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AImpliesExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TKwimplies is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class ANotExpr
@@ -717,81 +751,97 @@ end
 class AEqExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TEq is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class ANeExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TNe is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class ALtExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TLt is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class ALeExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TLe is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class ALlExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TLl is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AGtExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TGt is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AGeExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TGe is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AGgExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TGg is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AIsaExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_kwisa: TKwisa is writable, noinit
        var n_type: AType is writable, noinit
 end
 class APlusExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TPlus is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AMinusExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TMinus is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AStarshipExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TStarship is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AStarExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TStar is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AStarstarExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TStarstar is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class ASlashExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TSlash is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class APercentExpr
        super AExpr
        var n_expr: AExpr is writable, noinit
+       var n_op: TPercent is writable, noinit
        var n_expr2: AExpr is writable, noinit
 end
 class AUminusExpr
@@ -799,6 +849,11 @@ class AUminusExpr
        var n_minus: TMinus is writable, noinit
        var n_expr: AExpr is writable, noinit
 end
+class AUplusExpr
+       super AExpr
+       var n_plus: TPlus is writable, noinit
+       var n_expr: AExpr is writable, noinit
+end
 class ANewExpr
        super AExpr
        var n_kwnew: TKwnew is writable, noinit
@@ -1066,11 +1121,35 @@ class ABraExprs
 end
 class APlusAssignOp
        super AAssignOp
-       var n_pluseq: TPluseq is writable, noinit
+       var n_op: TPluseq is writable, noinit
 end
 class AMinusAssignOp
        super AAssignOp
-       var n_minuseq: TMinuseq is writable, noinit
+       var n_op: TMinuseq is writable, noinit
+end
+class AStarAssignOp
+       super AAssignOp
+       var n_op: TStareq is writable, noinit
+end
+class ASlashAssignOp
+       super AAssignOp
+       var n_op: TSlasheq is writable, noinit
+end
+class APercentAssignOp
+       super AAssignOp
+       var n_op: TPercenteq is writable, noinit
+end
+class AStarstarAssignOp
+       super AAssignOp
+       var n_op: TStarstareq is writable, noinit
+end
+class ALlAssignOp
+       super AAssignOp
+       var n_op: TLleq is writable, noinit
+end
+class AGgAssignOp
+       super AAssignOp
+       var n_op: TGgeq is writable, noinit
 end
 class AModuleName
        super AModuleName
index 270c185..1525f17 100644 (file)
@@ -661,6 +661,11 @@ class TKwlabel
        super TokenKeyword
 end
 
+# The keyword `with`
+class TKwwith
+       super TokenKeyword
+end
+
 # The special keyword `__DEBUG__`
 class TKwdebug
        super Token
@@ -725,6 +730,36 @@ class TMinuseq
        super TokenOperator
 end
 
+# The operator `*=`
+class TStareq
+       super TokenOperator
+end
+
+# The operator `/=`
+class TSlasheq
+       super TokenOperator
+end
+
+# The operator `%=`
+class TPercenteq
+       super TokenOperator
+end
+
+# The operator `**=`
+class TStarstareq
+       super TokenOperator
+end
+
+# The operator `<<=`
+class TLleq
+       super TokenOperator
+end
+
+# The operator `>>=`
+class TGgeq
+       super TokenOperator
+end
+
 # The symbol `...`
 class TDotdotdot
        super Token
@@ -1598,7 +1633,7 @@ class ALabel
        var n_kwlabel: TKwlabel is writable, noinit
 
        # The name of the label, if any
-       var n_id: nullable TId is writable
+       var n_id: nullable TId is writable, noinit
 end
 
 # Expression and statements
@@ -1625,7 +1660,7 @@ class AVardeclExpr
        super AExpr
 
        # The `var` keyword
-       var n_kwvar: TKwvar is writable, noinit
+       var n_kwvar: nullable TKwvar = null is writable
 
        # The name of the local variable
        var n_id: TId is writable, noinit
@@ -1795,6 +1830,24 @@ class AForExpr
        var n_block: nullable AExpr = null is writable
 end
 
+# A `with` statement
+class AWithExpr
+       super AExpr
+       super ALabelable
+
+       # The `with` keyword
+       var n_kwwith: TKwwith is writable, noinit
+
+       # The expression used to get the value to control
+       var n_expr: AExpr is writable, noinit
+
+       # The `do` keyword
+       var n_kwdo: TKwdo is writable, noinit
+
+       # The body of the loop
+       var n_block: nullable AExpr = null is writable
+end
+
 # An `assert` statement
 class AAssertExpr
        super AExpr
@@ -1856,9 +1909,16 @@ end
 # A binary operation on a method
 abstract class ABinopExpr
        super ASendExpr
+
+       # The operator
+       var n_op: Token is writable, noinit
+
        # The second operand of the operation
        # Note: the receiver (`n_expr`) is the first operand
        var n_expr2: AExpr is writable, noinit
+
+       # The name of the operator (eg '+')
+       fun operator: String is abstract
 end
 
 # Something that is boolean expression
@@ -1873,6 +1933,9 @@ abstract class ABinBoolExpr
        # The first boolean operand
        var n_expr: AExpr is writable, noinit
 
+       # The operator
+       var n_op: Token is writable, noinit
+
        # The second boolean operand
        var n_expr2: AExpr is writable, noinit
 end
@@ -1890,6 +1953,9 @@ end
 # A `or else` expression
 class AOrElseExpr
        super ABinBoolExpr
+
+       # The `else` keyword
+       var n_kwelse: TKwelse is writable, noinit
 end
 
 # A `implies` expression
@@ -1911,41 +1977,49 @@ end
 # A `==` expression
 class AEqExpr
        super ABinopExpr
+       redef fun operator do return "=="
 end
 
 # A `!=` expression
 class ANeExpr
        super ABinopExpr
+       redef fun operator do return "!="
 end
 
 # A `<` expression
 class ALtExpr
        super ABinopExpr
+       redef fun operator do return "<"
 end
 
 # A `<=` expression
 class ALeExpr
        super ABinopExpr
+       redef fun operator do return "<="
 end
 
 # A `<<` expression
 class ALlExpr
        super ABinopExpr
+       redef fun operator do return "<<"
 end
 
 # A `>` expression
 class AGtExpr
        super ABinopExpr
+       redef fun operator do return ">"
 end
 
 # A `>=` expression
 class AGeExpr
        super ABinopExpr
+       redef fun operator do return ">="
 end
 
 # A `>>` expression
 class AGgExpr
        super ABinopExpr
+       redef fun operator do return ">>"
 end
 
 # A type-ckeck expression. eg `x isa T`
@@ -1955,6 +2029,9 @@ class AIsaExpr
        # The expression to check
        var n_expr: AExpr is writable, noinit
 
+       # The `isa` keyword
+       var n_kwisa: TKwisa is writable, noinit
+
        # The destination type to check to
        var n_type: AType is writable, noinit
 end
@@ -1962,36 +2039,43 @@ end
 # A `+` expression
 class APlusExpr
        super ABinopExpr
+       redef fun operator do return "+"
 end
 
 # A `-` expression
 class AMinusExpr
        super ABinopExpr
+       redef fun operator do return "-"
 end
 
 # A `<=>` expression
 class AStarshipExpr
        super ABinopExpr
+       redef fun operator do return "<=>"
 end
 
 # A `*` expression
 class AStarExpr
        super ABinopExpr
+       redef fun operator do return "*"
 end
 
 # A `**` expression
 class AStarstarExpr
        super ABinopExpr
+       redef fun operator do return "**"
 end
 
 # A `/` expression
 class ASlashExpr
        super ABinopExpr
+       redef fun operator do return "/"
 end
 
 # A `%` expression
 class APercentExpr
        super ABinopExpr
+       redef fun operator do return "%"
 end
 
 # A unary minus expression. eg `-x`
@@ -2002,6 +2086,14 @@ class AUminusExpr
        var n_minus: TMinus is writable, noinit
 end
 
+# A unary plus expression. eg `+x`
+class AUplusExpr
+       super ASendExpr
+
+       # The `+` symbol
+       var n_plus: TPlus is writable, noinit
+end
+
 # An explicit instantiation. eg `new T`
 class ANewExpr
        super AExpr
@@ -2222,7 +2314,7 @@ class ASelfExpr
        super AExpr
 
        # The `self` keyword
-       var n_kwself: nullable TKwself is writable
+       var n_kwself: nullable TKwself = null is writable
 end
 
 # When there is no explicit receiver, `self` is implicit
@@ -2489,22 +2581,68 @@ end
 # A complex assignment operator. (`+=` and `-=`)
 abstract class AAssignOp
        super Prod
+
+       # The combined assignment operator
+       var n_op: Token is writable, noinit
+
+       # The name of the operator without the `=` (eg '+')
+       fun operator: String is abstract
 end
 
-# The `+=` assignment operation
+# A `+=` assignment operation
 class APlusAssignOp
        super AAssignOp
 
-       # The `+=` operator
-       var n_pluseq: TPluseq is writable, noinit
+       redef fun operator do return "+"
 end
 
-# The `-=` assignment operator
+# A `-=` assignment operation
 class AMinusAssignOp
        super AAssignOp
 
-       # The `-=` operator
-       var n_minuseq: TMinuseq is writable, noinit
+       redef fun operator do return "-"
+end
+
+# A `*=` assignment operation
+class AStarAssignOp
+       super AAssignOp
+
+       redef fun operator do return "*"
+end
+
+# A `/=` assignment operation
+class ASlashAssignOp
+       super AAssignOp
+
+       redef fun operator do return "/"
+end
+
+# A `%=` assignment operation
+class APercentAssignOp
+       super AAssignOp
+
+       redef fun operator do return "%"
+end
+
+# A `**=` assignment operation
+class AStarstarAssignOp
+       super AAssignOp
+
+       redef fun operator do return "**"
+end
+
+# A `<<=` assignment operation
+class ALlAssignOp
+       super AAssignOp
+
+       redef fun operator do return "<<"
+end
+
+# A `>>=` assignment operation
+class AGgAssignOp
+       super AAssignOp
+
+       redef fun operator do return ">>"
 end
 
 # A possibly fully-qualified module identifier
index 0c9f9d7..5ca9042 100644 (file)
@@ -2294,8 +2294,8 @@ redef class AVardeclExpr
                n_annotations: nullable AAnnotations
        )
        do
-               _n_kwvar = n_kwvar.as(not null)
-               n_kwvar.parent = self
+               _n_kwvar = n_kwvar
+               if n_kwvar != null then n_kwvar.parent = self
                _n_id = n_id.as(not null)
                n_id.parent = self
                _n_type = n_type
@@ -2311,7 +2311,7 @@ redef class AVardeclExpr
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
        do
                if _n_kwvar == old_child then
-                       n_kwvar = new_child.as(TKwvar)
+                       n_kwvar = new_child.as(nullable TKwvar)
                        return
                end
                if _n_id == old_child then
@@ -2339,7 +2339,7 @@ redef class AVardeclExpr
        redef fun n_kwvar=(node)
        do
                _n_kwvar = node
-               node.parent = self
+               if node != null then node.parent = self
        end
        redef fun n_id=(node)
        do
@@ -2971,6 +2971,87 @@ redef class AForExpr
                v.enter_visit(_n_label)
        end
 end
+redef class AWithExpr
+       init init_awithexpr (
+               n_kwwith: nullable TKwwith,
+               n_expr: nullable AExpr,
+               n_kwdo: nullable TKwdo,
+               n_block: nullable AExpr,
+               n_label: nullable ALabel
+       )
+       do
+               _n_kwwith = n_kwwith.as(not null)
+               n_kwwith.parent = self
+               _n_expr = n_expr.as(not null)
+               n_expr.parent = self
+               _n_kwdo = n_kwdo.as(not null)
+               n_kwdo.parent = self
+               _n_block = n_block
+               if n_block != null then n_block.parent = self
+               _n_label = n_label
+               if n_label != null then n_label.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_kwwith == old_child then
+                       n_kwwith = new_child.as(TKwwith)
+                       return
+               end
+               if _n_expr == old_child then
+                       n_expr = new_child.as(AExpr)
+                       return
+               end
+               if _n_kwdo == old_child then
+                       n_kwdo = new_child.as(TKwdo)
+                       return
+               end
+               if _n_block == old_child then
+                       n_block = new_child.as(nullable AExpr)
+                       return
+               end
+               if _n_label == old_child then
+                       n_label = new_child.as(nullable ALabel)
+                       return
+               end
+       end
+
+       redef fun n_kwwith=(node)
+       do
+               _n_kwwith = node
+               node.parent = self
+       end
+       redef fun n_expr=(node)
+       do
+               _n_expr = node
+               node.parent = self
+       end
+       redef fun n_kwdo=(node)
+       do
+               _n_kwdo = node
+               node.parent = self
+       end
+       redef fun n_block=(node)
+       do
+               _n_block = node
+               if node != null then node.parent = self
+       end
+       redef fun n_label=(node)
+       do
+               _n_label = node
+               if node != null then node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_kwwith)
+               v.enter_visit(_n_expr)
+               v.enter_visit(_n_kwdo)
+               v.enter_visit(_n_block)
+               v.enter_visit(_n_label)
+       end
+end
 redef class AAssertExpr
        init init_aassertexpr (
                n_kwassert: nullable TKwassert,
@@ -3155,11 +3236,14 @@ end
 redef class AOrExpr
        init init_aorexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TKwor,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3170,6 +3254,10 @@ redef class AOrExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TKwor)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3181,6 +3269,11 @@ redef class AOrExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3191,17 +3284,21 @@ redef class AOrExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AAndExpr
        init init_aandexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TKwand,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3212,6 +3309,10 @@ redef class AAndExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TKwand)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3223,6 +3324,11 @@ redef class AAndExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3233,17 +3339,24 @@ redef class AAndExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AOrElseExpr
        init init_aorelseexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TKwor,
+               n_kwelse: nullable TKwelse,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
+               _n_kwelse = n_kwelse.as(not null)
+               n_kwelse.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3254,6 +3367,14 @@ redef class AOrElseExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TKwor)
+                       return
+               end
+               if _n_kwelse == old_child then
+                       n_kwelse = new_child.as(TKwelse)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3265,6 +3386,16 @@ redef class AOrElseExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
+       redef fun n_kwelse=(node)
+       do
+               _n_kwelse = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3275,17 +3406,22 @@ redef class AOrElseExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
+               v.enter_visit(_n_kwelse)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AImpliesExpr
        init init_aimpliesexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TKwimplies,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3296,6 +3432,10 @@ redef class AImpliesExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TKwimplies)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3307,6 +3447,11 @@ redef class AImpliesExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3317,6 +3462,7 @@ redef class AImpliesExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
@@ -3365,11 +3511,14 @@ end
 redef class AEqExpr
        init init_aeqexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TEq,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3380,6 +3529,10 @@ redef class AEqExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TEq)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3391,6 +3544,11 @@ redef class AEqExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3401,17 +3559,21 @@ redef class AEqExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class ANeExpr
        init init_aneexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TNe,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3422,6 +3584,10 @@ redef class ANeExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TNe)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3433,6 +3599,11 @@ redef class ANeExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3443,17 +3614,21 @@ redef class ANeExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class ALtExpr
        init init_altexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TLt,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3464,6 +3639,10 @@ redef class ALtExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TLt)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3475,6 +3654,11 @@ redef class ALtExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3485,17 +3669,21 @@ redef class ALtExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class ALeExpr
        init init_aleexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TLe,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3506,6 +3694,10 @@ redef class ALeExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TLe)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3517,6 +3709,11 @@ redef class ALeExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3527,17 +3724,21 @@ redef class ALeExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class ALlExpr
        init init_allexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TLl,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3548,6 +3749,10 @@ redef class ALlExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TLl)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3559,6 +3764,11 @@ redef class ALlExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3569,17 +3779,21 @@ redef class ALlExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AGtExpr
        init init_agtexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TGt,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3590,6 +3804,10 @@ redef class AGtExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TGt)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3601,6 +3819,11 @@ redef class AGtExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3611,17 +3834,21 @@ redef class AGtExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AGeExpr
        init init_ageexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TGe,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3632,6 +3859,10 @@ redef class AGeExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TGe)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3643,6 +3874,11 @@ redef class AGeExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3653,17 +3889,21 @@ redef class AGeExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AGgExpr
        init init_aggexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TGg,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3674,6 +3914,10 @@ redef class AGgExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TGg)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3685,6 +3929,11 @@ redef class AGgExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3695,17 +3944,21 @@ redef class AGgExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AIsaExpr
        init init_aisaexpr (
                n_expr: nullable AExpr,
+               n_kwisa: nullable TKwisa,
                n_type: nullable AType
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_kwisa = n_kwisa.as(not null)
+               n_kwisa.parent = self
                _n_type = n_type.as(not null)
                n_type.parent = self
        end
@@ -3716,6 +3969,10 @@ redef class AIsaExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_kwisa == old_child then
+                       n_kwisa = new_child.as(TKwisa)
+                       return
+               end
                if _n_type == old_child then
                        n_type = new_child.as(AType)
                        return
@@ -3727,6 +3984,11 @@ redef class AIsaExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_kwisa=(node)
+       do
+               _n_kwisa = node
+               node.parent = self
+       end
        redef fun n_type=(node)
        do
                _n_type = node
@@ -3737,17 +3999,21 @@ redef class AIsaExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_kwisa)
                v.enter_visit(_n_type)
        end
 end
 redef class APlusExpr
        init init_aplusexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TPlus,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3758,6 +4024,10 @@ redef class APlusExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TPlus)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3769,6 +4039,11 @@ redef class APlusExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3779,17 +4054,21 @@ redef class APlusExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AMinusExpr
        init init_aminusexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TMinus,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3800,6 +4079,10 @@ redef class AMinusExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TMinus)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3811,6 +4094,11 @@ redef class AMinusExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3821,17 +4109,21 @@ redef class AMinusExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AStarshipExpr
        init init_astarshipexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TStarship,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3842,6 +4134,10 @@ redef class AStarshipExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TStarship)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3853,6 +4149,11 @@ redef class AStarshipExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3863,17 +4164,21 @@ redef class AStarshipExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AStarExpr
        init init_astarexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TStar,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3884,6 +4189,10 @@ redef class AStarExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TStar)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3895,6 +4204,11 @@ redef class AStarExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3905,17 +4219,21 @@ redef class AStarExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class AStarstarExpr
        init init_astarstarexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TStarstar,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3926,6 +4244,10 @@ redef class AStarstarExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TStarstar)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3937,6 +4259,11 @@ redef class AStarstarExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3947,17 +4274,21 @@ redef class AStarstarExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class ASlashExpr
        init init_aslashexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TSlash,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -3968,6 +4299,10 @@ redef class ASlashExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TSlash)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -3979,6 +4314,11 @@ redef class ASlashExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -3989,17 +4329,21 @@ redef class ASlashExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
 redef class APercentExpr
        init init_apercentexpr (
                n_expr: nullable AExpr,
+               n_op: nullable TPercent,
                n_expr2: nullable AExpr
        )
        do
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
        end
@@ -4010,6 +4354,10 @@ redef class APercentExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_op == old_child then
+                       n_op = new_child.as(TPercent)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -4021,6 +4369,11 @@ redef class APercentExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -4031,6 +4384,7 @@ redef class APercentExpr
        redef fun visit_all(v: Visitor)
        do
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_op)
                v.enter_visit(_n_expr2)
        end
 end
@@ -4076,6 +4430,48 @@ redef class AUminusExpr
                v.enter_visit(_n_expr)
        end
 end
+redef class AUplusExpr
+       init init_auplusexpr (
+               n_plus: nullable TPlus,
+               n_expr: nullable AExpr
+       )
+       do
+               _n_plus = n_plus.as(not null)
+               n_plus.parent = self
+               _n_expr = n_expr.as(not null)
+               n_expr.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_plus == old_child then
+                       n_plus = new_child.as(TPlus)
+                       return
+               end
+               if _n_expr == old_child then
+                       n_expr = new_child.as(AExpr)
+                       return
+               end
+       end
+
+       redef fun n_plus=(node)
+       do
+               _n_plus = node
+               node.parent = self
+       end
+       redef fun n_expr=(node)
+       do
+               _n_expr = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_plus)
+               v.enter_visit(_n_expr)
+       end
+end
 redef class ANewExpr
        init init_anewexpr (
                n_kwnew: nullable TKwnew,
@@ -6410,60 +6806,234 @@ redef class ABraExprs
 end
 redef class APlusAssignOp
        init init_aplusassignop (
-               n_pluseq: nullable TPluseq
+               n_op: nullable TPluseq
        )
        do
-               _n_pluseq = n_pluseq.as(not null)
-               n_pluseq.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
        end
 
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
        do
-               if _n_pluseq == old_child then
-                       n_pluseq = new_child.as(TPluseq)
+               if _n_op == old_child then
+                       n_op = new_child.as(TPluseq)
                        return
                end
        end
 
-       redef fun n_pluseq=(node)
+       redef fun n_op=(node)
        do
-               _n_pluseq = node
+               _n_op = node
                node.parent = self
        end
 
 
        redef fun visit_all(v: Visitor)
        do
-               v.enter_visit(_n_pluseq)
+               v.enter_visit(_n_op)
        end
 end
 redef class AMinusAssignOp
        init init_aminusassignop (
-               n_minuseq: nullable TMinuseq
+               n_op: nullable TMinuseq
+       )
+       do
+               _n_op = n_op.as(not null)
+               n_op.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_op == old_child then
+                       n_op = new_child.as(TMinuseq)
+                       return
+               end
+       end
+
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_op)
+       end
+end
+redef class AStarAssignOp
+       init init_astarassignop (
+               n_op: nullable TStareq
+       )
+       do
+               _n_op = n_op.as(not null)
+               n_op.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_op == old_child then
+                       n_op = new_child.as(TStareq)
+                       return
+               end
+       end
+
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_op)
+       end
+end
+redef class ASlashAssignOp
+       init init_aslashassignop (
+               n_op: nullable TSlasheq
+       )
+       do
+               _n_op = n_op.as(not null)
+               n_op.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_op == old_child then
+                       n_op = new_child.as(TSlasheq)
+                       return
+               end
+       end
+
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_op)
+       end
+end
+redef class APercentAssignOp
+       init init_apercentassignop (
+               n_op: nullable TPercenteq
+       )
+       do
+               _n_op = n_op.as(not null)
+               n_op.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_op == old_child then
+                       n_op = new_child.as(TPercenteq)
+                       return
+               end
+       end
+
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_op)
+       end
+end
+redef class AStarstarAssignOp
+       init init_astarstarassignop (
+               n_op: nullable TStarstareq
+       )
+       do
+               _n_op = n_op.as(not null)
+               n_op.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_op == old_child then
+                       n_op = new_child.as(TStarstareq)
+                       return
+               end
+       end
+
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_op)
+       end
+end
+redef class ALlAssignOp
+       init init_allassignop (
+               n_op: nullable TLleq
+       )
+       do
+               _n_op = n_op.as(not null)
+               n_op.parent = self
+       end
+
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+       do
+               if _n_op == old_child then
+                       n_op = new_child.as(TLleq)
+                       return
+               end
+       end
+
+       redef fun n_op=(node)
+       do
+               _n_op = node
+               node.parent = self
+       end
+
+
+       redef fun visit_all(v: Visitor)
+       do
+               v.enter_visit(_n_op)
+       end
+end
+redef class AGgAssignOp
+       init init_aggassignop (
+               n_op: nullable TGgeq
        )
        do
-               _n_minuseq = n_minuseq.as(not null)
-               n_minuseq.parent = self
+               _n_op = n_op.as(not null)
+               n_op.parent = self
        end
 
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
        do
-               if _n_minuseq == old_child then
-                       n_minuseq = new_child.as(TMinuseq)
+               if _n_op == old_child then
+                       n_op = new_child.as(TGgeq)
                        return
                end
        end
 
-       redef fun n_minuseq=(node)
+       redef fun n_op=(node)
        do
-               _n_minuseq = node
+               _n_op = node
                node.parent = self
        end
 
 
        redef fun visit_all(v: Visitor)
        do
-               v.enter_visit(_n_minuseq)
+               v.enter_visit(_n_op)
        end
 end
 redef class AModuleName
index 41d6741..c2eff11 100644 (file)
@@ -146,7 +146,7 @@ class Parser
                        else if action_type == 3 then # ERROR
                                # skip injected tokens
                                while not isset token._location do token = lexer.next
-                               var node2 = new AParserError.init_parser_error("Syntax error: unexpected {token}.", token.location, token)
+                               var node2 = new AParserError.init_parser_error("Syntax Error: unexpected {token}.", token.location, token)
                                var node = new Start(null, node2)
                                return node
                        end
@@ -220,7 +220,11 @@ private class ComputeProdLocationVisitor
                                var endl = _last_location
                                assert endl != null
 
-                               n.location = new Location(startl.file, startl.line_start, endl.line_end, startl.column_start, endl.column_end)
+                               if startl == endl then
+                                       n.location = startl
+                               else
+                                       n.location = new Location(startl.file, startl.line_start, endl.line_end, startl.column_start, endl.column_end)
+                               end
 
                                if not _need_after_epsilons.is_empty then
                                        var loc = new Location(endl.file, endl.line_end, endl.line_end, endl.column_end, endl.column_end)
index fcefab5..97cd793 100644 (file)
@@ -94,39 +94,48 @@ static const int lexer_goto_row8[] = {
        13, 13, 58,
        14, 255, 56
 };
+static const int lexer_goto_row9[] = {
+       1,
+       61, 61, 59
+};
 static const int lexer_goto_row10[] = {
        7,
-       0, 9, 59,
-       11, 12, 59,
-       14, 38, 59,
-       39, 39, 60,
-       40, 91, 59,
-       92, 92, 61,
-       93, 255, 59
+       0, 9, 60,
+       11, 12, 60,
+       14, 38, 60,
+       39, 39, 61,
+       40, 91, 60,
+       92, 92, 62,
+       93, 255, 60
 };
 static const int lexer_goto_row13[] = {
-       1,
-       42, 42, 62
+       2,
+       42, 42, 63,
+       61, 61, 64
 };
 static const int lexer_goto_row14[] = {
        1,
-       61, 61, 63
+       61, 61, 65
 };
 static const int lexer_goto_row16[] = {
        1,
-       61, 61, 64
+       61, 61, 66
 };
 static const int lexer_goto_row17[] = {
        2,
-       46, 46, 65,
-       48, 57, 66
+       46, 46, 67,
+       48, 57, 68
+};
+static const int lexer_goto_row18[] = {
+       1,
+       61, 61, 69
 };
 static const int lexer_goto_row19[] = {
        4,
-       46, 46, 67,
+       46, 46, 70,
        48, 57, 19,
-       88, 88, 68,
-       120, 120, 69
+       88, 88, 71,
+       120, 120, 72
 };
 static const int lexer_goto_row20[] = {
        1,
@@ -134,227 +143,228 @@ static const int lexer_goto_row20[] = {
 };
 static const int lexer_goto_row21[] = {
        1,
-       58, 58, 70
+       58, 58, 73
 };
 static const int lexer_goto_row22[] = {
        2,
-       60, 60, 71,
-       61, 61, 72
+       60, 60, 74,
+       61, 61, 75
 };
 static const int lexer_goto_row23[] = {
        1,
-       61, 61, 73
+       61, 61, 76
 };
 static const int lexer_goto_row24[] = {
        2,
-       61, 61, 74,
-       62, 62, 75
+       61, 61, 77,
+       62, 62, 78
 };
 static const int lexer_goto_row26[] = {
        4,
-       48, 57, 76,
-       65, 90, 77,
-       95, 95, 78,
-       97, 122, 79
+       48, 57, 79,
+       65, 90, 80,
+       95, 95, 81,
+       97, 122, 82
 };
 static const int lexer_goto_row29[] = {
        2,
-       95, 95, 80,
-       97, 122, 81
+       95, 95, 83,
+       97, 122, 84
 };
 static const int lexer_goto_row30[] = {
        1,
-       123, 123, 82
+       123, 123, 85
 };
 static const int lexer_goto_row31[] = {
        10,
-       48, 57, 83,
-       65, 90, 84,
-       95, 95, 85,
-       97, 97, 86,
-       98, 98, 87,
-       99, 109, 86,
-       110, 110, 88,
-       111, 114, 86,
-       115, 115, 89,
-       116, 122, 86
+       48, 57, 86,
+       65, 90, 87,
+       95, 95, 88,
+       97, 97, 89,
+       98, 98, 90,
+       99, 109, 89,
+       110, 110, 91,
+       111, 114, 89,
+       115, 115, 92,
+       116, 122, 89
 };
 static const int lexer_goto_row32[] = {
        4,
        48, 95, -32,
-       97, 113, 86,
-       114, 114, 90,
-       115, 122, 86
+       97, 113, 89,
+       114, 114, 93,
+       115, 122, 89
 };
 static const int lexer_goto_row33[] = {
        6,
        48, 95, -32,
-       97, 107, 86,
-       108, 108, 91,
-       109, 110, 86,
-       111, 111, 92,
-       112, 122, 86
+       97, 107, 89,
+       108, 108, 94,
+       109, 110, 89,
+       111, 111, 95,
+       112, 122, 89
 };
 static const int lexer_goto_row34[] = {
        4,
        48, 95, -32,
-       97, 110, 86,
-       111, 111, 93,
-       112, 122, 86
+       97, 110, 89,
+       111, 111, 96,
+       112, 122, 89
 };
 static const int lexer_goto_row35[] = {
        7,
        48, 107, -34,
-       108, 108, 94,
-       109, 109, 86,
-       110, 110, 95,
-       111, 119, 86,
-       120, 120, 96,
-       121, 122, 86
+       108, 108, 97,
+       109, 109, 89,
+       110, 110, 98,
+       111, 119, 89,
+       120, 120, 99,
+       121, 122, 89
 };
 static const int lexer_goto_row36[] = {
        7,
        48, 95, -32,
-       97, 97, 97,
-       98, 110, 86,
-       111, 111, 98,
-       112, 116, 86,
-       117, 117, 99,
-       118, 122, 86
+       97, 97, 100,
+       98, 110, 89,
+       111, 111, 101,
+       112, 116, 89,
+       117, 117, 102,
+       118, 122, 89
 };
 static const int lexer_goto_row37[] = {
        2,
        48, 95, -32,
-       97, 122, 86
+       97, 122, 89
 };
 static const int lexer_goto_row38[] = {
        9,
        48, 95, -32,
-       97, 101, 86,
-       102, 102, 100,
-       103, 108, 86,
-       109, 109, 101,
-       110, 110, 102,
-       111, 114, 86,
-       115, 115, 103,
-       116, 122, 86
+       97, 101, 89,
+       102, 102, 103,
+       103, 108, 89,
+       109, 109, 104,
+       110, 110, 105,
+       111, 114, 89,
+       115, 115, 106,
+       116, 122, 89
 };
 static const int lexer_goto_row39[] = {
        5,
        48, 95, -32,
-       97, 97, 104,
-       98, 110, 86,
-       111, 111, 105,
-       112, 122, 86
+       97, 97, 107,
+       98, 110, 89,
+       111, 111, 108,
+       112, 122, 89
 };
 static const int lexer_goto_row40[] = {
        3,
        48, 110, -35,
-       111, 111, 106,
-       112, 122, 86
+       111, 111, 109,
+       112, 122, 89
 };
 static const int lexer_goto_row41[] = {
        8,
        48, 95, -32,
-       97, 100, 86,
-       101, 101, 107,
-       102, 110, 86,
-       111, 111, 108,
-       112, 116, 86,
-       117, 117, 109,
-       118, 122, 86
+       97, 100, 89,
+       101, 101, 110,
+       102, 110, 89,
+       111, 111, 111,
+       112, 116, 89,
+       117, 117, 112,
+       118, 122, 89
 };
 static const int lexer_goto_row42[] = {
        6,
        48, 95, -32,
-       97, 109, 86,
-       110, 110, 110,
-       111, 113, 86,
-       114, 114, 111,
-       115, 122, 86
+       97, 109, 89,
+       110, 110, 113,
+       111, 113, 89,
+       114, 114, 114,
+       115, 122, 89
 };
 static const int lexer_goto_row43[] = {
        7,
        48, 95, -32,
-       97, 97, 112,
-       98, 113, 86,
-       114, 114, 113,
-       115, 116, 86,
-       117, 117, 114,
-       118, 122, 86
+       97, 97, 115,
+       98, 113, 89,
+       114, 114, 116,
+       115, 116, 89,
+       117, 117, 117,
+       118, 122, 89
 };
 static const int lexer_goto_row44[] = {
        3,
        48, 100, -42,
-       101, 101, 115,
-       102, 122, 86
+       101, 101, 118,
+       102, 122, 89
 };
 static const int lexer_goto_row45[] = {
        5,
        48, 100, -42,
-       101, 101, 116,
-       102, 116, 86,
-       117, 117, 117,
-       118, 122, 86
+       101, 101, 119,
+       102, 116, 89,
+       117, 117, 120,
+       118, 122, 89
 };
 static const int lexer_goto_row46[] = {
        8,
        48, 95, -32,
-       97, 103, 86,
-       104, 104, 118,
-       105, 113, 86,
-       114, 114, 119,
-       115, 120, 86,
-       121, 121, 120,
-       122, 122, 86
+       97, 103, 89,
+       104, 104, 121,
+       105, 113, 89,
+       114, 114, 122,
+       115, 120, 89,
+       121, 121, 123,
+       122, 122, 89
 };
 static const int lexer_goto_row47[] = {
        3,
        48, 109, -43,
-       110, 110, 121,
-       111, 122, 86
+       110, 110, 124,
+       111, 122, 89
 };
 static const int lexer_goto_row48[] = {
        3,
        48, 95, -32,
-       97, 97, 122,
-       98, 122, 86
+       97, 97, 125,
+       98, 122, 89
 };
 static const int lexer_goto_row49[] = {
-       3,
+       4,
        48, 103, -47,
-       104, 104, 123,
-       105, 122, 86
+       104, 104, 126,
+       105, 105, 127,
+       106, 122, 89
 };
 static const int lexer_goto_row50[] = {
        11,
-       0, 9, 124,
-       11, 12, 124,
-       14, 33, 124,
-       34, 34, 125,
-       35, 91, 124,
-       92, 92, 126,
-       93, 122, 124,
-       123, 123, 127,
-       124, 124, 124,
-       125, 125, 128,
-       126, 255, 124
+       0, 9, 128,
+       11, 12, 128,
+       14, 33, 128,
+       34, 34, 129,
+       35, 91, 128,
+       92, 92, 130,
+       93, 122, 128,
+       123, 123, 131,
+       124, 124, 128,
+       125, 125, 132,
+       126, 255, 128
 };
 static const int lexer_goto_row53[] = {
        3,
        0, 33, -8,
-       34, 34, 129,
+       34, 34, 133,
        35, 255, -8
 };
 static const int lexer_goto_row54[] = {
        1,
-       34, 34, 130
+       34, 34, 134
 };
 static const int lexer_goto_row55[] = {
        3,
-       0, 9, 131,
-       11, 12, 131,
-       14, 255, 131
+       0, 9, 135,
+       11, 12, 135,
+       14, 255, 135
 };
 static const int lexer_goto_row57[] = {
        1,
@@ -362,59 +372,59 @@ static const int lexer_goto_row57[] = {
 };
 static const int lexer_goto_row59[] = {
        1,
-       10, 10, 132
-};
-static const int lexer_goto_row60[] = {
-       1,
-       39, 39, 133
+       10, 10, 136
 };
 static const int lexer_goto_row61[] = {
        1,
-       39, 39, 134
+       39, 39, 137
 };
 static const int lexer_goto_row62[] = {
-       3,
-       0, 9, 135,
-       11, 12, 135,
-       14, 255, 135
-};
-static const int lexer_goto_row66[] = {
        1,
-       46, 46, 136
+       39, 39, 138
+};
+static const int lexer_goto_row63[] = {
+       3,
+       0, 9, 139,
+       11, 12, 139,
+       14, 255, 139
 };
-static const int lexer_goto_row67[] = {
+static const int lexer_goto_row64[] = {
        1,
-       48, 57, 66
+       61, 61, 140
 };
 static const int lexer_goto_row68[] = {
        1,
-       48, 57, 66
+       46, 46, 141
 };
 static const int lexer_goto_row69[] = {
-       3,
-       48, 57, 137,
-       65, 70, 138,
-       97, 102, 139
+       1,
+       48, 57, 68
 };
-static const int lexer_goto_row70[] = {
+static const int lexer_goto_row71[] = {
        1,
-       48, 102, -70
+       48, 57, 68
+};
+static const int lexer_goto_row72[] = {
+       3,
+       48, 57, 142,
+       65, 70, 143,
+       97, 102, 144
 };
 static const int lexer_goto_row73[] = {
        1,
-       62, 62, 140
+       48, 102, -73
 };
-static const int lexer_goto_row77[] = {
+static const int lexer_goto_row75[] = {
        1,
-       48, 122, -27
+       61, 61, 145
 };
-static const int lexer_goto_row78[] = {
+static const int lexer_goto_row76[] = {
        1,
-       48, 122, -27
+       62, 62, 146
 };
 static const int lexer_goto_row79[] = {
        1,
-       48, 122, -27
+       61, 61, 147
 };
 static const int lexer_goto_row80[] = {
        1,
@@ -422,1056 +432,1036 @@ static const int lexer_goto_row80[] = {
 };
 static const int lexer_goto_row81[] = {
        1,
-       100, 100, 141
+       48, 122, -27
 };
 static const int lexer_goto_row82[] = {
-       4,
-       48, 57, 142,
-       65, 90, 143,
-       95, 95, 144,
-       97, 122, 145
+       1,
+       48, 122, -27
 };
 static const int lexer_goto_row83[] = {
-       5,
-       0, 91, 146,
-       92, 92, 147,
-       93, 95, 146,
-       96, 96, 148,
-       97, 255, 146
+       1,
+       48, 122, -27
 };
 static const int lexer_goto_row84[] = {
        1,
-       48, 122, -38
+       100, 100, 148
 };
 static const int lexer_goto_row85[] = {
+       4,
+       48, 57, 149,
+       65, 90, 150,
+       95, 95, 151,
+       97, 122, 152
+};
+static const int lexer_goto_row86[] = {
+       5,
+       0, 91, 153,
+       92, 92, 154,
+       93, 95, 153,
+       96, 96, 155,
+       97, 255, 153
+};
+static const int lexer_goto_row87[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row86[] = {
+static const int lexer_goto_row88[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row87[] = {
+static const int lexer_goto_row89[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row88[] = {
+static const int lexer_goto_row90[] = {
+       1,
+       48, 122, -38
+};
+static const int lexer_goto_row91[] = {
        5,
        48, 110, -35,
-       111, 111, 149,
-       112, 114, 86,
-       115, 115, 150,
-       116, 122, 86
+       111, 111, 156,
+       112, 114, 89,
+       115, 115, 157,
+       116, 122, 89
 };
-static const int lexer_goto_row89[] = {
+static const int lexer_goto_row92[] = {
        4,
        48, 95, -32,
-       97, 99, 86,
-       100, 100, 151,
-       101, 122, 86
+       97, 99, 89,
+       100, 100, 158,
+       101, 122, 89
 };
-static const int lexer_goto_row90[] = {
+static const int lexer_goto_row93[] = {
        4,
        48, 95, -32,
-       97, 114, 86,
-       115, 115, 152,
-       116, 122, 86
+       97, 114, 89,
+       115, 115, 159,
+       116, 122, 89
 };
-static const int lexer_goto_row91[] = {
+static const int lexer_goto_row94[] = {
        3,
        48, 100, -42,
-       101, 101, 153,
-       102, 122, 86
+       101, 101, 160,
+       102, 122, 89
 };
-static const int lexer_goto_row92[] = {
+static const int lexer_goto_row95[] = {
        3,
        48, 95, -32,
-       97, 97, 154,
-       98, 122, 86
+       97, 97, 161,
+       98, 122, 89
 };
-static const int lexer_goto_row93[] = {
+static const int lexer_goto_row96[] = {
        3,
        48, 109, -43,
-       110, 110, 155,
-       111, 122, 86
+       110, 110, 162,
+       111, 122, 89
 };
-static const int lexer_goto_row94[] = {
+static const int lexer_goto_row97[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row95[] = {
+static const int lexer_goto_row98[] = {
        3,
-       48, 114, -91,
-       115, 115, 156,
-       116, 122, 86
+       48, 114, -94,
+       115, 115, 163,
+       116, 122, 89
 };
-static const int lexer_goto_row96[] = {
+static const int lexer_goto_row99[] = {
        5,
-       48, 99, -90,
-       100, 100, 157,
-       101, 116, 86,
-       117, 117, 158,
-       118, 122, 86
+       48, 99, -93,
+       100, 100, 164,
+       101, 116, 89,
+       117, 117, 165,
+       118, 122, 89
 };
-static const int lexer_goto_row97[] = {
+static const int lexer_goto_row100[] = {
        4,
        48, 95, -32,
-       97, 115, 86,
-       116, 116, 159,
-       117, 122, 86
+       97, 115, 89,
+       116, 116, 166,
+       117, 122, 89
 };
-static const int lexer_goto_row98[] = {
+static const int lexer_goto_row101[] = {
        3,
        48, 107, -34,
-       108, 108, 160,
-       109, 122, 86
+       108, 108, 167,
+       109, 122, 89
 };
-static const int lexer_goto_row99[] = {
+static const int lexer_goto_row102[] = {
        3,
        48, 113, -33,
-       114, 114, 161,
-       115, 122, 86
+       114, 114, 168,
+       115, 122, 89
 };
-static const int lexer_goto_row100[] = {
+static const int lexer_goto_row103[] = {
        3,
        48, 109, -43,
-       110, 110, 162,
-       111, 122, 86
+       110, 110, 169,
+       111, 122, 89
 };
-static const int lexer_goto_row101[] = {
+static const int lexer_goto_row104[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row102[] = {
+static const int lexer_goto_row105[] = {
        4,
        48, 95, -32,
-       97, 111, 86,
-       112, 112, 163,
-       113, 122, 86
+       97, 111, 89,
+       112, 112, 170,
+       113, 122, 89
 };
-static const int lexer_goto_row103[] = {
+static const int lexer_goto_row106[] = {
        6,
        48, 95, -32,
-       97, 104, 86,
-       105, 105, 164,
-       106, 115, 86,
-       116, 116, 165,
-       117, 122, 86
+       97, 104, 89,
+       105, 105, 171,
+       106, 115, 89,
+       116, 116, 172,
+       117, 122, 89
 };
-static const int lexer_goto_row104[] = {
+static const int lexer_goto_row107[] = {
        5,
        48, 95, -32,
-       97, 97, 166,
-       98, 114, 86,
-       115, 115, 167,
-       116, 122, 86
+       97, 97, 173,
+       98, 114, 89,
+       115, 115, 174,
+       116, 122, 89
 };
-static const int lexer_goto_row105[] = {
+static const int lexer_goto_row108[] = {
        3,
        48, 97, -32,
-       98, 98, 168,
-       99, 122, 86
+       98, 98, 175,
+       99, 122, 89
 };
-static const int lexer_goto_row106[] = {
+static const int lexer_goto_row109[] = {
        3,
        48, 110, -35,
-       111, 111, 169,
-       112, 122, 86
+       111, 111, 176,
+       112, 122, 89
 };
-static const int lexer_goto_row107[] = {
+static const int lexer_goto_row110[] = {
        3,
-       48, 99, -90,
-       100, 100, 170,
-       101, 122, 86
+       48, 99, -93,
+       100, 100, 177,
+       101, 122, 89
 };
-static const int lexer_goto_row108[] = {
+static const int lexer_goto_row111[] = {
        4,
        48, 95, -32,
-       97, 118, 86,
-       119, 119, 171,
-       120, 122, 86
+       97, 118, 89,
+       119, 119, 178,
+       120, 122, 89
 };
-static const int lexer_goto_row109[] = {
+static const int lexer_goto_row112[] = {
        3,
-       48, 115, -98,
-       116, 116, 172,
-       117, 122, 86
+       48, 115, -101,
+       116, 116, 179,
+       117, 122, 89
 };
-static const int lexer_goto_row110[] = {
+static const int lexer_goto_row113[] = {
        3,
        48, 107, -34,
-       108, 108, 173,
-       109, 122, 86
+       108, 108, 180,
+       109, 122, 89
 };
-static const int lexer_goto_row111[] = {
+static const int lexer_goto_row114[] = {
        4,
        48, 95, -32,
-       97, 98, 86,
-       99, 99, 174,
-       100, 122, 86
+       97, 98, 89,
+       99, 99, 181,
+       100, 122, 89
 };
-static const int lexer_goto_row112[] = {
+static const int lexer_goto_row115[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row113[] = {
+static const int lexer_goto_row116[] = {
        3,
-       48, 98, -112,
-       99, 99, 175,
-       100, 122, 86
+       48, 98, -115,
+       99, 99, 182,
+       100, 122, 89
 };
-static const int lexer_goto_row114[] = {
+static const int lexer_goto_row117[] = {
        5,
-       48, 104, -104,
-       105, 105, 176,
-       106, 110, 86,
-       111, 111, 177,
-       112, 122, 86
+       48, 104, -107,
+       105, 105, 183,
+       106, 110, 89,
+       111, 111, 184,
+       112, 122, 89
 };
-static const int lexer_goto_row115[] = {
+static const int lexer_goto_row118[] = {
        3,
        48, 97, -32,
-       98, 98, 178,
-       99, 122, 86
+       98, 98, 185,
+       99, 122, 89
 };
-static const int lexer_goto_row116[] = {
+static const int lexer_goto_row119[] = {
        5,
-       48, 99, -90,
-       100, 100, 179,
-       101, 115, 86,
-       116, 116, 180,
-       117, 122, 86
+       48, 99, -93,
+       100, 100, 186,
+       101, 115, 89,
+       116, 116, 187,
+       117, 122, 89
 };
-static const int lexer_goto_row117[] = {
+static const int lexer_goto_row120[] = {
        3,
        48, 107, -34,
-       108, 108, 181,
-       109, 122, 86
+       108, 108, 188,
+       109, 122, 89
 };
-static const int lexer_goto_row118[] = {
+static const int lexer_goto_row121[] = {
        3,
-       48, 111, -103,
-       112, 112, 182,
-       113, 122, 86
+       48, 111, -106,
+       112, 112, 189,
+       113, 122, 89
 };
-static const int lexer_goto_row119[] = {
+static const int lexer_goto_row122[] = {
        3,
        48, 100, -42,
-       101, 101, 183,
-       102, 122, 86
+       101, 101, 190,
+       102, 122, 89
 };
-static const int lexer_goto_row120[] = {
+static const int lexer_goto_row123[] = {
        4,
        48, 95, -32,
-       97, 116, 86,
-       117, 117, 184,
-       118, 122, 86
+       97, 116, 89,
+       117, 117, 191,
+       118, 122, 89
 };
-static const int lexer_goto_row121[] = {
+static const int lexer_goto_row124[] = {
        3,
-       48, 111, -103,
-       112, 112, 185,
-       113, 122, 86
+       48, 111, -106,
+       112, 112, 192,
+       113, 122, 89
 };
-static const int lexer_goto_row122[] = {
+static const int lexer_goto_row125[] = {
        3,
-       48, 104, -104,
-       105, 105, 186,
-       106, 122, 86
+       48, 104, -107,
+       105, 105, 193,
+       106, 122, 89
 };
-static const int lexer_goto_row123[] = {
+static const int lexer_goto_row126[] = {
        3,
        48, 113, -33,
-       114, 114, 187,
-       115, 122, 86
+       114, 114, 194,
+       115, 122, 89
 };
-static const int lexer_goto_row124[] = {
+static const int lexer_goto_row127[] = {
        3,
-       48, 104, -104,
-       105, 105, 188,
-       106, 122, 86
+       48, 104, -107,
+       105, 105, 195,
+       106, 122, 89
 };
-static const int lexer_goto_row125[] = {
+static const int lexer_goto_row128[] = {
+       3,
+       48, 115, -101,
+       116, 116, 196,
+       117, 122, 89
+};
+static const int lexer_goto_row129[] = {
        2,
        0, 123, -51,
-       124, 255, 124
+       124, 255, 128
 };
-static const int lexer_goto_row127[] = {
+static const int lexer_goto_row131[] = {
        3,
-       0, 9, 189,
-       11, 12, 189,
-       14, 255, 189
+       0, 9, 197,
+       11, 12, 197,
+       14, 255, 197
 };
-static const int lexer_goto_row129[] = {
+static const int lexer_goto_row133[] = {
        3,
        0, 124, -51,
-       125, 125, 190,
-       126, 255, 124
+       125, 125, 198,
+       126, 255, 128
 };
-static const int lexer_goto_row131[] = {
+static const int lexer_goto_row135[] = {
        11,
-       0, 9, 191,
-       10, 10, 192,
-       11, 12, 191,
-       13, 13, 193,
-       14, 33, 191,
-       34, 34, 194,
-       35, 91, 191,
-       92, 92, 195,
-       93, 122, 191,
-       123, 123, 196,
-       124, 255, 191
-};
-static const int lexer_goto_row132[] = {
+       0, 9, 199,
+       10, 10, 200,
+       11, 12, 199,
+       13, 13, 201,
+       14, 33, 199,
+       34, 34, 202,
+       35, 91, 199,
+       92, 92, 203,
+       93, 122, 199,
+       123, 123, 204,
+       124, 255, 199
+};
+static const int lexer_goto_row136[] = {
        1,
        0, 255, -54
 };
-static const int lexer_goto_row135[] = {
+static const int lexer_goto_row139[] = {
        9,
-       0, 9, 197,
-       10, 10, 198,
-       11, 12, 197,
-       13, 13, 199,
-       14, 38, 197,
-       39, 39, 200,
-       40, 91, 197,
-       92, 92, 201,
-       93, 255, 197
+       0, 9, 205,
+       10, 10, 206,
+       11, 12, 205,
+       13, 13, 207,
+       14, 38, 205,
+       39, 39, 208,
+       40, 91, 205,
+       92, 92, 209,
+       93, 255, 205
 };
-static const int lexer_goto_row136[] = {
+static const int lexer_goto_row140[] = {
        1,
-       39, 39, 202
+       39, 39, 210
 };
-static const int lexer_goto_row138[] = {
+static const int lexer_goto_row143[] = {
        1,
-       48, 102, -70
+       48, 102, -73
 };
-static const int lexer_goto_row139[] = {
+static const int lexer_goto_row144[] = {
        1,
-       48, 102, -70
+       48, 102, -73
 };
-static const int lexer_goto_row140[] = {
+static const int lexer_goto_row145[] = {
        1,
-       48, 102, -70
+       48, 102, -73
 };
-static const int lexer_goto_row142[] = {
+static const int lexer_goto_row149[] = {
        1,
-       101, 101, 203
+       101, 101, 211
 };
-static const int lexer_goto_row143[] = {
+static const int lexer_goto_row150[] = {
        1,
-       48, 122, -83
+       48, 122, -86
 };
-static const int lexer_goto_row144[] = {
+static const int lexer_goto_row151[] = {
        1,
-       48, 122, -83
+       48, 122, -86
 };
-static const int lexer_goto_row145[] = {
+static const int lexer_goto_row152[] = {
        1,
-       48, 122, -83
+       48, 122, -86
 };
-static const int lexer_goto_row146[] = {
+static const int lexer_goto_row153[] = {
        1,
-       48, 122, -83
+       48, 122, -86
 };
-static const int lexer_goto_row147[] = {
+static const int lexer_goto_row154[] = {
        1,
-       0, 255, -84
+       0, 255, -87
 };
-static const int lexer_goto_row148[] = {
+static const int lexer_goto_row155[] = {
        1,
-       0, 255, 204
+       0, 255, 212
 };
-static const int lexer_goto_row149[] = {
+static const int lexer_goto_row156[] = {
        3,
-       0, 124, 205,
-       125, 125, 206,
-       126, 255, 205
+       0, 124, 213,
+       125, 125, 214,
+       126, 255, 213
 };
-static const int lexer_goto_row150[] = {
+static const int lexer_goto_row157[] = {
        3,
        48, 113, -33,
-       114, 114, 207,
-       115, 122, 86
+       114, 114, 215,
+       115, 122, 89
 };
-static const int lexer_goto_row151[] = {
+static const int lexer_goto_row158[] = {
        3,
-       48, 115, -98,
-       116, 116, 208,
-       117, 122, 86
+       48, 115, -101,
+       116, 116, 216,
+       117, 122, 89
 };
-static const int lexer_goto_row152[] = {
+static const int lexer_goto_row159[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row153[] = {
+static const int lexer_goto_row160[] = {
        3,
        48, 100, -42,
-       101, 101, 209,
-       102, 122, 86
+       101, 101, 217,
+       102, 122, 89
 };
-static const int lexer_goto_row154[] = {
+static const int lexer_goto_row161[] = {
        3,
        48, 95, -32,
-       97, 97, 210,
-       98, 122, 86
+       97, 97, 218,
+       98, 122, 89
 };
-static const int lexer_goto_row155[] = {
+static const int lexer_goto_row162[] = {
        3,
-       48, 114, -91,
-       115, 115, 211,
-       116, 122, 86
+       48, 114, -94,
+       115, 115, 219,
+       116, 122, 89
 };
-static const int lexer_goto_row156[] = {
+static const int lexer_goto_row163[] = {
        3,
-       48, 115, -98,
-       116, 116, 212,
-       117, 122, 86
+       48, 115, -101,
+       116, 116, 220,
+       117, 122, 89
 };
-static const int lexer_goto_row157[] = {
+static const int lexer_goto_row164[] = {
        3,
        48, 100, -42,
-       101, 101, 213,
-       102, 122, 86
+       101, 101, 221,
+       102, 122, 89
 };
-static const int lexer_goto_row158[] = {
+static const int lexer_goto_row165[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row159[] = {
+static const int lexer_goto_row166[] = {
        4,
        48, 95, -32,
-       97, 108, 86,
-       109, 109, 214,
-       110, 122, 86
+       97, 108, 89,
+       109, 109, 222,
+       110, 122, 89
 };
-static const int lexer_goto_row160[] = {
+static const int lexer_goto_row167[] = {
        3,
        48, 100, -42,
-       101, 101, 215,
-       102, 122, 86
+       101, 101, 223,
+       102, 122, 89
 };
-static const int lexer_goto_row161[] = {
+static const int lexer_goto_row168[] = {
        3,
-       48, 114, -91,
-       115, 115, 216,
-       116, 122, 86
+       48, 114, -94,
+       115, 115, 224,
+       116, 122, 89
 };
-static const int lexer_goto_row162[] = {
+static const int lexer_goto_row169[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row163[] = {
+static const int lexer_goto_row170[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row164[] = {
+static const int lexer_goto_row171[] = {
        5,
        48, 107, -34,
-       108, 108, 217,
-       109, 110, 86,
-       111, 111, 218,
-       112, 122, 86
+       108, 108, 225,
+       109, 110, 89,
+       111, 111, 226,
+       112, 122, 89
 };
-static const int lexer_goto_row165[] = {
+static const int lexer_goto_row172[] = {
        3,
-       48, 115, -98,
-       116, 116, 219,
-       117, 122, 86
+       48, 115, -101,
+       116, 116, 227,
+       117, 122, 89
 };
-static const int lexer_goto_row166[] = {
+static const int lexer_goto_row173[] = {
        5,
        48, 100, -42,
-       101, 101, 220,
-       102, 113, 86,
-       114, 114, 221,
-       115, 122, 86
+       101, 101, 228,
+       102, 113, 89,
+       114, 114, 229,
+       115, 122, 89
 };
-static const int lexer_goto_row167[] = {
+static const int lexer_goto_row174[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row168[] = {
+static const int lexer_goto_row175[] = {
        3,
        48, 100, -42,
-       101, 101, 222,
-       102, 122, 86
+       101, 101, 230,
+       102, 122, 89
 };
-static const int lexer_goto_row169[] = {
+static const int lexer_goto_row176[] = {
        3,
        48, 100, -42,
-       101, 101, 223,
-       102, 122, 86
+       101, 101, 231,
+       102, 122, 89
 };
-static const int lexer_goto_row170[] = {
+static const int lexer_goto_row177[] = {
        3,
-       48, 111, -103,
-       112, 112, 224,
-       113, 122, 86
+       48, 111, -106,
+       112, 112, 232,
+       113, 122, 89
 };
-static const int lexer_goto_row171[] = {
+static const int lexer_goto_row178[] = {
        3,
-       48, 116, -121,
-       117, 117, 225,
-       118, 122, 86
+       48, 116, -124,
+       117, 117, 233,
+       118, 122, 89
 };
-static const int lexer_goto_row172[] = {
+static const int lexer_goto_row179[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row173[] = {
+static const int lexer_goto_row180[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row174[] = {
+static const int lexer_goto_row181[] = {
        3,
        48, 107, -34,
-       108, 108, 226,
-       109, 122, 86
+       108, 108, 234,
+       109, 122, 89
 };
-static const int lexer_goto_row175[] = {
+static const int lexer_goto_row182[] = {
        3,
        48, 100, -42,
-       101, 101, 227,
-       102, 122, 86
+       101, 101, 235,
+       102, 122, 89
 };
-static const int lexer_goto_row176[] = {
+static const int lexer_goto_row183[] = {
        4,
        48, 95, -32,
-       97, 106, 86,
-       107, 107, 228,
-       108, 122, 86
+       97, 106, 89,
+       107, 107, 236,
+       108, 122, 89
 };
-static const int lexer_goto_row177[] = {
+static const int lexer_goto_row184[] = {
        4,
        48, 95, -32,
-       97, 117, 86,
-       118, 118, 229,
-       119, 122, 86
+       97, 117, 89,
+       118, 118, 237,
+       119, 122, 89
 };
-static const int lexer_goto_row178[] = {
+static const int lexer_goto_row185[] = {
        3,
-       48, 115, -98,
-       116, 116, 230,
-       117, 122, 86
+       48, 115, -101,
+       116, 116, 238,
+       117, 122, 89
 };
-static const int lexer_goto_row179[] = {
+static const int lexer_goto_row186[] = {
        3,
        48, 107, -34,
-       108, 108, 231,
-       109, 122, 86
+       108, 108, 239,
+       109, 122, 89
 };
-static const int lexer_goto_row180[] = {
+static const int lexer_goto_row187[] = {
        3,
        48, 100, -42,
-       101, 101, 232,
-       102, 122, 86
+       101, 101, 240,
+       102, 122, 89
 };
-static const int lexer_goto_row181[] = {
+static const int lexer_goto_row188[] = {
        3,
-       48, 116, -121,
-       117, 117, 233,
-       118, 122, 86
+       48, 116, -124,
+       117, 117, 241,
+       118, 122, 89
 };
-static const int lexer_goto_row182[] = {
+static const int lexer_goto_row189[] = {
        3,
        48, 101, -39,
-       102, 102, 234,
-       103, 122, 86
+       102, 102, 242,
+       103, 122, 89
 };
-static const int lexer_goto_row183[] = {
+static const int lexer_goto_row190[] = {
        3,
        48, 100, -42,
-       101, 101, 235,
-       102, 122, 86
+       101, 101, 243,
+       102, 122, 89
 };
-static const int lexer_goto_row184[] = {
+static const int lexer_goto_row191[] = {
        3,
        48, 109, -43,
-       110, 110, 236,
-       111, 122, 86
+       110, 110, 244,
+       111, 122, 89
 };
-static const int lexer_goto_row185[] = {
+static const int lexer_goto_row192[] = {
        3,
        48, 100, -42,
-       101, 101, 237,
-       102, 122, 86
+       101, 101, 245,
+       102, 122, 89
 };
-static const int lexer_goto_row186[] = {
+static const int lexer_goto_row193[] = {
        3,
        48, 100, -42,
-       101, 101, 238,
-       102, 122, 86
+       101, 101, 246,
+       102, 122, 89
 };
-static const int lexer_goto_row187[] = {
+static const int lexer_goto_row194[] = {
        3,
-       48, 117, -178,
-       118, 118, 239,
-       119, 122, 86
+       48, 117, -185,
+       118, 118, 247,
+       119, 122, 89
 };
-static const int lexer_goto_row188[] = {
+static const int lexer_goto_row195[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row189[] = {
+static const int lexer_goto_row196[] = {
        3,
        48, 107, -34,
-       108, 108, 240,
-       109, 122, 86
+       108, 108, 248,
+       109, 122, 89
 };
-static const int lexer_goto_row190[] = {
+static const int lexer_goto_row197[] = {
+       3,
+       48, 103, -47,
+       104, 104, 249,
+       105, 122, 89
+};
+static const int lexer_goto_row198[] = {
        1,
-       0, 255, -126
+       0, 255, -130
 };
-static const int lexer_goto_row191[] = {
+static const int lexer_goto_row199[] = {
        11,
-       0, 9, 241,
-       10, 10, 242,
-       11, 12, 241,
-       13, 13, 243,
-       14, 33, 241,
-       34, 34, 244,
-       35, 91, 241,
-       92, 92, 245,
-       93, 122, 241,
-       123, 123, 246,
-       124, 255, 241
+       0, 9, 250,
+       10, 10, 251,
+       11, 12, 250,
+       13, 13, 252,
+       14, 33, 250,
+       34, 34, 253,
+       35, 91, 250,
+       92, 92, 254,
+       93, 122, 250,
+       123, 123, 255,
+       124, 255, 250
 };
-static const int lexer_goto_row192[] = {
+static const int lexer_goto_row200[] = {
        1,
-       0, 255, -132
+       0, 255, -136
 };
-static const int lexer_goto_row193[] = {
+static const int lexer_goto_row201[] = {
        1,
-       0, 255, -132
+       0, 255, -136
 };
-static const int lexer_goto_row194[] = {
+static const int lexer_goto_row202[] = {
        1,
-       0, 255, -132
+       0, 255, -136
 };
-static const int lexer_goto_row195[] = {
+static const int lexer_goto_row203[] = {
        5,
-       0, 33, -132,
-       34, 34, 247,
-       35, 122, -132,
-       123, 123, 248,
-       124, 255, 191
+       0, 33, -136,
+       34, 34, 256,
+       35, 122, -136,
+       123, 123, 257,
+       124, 255, 199
 };
-static const int lexer_goto_row196[] = {
+static const int lexer_goto_row204[] = {
        3,
-       0, 9, 249,
-       11, 12, 249,
-       14, 255, 249
+       0, 9, 258,
+       11, 12, 258,
+       14, 255, 258
 };
-static const int lexer_goto_row197[] = {
+static const int lexer_goto_row205[] = {
        5,
-       0, 33, -132,
-       34, 34, 250,
-       35, 122, -132,
-       123, 123, 251,
-       124, 255, 191
+       0, 33, -136,
+       34, 34, 259,
+       35, 122, -136,
+       123, 123, 260,
+       124, 255, 199
 };
-static const int lexer_goto_row198[] = {
+static const int lexer_goto_row206[] = {
        1,
-       0, 255, -136
+       0, 255, -140
 };
-static const int lexer_goto_row199[] = {
+static const int lexer_goto_row207[] = {
        1,
-       0, 255, -136
+       0, 255, -140
 };
-static const int lexer_goto_row200[] = {
+static const int lexer_goto_row208[] = {
        1,
-       0, 255, -136
+       0, 255, -140
 };
-static const int lexer_goto_row201[] = {
+static const int lexer_goto_row209[] = {
        9,
-       0, 9, 252,
-       10, 10, 253,
-       11, 12, 252,
-       13, 13, 254,
-       14, 38, 252,
-       39, 39, 255,
-       40, 91, 252,
-       92, 92, 256,
-       93, 255, 252
+       0, 9, 261,
+       10, 10, 262,
+       11, 12, 261,
+       13, 13, 263,
+       14, 38, 261,
+       39, 39, 264,
+       40, 91, 261,
+       92, 92, 265,
+       93, 255, 261
 };
-static const int lexer_goto_row202[] = {
+static const int lexer_goto_row210[] = {
        3,
-       0, 9, 257,
-       11, 12, 257,
-       14, 255, 257
+       0, 9, 266,
+       11, 12, 266,
+       14, 255, 266
 };
-static const int lexer_goto_row204[] = {
+static const int lexer_goto_row212[] = {
        1,
-       98, 98, 258
+       98, 98, 267
 };
-static const int lexer_goto_row205[] = {
+static const int lexer_goto_row213[] = {
        1,
-       0, 255, -84
+       0, 255, -87
 };
-static const int lexer_goto_row206[] = {
+static const int lexer_goto_row214[] = {
        1,
-       0, 255, -84
+       0, 255, -87
 };
-static const int lexer_goto_row208[] = {
+static const int lexer_goto_row216[] = {
        3,
-       48, 115, -98,
-       116, 116, 259,
-       117, 122, 86
+       48, 115, -101,
+       116, 116, 268,
+       117, 122, 89
 };
-static const int lexer_goto_row209[] = {
+static const int lexer_goto_row217[] = {
        3,
        48, 113, -33,
-       114, 114, 260,
-       115, 122, 86
+       114, 114, 269,
+       115, 122, 89
 };
-static const int lexer_goto_row210[] = {
+static const int lexer_goto_row218[] = {
        3,
        48, 113, -33,
-       114, 114, 261,
-       115, 122, 86
+       114, 114, 270,
+       115, 122, 89
 };
-static const int lexer_goto_row211[] = {
+static const int lexer_goto_row219[] = {
        3,
-       48, 106, -177,
-       107, 107, 262,
-       108, 122, 86
+       48, 106, -184,
+       107, 107, 271,
+       108, 122, 89
 };
-static const int lexer_goto_row212[] = {
+static const int lexer_goto_row220[] = {
        3,
-       48, 114, -91,
-       115, 115, 263,
-       116, 122, 86
+       48, 114, -94,
+       115, 115, 272,
+       116, 122, 89
 };
-static const int lexer_goto_row213[] = {
+static const int lexer_goto_row221[] = {
        3,
-       48, 104, -104,
-       105, 105, 264,
-       106, 122, 86
+       48, 104, -107,
+       105, 105, 273,
+       106, 122, 89
 };
-static const int lexer_goto_row214[] = {
+static const int lexer_goto_row222[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row215[] = {
+static const int lexer_goto_row223[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row216[] = {
+static const int lexer_goto_row224[] = {
        3,
        48, 113, -33,
-       114, 114, 265,
-       115, 122, 86
+       114, 114, 274,
+       115, 122, 89
 };
-static const int lexer_goto_row217[] = {
+static const int lexer_goto_row225[] = {
        3,
        48, 100, -42,
-       101, 101, 266,
-       102, 122, 86
+       101, 101, 275,
+       102, 122, 89
 };
-static const int lexer_goto_row218[] = {
+static const int lexer_goto_row226[] = {
        3,
-       48, 104, -104,
-       105, 105, 267,
-       106, 122, 86
+       48, 104, -107,
+       105, 105, 276,
+       106, 122, 89
 };
-static const int lexer_goto_row219[] = {
+static const int lexer_goto_row227[] = {
        3,
        48, 113, -33,
-       114, 114, 268,
-       115, 122, 86
+       114, 114, 277,
+       115, 122, 89
 };
-static const int lexer_goto_row220[] = {
+static const int lexer_goto_row228[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row221[] = {
+static const int lexer_goto_row229[] = {
        3,
        48, 113, -33,
-       114, 114, 269,
-       115, 122, 86
+       114, 114, 278,
+       115, 122, 89
 };
-static const int lexer_goto_row222[] = {
+static const int lexer_goto_row230[] = {
        3,
-       48, 116, -121,
-       117, 117, 270,
-       118, 122, 86
+       48, 116, -124,
+       117, 117, 279,
+       118, 122, 89
 };
-static const int lexer_goto_row223[] = {
+static const int lexer_goto_row231[] = {
        3,
-       48, 115, -98,
-       116, 116, 271,
-       117, 122, 86
+       48, 115, -101,
+       116, 116, 280,
+       117, 122, 89
 };
-static const int lexer_goto_row224[] = {
+static const int lexer_goto_row232[] = {
        3,
        48, 107, -34,
-       108, 108, 272,
-       109, 122, 86
+       108, 108, 281,
+       109, 122, 89
 };
-static const int lexer_goto_row225[] = {
+static const int lexer_goto_row233[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row226[] = {
+static const int lexer_goto_row234[] = {
        3,
        48, 107, -34,
-       108, 108, 273,
-       109, 122, 86
+       108, 108, 282,
+       109, 122, 89
 };
-static const int lexer_goto_row227[] = {
+static const int lexer_goto_row235[] = {
        3,
        48, 95, -32,
-       97, 97, 274,
-       98, 122, 86
+       97, 97, 283,
+       98, 122, 89
 };
-static const int lexer_goto_row228[] = {
+static const int lexer_goto_row236[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row229[] = {
+static const int lexer_goto_row237[] = {
        3,
        48, 95, -32,
-       97, 97, 275,
-       98, 122, 86
+       97, 97, 284,
+       98, 122, 89
 };
-static const int lexer_goto_row230[] = {
+static const int lexer_goto_row238[] = {
        3,
        48, 95, -32,
-       97, 97, 276,
-       98, 122, 86
+       97, 97, 285,
+       98, 122, 89
 };
-static const int lexer_goto_row231[] = {
+static const int lexer_goto_row239[] = {
        3,
        48, 100, -42,
-       101, 101, 277,
-       102, 122, 86
+       101, 101, 286,
+       102, 122, 89
 };
-static const int lexer_goto_row232[] = {
+static const int lexer_goto_row240[] = {
        3,
-       48, 104, -104,
-       105, 105, 278,
-       106, 122, 86
+       48, 104, -107,
+       105, 105, 287,
+       106, 122, 89
 };
-static const int lexer_goto_row233[] = {
+static const int lexer_goto_row241[] = {
        3,
        48, 101, -39,
-       102, 102, 279,
-       103, 122, 86
+       102, 102, 288,
+       103, 122, 89
 };
-static const int lexer_goto_row234[] = {
+static const int lexer_goto_row242[] = {
        3,
        48, 113, -33,
-       114, 114, 280,
-       115, 122, 86
+       114, 114, 289,
+       115, 122, 89
 };
-static const int lexer_goto_row235[] = {
+static const int lexer_goto_row243[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row236[] = {
+static const int lexer_goto_row244[] = {
        3,
        48, 113, -33,
-       114, 114, 281,
-       115, 122, 86
+       114, 114, 290,
+       115, 122, 89
 };
-static const int lexer_goto_row237[] = {
+static const int lexer_goto_row245[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row238[] = {
+static const int lexer_goto_row246[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row239[] = {
+static const int lexer_goto_row247[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row240[] = {
-       3,
-       48, 100, -42,
-       101, 101, 282,
-       102, 122, 86
-};
-static const int lexer_goto_row241[] = {
-       3,
-       48, 100, -42,
-       101, 101, 283,
-       102, 122, 86
-};
-static const int lexer_goto_row242[] = {
-       1,
-       0, 255, -192
-};
-static const int lexer_goto_row243[] = {
-       11,
-       0, 9, 284,
-       10, 10, 242,
-       11, 12, 284,
-       13, 13, 243,
-       14, 33, 284,
-       34, 34, 285,
-       35, 91, 284,
-       92, 92, 286,
-       93, 122, 284,
-       123, 123, 287,
-       124, 255, 284
-};
-static const int lexer_goto_row244[] = {
-       1,
-       0, 255, -244
-};
-static const int lexer_goto_row245[] = {
-       5,
-       0, 33, -244,
-       34, 34, 288,
-       35, 122, -244,
-       123, 123, 289,
-       124, 255, 284
-};
-static const int lexer_goto_row246[] = {
-       3,
-       0, 9, 290,
-       11, 12, 290,
-       14, 255, 290
-};
-static const int lexer_goto_row247[] = {
-       5,
-       0, 33, -244,
-       34, 34, 291,
-       35, 122, -244,
-       123, 123, 292,
-       124, 255, 284
-};
 static const int lexer_goto_row248[] = {
        3,
-       0, 33, -132,
-       34, 34, 293,
-       35, 255, -196
+       48, 100, -42,
+       101, 101, 291,
+       102, 122, 89
 };
 static const int lexer_goto_row249[] = {
        3,
-       0, 122, -198,
-       123, 123, 294,
-       124, 255, 191
+       48, 100, -42,
+       101, 101, 292,
+       102, 122, 89
 };
 static const int lexer_goto_row250[] = {
        1,
-       0, 255, -132
+       48, 122, -38
 };
 static const int lexer_goto_row251[] = {
-       3,
-       0, 33, -132,
-       34, 34, 295,
-       35, 255, -196
+       1,
+       0, 255, -200
 };
 static const int lexer_goto_row252[] = {
-       3,
-       0, 122, -198,
+       11,
+       0, 9, 293,
+       10, 10, 251,
+       11, 12, 293,
+       13, 13, 252,
+       14, 33, 293,
+       34, 34, 294,
+       35, 91, 293,
+       92, 92, 295,
+       93, 122, 293,
        123, 123, 296,
-       124, 255, 191
+       124, 255, 293
 };
 static const int lexer_goto_row253[] = {
        1,
-       0, 255, -136
+       0, 255, -253
 };
 static const int lexer_goto_row254[] = {
-       1,
-       0, 255, -136
+       5,
+       0, 33, -253,
+       34, 34, 297,
+       35, 122, -253,
+       123, 123, 298,
+       124, 255, 293
 };
 static const int lexer_goto_row255[] = {
-       1,
-       0, 255, -136
+       3,
+       0, 9, 299,
+       11, 12, 299,
+       14, 255, 299
 };
 static const int lexer_goto_row256[] = {
-       9,
-       0, 9, 297,
-       10, 10, 298,
-       11, 12, 297,
-       13, 13, 299,
-       14, 38, 297,
-       39, 39, 300,
-       40, 91, 297,
-       92, 92, 301,
-       93, 255, 297
+       5,
+       0, 33, -253,
+       34, 34, 300,
+       35, 122, -253,
+       123, 123, 301,
+       124, 255, 293
 };
 static const int lexer_goto_row257[] = {
        3,
-       0, 9, 302,
-       11, 12, 302,
-       14, 255, 302
+       0, 33, -136,
+       34, 34, 302,
+       35, 255, -204
 };
 static const int lexer_goto_row258[] = {
-       1,
-       0, 255, -136
+       3,
+       0, 122, -206,
+       123, 123, 303,
+       124, 255, 199
 };
 static const int lexer_goto_row259[] = {
        1,
-       117, 117, 303
+       0, 255, -136
 };
 static const int lexer_goto_row260[] = {
-       1,
-       48, 122, -38
+       3,
+       0, 33, -136,
+       34, 34, 304,
+       35, 255, -204
 };
 static const int lexer_goto_row261[] = {
        3,
-       48, 95, -32,
-       97, 97, 304,
-       98, 122, 86
+       0, 122, -206,
+       123, 123, 305,
+       124, 255, 199
 };
 static const int lexer_goto_row262[] = {
-       3,
-       48, 115, -98,
-       116, 116, 305,
-       117, 122, 86
+       1,
+       0, 255, -140
 };
 static const int lexer_goto_row263[] = {
        1,
-       48, 122, -38
+       0, 255, -140
 };
 static const int lexer_goto_row264[] = {
        1,
-       48, 122, -38
+       0, 255, -140
 };
 static const int lexer_goto_row265[] = {
-       3,
-       48, 109, -43,
-       110, 110, 306,
-       111, 122, 86
+       9,
+       0, 9, 306,
+       10, 10, 307,
+       11, 12, 306,
+       13, 13, 308,
+       14, 38, 306,
+       39, 39, 309,
+       40, 91, 306,
+       92, 92, 310,
+       93, 255, 306
 };
 static const int lexer_goto_row266[] = {
        3,
-       48, 109, -43,
-       110, 110, 307,
-       111, 122, 86
+       0, 9, 311,
+       11, 12, 311,
+       14, 255, 311
 };
 static const int lexer_goto_row267[] = {
        1,
-       48, 122, -38
+       0, 255, -140
 };
 static const int lexer_goto_row268[] = {
-       3,
-       48, 100, -42,
-       101, 101, 308,
-       102, 122, 86
+       1,
+       117, 117, 312
 };
 static const int lexer_goto_row269[] = {
-       3,
-       48, 115, -98,
-       116, 116, 309,
-       117, 122, 86
+       1,
+       48, 122, -38
 };
 static const int lexer_goto_row270[] = {
        3,
-       48, 101, -39,
-       102, 102, 310,
-       103, 122, 86
+       48, 95, -32,
+       97, 97, 313,
+       98, 122, 89
 };
 static const int lexer_goto_row271[] = {
        3,
-       48, 99, -90,
-       100, 100, 311,
-       101, 122, 86
+       48, 115, -101,
+       116, 116, 314,
+       117, 122, 89
 };
 static const int lexer_goto_row272[] = {
        1,
@@ -1483,50 +1473,47 @@ static const int lexer_goto_row273[] = {
 };
 static const int lexer_goto_row274[] = {
        3,
-       48, 100, -42,
-       101, 101, 312,
-       102, 122, 86
+       48, 109, -43,
+       110, 110, 315,
+       111, 122, 89
 };
 static const int lexer_goto_row275[] = {
        3,
-       48, 97, -32,
-       98, 98, 313,
-       99, 122, 86
+       48, 109, -43,
+       110, 110, 316,
+       111, 122, 89
 };
 static const int lexer_goto_row276[] = {
-       4,
-       48, 95, -32,
-       97, 102, 86,
-       103, 103, 314,
-       104, 122, 86
+       1,
+       48, 122, -38
 };
 static const int lexer_goto_row277[] = {
        3,
-       48, 115, -98,
-       116, 116, 315,
-       117, 122, 86
+       48, 100, -42,
+       101, 101, 317,
+       102, 122, 89
 };
 static const int lexer_goto_row278[] = {
        3,
-       48, 98, -112,
-       99, 99, 316,
-       100, 122, 86
+       48, 115, -101,
+       116, 116, 318,
+       117, 122, 89
 };
 static const int lexer_goto_row279[] = {
        3,
-       48, 98, -112,
-       99, 99, 317,
-       100, 122, 86
+       48, 101, -39,
+       102, 102, 319,
+       103, 122, 89
 };
 static const int lexer_goto_row280[] = {
-       1,
-       48, 122, -38
+       3,
+       48, 99, -93,
+       100, 100, 320,
+       101, 122, 89
 };
 static const int lexer_goto_row281[] = {
-       3,
-       48, 109, -43,
-       110, 110, 318,
-       111, 122, 86
+       1,
+       48, 122, -38
 };
 static const int lexer_goto_row282[] = {
        1,
@@ -1534,325 +1521,376 @@ static const int lexer_goto_row282[] = {
 };
 static const int lexer_goto_row283[] = {
        3,
-       48, 113, -33,
-       114, 114, 319,
-       115, 122, 86
+       48, 100, -42,
+       101, 101, 321,
+       102, 122, 89
 };
 static const int lexer_goto_row284[] = {
-       1,
-       48, 122, -38
+       3,
+       48, 97, -32,
+       98, 98, 322,
+       99, 122, 89
 };
 static const int lexer_goto_row285[] = {
-       1,
-       0, 255, -244
+       4,
+       48, 95, -32,
+       97, 102, 89,
+       103, 103, 323,
+       104, 122, 89
 };
 static const int lexer_goto_row286[] = {
-       1,
-       0, 255, -246
+       3,
+       48, 115, -101,
+       116, 116, 324,
+       117, 122, 89
 };
 static const int lexer_goto_row287[] = {
        3,
-       0, 9, 320,
-       11, 12, 320,
-       14, 255, 320
+       48, 98, -115,
+       99, 99, 325,
+       100, 122, 89
 };
 static const int lexer_goto_row288[] = {
-       1,
-       0, 255, -248
+       3,
+       48, 98, -115,
+       99, 99, 326,
+       100, 122, 89
 };
 static const int lexer_goto_row289[] = {
-       3,
-       0, 33, -244,
-       34, 34, 321,
-       35, 255, -246
+       1,
+       48, 122, -38
 };
 static const int lexer_goto_row290[] = {
        3,
-       0, 122, -248,
-       123, 123, 322,
-       124, 255, 284
+       48, 109, -43,
+       110, 110, 327,
+       111, 122, 89
 };
 static const int lexer_goto_row291[] = {
        1,
-       0, 255, -192
+       48, 122, -38
 };
 static const int lexer_goto_row292[] = {
        3,
-       0, 33, -244,
-       34, 34, 323,
-       35, 255, -246
+       48, 113, -33,
+       114, 114, 328,
+       115, 122, 89
 };
 static const int lexer_goto_row293[] = {
-       3,
-       0, 122, -248,
-       123, 123, 324,
-       124, 255, 284
+       1,
+       48, 122, -38
 };
 static const int lexer_goto_row294[] = {
        1,
-       34, 34, 325
+       0, 255, -253
 };
 static const int lexer_goto_row295[] = {
        1,
-       0, 255, -253
+       0, 255, -255
 };
 static const int lexer_goto_row296[] = {
-       1,
-       0, 255, -249
+       3,
+       0, 9, 329,
+       11, 12, 329,
+       14, 255, 329
 };
 static const int lexer_goto_row297[] = {
        1,
-       123, 123, 326
+       0, 255, -257
 };
 static const int lexer_goto_row298[] = {
-       1,
-       0, 255, -136
+       3,
+       0, 33, -253,
+       34, 34, 330,
+       35, 255, -255
 };
 static const int lexer_goto_row299[] = {
-       1,
-       0, 255, -136
+       3,
+       0, 122, -257,
+       123, 123, 331,
+       124, 255, 293
 };
 static const int lexer_goto_row300[] = {
        1,
-       0, 255, -136
+       0, 255, -200
+};
+static const int lexer_goto_row301[] = {
+       3,
+       0, 33, -253,
+       34, 34, 332,
+       35, 255, -255
 };
 static const int lexer_goto_row302[] = {
        3,
-       0, 9, 327,
-       11, 12, 327,
-       14, 255, 327
+       0, 122, -257,
+       123, 123, 333,
+       124, 255, 293
 };
 static const int lexer_goto_row303[] = {
        1,
-       0, 255, -136
+       34, 34, 334
 };
 static const int lexer_goto_row304[] = {
        1,
-       103, 103, 328
+       0, 255, -262
 };
 static const int lexer_goto_row305[] = {
-       3,
-       48, 98, -112,
-       99, 99, 329,
-       100, 122, 86
+       1,
+       0, 255, -258
 };
 static const int lexer_goto_row306[] = {
        1,
-       48, 122, -38
+       123, 123, 335
 };
 static const int lexer_goto_row307[] = {
-       3,
-       48, 116, -121,
-       117, 117, 330,
-       118, 122, 86
+       1,
+       0, 255, -140
 };
 static const int lexer_goto_row308[] = {
        1,
-       48, 122, -38
+       0, 255, -140
 };
 static const int lexer_goto_row309[] = {
-       3,
-       48, 114, -91,
-       115, 115, 331,
-       116, 122, 86
-};
-static const int lexer_goto_row310[] = {
        1,
-       48, 122, -38
+       0, 255, -140
 };
 static const int lexer_goto_row311[] = {
        3,
-       48, 95, -32,
-       97, 97, 332,
-       98, 122, 86
+       0, 9, 336,
+       11, 12, 336,
+       14, 255, 336
 };
 static const int lexer_goto_row312[] = {
-       3,
-       48, 100, -42,
-       101, 101, 333,
-       102, 122, 86
+       1,
+       0, 255, -140
 };
 static const int lexer_goto_row313[] = {
        1,
-       48, 122, -38
+       103, 103, 337
 };
 static const int lexer_goto_row314[] = {
        3,
-       48, 107, -34,
-       108, 108, 334,
-       109, 122, 86
+       48, 98, -115,
+       99, 99, 338,
+       100, 122, 89
 };
 static const int lexer_goto_row315[] = {
-       3,
-       48, 100, -42,
-       101, 101, 335,
-       102, 122, 86
+       1,
+       48, 122, -38
 };
 static const int lexer_goto_row316[] = {
        3,
-       48, 100, -42,
-       101, 101, 336,
-       102, 122, 86
+       48, 116, -124,
+       117, 117, 339,
+       118, 122, 89
 };
 static const int lexer_goto_row317[] = {
-       3,
-       48, 115, -98,
-       116, 116, 337,
-       117, 122, 86
-};
-static const int lexer_goto_row318[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row319[] = {
-       1,
+static const int lexer_goto_row318[] = {
+       3,
+       48, 114, -94,
+       115, 115, 340,
+       116, 122, 89
+};
+static const int lexer_goto_row319[] = {
+       1,
        48, 122, -38
 };
 static const int lexer_goto_row320[] = {
        3,
-       48, 114, -91,
-       115, 115, 338,
-       116, 122, 86
+       48, 95, -32,
+       97, 97, 341,
+       98, 122, 89
 };
 static const int lexer_goto_row321[] = {
-       1,
-       0, 255, -244
+       3,
+       48, 100, -42,
+       101, 101, 342,
+       102, 122, 89
 };
 static const int lexer_goto_row322[] = {
        1,
-       34, 34, 339
+       48, 122, -38
 };
 static const int lexer_goto_row323[] = {
-       1,
-       0, 255, -294
+       3,
+       48, 107, -34,
+       108, 108, 343,
+       109, 122, 89
 };
 static const int lexer_goto_row324[] = {
-       1,
-       0, 255, -290
+       3,
+       48, 100, -42,
+       101, 101, 344,
+       102, 122, 89
 };
 static const int lexer_goto_row325[] = {
-       1,
-       123, 123, 340
+       3,
+       48, 100, -42,
+       101, 101, 345,
+       102, 122, 89
 };
 static const int lexer_goto_row326[] = {
-       1,
-       34, 34, 325
+       3,
+       48, 115, -101,
+       116, 116, 346,
+       117, 122, 89
 };
 static const int lexer_goto_row327[] = {
        1,
-       123, 123, 326
+       48, 122, -38
 };
 static const int lexer_goto_row328[] = {
        1,
-       0, 255, -136
+       48, 122, -38
 };
 static const int lexer_goto_row329[] = {
-       1,
-       95, 95, 341
+       3,
+       48, 114, -94,
+       115, 115, 347,
+       116, 122, 89
 };
 static const int lexer_goto_row330[] = {
-       3,
-       48, 115, -98,
-       116, 116, 342,
-       117, 122, 86
+       1,
+       0, 255, -253
 };
 static const int lexer_goto_row331[] = {
+       1,
+       34, 34, 348
+};
+static const int lexer_goto_row332[] = {
+       1,
+       0, 255, -303
+};
+static const int lexer_goto_row333[] = {
+       1,
+       0, 255, -299
+};
+static const int lexer_goto_row334[] = {
+       1,
+       123, 123, 349
+};
+static const int lexer_goto_row335[] = {
+       1,
+       34, 34, 334
+};
+static const int lexer_goto_row336[] = {
+       1,
+       123, 123, 335
+};
+static const int lexer_goto_row337[] = {
+       1,
+       0, 255, -140
+};
+static const int lexer_goto_row338[] = {
+       1,
+       95, 95, 350
+};
+static const int lexer_goto_row339[] = {
+       3,
+       48, 115, -101,
+       116, 116, 351,
+       117, 122, 89
+};
+static const int lexer_goto_row340[] = {
        3,
        48, 100, -42,
-       101, 101, 343,
-       102, 122, 86
+       101, 101, 352,
+       102, 122, 89
 };
-static const int lexer_goto_row332[] = {
+static const int lexer_goto_row341[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row333[] = {
+static const int lexer_goto_row342[] = {
        3,
-       48, 98, -112,
-       99, 99, 344,
-       100, 122, 86
+       48, 98, -115,
+       99, 99, 353,
+       100, 122, 89
 };
-static const int lexer_goto_row334[] = {
+static const int lexer_goto_row343[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row335[] = {
+static const int lexer_goto_row344[] = {
        3,
        48, 100, -42,
-       101, 101, 345,
-       102, 122, 86
+       101, 101, 354,
+       102, 122, 89
 };
-static const int lexer_goto_row336[] = {
+static const int lexer_goto_row345[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row337[] = {
+static const int lexer_goto_row346[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row338[] = {
+static const int lexer_goto_row347[] = {
        3,
        48, 100, -42,
-       101, 101, 346,
-       102, 122, 86
+       101, 101, 355,
+       102, 122, 89
 };
-static const int lexer_goto_row339[] = {
+static const int lexer_goto_row348[] = {
        3,
        48, 95, -32,
-       97, 97, 347,
-       98, 122, 86
+       97, 97, 356,
+       98, 122, 89
 };
-static const int lexer_goto_row340[] = {
+static const int lexer_goto_row349[] = {
        1,
-       34, 34, 339
+       34, 34, 348
 };
-static const int lexer_goto_row341[] = {
+static const int lexer_goto_row350[] = {
        1,
-       123, 123, 340
+       123, 123, 349
 };
-static const int lexer_goto_row342[] = {
+static const int lexer_goto_row351[] = {
        1,
-       95, 95, 348
+       95, 95, 357
 };
-static const int lexer_goto_row343[] = {
+static const int lexer_goto_row352[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row344[] = {
+static const int lexer_goto_row353[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row345[] = {
+static const int lexer_goto_row354[] = {
        3,
        48, 100, -42,
-       101, 101, 349,
-       102, 122, 86
+       101, 101, 358,
+       102, 122, 89
 };
-static const int lexer_goto_row346[] = {
+static const int lexer_goto_row355[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row347[] = {
+static const int lexer_goto_row356[] = {
        3,
-       48, 99, -90,
-       100, 100, 350,
-       101, 122, 86
+       48, 99, -93,
+       100, 100, 359,
+       101, 122, 89
 };
-static const int lexer_goto_row348[] = {
+static const int lexer_goto_row357[] = {
        3,
        48, 107, -34,
-       108, 108, 351,
-       109, 122, 86
+       108, 108, 360,
+       109, 122, 89
 };
-static const int lexer_goto_row350[] = {
+static const int lexer_goto_row359[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row351[] = {
+static const int lexer_goto_row360[] = {
        1,
        48, 122, -38
 };
-static const int lexer_goto_row352[] = {
+static const int lexer_goto_row361[] = {
        1,
        48, 122, -38
 };
@@ -1866,7 +1904,7 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row6,
        lexer_goto_row7,
        lexer_goto_row8,
-       lexer_goto_row_null,
+       lexer_goto_row9,
        lexer_goto_row10,
        lexer_goto_row_null,
        lexer_goto_row_null,
@@ -1875,7 +1913,7 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row_null,
        lexer_goto_row16,
        lexer_goto_row17,
-       lexer_goto_row_null,
+       lexer_goto_row18,
        lexer_goto_row19,
        lexer_goto_row20,
        lexer_goto_row21,
@@ -1917,25 +1955,25 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row57,
        lexer_goto_row_null,
        lexer_goto_row59,
-       lexer_goto_row60,
+       lexer_goto_row_null,
        lexer_goto_row61,
        lexer_goto_row62,
+       lexer_goto_row63,
+       lexer_goto_row64,
        lexer_goto_row_null,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row66,
-       lexer_goto_row67,
        lexer_goto_row68,
        lexer_goto_row69,
-       lexer_goto_row70,
-       lexer_goto_row_null,
        lexer_goto_row_null,
+       lexer_goto_row71,
+       lexer_goto_row72,
        lexer_goto_row73,
        lexer_goto_row_null,
+       lexer_goto_row75,
+       lexer_goto_row76,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row77,
-       lexer_goto_row78,
        lexer_goto_row79,
        lexer_goto_row80,
        lexer_goto_row81,
@@ -1983,29 +2021,29 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row123,
        lexer_goto_row124,
        lexer_goto_row125,
-       lexer_goto_row_null,
+       lexer_goto_row126,
        lexer_goto_row127,
-       lexer_goto_row_null,
+       lexer_goto_row128,
        lexer_goto_row129,
        lexer_goto_row_null,
        lexer_goto_row131,
-       lexer_goto_row132,
        lexer_goto_row_null,
+       lexer_goto_row133,
        lexer_goto_row_null,
        lexer_goto_row135,
        lexer_goto_row136,
        lexer_goto_row_null,
-       lexer_goto_row138,
+       lexer_goto_row_null,
        lexer_goto_row139,
        lexer_goto_row140,
        lexer_goto_row_null,
-       lexer_goto_row142,
+       lexer_goto_row_null,
        lexer_goto_row143,
        lexer_goto_row144,
        lexer_goto_row145,
-       lexer_goto_row146,
-       lexer_goto_row147,
-       lexer_goto_row148,
+       lexer_goto_row_null,
+       lexer_goto_row_null,
+       lexer_goto_row_null,
        lexer_goto_row149,
        lexer_goto_row150,
        lexer_goto_row151,
@@ -2060,19 +2098,19 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row200,
        lexer_goto_row201,
        lexer_goto_row202,
-       lexer_goto_row_null,
+       lexer_goto_row203,
        lexer_goto_row204,
        lexer_goto_row205,
        lexer_goto_row206,
-       lexer_goto_row_null,
+       lexer_goto_row207,
        lexer_goto_row208,
        lexer_goto_row209,
        lexer_goto_row210,
-       lexer_goto_row211,
+       lexer_goto_row_null,
        lexer_goto_row212,
        lexer_goto_row213,
        lexer_goto_row214,
-       lexer_goto_row215,
+       lexer_goto_row_null,
        lexer_goto_row216,
        lexer_goto_row217,
        lexer_goto_row218,
@@ -2158,7 +2196,7 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row298,
        lexer_goto_row299,
        lexer_goto_row300,
-       lexer_goto_row_null,
+       lexer_goto_row301,
        lexer_goto_row302,
        lexer_goto_row303,
        lexer_goto_row304,
@@ -2167,7 +2205,7 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row307,
        lexer_goto_row308,
        lexer_goto_row309,
-       lexer_goto_row310,
+       lexer_goto_row_null,
        lexer_goto_row311,
        lexer_goto_row312,
        lexer_goto_row313,
@@ -2206,50 +2244,59 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row346,
        lexer_goto_row347,
        lexer_goto_row348,
-       lexer_goto_row_null,
+       lexer_goto_row349,
        lexer_goto_row350,
        lexer_goto_row351,
-       lexer_goto_row352
+       lexer_goto_row352,
+       lexer_goto_row353,
+       lexer_goto_row354,
+       lexer_goto_row355,
+       lexer_goto_row356,
+       lexer_goto_row357,
+       lexer_goto_row_null,
+       lexer_goto_row359,
+       lexer_goto_row360,
+       lexer_goto_row361
 };
 
 const int lexer_accept_table[] = {
-       -1,0,1,1,0,80,93,2,70,-1,52,53,67,65,56,66,64,69,85,85,57,73,59,76,81,82,54,55,-1,-1,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,93,1,72,93,88,-1,89,2,2,2,94,94,94,68,60,61,63,87,-1,-1,-1,58,75,74,71,77,78,82,82,82,82,-1,84,-1,83,83,83,83,83,83,47,83,83,83,16,83,83,83,83,83,83,23,83,29,15,83,83,83,83,83,83,83,31,83,83,83,83,83,83,83,83,83,83,83,83,93,91,-1,90,93,88,93,93,2,92,93,94,62,86,86,86,79,-1,84,84,84,84,-1,-1,-1,83,83,30,83,83,83,83,83,10,83,83,83,28,11,83,83,83,40,83,83,83,83,39,32,83,83,83,83,83,83,83,83,83,83,83,83,83,83,17,83,93,93,93,93,93,-1,-1,-1,93,93,93,-1,-1,92,-1,-1,-1,95,83,83,83,83,83,83,25,9,83,83,83,83,13,83,83,83,83,27,83,46,41,83,83,83,83,83,83,43,83,24,44,12,83,83,93,-1,-1,91,-1,90,-1,-1,93,-1,-1,93,93,93,-1,-1,93,-1,37,83,83,36,6,83,83,45,83,83,83,83,49,50,83,83,83,83,83,83,14,83,42,83,26,-1,-1,-1,-1,-1,-1,93,-1,-1,88,-1,-1,89,93,93,93,88,-1,93,-1,83,38,83,18,83,5,83,83,4,83,83,83,83,19,34,83,-1,91,-1,-1,90,88,89,93,-1,83,83,33,83,22,83,3,21,83,83,91,90,-1,7,35,83,48,83,83,51,8,20,9
+       -1,0,1,1,0,87,100,2,77,-1,53,54,74,72,57,73,71,76,92,92,58,80,60,83,88,89,55,56,-1,-1,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,100,1,79,100,95,-1,96,2,2,2,65,101,101,101,75,63,61,62,70,94,64,-1,-1,-1,59,82,81,78,84,85,89,89,89,89,-1,91,-1,90,90,90,90,90,90,47,90,90,90,16,90,90,90,90,90,90,23,90,29,15,90,90,90,90,90,90,90,31,90,90,90,90,90,90,90,90,90,90,90,90,90,100,98,-1,97,100,95,100,100,2,99,100,101,66,69,93,93,93,67,86,68,-1,91,91,91,91,-1,-1,-1,90,90,30,90,90,90,90,90,10,90,90,90,28,11,90,90,90,40,90,90,90,90,39,32,90,90,90,90,90,90,90,90,90,90,90,90,90,90,17,90,90,100,100,100,100,100,-1,-1,-1,100,100,100,-1,-1,99,-1,-1,-1,102,90,90,90,90,90,90,25,9,90,90,90,90,13,90,90,90,90,27,90,46,41,90,90,90,90,90,90,43,90,24,44,12,90,90,51,100,-1,-1,98,-1,97,-1,-1,100,-1,-1,100,100,100,-1,-1,100,-1,37,90,90,36,6,90,90,45,90,90,90,90,49,50,90,90,90,90,90,90,14,90,42,90,26,-1,-1,-1,-1,-1,-1,100,-1,-1,95,-1,-1,96,100,100,100,95,-1,100,-1,90,38,90,18,90,5,90,90,4,90,90,90,90,19,34,90,-1,98,-1,-1,97,95,96,100,-1,90,90,33,90,22,90,3,21,90,90,98,97,-1,7,35,90,48,90,90,52,8,20,9
 };
 
 static int parser_action_row1[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row2[] = {
        1,
-       -1, 1, 1000
+       -1, 1, 1025
 };
 static int parser_action_row3[] = {
        1,
-       -1, 1, 998
+       -1, 1, 1023
 };
 static int parser_action_row4[] = {
        2,
        -1, 3, 3,
-       95, 2, -1
+       102, 2, -1
 };
 static int parser_action_row5[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row6[] = {
        1,
-       -1, 1, 964
+       -1, 1, 989
 };
 static int parser_action_row7[] = {
        1,
-       -1, 1, 968
+       -1, 1, 993
 };
 static int parser_action_row8[] = {
        1,
@@ -2265,15 +2312,15 @@ static int parser_action_row10[] = {
 };
 static int parser_action_row11[] = {
        1,
-       -1, 1, 966
+       -1, 1, 991
 };
 static int parser_action_row12[] = {
        2,
-       -1, 1, 446,
-       95, 1, 23
+       -1, 1, 459,
+       102, 1, 23
 };
 static int parser_action_row13[] = {
-       34,
+       35,
        -1, 1, 28,
        12, 0, 25,
        13, 0, 26,
@@ -2290,74 +2337,75 @@ static int parser_action_row13[] = {
        36, 0, 37,
        37, 0, 38,
        38, 0, 39,
-       41, 1, 427,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54,
-       94, 0, 55
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55,
+       101, 0, 56
 };
 static int parser_action_row14[] = {
        2,
-       -1, 1, 444,
+       -1, 1, 457,
        1, 0, 2
 };
 static int parser_action_row15[] = {
        3,
        -1, 3, 14,
-       0, 0, 81,
-       1, 0, 82
+       0, 0, 83,
+       1, 0, 84
 };
 static int parser_action_row16[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row17[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row18[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row19[] = {
        3,
-       -1, 1, 442,
+       -1, 1, 455,
        0, 0, 1,
-       1, 0, 95
+       1, 0, 97
 };
 static int parser_action_row20[] = {
        2,
-       -1, 1, 449,
-       0, 0, 97
+       -1, 1, 462,
+       0, 0, 99
 };
 static int parser_action_row21[] = {
        1,
        -1, 1, 1
 };
 static int parser_action_row22[] = {
-       34,
+       35,
        -1, 1, 28,
        12, 0, 25,
        13, 0, 26,
@@ -2374,85 +2422,87 @@ static int parser_action_row22[] = {
        36, 0, 37,
        37, 0, 38,
        38, 0, 39,
-       41, 1, 427,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54,
-       94, 0, 55
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55,
+       101, 0, 56
 };
 static int parser_action_row23[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row24[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row25[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
 static int parser_action_row26[] = {
-       26,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 321,
-       61, 1, 321,
-       63, 1, 321,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       27,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 334,
+       68, 1, 334,
+       70, 1, 334,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
 static int parser_action_row27[] = {
        1,
        -1, 1, 29
 };
 static int parser_action_row28[] = {
-       32,
-       -1, 1, 427,
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 140,
+       9, 0, 143,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -2472,39 +2522,40 @@ static int parser_action_row28[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row29[] = {
        2,
        -1, 3, 28,
-       82, 0, 145
+       89, 0, 148
 };
 static int parser_action_row30[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row31[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row32[] = {
-       32,
-       -1, 1, 427,
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 140,
+       9, 0, 143,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -2524,375 +2575,395 @@ static int parser_action_row32[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row33[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row34[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row35[] = {
-       24,
+       25,
        -1, 1, 163,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row36[] = {
        2,
        -1, 1, 168,
-       49, 0, 174
+       49, 0, 178
 };
 static int parser_action_row37[] = {
        2,
        -1, 1, 165,
-       49, 0, 174
+       49, 0, 178
 };
 static int parser_action_row38[] = {
        1,
        -1, 1, 167
 };
 static int parser_action_row39[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 177,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 181,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row40[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row41[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row42[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row43[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row44[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row45[] = {
-       2,
-       -1, 3, 44,
-       11, 0, 187
-};
-static int parser_action_row46[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
+static int parser_action_row46[] = {
+       2,
+       -1, 3, 45,
+       11, 0, 192
+};
 static int parser_action_row47[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row48[] = {
-       2,
-       -1, 3, 47,
-       57, 0, 190
+       3,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row49[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 309,
-       57, 0, 191,
-       58, 0, 192,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 309,
-       63, 1, 309,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       2,
+       -1, 3, 48,
+       58, 0, 195
 };
 static int parser_action_row50[] = {
-       2,
-       -1, 1, 371,
-       80, 0, 181
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 322,
+       58, 0, 196,
+       59, 0, 197,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 322,
+       70, 1, 322,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
 static int parser_action_row51[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row52[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row53[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row54[] = {
-       1,
-       -1, 1, 363
+       2,
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row55[] = {
-       2,
-       -1, 1, 371,
-       80, 0, 181
+       1,
+       -1, 1, 376
 };
 static int parser_action_row56[] = {
+       2,
+       -1, 1, 384,
+       87, 0, 185
+};
+static int parser_action_row57[] = {
        1,
        -1, 1, 135
 };
-static int parser_action_row57[] = {
+static int parser_action_row58[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row58[] = {
+static int parser_action_row59[] = {
        2,
-       -1, 3, 57,
-       94, 0, 208
+       -1, 3, 58,
+       101, 0, 219
 };
-static int parser_action_row59[] = {
+static int parser_action_row60[] = {
        1,
        -1, 1, 139
 };
-static int parser_action_row60[] = {
+static int parser_action_row61[] = {
        1,
        -1, 1, 24
 };
-static int parser_action_row61[] = {
+static int parser_action_row62[] = {
        1,
        -1, 1, 25
 };
-static int parser_action_row62[] = {
+static int parser_action_row63[] = {
        3,
        -1, 1, 154,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row63[] = {
+static int parser_action_row64[] = {
        1,
        -1, 1, 161
 };
-static int parser_action_row64[] = {
+static int parser_action_row65[] = {
        1,
        -1, 1, 162
 };
-static int parser_action_row65[] = {
+static int parser_action_row66[] = {
        1,
        -1, 1, 170
 };
-static int parser_action_row66[] = {
+static int parser_action_row67[] = {
        1,
        -1, 1, 171
 };
-static int parser_action_row67[] = {
+static int parser_action_row68[] = {
        1,
        -1, 1, 173
 };
-static int parser_action_row68[] = {
+static int parser_action_row69[] = {
        1,
        -1, 1, 172
 };
-static int parser_action_row69[] = {
+static int parser_action_row70[] = {
        1,
        -1, 1, 174
 };
-static int parser_action_row70[] = {
+static int parser_action_row71[] = {
        1,
        -1, 1, 175
 };
-static int parser_action_row71[] = {
-       4,
-       -1, 3, 70,
-       53, 0, 212,
-       61, 0, 213,
-       63, 0, 214
-};
 static int parser_action_row72[] = {
        1,
-       -1, 1, 297
+       -1, 1, 176
 };
 static int parser_action_row73[] = {
-       1,
-       -1, 1, 345
+       4,
+       -1, 3, 72,
+       54, 0, 223,
+       68, 0, 224,
+       70, 0, 225
 };
 static int parser_action_row74[] = {
        1,
-       -1, 1, 344
+       -1, 1, 310
 };
 static int parser_action_row75[] = {
-       3,
-       -1, 3, 74,
-       89, 0, 216,
-       90, 0, 217
+       1,
+       -1, 1, 358
 };
 static int parser_action_row76[] = {
-       3,
-       -1, 1, 445,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 357
 };
 static int parser_action_row77[] = {
        3,
        -1, 3, 76,
-       41, 0, 223,
-       83, 0, 224
+       96, 0, 227,
+       97, 0, 228
 };
 static int parser_action_row78[] = {
-       1,
-       -1, 1, 996
+       3,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row79[] = {
        3,
-       -1, 1, 424,
-       12, 0, 225,
-       82, 0, 226
+       -1, 3, 78,
+       41, 0, 234,
+       90, 0, 235
 };
 static int parser_action_row80[] = {
-       4,
-       -1, 1, 426,
-       12, 0, 227,
-       81, 0, 47,
-       82, 0, 228
+       1,
+       -1, 1, 1021
 };
 static int parser_action_row81[] = {
        3,
-       -1, 1, 443,
-       0, 0, 1,
-       1, 0, 95
+       -1, 1, 437,
+       12, 0, 236,
+       89, 0, 237
 };
 static int parser_action_row82[] = {
-       1,
-       -1, 1, 441
+       4,
+       -1, 1, 439,
+       12, 0, 238,
+       88, 0, 48,
+       89, 0, 239
 };
 static int parser_action_row83[] = {
-       1,
-       -1, 1, 440
+       3,
+       -1, 1, 456,
+       0, 0, 1,
+       1, 0, 97
 };
 static int parser_action_row84[] = {
        1,
-       -1, 1, 20
+       -1, 1, 454
 };
 static int parser_action_row85[] = {
        1,
-       -1, 1, 965
+       -1, 1, 453
 };
 static int parser_action_row86[] = {
        1,
-       -1, 1, 2
+       -1, 1, 20
 };
 static int parser_action_row87[] = {
+       1,
+       -1, 1, 990
+};
+static int parser_action_row88[] = {
+       1,
+       -1, 1, 2
+};
+static int parser_action_row89[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row88[] = {
+static int parser_action_row90[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row89[] = {
+static int parser_action_row91[] = {
        1,
        -1, 1, 4
 };
-static int parser_action_row90[] = {
+static int parser_action_row92[] = {
        1,
-       -1, 1, 967
+       -1, 1, 992
 };
-static int parser_action_row91[] = {
-       34,
+static int parser_action_row93[] = {
+       35,
        -1, 1, 28,
        12, 0, 25,
        13, 0, 26,
@@ -2909,42 +2980,43 @@ static int parser_action_row91[] = {
        36, 0, 37,
        37, 0, 38,
        38, 0, 39,
-       41, 1, 427,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54,
-       94, 0, 55
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55,
+       101, 0, 56
 };
-static int parser_action_row92[] = {
+static int parser_action_row94[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row93[] = {
+static int parser_action_row95[] = {
        1,
-       -1, 1, 969
+       -1, 1, 994
 };
-static int parser_action_row94[] = {
+static int parser_action_row96[] = {
        1,
        -1, 1, 8
 };
-static int parser_action_row95[] = {
-       32,
+static int parser_action_row97[] = {
+       33,
        -1, 1, 28,
        12, 0, 25,
        13, 0, 26,
@@ -2960,317 +3032,343 @@ static int parser_action_row95[] = {
        36, 0, 37,
        37, 0, 38,
        38, 0, 39,
-       41, 1, 427,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row96[] = {
+static int parser_action_row98[] = {
        1,
-       -1, 1, 999
+       -1, 1, 1024
 };
-static int parser_action_row97[] = {
+static int parser_action_row99[] = {
        2,
-       -1, 1, 447,
-       0, 0, 97
+       -1, 1, 460,
+       0, 0, 99
 };
-static int parser_action_row98[] = {
+static int parser_action_row100[] = {
        1,
-       -1, 1, 1001
+       -1, 1, 1026
 };
-static int parser_action_row99[] = {
+static int parser_action_row101[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row100[] = {
+static int parser_action_row102[] = {
        1,
        -1, 1, 3
 };
-static int parser_action_row101[] = {
+static int parser_action_row103[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row102[] = {
+static int parser_action_row104[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row103[] = {
+static int parser_action_row105[] = {
        1,
        -1, 1, 5
 };
-static int parser_action_row104[] = {
+static int parser_action_row106[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row105[] = {
+static int parser_action_row107[] = {
        1,
        -1, 1, 9
 };
-static int parser_action_row106[] = {
+static int parser_action_row108[] = {
        2,
-       -1, 1, 702,
-       51, 0, 242
+       -1, 1, 718,
+       52, 0, 253
 };
-static int parser_action_row107[] = {
+static int parser_action_row109[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row108[] = {
+static int parser_action_row110[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row109[] = {
+static int parser_action_row111[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row110[] = {
+static int parser_action_row112[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row111[] = {
+static int parser_action_row113[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row112[] = {
+static int parser_action_row114[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row113[] = {
+static int parser_action_row115[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row114[] = {
+static int parser_action_row116[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row115[] = {
+static int parser_action_row117[] = {
        15,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 252,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 263,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row116[] = {
+static int parser_action_row118[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row117[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row119[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row118[] = {
-       3,
-       -1, 1, 690,
-       51, 0, 242,
-       57, 0, 191
-};
-static int parser_action_row119[] = {
-       2,
-       -1, 1, 371,
-       80, 0, 181
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row120[] = {
-       2,
-       -1, 1, 371,
-       80, 0, 181
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row121[] = {
-       2,
-       -1, 1, 371,
-       80, 0, 181
+       3,
+       -1, 1, 706,
+       52, 0, 253,
+       58, 0, 196
 };
 static int parser_action_row122[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row123[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row124[] = {
-       1,
-       -1, 1, 725
+       2,
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row125[] = {
-       1,
-       -1, 1, 320
+       2,
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row126[] = {
-       1,
-       -1, 1, 186
+       2,
+       -1, 1, 384,
+       87, 0, 185
 };
 static int parser_action_row127[] = {
-       3,
-       -1, 3, 126,
-       41, 0, 263,
-       83, 0, 264
+       1,
+       -1, 1, 741
 };
 static int parser_action_row128[] = {
-       2,
-       -1, 1, 424,
-       82, 0, 265
+       1,
+       -1, 1, 333
 };
 static int parser_action_row129[] = {
        1,
-       -1, 1, 408
+       -1, 1, 187
 };
 static int parser_action_row130[] = {
-       4,
-       -1, 1, 641,
-       29, 0, 266,
-       30, 0, 267,
-       32, 0, 268
+       3,
+       -1, 3, 129,
+       41, 0, 275,
+       90, 0, 276
 };
 static int parser_action_row131[] = {
-       1,
-       -1, 1, 643
+       2,
+       -1, 1, 437,
+       89, 0, 277
 };
 static int parser_action_row132[] = {
-       3,
-       -1, 1, 648,
-       74, 0, 269,
-       77, 0, 270
+       1,
+       -1, 1, 421
 };
 static int parser_action_row133[] = {
-       11,
-       -1, 1, 650,
-       39, 0, 271,
-       64, 0, 272,
-       65, 0, 273,
-       70, 0, 274,
-       71, 0, 275,
-       72, 0, 276,
-       73, 0, 277,
-       75, 0, 278,
-       76, 0, 279,
-       78, 0, 280
+       4,
+       -1, 1, 656,
+       29, 0, 278,
+       30, 0, 279,
+       32, 0, 280
 };
 static int parser_action_row134[] = {
-       4,
-       -1, 1, 661,
-       66, 0, 281,
-       68, 0, 282,
-       69, 0, 283
+       1,
+       -1, 1, 658
 };
 static int parser_action_row135[] = {
-       1,
-       -1, 1, 664
+       3,
+       -1, 1, 663,
+       81, 0, 281,
+       84, 0, 282
 };
 static int parser_action_row136[] = {
-       2,
-       -1, 1, 668,
-       67, 0, 284
+       11,
+       -1, 1, 665,
+       39, 0, 283,
+       71, 0, 284,
+       72, 0, 285,
+       77, 0, 286,
+       78, 0, 287,
+       79, 0, 288,
+       80, 0, 289,
+       82, 0, 290,
+       83, 0, 291,
+       85, 0, 292
 };
 static int parser_action_row137[] = {
-       1,
-       -1, 1, 670
+       4,
+       -1, 1, 676,
+       73, 0, 293,
+       75, 0, 294,
+       76, 0, 295
 };
 static int parser_action_row138[] = {
-       4,
-       -1, 1, 673,
-       53, 0, 212,
-       61, 0, 285,
-       63, 0, 286
+       1,
+       -1, 1, 679
 };
 static int parser_action_row139[] = {
-       1,
-       -1, 1, 678
+       2,
+       -1, 1, 683,
+       74, 0, 296
 };
 static int parser_action_row140[] = {
-       3,
-       -1, 1, 426,
-       81, 0, 47,
-       82, 0, 288
+       1,
+       -1, 1, 685
 };
 static int parser_action_row141[] = {
-       2,
-       -1, 1, 152,
-       49, 1, 898
+       4,
+       -1, 1, 689,
+       54, 0, 223,
+       68, 0, 297,
+       70, 0, 298
 };
 static int parser_action_row142[] = {
        1,
-       -1, 1, 241
+       -1, 1, 694
 };
 static int parser_action_row143[] = {
+       3,
+       -1, 1, 439,
+       88, 0, 48,
+       89, 0, 300
+};
+static int parser_action_row144[] = {
+       2,
+       -1, 1, 152,
+       49, 1, 919
+};
+static int parser_action_row145[] = {
+       1,
+       -1, 1, 248
+};
+static int parser_action_row146[] = {
        1,
        -1, 1, 153
 };
-static int parser_action_row144[] = {
-       30,
-       -1, 1, 427,
-       9, 0, 290,
+static int parser_action_row147[] = {
+       31,
+       -1, 1, 440,
+       9, 0, 302,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -3290,571 +3388,660 @@ static int parser_action_row144[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row145[] = {
+static int parser_action_row148[] = {
        2,
-       -1, 3, 144,
-       49, 0, 174
+       -1, 3, 147,
+       49, 0, 178
 };
-static int parser_action_row146[] = {
+static int parser_action_row149[] = {
        3,
        -1, 1, 149,
-       56, 0, 294,
-       80, 0, 181
+       57, 0, 306,
+       87, 0, 185
 };
-static int parser_action_row147[] = {
+static int parser_action_row150[] = {
        1,
-       -1, 1, 446
+       -1, 1, 459
 };
-static int parser_action_row148[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row151[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row149[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row152[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row150[] = {
+static int parser_action_row153[] = {
        1,
-       -1, 1, 250
+       -1, 1, 257
 };
-static int parser_action_row151[] = {
+static int parser_action_row154[] = {
        2,
-       -1, 3, 150,
-       49, 0, 174
+       -1, 3, 153,
+       49, 0, 178
 };
-static int parser_action_row152[] = {
+static int parser_action_row155[] = {
        3,
-       -1, 3, 151,
-       51, 0, 300,
-       82, 0, 301
+       -1, 3, 154,
+       52, 0, 312,
+       89, 0, 313
 };
-static int parser_action_row153[] = {
+static int parser_action_row156[] = {
        2,
-       -1, 3, 152,
-       87, 0, 304
+       -1, 3, 155,
+       94, 0, 316
 };
-static int parser_action_row154[] = {
+static int parser_action_row157[] = {
        2,
-       -1, 1, 321,
-       51, 0, 242
+       -1, 1, 334,
+       52, 0, 253
 };
-static int parser_action_row155[] = {
+static int parser_action_row158[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row156[] = {
+static int parser_action_row159[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row157[] = {
+static int parser_action_row160[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row158[] = {
+static int parser_action_row161[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row159[] = {
+static int parser_action_row162[] = {
        17,
-       -1, 1, 427,
-       12, 0, 153,
+       -1, 1, 440,
+       12, 0, 156,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row160[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row163[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row161[] = {
-       3,
-       -1, 1, 309,
-       51, 0, 242,
-       57, 0, 191
-};
-static int parser_action_row162[] = {
-       1,
-       -1, 1, 164
-};
-static int parser_action_row163[] = {
-       4,
-       -1, 1, 260,
-       29, 0, 313,
-       30, 0, 314,
-       32, 0, 315
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row164[] = {
-       1,
-       -1, 1, 262
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
 static int parser_action_row165[] = {
        3,
-       -1, 1, 267,
-       74, 0, 316,
-       77, 0, 317
+       -1, 1, 322,
+       52, 0, 253,
+       58, 0, 196
 };
 static int parser_action_row166[] = {
-       11,
-       -1, 1, 269,
-       39, 0, 318,
-       64, 0, 319,
-       65, 0, 320,
-       70, 0, 321,
-       71, 0, 322,
-       72, 0, 323,
-       73, 0, 324,
-       75, 0, 325,
-       76, 0, 326,
-       78, 0, 327
+       1,
+       -1, 1, 164
 };
 static int parser_action_row167[] = {
        4,
-       -1, 1, 280,
-       66, 0, 328,
-       68, 0, 329,
-       69, 0, 330
+       -1, 1, 272,
+       29, 0, 326,
+       30, 0, 327,
+       32, 0, 328
 };
 static int parser_action_row168[] = {
        1,
-       -1, 1, 283
+       -1, 1, 274
 };
 static int parser_action_row169[] = {
-       2,
-       -1, 1, 287,
-       67, 0, 331
+       3,
+       -1, 1, 279,
+       81, 0, 329,
+       84, 0, 330
 };
 static int parser_action_row170[] = {
-       1,
-       -1, 1, 289
+       11,
+       -1, 1, 281,
+       39, 0, 331,
+       71, 0, 332,
+       72, 0, 333,
+       77, 0, 334,
+       78, 0, 335,
+       79, 0, 336,
+       80, 0, 337,
+       82, 0, 338,
+       83, 0, 339,
+       85, 0, 340
 };
 static int parser_action_row171[] = {
        4,
        -1, 1, 292,
-       53, 0, 212,
-       61, 0, 213,
-       63, 0, 332
+       73, 0, 341,
+       75, 0, 342,
+       76, 0, 343
 };
 static int parser_action_row172[] = {
-       3,
-       -1, 3, 171,
-       41, 0, 334,
-       83, 0, 335
+       1,
+       -1, 1, 295
 };
 static int parser_action_row173[] = {
        2,
-       -1, 1, 424,
-       82, 0, 336
+       -1, 1, 299,
+       74, 0, 344
 };
 static int parser_action_row174[] = {
-       3,
-       -1, 1, 426,
-       81, 0, 47,
-       82, 0, 337
+       1,
+       -1, 1, 301
 };
 static int parser_action_row175[] = {
-       2,
-       -1, 1, 194,
-       82, 0, 339
+       4,
+       -1, 1, 305,
+       54, 0, 223,
+       68, 0, 224,
+       70, 0, 345
 };
 static int parser_action_row176[] = {
-       1,
-       -1, 1, 169
+       3,
+       -1, 3, 175,
+       41, 0, 347,
+       90, 0, 348
 };
 static int parser_action_row177[] = {
-       1,
-       -1, 1, 166
+       2,
+       -1, 1, 437,
+       89, 0, 349
 };
 static int parser_action_row178[] = {
-       4,
-       -1, 1, 309,
-       51, 0, 242,
-       56, 0, 340,
-       57, 0, 191
+       3,
+       -1, 1, 439,
+       88, 0, 48,
+       89, 0, 350
 };
 static int parser_action_row179[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+       2,
+       -1, 1, 195,
+       89, 0, 352
+};
+static int parser_action_row180[] = {
+       1,
+       -1, 1, 169
+};
+static int parser_action_row181[] = {
+       1,
+       -1, 1, 166
+};
+static int parser_action_row182[] = {
+       4,
+       -1, 1, 322,
+       52, 0, 253,
+       57, 0, 353,
+       58, 0, 196
+};
+static int parser_action_row183[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row180[] = {
+static int parser_action_row184[] = {
        2,
-       -1, 1, 257,
-       24, 0, 342
+       -1, 1, 269,
+       24, 0, 355
 };
-static int parser_action_row181[] = {
+static int parser_action_row185[] = {
        3,
-       -1, 3, 180,
-       47, 0, 343,
-       81, 0, 344
+       -1, 3, 184,
+       47, 0, 356,
+       88, 0, 357
 };
-static int parser_action_row182[] = {
+static int parser_action_row186[] = {
        3,
        -1, 1, 28,
        13, 0, 26,
-       51, 0, 346
+       52, 0, 359
 };
-static int parser_action_row183[] = {
+static int parser_action_row187[] = {
        1,
-       -1, 1, 370
+       -1, 1, 383
 };
-static int parser_action_row184[] = {
+static int parser_action_row188[] = {
        1,
-       -1, 1, 335
+       -1, 1, 348
 };
-static int parser_action_row185[] = {
+static int parser_action_row189[] = {
        1,
-       -1, 1, 336
+       -1, 1, 349
 };
-static int parser_action_row186[] = {
+static int parser_action_row190[] = {
        1,
-       -1, 1, 337
+       -1, 1, 350
 };
-static int parser_action_row187[] = {
+static int parser_action_row191[] = {
        1,
-       -1, 1, 338
+       -1, 1, 351
 };
-static int parser_action_row188[] = {
+static int parser_action_row192[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 362,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row193[] = {
        3,
-       -1, 3, 187,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 192,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row189[] = {
-       49,
-       -1, 1, 427,
-       12, 0, 153,
+static int parser_action_row194[] = {
+       50,
+       -1, 1, 440,
+       12, 0, 156,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 154,
+       22, 0, 157,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 155,
-       33, 0, 352,
-       34, 0, 353,
-       35, 0, 354,
-       36, 0, 355,
+       31, 0, 158,
+       33, 0, 368,
+       34, 0, 369,
+       35, 0, 370,
+       36, 0, 371,
        37, 0, 38,
-       38, 0, 156,
-       40, 0, 157,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       47, 0, 349,
-       48, 0, 158,
-       50, 0, 356,
-       51, 0, 45,
-       53, 0, 357,
-       64, 0, 358,
-       65, 0, 359,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 374,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       47, 0, 365,
+       48, 0, 161,
+       50, 0, 44,
+       51, 0, 372,
+       52, 0, 46,
+       54, 0, 373,
+       71, 0, 374,
+       72, 0, 375,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 390,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row190[] = {
-       23,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 394,
-       27, 0, 395,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row195[] = {
+       24,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 411,
+       27, 0, 412,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row191[] = {
+static int parser_action_row196[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row192[] = {
+static int parser_action_row197[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row193[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row198[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row194[] = {
+static int parser_action_row199[] = {
        1,
-       -1, 1, 238
+       -1, 1, 239
 };
-static int parser_action_row195[] = {
+static int parser_action_row200[] = {
        1,
-       -1, 1, 239
+       -1, 1, 240
 };
-static int parser_action_row196[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row201[] = {
+       1,
+       -1, 1, 241
+};
+static int parser_action_row202[] = {
+       1,
+       -1, 1, 242
+};
+static int parser_action_row203[] = {
+       1,
+       -1, 1, 243
+};
+static int parser_action_row204[] = {
+       1,
+       -1, 1, 244
+};
+static int parser_action_row205[] = {
+       1,
+       -1, 1, 245
+};
+static int parser_action_row206[] = {
+       1,
+       -1, 1, 246
+};
+static int parser_action_row207[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row197[] = {
-       4,
-       -1, 1, 308,
-       58, 0, 403,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row208[] = {
+       10,
+       -1, 1, 321,
+       59, 0, 420,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row198[] = {
+static int parser_action_row209[] = {
        1,
-       -1, 1, 180
+       -1, 1, 181
 };
-static int parser_action_row199[] = {
+static int parser_action_row210[] = {
        1,
-       -1, 1, 339
+       -1, 1, 352
 };
-static int parser_action_row200[] = {
+static int parser_action_row211[] = {
        1,
-       -1, 1, 340
+       -1, 1, 353
 };
-static int parser_action_row201[] = {
+static int parser_action_row212[] = {
        1,
-       -1, 1, 341
+       -1, 1, 354
 };
-static int parser_action_row202[] = {
+static int parser_action_row213[] = {
        1,
-       -1, 1, 343
+       -1, 1, 356
 };
-static int parser_action_row203[] = {
+static int parser_action_row214[] = {
        1,
-       -1, 1, 342
+       -1, 1, 355
 };
-static int parser_action_row204[] = {
+static int parser_action_row215[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row205[] = {
+static int parser_action_row216[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row206[] = {
+static int parser_action_row217[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row207[] = {
+static int parser_action_row218[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row208[] = {
+static int parser_action_row219[] = {
        9,
-       -1, 3, 207,
-       3, 0, 409,
-       4, 0, 410,
-       5, 0, 411,
-       6, 0, 412,
-       7, 0, 413,
-       8, 0, 414,
-       10, 0, 415,
-       17, 0, 416
+       -1, 3, 218,
+       3, 0, 426,
+       4, 0, 427,
+       5, 0, 428,
+       6, 0, 429,
+       7, 0, 430,
+       8, 0, 431,
+       10, 0, 432,
+       17, 0, 433
 };
-static int parser_action_row209[] = {
+static int parser_action_row220[] = {
        1,
        -1, 1, 136
 };
-static int parser_action_row210[] = {
+static int parser_action_row221[] = {
        1,
-       -1, 1, 980
+       -1, 1, 1005
 };
-static int parser_action_row211[] = {
-       31,
+static int parser_action_row222[] = {
+       32,
        -1, 1, 156,
        12, 0, 25,
        15, 0, 27,
@@ -3869,1010 +4056,1056 @@ static int parser_action_row211[] = {
        36, 0, 37,
        37, 0, 38,
        38, 0, 39,
-       41, 1, 427,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row212[] = {
+static int parser_action_row223[] = {
        3,
        -1, 1, 155,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row213[] = {
+static int parser_action_row224[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row214[] = {
+static int parser_action_row225[] = {
        1,
-       -1, 1, 334
+       -1, 1, 347
 };
-static int parser_action_row215[] = {
+static int parser_action_row226[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row216[] = {
-       4,
-       -1, 1, 322,
-       58, 0, 423,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row227[] = {
+       10,
+       -1, 1, 335,
+       59, 0, 440,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row217[] = {
+static int parser_action_row228[] = {
        1,
-       -1, 1, 366
+       -1, 1, 379
 };
-static int parser_action_row218[] = {
+static int parser_action_row229[] = {
        1,
-       -1, 1, 367
+       -1, 1, 380
 };
-static int parser_action_row219[] = {
+static int parser_action_row230[] = {
        1,
-       -1, 1, 986
+       -1, 1, 1011
 };
-static int parser_action_row220[] = {
+static int parser_action_row231[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row221[] = {
+static int parser_action_row232[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row222[] = {
+static int parser_action_row233[] = {
        3,
-       -1, 3, 221,
-       89, 0, 216,
-       90, 0, 217
+       -1, 3, 232,
+       96, 0, 227,
+       97, 0, 228
 };
-static int parser_action_row223[] = {
-       24,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row234[] = {
+       25,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       89, 1, 362,
-       90, 1, 362,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       96, 1, 375,
+       97, 1, 375,
+       98, 0, 55
 };
-static int parser_action_row224[] = {
-       26,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 317,
-       61, 1, 317,
-       63, 1, 317,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row235[] = {
+       27,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 330,
+       68, 1, 330,
+       70, 1, 330,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row225[] = {
-       4,
-       -1, 1, 299,
-       58, 0, 432,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row236[] = {
+       10,
+       -1, 1, 312,
+       59, 0, 449,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row226[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row237[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row227[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 311,
-       58, 0, 436,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 311,
-       63, 1, 311,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row238[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 324,
+       59, 0, 453,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 324,
+       70, 1, 324,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row228[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row239[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row229[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 315,
-       57, 0, 191,
-       58, 0, 441,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 315,
-       63, 1, 315,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row240[] = {
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 328,
+       58, 0, 196,
+       59, 0, 458,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 328,
+       70, 1, 328,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row230[] = {
+static int parser_action_row241[] = {
        1,
-       -1, 1, 997
+       -1, 1, 1022
 };
-static int parser_action_row231[] = {
+static int parser_action_row242[] = {
        3,
-       -1, 1, 425,
-       12, 0, 445,
-       82, 0, 446
+       -1, 1, 438,
+       12, 0, 462,
+       89, 0, 463
 };
-static int parser_action_row232[] = {
+static int parser_action_row243[] = {
        2,
-       -1, 1, 448,
-       0, 0, 97
+       -1, 1, 461,
+       0, 0, 99
 };
-static int parser_action_row233[] = {
+static int parser_action_row244[] = {
        1,
        -1, 1, 6
 };
-static int parser_action_row234[] = {
+static int parser_action_row245[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row235[] = {
+static int parser_action_row246[] = {
        1,
        -1, 1, 10
 };
-static int parser_action_row236[] = {
+static int parser_action_row247[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row237[] = {
+static int parser_action_row248[] = {
        1,
        -1, 1, 12
 };
-static int parser_action_row238[] = {
+static int parser_action_row249[] = {
        8,
-       -1, 3, 237,
-       4, 0, 410,
-       5, 0, 411,
-       6, 0, 412,
-       7, 0, 413,
-       8, 0, 414,
-       10, 0, 415,
-       17, 0, 416
+       -1, 3, 248,
+       4, 0, 427,
+       5, 0, 428,
+       6, 0, 429,
+       7, 0, 430,
+       8, 0, 431,
+       10, 0, 432,
+       17, 0, 433
 };
-static int parser_action_row239[] = {
+static int parser_action_row250[] = {
        1,
        -1, 1, 7
 };
-static int parser_action_row240[] = {
+static int parser_action_row251[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       95, 1, 22
+       102, 1, 22
 };
-static int parser_action_row241[] = {
+static int parser_action_row252[] = {
        1,
        -1, 1, 11
 };
-static int parser_action_row242[] = {
+static int parser_action_row253[] = {
        1,
        -1, 1, 13
 };
-static int parser_action_row243[] = {
+static int parser_action_row254[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row244[] = {
+static int parser_action_row255[] = {
        1,
-       -1, 1, 701
+       -1, 1, 717
 };
-static int parser_action_row245[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row256[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row246[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 105,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row257[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row247[] = {
+static int parser_action_row258[] = {
        3,
-       -1, 3, 246,
-       47, 0, 343,
-       81, 0, 344
+       -1, 3, 257,
+       47, 0, 356,
+       88, 0, 357
 };
-static int parser_action_row248[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row259[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row249[] = {
+static int parser_action_row260[] = {
        1,
-       -1, 1, 716
+       -1, 1, 732
 };
-static int parser_action_row250[] = {
+static int parser_action_row261[] = {
        1,
-       -1, 1, 717
+       -1, 1, 733
 };
-static int parser_action_row251[] = {
+static int parser_action_row262[] = {
        1,
-       -1, 1, 718
+       -1, 1, 734
 };
-static int parser_action_row252[] = {
+static int parser_action_row263[] = {
        1,
-       -1, 1, 719
+       -1, 1, 735
 };
-static int parser_action_row253[] = {
+static int parser_action_row264[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row254[] = {
+static int parser_action_row265[] = {
        3,
-       -1, 3, 253,
-       41, 0, 263,
-       83, 0, 456
+       -1, 3, 264,
+       41, 0, 275,
+       90, 0, 473
 };
-static int parser_action_row255[] = {
+static int parser_action_row266[] = {
        4,
-       -1, 3, 254,
-       53, 0, 212,
-       61, 0, 285,
-       63, 0, 457
+       -1, 3, 265,
+       54, 0, 223,
+       68, 0, 297,
+       70, 0, 474
 };
-static int parser_action_row256[] = {
-       23,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row267[] = {
+       24,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       52, 0, 458,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       53, 0, 475,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row257[] = {
+static int parser_action_row268[] = {
        1,
-       -1, 1, 671
+       -1, 1, 687
 };
-static int parser_action_row258[] = {
+static int parser_action_row269[] = {
        1,
-       -1, 1, 689
+       -1, 1, 686
 };
-static int parser_action_row259[] = {
+static int parser_action_row270[] = {
        1,
-       -1, 1, 720
+       -1, 1, 705
 };
-static int parser_action_row260[] = {
+static int parser_action_row271[] = {
        1,
-       -1, 1, 721
+       -1, 1, 736
 };
-static int parser_action_row261[] = {
+static int parser_action_row272[] = {
        1,
-       -1, 1, 722
+       -1, 1, 737
 };
-static int parser_action_row262[] = {
+static int parser_action_row273[] = {
        1,
-       -1, 1, 724
+       -1, 1, 738
 };
-static int parser_action_row263[] = {
+static int parser_action_row274[] = {
        1,
-       -1, 1, 723
+       -1, 1, 740
 };
-static int parser_action_row264[] = {
+static int parser_action_row275[] = {
+       1,
+       -1, 1, 739
+};
+static int parser_action_row276[] = {
        2,
-       -1, 1, 698,
-       51, 0, 242
+       -1, 1, 714,
+       52, 0, 253
 };
-static int parser_action_row265[] = {
+static int parser_action_row277[] = {
        1,
-       -1, 1, 680
+       -1, 1, 696
 };
-static int parser_action_row266[] = {
+static int parser_action_row278[] = {
        2,
-       -1, 1, 692,
-       51, 0, 242
+       -1, 1, 708,
+       52, 0, 253
 };
-static int parser_action_row267[] = {
+static int parser_action_row279[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row268[] = {
+static int parser_action_row280[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       24, 0, 464
+       24, 0, 481
 };
-static int parser_action_row269[] = {
+static int parser_action_row281[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row270[] = {
+static int parser_action_row282[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row271[] = {
+static int parser_action_row283[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row272[] = {
+static int parser_action_row284[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row273[] = {
+static int parser_action_row285[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row274[] = {
+static int parser_action_row286[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row275[] = {
+static int parser_action_row287[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row276[] = {
+static int parser_action_row288[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row277[] = {
+static int parser_action_row289[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row278[] = {
+static int parser_action_row290[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row279[] = {
+static int parser_action_row291[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row280[] = {
+static int parser_action_row292[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row281[] = {
+static int parser_action_row293[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row282[] = {
+static int parser_action_row294[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row283[] = {
+static int parser_action_row295[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row284[] = {
+static int parser_action_row296[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row285[] = {
+static int parser_action_row297[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row286[] = {
+static int parser_action_row298[] = {
        1,
-       -1, 1, 715
+       -1, 1, 731
 };
-static int parser_action_row287[] = {
+static int parser_action_row299[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row288[] = {
+static int parser_action_row300[] = {
        1,
-       -1, 1, 703
+       -1, 1, 719
 };
-static int parser_action_row289[] = {
+static int parser_action_row301[] = {
        3,
-       -1, 1, 696,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 712,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row290[] = {
+static int parser_action_row302[] = {
        2,
-       -1, 1, 425,
-       82, 0, 485
+       -1, 1, 438,
+       89, 0, 502
 };
-static int parser_action_row291[] = {
+static int parser_action_row303[] = {
        2,
        -1, 1, 151,
-       49, 1, 897
+       49, 1, 918
 };
-static int parser_action_row292[] = {
+static int parser_action_row304[] = {
        2,
        -1, 1, 150,
-       49, 1, 896
+       49, 1, 917
 };
-static int parser_action_row293[] = {
+static int parser_action_row305[] = {
        3,
-       -1, 3, 292,
+       -1, 3, 304,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row294[] = {
+static int parser_action_row306[] = {
        1,
-       -1, 1, 240
+       -1, 1, 247
 };
-static int parser_action_row295[] = {
+static int parser_action_row307[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row296[] = {
+static int parser_action_row308[] = {
        2,
-       -1, 1, 196,
-       58, 0, 489
+       -1, 1, 197,
+       59, 0, 506
 };
-static int parser_action_row297[] = {
+static int parser_action_row309[] = {
        2,
        -1, 1, 149,
-       56, 0, 294
+       57, 0, 306
 };
-static int parser_action_row298[] = {
+static int parser_action_row310[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row299[] = {
+static int parser_action_row311[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row300[] = {
+static int parser_action_row312[] = {
        1,
-       -1, 1, 249
+       -1, 1, 256
 };
-static int parser_action_row301[] = {
+static int parser_action_row313[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row302[] = {
+static int parser_action_row314[] = {
        1,
-       -1, 1, 418
+       -1, 1, 431
 };
-static int parser_action_row303[] = {
+static int parser_action_row315[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row304[] = {
+static int parser_action_row316[] = {
        2,
-       -1, 1, 417,
-       55, 0, 495
+       -1, 1, 430,
+       56, 0, 512
 };
-static int parser_action_row305[] = {
+static int parser_action_row317[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row306[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row318[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row307[] = {
-       21,
-       -1, 1, 427,
-       12, 0, 153,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row319[] = {
+       22,
+       -1, 1, 440,
+       12, 0, 156,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row308[] = {
+static int parser_action_row320[] = {
        3,
-       -1, 3, 307,
-       47, 0, 343,
-       81, 0, 344
+       -1, 3, 319,
+       47, 0, 356,
+       88, 0, 357
 };
-static int parser_action_row309[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row321[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row310[] = {
+static int parser_action_row322[] = {
        4,
-       -1, 3, 309,
-       53, 0, 212,
-       61, 0, 213,
-       63, 0, 501
+       -1, 3, 321,
+       54, 0, 223,
+       68, 0, 224,
+       70, 0, 518
 };
-static int parser_action_row311[] = {
+static int parser_action_row323[] = {
        3,
-       -1, 3, 310,
-       41, 0, 334,
-       83, 0, 502
+       -1, 3, 322,
+       41, 0, 347,
+       90, 0, 519
 };
-static int parser_action_row312[] = {
+static int parser_action_row324[] = {
        1,
-       -1, 1, 290
+       -1, 1, 303
 };
-static int parser_action_row313[] = {
+static int parser_action_row325[] = {
        1,
-       -1, 1, 308
+       -1, 1, 302
 };
-static int parser_action_row314[] = {
+static int parser_action_row326[] = {
+       1,
+       -1, 1, 321
+};
+static int parser_action_row327[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row315[] = {
+static int parser_action_row328[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       24, 0, 504
+       24, 0, 521
 };
-static int parser_action_row316[] = {
+static int parser_action_row329[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row317[] = {
+static int parser_action_row330[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row318[] = {
+static int parser_action_row331[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row319[] = {
+static int parser_action_row332[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row320[] = {
+static int parser_action_row333[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row321[] = {
+static int parser_action_row334[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row322[] = {
+static int parser_action_row335[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row323[] = {
+static int parser_action_row336[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row324[] = {
+static int parser_action_row337[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row325[] = {
+static int parser_action_row338[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row326[] = {
+static int parser_action_row339[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row327[] = {
+static int parser_action_row340[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row328[] = {
+static int parser_action_row341[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row329[] = {
+static int parser_action_row342[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row330[] = {
+static int parser_action_row343[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row331[] = {
+static int parser_action_row344[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row332[] = {
+static int parser_action_row345[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row333[] = {
+static int parser_action_row346[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row334[] = {
+static int parser_action_row347[] = {
        1,
-       -1, 1, 322
+       -1, 1, 335
 };
-static int parser_action_row335[] = {
+static int parser_action_row348[] = {
        2,
-       -1, 1, 317,
-       51, 0, 242
+       -1, 1, 330,
+       52, 0, 253
 };
-static int parser_action_row336[] = {
+static int parser_action_row349[] = {
        1,
-       -1, 1, 299
+       -1, 1, 312
 };
-static int parser_action_row337[] = {
+static int parser_action_row350[] = {
        2,
-       -1, 1, 311,
-       51, 0, 242
+       -1, 1, 324,
+       52, 0, 253
 };
-static int parser_action_row338[] = {
+static int parser_action_row351[] = {
        3,
-       -1, 1, 315,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 328,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row339[] = {
+static int parser_action_row352[] = {
        2,
-       -1, 1, 425,
-       82, 0, 526
+       -1, 1, 438,
+       89, 0, 543
 };
-static int parser_action_row340[] = {
+static int parser_action_row353[] = {
        1,
-       -1, 1, 195
+       -1, 1, 196
 };
-static int parser_action_row341[] = {
+static int parser_action_row354[] = {
        1,
-       -1, 1, 259
+       -1, 1, 271
 };
-static int parser_action_row342[] = {
+static int parser_action_row355[] = {
        2,
-       -1, 1, 258,
-       24, 0, 527
+       -1, 1, 270,
+       24, 0, 544
 };
-static int parser_action_row343[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row356[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -4892,519 +5125,575 @@ static int parser_action_row343[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row344[] = {
+static int parser_action_row357[] = {
        2,
-       -1, 3, 343,
-       81, 0, 531
+       -1, 3, 356,
+       88, 0, 548
 };
-static int parser_action_row345[] = {
+static int parser_action_row358[] = {
        3,
-       -1, 1, 729,
-       53, 0, 532,
-       80, 0, 533
+       -1, 1, 745,
+       54, 0, 549,
+       87, 0, 550
 };
-static int parser_action_row346[] = {
+static int parser_action_row359[] = {
        2,
-       -1, 3, 345,
-       63, 0, 536
+       -1, 3, 358,
+       70, 0, 553
 };
-static int parser_action_row347[] = {
+static int parser_action_row360[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row348[] = {
+static int parser_action_row361[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row349[] = {
+static int parser_action_row362[] = {
        1,
-       -1, 1, 368
+       -1, 1, 381
 };
-static int parser_action_row350[] = {
+static int parser_action_row363[] = {
+       6,
+       -1, 1, 322,
+       52, 0, 253,
+       57, 0, 306,
+       58, 0, 196,
+       59, 1, 149,
+       87, 0, 185
+};
+static int parser_action_row364[] = {
+       3,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row365[] = {
+       1,
+       -1, 1, 266
+};
+static int parser_action_row366[] = {
        2,
-       -1, 3, 349,
-       81, 0, 539
+       -1, 3, 365,
+       88, 0, 559
 };
-static int parser_action_row351[] = {
+static int parser_action_row367[] = {
        3,
-       -1, 1, 371,
-       53, 0, 540,
-       80, 0, 181
+       -1, 1, 384,
+       54, 0, 560,
+       87, 0, 185
 };
-static int parser_action_row352[] = {
+static int parser_action_row368[] = {
        2,
-       -1, 3, 351,
-       56, 0, 542
+       -1, 3, 367,
+       57, 0, 562
 };
-static int parser_action_row353[] = {
-       24,
-       -1, 1, 904,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row369[] = {
+       25,
+       -1, 1, 925,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row354[] = {
+static int parser_action_row370[] = {
        2,
-       -1, 1, 909,
-       49, 0, 174
+       -1, 1, 930,
+       49, 0, 178
 };
-static int parser_action_row355[] = {
+static int parser_action_row371[] = {
        2,
-       -1, 1, 906,
-       49, 0, 174
+       -1, 1, 927,
+       49, 0, 178
 };
-static int parser_action_row356[] = {
+static int parser_action_row372[] = {
        1,
-       -1, 1, 908
+       -1, 1, 929
 };
-static int parser_action_row357[] = {
+static int parser_action_row373[] = {
        2,
-       -1, 3, 356,
-       11, 0, 546
+       -1, 3, 372,
+       11, 0, 566
 };
-static int parser_action_row358[] = {
+static int parser_action_row374[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       54, 0, 547
+       55, 0, 567
 };
-static int parser_action_row359[] = {
-       1,
-       -1, 1, 457
+static int parser_action_row375[] = {
+       23,
+       -1, 1, 470,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row360[] = {
-       22,
-       -1, 1, 458,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row376[] = {
+       23,
+       -1, 1, 471,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row361[] = {
+static int parser_action_row377[] = {
        1,
-       -1, 1, 459
+       -1, 1, 472
 };
-static int parser_action_row362[] = {
+static int parser_action_row378[] = {
        1,
-       -1, 1, 460
+       -1, 1, 473
 };
-static int parser_action_row363[] = {
+static int parser_action_row379[] = {
        1,
-       -1, 1, 461
+       -1, 1, 474
 };
-static int parser_action_row364[] = {
+static int parser_action_row380[] = {
        1,
-       -1, 1, 462
+       -1, 1, 475
 };
-static int parser_action_row365[] = {
+static int parser_action_row381[] = {
        1,
-       -1, 1, 463
+       -1, 1, 476
 };
-static int parser_action_row366[] = {
+static int parser_action_row382[] = {
        1,
-       -1, 1, 464
+       -1, 1, 477
 };
-static int parser_action_row367[] = {
+static int parser_action_row383[] = {
        1,
-       -1, 1, 467
+       -1, 1, 480
 };
-static int parser_action_row368[] = {
+static int parser_action_row384[] = {
        1,
-       -1, 1, 465
+       -1, 1, 478
 };
-static int parser_action_row369[] = {
+static int parser_action_row385[] = {
        1,
-       -1, 1, 469
+       -1, 1, 482
 };
-static int parser_action_row370[] = {
+static int parser_action_row386[] = {
        1,
-       -1, 1, 468
+       -1, 1, 481
 };
-static int parser_action_row371[] = {
+static int parser_action_row387[] = {
        1,
-       -1, 1, 466
+       -1, 1, 479
 };
-static int parser_action_row372[] = {
+static int parser_action_row388[] = {
        1,
-       -1, 1, 470
+       -1, 1, 483
 };
-static int parser_action_row373[] = {
+static int parser_action_row389[] = {
        1,
-       -1, 1, 472
+       -1, 1, 485
 };
-static int parser_action_row374[] = {
+static int parser_action_row390[] = {
        4,
-       -1, 1, 371,
-       53, 0, 540,
-       57, 0, 190,
-       80, 0, 181
+       -1, 1, 384,
+       54, 0, 560,
+       58, 0, 195,
+       87, 0, 185
 };
-static int parser_action_row375[] = {
-       6,
-       -1, 1, 309,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 548,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row391[] = {
+       12,
+       -1, 1, 322,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 568,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row376[] = {
+static int parser_action_row392[] = {
        1,
-       -1, 1, 396
+       -1, 1, 409
 };
-static int parser_action_row377[] = {
+static int parser_action_row393[] = {
        1,
-       -1, 1, 902
+       -1, 1, 923
 };
-static int parser_action_row378[] = {
+static int parser_action_row394[] = {
        1,
-       -1, 1, 903
+       -1, 1, 924
 };
-static int parser_action_row379[] = {
+static int parser_action_row395[] = {
        1,
-       -1, 1, 911
+       -1, 1, 932
 };
-static int parser_action_row380[] = {
+static int parser_action_row396[] = {
        1,
-       -1, 1, 913
+       -1, 1, 934
 };
-static int parser_action_row381[] = {
+static int parser_action_row397[] = {
        1,
-       -1, 1, 912
+       -1, 1, 933
 };
-static int parser_action_row382[] = {
+static int parser_action_row398[] = {
        1,
-       -1, 1, 914
+       -1, 1, 935
 };
-static int parser_action_row383[] = {
+static int parser_action_row399[] = {
        1,
-       -1, 1, 915
+       -1, 1, 936
 };
-static int parser_action_row384[] = {
+static int parser_action_row400[] = {
        1,
-       -1, 1, 397
+       -1, 1, 937
 };
-static int parser_action_row385[] = {
+static int parser_action_row401[] = {
+       1,
+       -1, 1, 410
+};
+static int parser_action_row402[] = {
        4,
-       -1, 1, 292,
-       53, 0, 212,
-       61, 0, 213,
-       63, 0, 549
+       -1, 1, 305,
+       54, 0, 223,
+       68, 0, 224,
+       70, 0, 569
 };
-static int parser_action_row386[] = {
+static int parser_action_row403[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row387[] = {
+static int parser_action_row404[] = {
        1,
-       -1, 1, 401
+       -1, 1, 414
 };
-static int parser_action_row388[] = {
+static int parser_action_row405[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       55, 0, 551
+       56, 0, 571
 };
-static int parser_action_row389[] = {
+static int parser_action_row406[] = {
        3,
-       -1, 3, 388,
-       41, 0, 334,
-       83, 0, 224
+       -1, 3, 405,
+       41, 0, 347,
+       90, 0, 235
 };
-static int parser_action_row390[] = {
+static int parser_action_row407[] = {
        18,
-       -1, 1, 424,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 557
+       -1, 1, 437,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 578
 };
-static int parser_action_row391[] = {
+static int parser_action_row408[] = {
        1,
-       -1, 1, 475
+       -1, 1, 488
 };
-static int parser_action_row392[] = {
+static int parser_action_row409[] = {
        1,
-       -1, 1, 400
+       -1, 1, 413
 };
-static int parser_action_row393[] = {
+static int parser_action_row410[] = {
        1,
-       -1, 1, 398
+       -1, 1, 411
 };
-static int parser_action_row394[] = {
+static int parser_action_row411[] = {
        19,
-       -1, 1, 426,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       81, 0, 47,
-       82, 0, 559
+       -1, 1, 439,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       88, 0, 48,
+       89, 0, 580
 };
-static int parser_action_row395[] = {
+static int parser_action_row412[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row396[] = {
+static int parser_action_row413[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row397[] = {
+static int parser_action_row414[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row398[] = {
+static int parser_action_row415[] = {
        2,
        -1, 1, 149,
-       56, 0, 294
+       57, 0, 306
 };
-static int parser_action_row399[] = {
+static int parser_action_row416[] = {
        2,
-       -1, 1, 353,
-       55, 0, 566
+       -1, 1, 366,
+       56, 0, 587
 };
-static int parser_action_row400[] = {
+static int parser_action_row417[] = {
        1,
-       -1, 1, 437
+       -1, 1, 450
 };
-static int parser_action_row401[] = {
+static int parser_action_row418[] = {
        1,
-       -1, 1, 436
+       -1, 1, 449
 };
-static int parser_action_row402[] = {
+static int parser_action_row419[] = {
        1,
-       -1, 1, 211
+       -1, 1, 212
 };
-static int parser_action_row403[] = {
+static int parser_action_row420[] = {
        1,
-       -1, 1, 230
+       -1, 1, 231
 };
-static int parser_action_row404[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row421[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row405[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row422[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row406[] = {
+static int parser_action_row423[] = {
        1,
        -1, 1, 80
 };
-static int parser_action_row407[] = {
+static int parser_action_row424[] = {
        1,
        -1, 1, 82
 };
-static int parser_action_row408[] = {
+static int parser_action_row425[] = {
        1,
        -1, 1, 81
 };
-static int parser_action_row409[] = {
+static int parser_action_row426[] = {
        1,
        -1, 1, 83
 };
-static int parser_action_row410[] = {
+static int parser_action_row427[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row411[] = {
+static int parser_action_row428[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row412[] = {
+static int parser_action_row429[] = {
        1,
        -1, 1, 30
 };
-static int parser_action_row413[] = {
+static int parser_action_row430[] = {
        2,
-       -1, 3, 412,
-       5, 0, 573
+       -1, 3, 429,
+       5, 0, 594
 };
-static int parser_action_row414[] = {
+static int parser_action_row431[] = {
        1,
        -1, 1, 32
 };
-static int parser_action_row415[] = {
+static int parser_action_row432[] = {
        1,
        -1, 1, 33
 };
-static int parser_action_row416[] = {
+static int parser_action_row433[] = {
        19,
-       -1, 3, 415,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 47,
-       82, 0, 590
+       -1, 3, 432,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 48,
+       89, 0, 611
 };
-static int parser_action_row417[] = {
+static int parser_action_row434[] = {
        2,
-       -1, 3, 416,
-       5, 0, 595
+       -1, 3, 433,
+       5, 0, 616
 };
-static int parser_action_row418[] = {
+static int parser_action_row435[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row419[] = {
+static int parser_action_row436[] = {
        1,
        -1, 1, 160
 };
-static int parser_action_row420[] = {
+static int parser_action_row437[] = {
        1,
-       -1, 1, 981
+       -1, 1, 1006
 };
-static int parser_action_row421[] = {
-       31,
+static int parser_action_row438[] = {
+       32,
        -1, 1, 157,
        12, 0, 25,
        15, 0, 27,
@@ -5419,931 +5708,982 @@ static int parser_action_row421[] = {
        36, 0, 37,
        37, 0, 38,
        38, 0, 39,
-       41, 1, 427,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row422[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row439[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row423[] = {
+static int parser_action_row440[] = {
        5,
-       -1, 1, 427,
-       12, 0, 598,
-       46, 0, 599,
-       81, 0, 47,
-       82, 0, 600
+       -1, 1, 440,
+       12, 0, 619,
+       46, 0, 620,
+       88, 0, 48,
+       89, 0, 621
 };
-static int parser_action_row424[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row441[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row425[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row442[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row426[] = {
-       24,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row443[] = {
+       25,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       89, 1, 365,
-       90, 1, 365,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       96, 1, 378,
+       97, 1, 378,
+       98, 0, 55
 };
-static int parser_action_row427[] = {
+static int parser_action_row444[] = {
        1,
-       -1, 1, 359
+       -1, 1, 372
 };
-static int parser_action_row428[] = {
+static int parser_action_row445[] = {
        1,
-       -1, 1, 987
+       -1, 1, 1012
 };
-static int parser_action_row429[] = {
+static int parser_action_row446[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row430[] = {
+static int parser_action_row447[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row431[] = {
+static int parser_action_row448[] = {
        1,
-       -1, 1, 316
+       -1, 1, 329
 };
-static int parser_action_row432[] = {
+static int parser_action_row449[] = {
        1,
-       -1, 1, 184
+       -1, 1, 185
 };
-static int parser_action_row433[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row450[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row434[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row451[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row435[] = {
+static int parser_action_row452[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row436[] = {
+static int parser_action_row453[] = {
        1,
-       -1, 1, 190
+       -1, 1, 191
 };
-static int parser_action_row437[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row454[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row438[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row455[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row439[] = {
-       4,
-       -1, 1, 310,
-       58, 0, 614,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row456[] = {
+       10,
+       -1, 1, 323,
+       59, 0, 635,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row440[] = {
+static int parser_action_row457[] = {
        1,
-       -1, 1, 181
+       -1, 1, 182
 };
-static int parser_action_row441[] = {
+static int parser_action_row458[] = {
        1,
-       -1, 1, 192
+       -1, 1, 193
 };
-static int parser_action_row442[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row459[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row443[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row460[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row444[] = {
-       4,
-       -1, 1, 314,
-       58, 0, 618,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row461[] = {
+       10,
+       -1, 1, 327,
+       59, 0, 639,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row445[] = {
+static int parser_action_row462[] = {
        1,
-       -1, 1, 183
+       -1, 1, 184
 };
-static int parser_action_row446[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row463[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row447[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 313,
-       58, 0, 621,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 313,
-       63, 1, 313,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row464[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 326,
+       59, 0, 642,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 326,
+       70, 1, 326,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row448[] = {
+static int parser_action_row465[] = {
        1,
        -1, 1, 14
 };
-static int parser_action_row449[] = {
+static int parser_action_row466[] = {
        7,
-       -1, 3, 448,
-       5, 0, 411,
-       6, 0, 412,
-       7, 0, 413,
-       8, 0, 414,
-       10, 0, 415,
-       17, 0, 416
+       -1, 3, 465,
+       5, 0, 428,
+       6, 0, 429,
+       7, 0, 430,
+       8, 0, 431,
+       10, 0, 432,
+       17, 0, 433
 };
-static int parser_action_row450[] = {
+static int parser_action_row467[] = {
        1,
        -1, 1, 15
 };
-static int parser_action_row451[] = {
-       23,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row468[] = {
+       24,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       52, 0, 625,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       53, 0, 646,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row452[] = {
+static int parser_action_row469[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row453[] = {
+static int parser_action_row470[] = {
        1,
-       -1, 1, 649
+       -1, 1, 664
 };
-static int parser_action_row454[] = {
+static int parser_action_row471[] = {
        3,
-       -1, 1, 675,
-       51, 0, 242,
-       63, 0, 628
+       -1, 1, 691,
+       52, 0, 253,
+       70, 0, 649
 };
-static int parser_action_row455[] = {
+static int parser_action_row472[] = {
        1,
-       -1, 1, 672
+       -1, 1, 688
 };
-static int parser_action_row456[] = {
+static int parser_action_row473[] = {
        3,
-       -1, 3, 455,
-       47, 0, 343,
-       81, 0, 344
+       -1, 3, 472,
+       47, 0, 356,
+       88, 0, 357
 };
-static int parser_action_row457[] = {
+static int parser_action_row474[] = {
        4,
-       -1, 1, 677,
-       53, 1, 680,
-       61, 1, 680,
-       63, 1, 680
+       -1, 1, 693,
+       54, 1, 696,
+       68, 1, 696,
+       70, 1, 696
 };
-static int parser_action_row458[] = {
+static int parser_action_row475[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row459[] = {
-       7,
-       -1, 1, 409,
-       53, 1, 406,
-       58, 1, 406,
-       59, 1, 406,
-       60, 1, 406,
-       61, 1, 406,
-       63, 1, 406
+static int parser_action_row476[] = {
+       8,
+       -1, 1, 419,
+       0, 1, 422,
+       1, 1, 422,
+       9, 1, 422,
+       24, 1, 422,
+       53, 1, 422,
+       56, 1, 422,
+       102, 1, 422
 };
-static int parser_action_row460[] = {
+static int parser_action_row477[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row461[] = {
+static int parser_action_row478[] = {
        2,
-       -1, 3, 460,
-       52, 0, 633
+       -1, 3, 477,
+       53, 0, 654
 };
-static int parser_action_row462[] = {
+static int parser_action_row479[] = {
        1,
-       -1, 1, 697
+       -1, 1, 713
 };
-static int parser_action_row463[] = {
+static int parser_action_row480[] = {
        1,
-       -1, 1, 691
+       -1, 1, 707
 };
-static int parser_action_row464[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 105,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row481[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row465[] = {
+static int parser_action_row482[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row466[] = {
+static int parser_action_row483[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
+};
+static int parser_action_row484[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
+};
+static int parser_action_row485[] = {
        19,
-       -1, 1, 427,
-       12, 0, 105,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row467[] = {
+static int parser_action_row486[] = {
        19,
-       -1, 1, 427,
-       12, 0, 105,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row468[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
-};
-static int parser_action_row469[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
-};
-static int parser_action_row470[] = {
+static int parser_action_row487[] = {
        3,
-       -1, 3, 469,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 486,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row471[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row488[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row472[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row489[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row473[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row490[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row474[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row491[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row475[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row492[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row476[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row493[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row477[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row494[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row478[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row495[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row479[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row496[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row480[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row497[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row481[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row498[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row482[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row499[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row483[] = {
-       18,
-       -1, 1, 427,
-       12, 0, 105,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row500[] = {
+       19,
+       -1, 1, 440,
+       12, 0, 107,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row484[] = {
+static int parser_action_row501[] = {
        5,
-       -1, 1, 427,
-       12, 0, 654,
-       46, 0, 655,
-       81, 0, 47,
-       82, 0, 656
+       -1, 1, 440,
+       12, 0, 675,
+       46, 0, 676,
+       88, 0, 48,
+       89, 0, 677
 };
-static int parser_action_row485[] = {
+static int parser_action_row502[] = {
        1,
-       -1, 1, 695
+       -1, 1, 711
 };
-static int parser_action_row486[] = {
+static int parser_action_row503[] = {
        2,
-       -1, 1, 694,
-       51, 0, 242
+       -1, 1, 710,
+       52, 0, 253
 };
-static int parser_action_row487[] = {
-       30,
-       -1, 1, 427,
-       9, 0, 661,
+static int parser_action_row504[] = {
+       31,
+       -1, 1, 440,
+       9, 0, 682,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -6363,558 +6703,577 @@ static int parser_action_row487[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row488[] = {
+static int parser_action_row505[] = {
        3,
-       -1, 3, 487,
+       -1, 3, 504,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row489[] = {
+static int parser_action_row506[] = {
        3,
-       -1, 3, 488,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 505,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row490[] = {
+static int parser_action_row507[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row491[] = {
+static int parser_action_row508[] = {
        2,
-       -1, 1, 197,
-       58, 0, 665
+       -1, 1, 198,
+       59, 0, 686
 };
-static int parser_action_row492[] = {
+static int parser_action_row509[] = {
        2,
-       -1, 3, 491,
-       23, 0, 666
+       -1, 3, 508,
+       23, 0, 687
 };
-static int parser_action_row493[] = {
+static int parser_action_row510[] = {
        2,
-       -1, 3, 492,
-       15, 0, 667
+       -1, 3, 509,
+       15, 0, 688
 };
-static int parser_action_row494[] = {
+static int parser_action_row511[] = {
        2,
-       -1, 3, 493,
-       82, 0, 301
+       -1, 3, 510,
+       89, 0, 313
 };
-static int parser_action_row495[] = {
+static int parser_action_row512[] = {
        2,
-       -1, 3, 494,
-       28, 0, 669
+       -1, 3, 511,
+       28, 0, 690
 };
-static int parser_action_row496[] = {
+static int parser_action_row513[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row497[] = {
+static int parser_action_row514[] = {
        1,
        -1, 1, 134
 };
-static int parser_action_row498[] = {
+static int parser_action_row515[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row499[] = {
+static int parser_action_row516[] = {
        1,
-       -1, 1, 268
+       -1, 1, 280
 };
-static int parser_action_row500[] = {
+static int parser_action_row517[] = {
        3,
-       -1, 1, 294,
-       51, 0, 242,
-       63, 0, 536
+       -1, 1, 307,
+       52, 0, 253,
+       70, 0, 553
 };
-static int parser_action_row501[] = {
+static int parser_action_row518[] = {
        1,
-       -1, 1, 291
+       -1, 1, 304
 };
-static int parser_action_row502[] = {
+static int parser_action_row519[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row503[] = {
+static int parser_action_row520[] = {
        4,
-       -1, 1, 296,
-       53, 1, 299,
-       61, 1, 299,
-       63, 1, 299
+       -1, 1, 309,
+       54, 1, 312,
+       68, 1, 312,
+       70, 1, 312
 };
-static int parser_action_row504[] = {
-       21,
-       -1, 1, 427,
-       12, 0, 153,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row521[] = {
+       22,
+       -1, 1, 440,
+       12, 0, 156,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row505[] = {
+static int parser_action_row522[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row506[] = {
-       21,
-       -1, 1, 427,
-       12, 0, 153,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row523[] = {
+       22,
+       -1, 1, 440,
+       12, 0, 156,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row507[] = {
-       21,
-       -1, 1, 427,
-       12, 0, 153,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row524[] = {
+       22,
+       -1, 1, 440,
+       12, 0, 156,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row508[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row525[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row509[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row526[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row510[] = {
+static int parser_action_row527[] = {
        3,
-       -1, 3, 509,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 526,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row511[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row528[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row512[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row529[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row513[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row530[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row514[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row531[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row515[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row532[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row516[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row533[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row517[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row534[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row518[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row535[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row519[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row536[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row520[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row537[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row521[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row538[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row522[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row539[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row523[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row540[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row524[] = {
+static int parser_action_row541[] = {
        5,
-       -1, 1, 427,
-       12, 0, 694,
-       46, 0, 599,
-       81, 0, 47,
-       82, 0, 695
+       -1, 1, 440,
+       12, 0, 715,
+       46, 0, 620,
+       88, 0, 48,
+       89, 0, 716
 };
-static int parser_action_row525[] = {
+static int parser_action_row542[] = {
        1,
-       -1, 1, 310
+       -1, 1, 323
 };
-static int parser_action_row526[] = {
+static int parser_action_row543[] = {
        1,
-       -1, 1, 314
+       -1, 1, 327
 };
-static int parser_action_row527[] = {
+static int parser_action_row544[] = {
        2,
-       -1, 1, 313,
-       51, 0, 242
+       -1, 1, 326,
+       52, 0, 253
 };
-static int parser_action_row528[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row545[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -6934,28 +7293,29 @@ static int parser_action_row528[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row529[] = {
+static int parser_action_row546[] = {
        1,
        -1, 1, 152
 };
-static int parser_action_row530[] = {
+static int parser_action_row547[] = {
        1,
-       -1, 1, 255
+       -1, 1, 267
 };
-static int parser_action_row531[] = {
-       30,
-       -1, 1, 427,
-       9, 0, 701,
+static int parser_action_row548[] = {
+       31,
+       -1, 1, 440,
+       9, 0, 722,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -6975,1001 +7335,1059 @@ static int parser_action_row531[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row532[] = {
+static int parser_action_row549[] = {
        3,
-       -1, 1, 729,
-       53, 0, 703,
-       80, 0, 533
+       -1, 1, 745,
+       54, 0, 724,
+       87, 0, 550
 };
-static int parser_action_row533[] = {
+static int parser_action_row550[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row534[] = {
+static int parser_action_row551[] = {
        3,
        -1, 1, 28,
        13, 0, 26,
-       51, 0, 706
+       52, 0, 727
 };
-static int parser_action_row535[] = {
+static int parser_action_row552[] = {
        1,
-       -1, 1, 728
+       -1, 1, 744
 };
-static int parser_action_row536[] = {
+static int parser_action_row553[] = {
        1,
-       -1, 1, 566
+       -1, 1, 580
 };
-static int parser_action_row537[] = {
+static int parser_action_row554[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row538[] = {
+static int parser_action_row555[] = {
        2,
        -1, 1, 28,
        13, 0, 26
 };
-static int parser_action_row539[] = {
+static int parser_action_row556[] = {
        4,
-       -1, 3, 538,
-       6, 0, 713,
-       17, 0, 714,
-       82, 0, 715
+       -1, 3, 555,
+       6, 0, 734,
+       17, 0, 735,
+       89, 0, 736
 };
-static int parser_action_row540[] = {
+static int parser_action_row557[] = {
+       2,
+       -1, 3, 556,
+       59, 0, 738
+};
+static int parser_action_row558[] = {
+       2,
+       -1, 1, 149,
+       57, 0, 306
+};
+static int parser_action_row559[] = {
+       2,
+       -1, 3, 558,
+       15, 0, 740
+};
+static int parser_action_row560[] = {
        3,
-       -1, 1, 371,
-       53, 0, 717,
-       80, 0, 181
+       -1, 1, 384,
+       54, 0, 741,
+       87, 0, 185
 };
-static int parser_action_row541[] = {
+static int parser_action_row561[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row542[] = {
+static int parser_action_row562[] = {
        1,
        -1, 1, 140
 };
-static int parser_action_row543[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row563[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row544[] = {
+static int parser_action_row564[] = {
        1,
-       -1, 1, 905
+       -1, 1, 926
 };
-static int parser_action_row545[] = {
+static int parser_action_row565[] = {
        1,
-       -1, 1, 910
+       -1, 1, 931
 };
-static int parser_action_row546[] = {
+static int parser_action_row566[] = {
        1,
-       -1, 1, 907
+       -1, 1, 928
 };
-static int parser_action_row547[] = {
+static int parser_action_row567[] = {
        3,
-       -1, 3, 546,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 566,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row548[] = {
+static int parser_action_row568[] = {
        2,
-       -1, 1, 471,
-       58, 0, 722
+       -1, 1, 484,
+       59, 0, 746
 };
-static int parser_action_row549[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row569[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row550[] = {
+static int parser_action_row570[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row551[] = {
+static int parser_action_row571[] = {
        2,
-       -1, 3, 550,
-       52, 0, 724
+       -1, 3, 570,
+       53, 0, 748
 };
-static int parser_action_row552[] = {
+static int parser_action_row572[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row553[] = {
+static int parser_action_row573[] = {
        1,
-       -1, 1, 982
+       -1, 1, 1007
 };
-static int parser_action_row554[] = {
+static int parser_action_row574[] = {
        2,
-       -1, 3, 553,
-       52, 0, 726
+       -1, 3, 573,
+       53, 0, 750
 };
-static int parser_action_row555[] = {
+static int parser_action_row575[] = {
        2,
-       -1, 1, 351,
-       55, 0, 551
+       -1, 1, 364,
+       56, 0, 571
 };
-static int parser_action_row556[] = {
+static int parser_action_row576[] = {
        2,
-       -1, 3, 555,
-       54, 0, 547
+       -1, 3, 575,
+       55, 0, 567
 };
-static int parser_action_row557[] = {
+static int parser_action_row577[] = {
        1,
-       -1, 1, 458
+       -1, 1, 470
 };
-static int parser_action_row558[] = {
-       5,
-       -1, 1, 311,
-       51, 0, 242,
-       58, 0, 728,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row578[] = {
+       1,
+       -1, 1, 471
 };
-static int parser_action_row559[] = {
+static int parser_action_row579[] = {
+       11,
+       -1, 1, 324,
+       52, 0, 253,
+       59, 0, 752,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
+};
+static int parser_action_row580[] = {
        1,
-       -1, 1, 476
+       -1, 1, 489
 };
-static int parser_action_row560[] = {
-       6,
-       -1, 1, 315,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 729,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row581[] = {
+       12,
+       -1, 1, 328,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 753,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row561[] = {
+static int parser_action_row582[] = {
        18,
-       -1, 1, 425,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 730
+       -1, 1, 438,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 754
 };
-static int parser_action_row562[] = {
+static int parser_action_row583[] = {
        1,
-       -1, 1, 478
+       -1, 1, 491
 };
-static int parser_action_row563[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row584[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row564[] = {
+static int parser_action_row585[] = {
        3,
-       -1, 3, 563,
-       51, 0, 300,
-       82, 0, 301
+       -1, 3, 584,
+       52, 0, 312,
+       89, 0, 313
 };
-static int parser_action_row565[] = {
+static int parser_action_row586[] = {
        2,
-       -1, 1, 356,
-       62, 0, 734
+       -1, 1, 369,
+       69, 0, 758
 };
-static int parser_action_row566[] = {
+static int parser_action_row587[] = {
        2,
-       -1, 3, 565,
-       54, 0, 735
+       -1, 3, 586,
+       55, 0, 759
 };
-static int parser_action_row567[] = {
+static int parser_action_row588[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row568[] = {
+static int parser_action_row589[] = {
        1,
-       -1, 1, 984
+       -1, 1, 1009
 };
-static int parser_action_row569[] = {
+static int parser_action_row590[] = {
        2,
-       -1, 1, 354,
-       55, 0, 566
+       -1, 1, 367,
+       56, 0, 587
 };
-static int parser_action_row570[] = {
+static int parser_action_row591[] = {
        1,
-       -1, 1, 210
+       -1, 1, 211
 };
-static int parser_action_row571[] = {
+static int parser_action_row592[] = {
        1,
-       -1, 1, 229
+       -1, 1, 230
 };
-static int parser_action_row572[] = {
+static int parser_action_row593[] = {
        3,
-       -1, 3, 571,
-       57, 0, 738,
-       82, 0, 739
+       -1, 3, 592,
+       58, 0, 762,
+       89, 0, 763
 };
-static int parser_action_row573[] = {
+static int parser_action_row594[] = {
        4,
-       -1, 3, 572,
-       9, 0, 742,
-       57, 0, 738,
-       82, 0, 739
+       -1, 3, 593,
+       9, 0, 766,
+       58, 0, 762,
+       89, 0, 763
 };
-static int parser_action_row574[] = {
+static int parser_action_row595[] = {
        1,
        -1, 1, 31
 };
-static int parser_action_row575[] = {
+static int parser_action_row596[] = {
        2,
-       -1, 3, 574,
-       54, 0, 744
+       -1, 3, 595,
+       55, 0, 768
 };
-static int parser_action_row576[] = {
+static int parser_action_row597[] = {
        1,
        -1, 1, 84
 };
-static int parser_action_row577[] = {
+static int parser_action_row598[] = {
        1,
        -1, 1, 85
 };
-static int parser_action_row578[] = {
+static int parser_action_row599[] = {
        1,
        -1, 1, 86
 };
-static int parser_action_row579[] = {
+static int parser_action_row600[] = {
        1,
        -1, 1, 87
 };
-static int parser_action_row580[] = {
+static int parser_action_row601[] = {
        1,
        -1, 1, 88
 };
-static int parser_action_row581[] = {
+static int parser_action_row602[] = {
        1,
        -1, 1, 89
 };
-static int parser_action_row582[] = {
+static int parser_action_row603[] = {
        1,
        -1, 1, 90
 };
-static int parser_action_row583[] = {
+static int parser_action_row604[] = {
        1,
        -1, 1, 91
 };
-static int parser_action_row584[] = {
+static int parser_action_row605[] = {
        1,
        -1, 1, 94
 };
-static int parser_action_row585[] = {
+static int parser_action_row606[] = {
        1,
        -1, 1, 92
 };
-static int parser_action_row586[] = {
+static int parser_action_row607[] = {
        1,
        -1, 1, 96
 };
-static int parser_action_row587[] = {
+static int parser_action_row608[] = {
        1,
        -1, 1, 95
 };
-static int parser_action_row588[] = {
+static int parser_action_row609[] = {
        1,
        -1, 1, 93
 };
-static int parser_action_row589[] = {
+static int parser_action_row610[] = {
        1,
        -1, 1, 97
 };
-static int parser_action_row590[] = {
+static int parser_action_row611[] = {
        1,
        -1, 1, 99
 };
-static int parser_action_row591[] = {
+static int parser_action_row612[] = {
        3,
        -1, 1, 102,
-       57, 0, 191,
-       58, 0, 745
+       58, 0, 196,
+       59, 0, 769
 };
-static int parser_action_row592[] = {
+static int parser_action_row613[] = {
        1,
-       -1, 1, 432
+       -1, 1, 445
 };
-static int parser_action_row593[] = {
+static int parser_action_row614[] = {
        5,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       51, 0, 746,
-       56, 0, 747
+       52, 0, 770,
+       57, 0, 771
 };
-static int parser_action_row594[] = {
+static int parser_action_row615[] = {
        18,
-       -1, 3, 593,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       82, 0, 751
+       -1, 3, 614,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       89, 0, 775
 };
-static int parser_action_row595[] = {
+static int parser_action_row616[] = {
        19,
-       -1, 3, 594,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 47,
-       82, 0, 590
+       -1, 3, 615,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 48,
+       89, 0, 611
 };
-static int parser_action_row596[] = {
+static int parser_action_row617[] = {
        1,
        -1, 1, 34
 };
-static int parser_action_row597[] = {
+static int parser_action_row618[] = {
        3,
-       -1, 3, 596,
-       81, 0, 755,
-       82, 0, 756
+       -1, 3, 617,
+       88, 0, 779,
+       89, 0, 780
 };
-static int parser_action_row598[] = {
+static int parser_action_row619[] = {
        2,
-       -1, 3, 597,
-       54, 0, 760
+       -1, 3, 618,
+       55, 0, 784
 };
-static int parser_action_row599[] = {
-       26,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 319,
-       61, 1, 319,
-       63, 1, 319,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row620[] = {
+       27,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 332,
+       68, 1, 332,
+       70, 1, 332,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row600[] = {
+static int parser_action_row621[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row601[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 301,
-       57, 0, 191,
-       58, 0, 764,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 301,
-       63, 1, 301,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row622[] = {
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 314,
+       58, 0, 196,
+       59, 0, 788,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 314,
+       70, 1, 314,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row602[] = {
+static int parser_action_row623[] = {
        2,
-       -1, 3, 601,
-       83, 0, 768
+       -1, 3, 622,
+       90, 0, 792
 };
-static int parser_action_row603[] = {
+static int parser_action_row624[] = {
        3,
-       -1, 1, 424,
-       12, 0, 769,
-       82, 0, 770
+       -1, 1, 437,
+       12, 0, 793,
+       89, 0, 794
 };
-static int parser_action_row604[] = {
+static int parser_action_row625[] = {
        4,
-       -1, 1, 426,
-       12, 0, 771,
-       81, 0, 47,
-       82, 0, 772
+       -1, 1, 439,
+       12, 0, 795,
+       88, 0, 48,
+       89, 0, 796
 };
-static int parser_action_row605[] = {
+static int parser_action_row626[] = {
        1,
-       -1, 1, 218
+       -1, 1, 219
 };
-static int parser_action_row606[] = {
+static int parser_action_row627[] = {
        1,
-       -1, 1, 237
+       -1, 1, 238
 };
-static int parser_action_row607[] = {
+static int parser_action_row628[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row608[] = {
+static int parser_action_row629[] = {
        1,
-       -1, 1, 360
+       -1, 1, 373
 };
-static int parser_action_row609[] = {
+static int parser_action_row630[] = {
        1,
-       -1, 1, 361
+       -1, 1, 374
 };
-static int parser_action_row610[] = {
+static int parser_action_row631[] = {
        1,
-       -1, 1, 201
+       -1, 1, 202
 };
-static int parser_action_row611[] = {
+static int parser_action_row632[] = {
        1,
-       -1, 1, 220
+       -1, 1, 221
 };
-static int parser_action_row612[] = {
-       23,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row633[] = {
+       24,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       52, 0, 775,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       53, 0, 799,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row613[] = {
+static int parser_action_row634[] = {
        1,
-       -1, 1, 213
+       -1, 1, 214
 };
-static int parser_action_row614[] = {
+static int parser_action_row635[] = {
        1,
-       -1, 1, 232
+       -1, 1, 233
 };
-static int parser_action_row615[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row636[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row616[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row637[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row617[] = {
+static int parser_action_row638[] = {
        1,
-       -1, 1, 217
+       -1, 1, 218
 };
-static int parser_action_row618[] = {
+static int parser_action_row639[] = {
        1,
-       -1, 1, 236
+       -1, 1, 237
 };
-static int parser_action_row619[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row640[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row620[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row641[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row621[] = {
+static int parser_action_row642[] = {
        1,
-       -1, 1, 191
+       -1, 1, 192
 };
-static int parser_action_row622[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row643[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row623[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row644[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row624[] = {
-       4,
-       -1, 1, 312,
-       58, 0, 783,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row645[] = {
+       10,
+       -1, 1, 325,
+       59, 0, 807,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row625[] = {
+static int parser_action_row646[] = {
        1,
-       -1, 1, 182
+       -1, 1, 183
 };
-static int parser_action_row626[] = {
+static int parser_action_row647[] = {
        1,
-       -1, 1, 406
+       -1, 1, 419
 };
-static int parser_action_row627[] = {
+static int parser_action_row648[] = {
        2,
-       -1, 3, 626,
-       52, 0, 785
+       -1, 3, 647,
+       53, 0, 809
 };
-static int parser_action_row628[] = {
+static int parser_action_row649[] = {
        2,
-       -1, 3, 627,
-       23, 0, 786
+       -1, 3, 648,
+       23, 0, 810
 };
-static int parser_action_row629[] = {
+static int parser_action_row650[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row630[] = {
+static int parser_action_row651[] = {
        1,
-       -1, 1, 674
+       -1, 1, 690
 };
-static int parser_action_row631[] = {
+static int parser_action_row652[] = {
        2,
-       -1, 3, 630,
-       63, 0, 628
+       -1, 3, 651,
+       70, 0, 649
 };
-static int parser_action_row632[] = {
+static int parser_action_row653[] = {
        5,
-       -1, 1, 427,
-       12, 0, 654,
-       46, 0, 655,
-       81, 0, 47,
-       82, 0, 656
+       -1, 1, 440,
+       12, 0, 675,
+       46, 0, 676,
+       88, 0, 48,
+       89, 0, 677
 };
-static int parser_action_row633[] = {
+static int parser_action_row654[] = {
        2,
-       -1, 1, 413,
-       55, 0, 789
+       -1, 1, 426,
+       56, 0, 813
 };
-static int parser_action_row634[] = {
-       7,
-       -1, 1, 407,
-       53, 1, 405,
-       58, 1, 405,
-       59, 1, 405,
-       60, 1, 405,
-       61, 1, 405,
-       63, 1, 405
+static int parser_action_row655[] = {
+       8,
+       -1, 1, 418,
+       0, 1, 420,
+       1, 1, 420,
+       9, 1, 420,
+       24, 1, 420,
+       53, 1, 420,
+       56, 1, 420,
+       102, 1, 420
 };
-static int parser_action_row635[] = {
+static int parser_action_row656[] = {
        1,
-       -1, 1, 645
+       -1, 1, 660
 };
-static int parser_action_row636[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 105,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row657[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 107,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row637[] = {
+static int parser_action_row658[] = {
        1,
-       -1, 1, 644
+       -1, 1, 659
 };
-static int parser_action_row638[] = {
+static int parser_action_row659[] = {
        1,
-       -1, 1, 647
+       -1, 1, 662
 };
-static int parser_action_row639[] = {
+static int parser_action_row660[] = {
        3,
-       -1, 1, 655,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 670,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row640[] = {
+static int parser_action_row661[] = {
        3,
-       -1, 1, 658,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 673,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row641[] = {
+static int parser_action_row662[] = {
        1,
-       -1, 1, 660
+       -1, 1, 675
 };
-static int parser_action_row642[] = {
+static int parser_action_row663[] = {
        4,
-       -1, 1, 662,
-       66, 0, 281,
-       68, 0, 282,
-       69, 0, 283
+       -1, 1, 677,
+       73, 0, 293,
+       75, 0, 294,
+       76, 0, 295
 };
-static int parser_action_row643[] = {
+static int parser_action_row664[] = {
        4,
-       -1, 1, 663,
-       66, 0, 281,
-       68, 0, 282,
-       69, 0, 283
+       -1, 1, 678,
+       73, 0, 293,
+       75, 0, 294,
+       76, 0, 295
 };
-static int parser_action_row644[] = {
+static int parser_action_row665[] = {
        3,
-       -1, 1, 651,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 666,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row645[] = {
+static int parser_action_row666[] = {
        3,
-       -1, 1, 652,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 667,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row646[] = {
+static int parser_action_row667[] = {
        3,
-       -1, 1, 653,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 668,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row647[] = {
+static int parser_action_row668[] = {
        3,
-       -1, 1, 654,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 669,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row648[] = {
+static int parser_action_row669[] = {
        3,
-       -1, 1, 656,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 671,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row649[] = {
+static int parser_action_row670[] = {
        3,
-       -1, 1, 657,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 672,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row650[] = {
+static int parser_action_row671[] = {
        3,
-       -1, 1, 659,
-       64, 0, 272,
-       65, 0, 273
+       -1, 1, 674,
+       71, 0, 284,
+       72, 0, 285
 };
-static int parser_action_row651[] = {
+static int parser_action_row672[] = {
        1,
-       -1, 1, 665
+       -1, 1, 680
 };
-static int parser_action_row652[] = {
+static int parser_action_row673[] = {
        1,
-       -1, 1, 666
+       -1, 1, 681
 };
-static int parser_action_row653[] = {
+static int parser_action_row674[] = {
        1,
-       -1, 1, 667
+       -1, 1, 682
 };
-static int parser_action_row654[] = {
+static int parser_action_row675[] = {
        1,
-       -1, 1, 669
+       -1, 1, 684
 };
-static int parser_action_row655[] = {
+static int parser_action_row676[] = {
        2,
-       -1, 1, 700,
-       51, 0, 242
+       -1, 1, 716,
+       52, 0, 253
 };
-static int parser_action_row656[] = {
+static int parser_action_row677[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row657[] = {
+static int parser_action_row678[] = {
        3,
-       -1, 1, 682,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 698,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row658[] = {
+static int parser_action_row679[] = {
        2,
-       -1, 3, 657,
-       83, 0, 796
+       -1, 3, 678,
+       90, 0, 820
 };
-static int parser_action_row659[] = {
+static int parser_action_row680[] = {
        2,
-       -1, 1, 424,
-       82, 0, 797
+       -1, 1, 437,
+       89, 0, 821
 };
-static int parser_action_row660[] = {
+static int parser_action_row681[] = {
        3,
-       -1, 1, 426,
-       81, 0, 47,
-       82, 0, 798
+       -1, 1, 439,
+       88, 0, 48,
+       89, 0, 822
 };
-static int parser_action_row661[] = {
+static int parser_action_row682[] = {
        1,
-       -1, 1, 693
+       -1, 1, 709
 };
-static int parser_action_row662[] = {
+static int parser_action_row683[] = {
        1,
        -1, 1, 158
 };
-static int parser_action_row663[] = {
-       30,
-       -1, 1, 427,
-       9, 0, 800,
+static int parser_action_row684[] = {
+       31,
+       -1, 1, 440,
+       9, 0, 824,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -7989,93 +8407,96 @@ static int parser_action_row663[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row664[] = {
+static int parser_action_row685[] = {
        1,
        -1, 1, 148
 };
-static int parser_action_row665[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row686[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row666[] = {
+static int parser_action_row687[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row667[] = {
-       33,
-       -1, 1, 427,
+static int parser_action_row688[] = {
+       34,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 803,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 827,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       24, 0, 807,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       24, 0, 831,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row668[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row689[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 140,
+       9, 0, 143,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -8095,1146 +8516,1240 @@ static int parser_action_row668[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row669[] = {
+static int parser_action_row690[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       55, 0, 495
+       56, 0, 512
 };
-static int parser_action_row670[] = {
+static int parser_action_row691[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row671[] = {
+static int parser_action_row692[] = {
        2,
-       -1, 3, 670,
-       82, 0, 838
+       -1, 3, 691,
+       89, 0, 864
 };
-static int parser_action_row672[] = {
+static int parser_action_row693[] = {
        2,
-       -1, 3, 671,
-       23, 0, 839
+       -1, 3, 692,
+       23, 0, 865
 };
-static int parser_action_row673[] = {
+static int parser_action_row694[] = {
        1,
-       -1, 1, 293
+       -1, 1, 306
 };
-static int parser_action_row674[] = {
+static int parser_action_row695[] = {
        5,
-       -1, 1, 427,
-       12, 0, 694,
-       46, 0, 599,
-       81, 0, 47,
-       82, 0, 695
+       -1, 1, 440,
+       12, 0, 715,
+       46, 0, 620,
+       88, 0, 48,
+       89, 0, 716
 };
-static int parser_action_row675[] = {
+static int parser_action_row696[] = {
        1,
-       -1, 1, 264
+       -1, 1, 276
 };
-static int parser_action_row676[] = {
-       21,
-       -1, 1, 427,
-       12, 0, 153,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row697[] = {
+       22,
+       -1, 1, 440,
+       12, 0, 156,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row677[] = {
+static int parser_action_row698[] = {
        1,
-       -1, 1, 263
+       -1, 1, 275
 };
-static int parser_action_row678[] = {
+static int parser_action_row699[] = {
        1,
-       -1, 1, 266
+       -1, 1, 278
 };
-static int parser_action_row679[] = {
+static int parser_action_row700[] = {
        3,
-       -1, 1, 274,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 286,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row680[] = {
+static int parser_action_row701[] = {
        3,
-       -1, 1, 277,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 289,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row681[] = {
+static int parser_action_row702[] = {
        1,
-       -1, 1, 279
+       -1, 1, 291
 };
-static int parser_action_row682[] = {
+static int parser_action_row703[] = {
        4,
-       -1, 1, 281,
-       66, 0, 328,
-       68, 0, 329,
-       69, 0, 330
+       -1, 1, 293,
+       73, 0, 341,
+       75, 0, 342,
+       76, 0, 343
 };
-static int parser_action_row683[] = {
+static int parser_action_row704[] = {
        4,
-       -1, 1, 282,
-       66, 0, 328,
-       68, 0, 329,
-       69, 0, 330
+       -1, 1, 294,
+       73, 0, 341,
+       75, 0, 342,
+       76, 0, 343
 };
-static int parser_action_row684[] = {
+static int parser_action_row705[] = {
        3,
-       -1, 1, 270,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 282,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row685[] = {
+static int parser_action_row706[] = {
        3,
-       -1, 1, 271,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 283,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row686[] = {
+static int parser_action_row707[] = {
        3,
-       -1, 1, 272,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 284,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row687[] = {
+static int parser_action_row708[] = {
        3,
-       -1, 1, 273,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 285,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row688[] = {
+static int parser_action_row709[] = {
        3,
-       -1, 1, 275,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 287,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row689[] = {
+static int parser_action_row710[] = {
        3,
-       -1, 1, 276,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 288,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row690[] = {
+static int parser_action_row711[] = {
        3,
-       -1, 1, 278,
-       64, 0, 319,
-       65, 0, 320
+       -1, 1, 290,
+       71, 0, 332,
+       72, 0, 333
 };
-static int parser_action_row691[] = {
+static int parser_action_row712[] = {
        1,
-       -1, 1, 284
+       -1, 1, 296
 };
-static int parser_action_row692[] = {
+static int parser_action_row713[] = {
        1,
-       -1, 1, 285
+       -1, 1, 297
 };
-static int parser_action_row693[] = {
+static int parser_action_row714[] = {
        1,
-       -1, 1, 286
+       -1, 1, 298
 };
-static int parser_action_row694[] = {
+static int parser_action_row715[] = {
        1,
-       -1, 1, 288
+       -1, 1, 300
 };
-static int parser_action_row695[] = {
+static int parser_action_row716[] = {
        2,
-       -1, 1, 319,
-       51, 0, 242
+       -1, 1, 332,
+       52, 0, 253
 };
-static int parser_action_row696[] = {
+static int parser_action_row717[] = {
        3,
-       -1, 1, 301,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 314,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row697[] = {
+static int parser_action_row718[] = {
        2,
-       -1, 3, 696,
-       83, 0, 843
+       -1, 3, 717,
+       90, 0, 869
 };
-static int parser_action_row698[] = {
+static int parser_action_row719[] = {
        2,
-       -1, 1, 424,
-       82, 0, 844
+       -1, 1, 437,
+       89, 0, 870
 };
-static int parser_action_row699[] = {
+static int parser_action_row720[] = {
        3,
-       -1, 1, 426,
-       81, 0, 47,
-       82, 0, 845
+       -1, 1, 439,
+       88, 0, 48,
+       89, 0, 871
 };
-static int parser_action_row700[] = {
+static int parser_action_row721[] = {
        1,
-       -1, 1, 312
+       -1, 1, 325
 };
-static int parser_action_row701[] = {
+static int parser_action_row722[] = {
        1,
-       -1, 1, 256
+       -1, 1, 268
 };
-static int parser_action_row702[] = {
+static int parser_action_row723[] = {
        1,
        -1, 1, 151
 };
-static int parser_action_row703[] = {
+static int parser_action_row724[] = {
        1,
        -1, 1, 150
 };
-static int parser_action_row704[] = {
+static int parser_action_row725[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row705[] = {
+static int parser_action_row726[] = {
        1,
-       -1, 1, 567
+       -1, 1, 581
 };
-static int parser_action_row706[] = {
+static int parser_action_row727[] = {
        3,
-       -1, 3, 705,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 726,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row707[] = {
+static int parser_action_row728[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row708[] = {
+static int parser_action_row729[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row709[] = {
+static int parser_action_row730[] = {
        1,
-       -1, 1, 726
+       -1, 1, 742
 };
-static int parser_action_row710[] = {
+static int parser_action_row731[] = {
        3,
-       -1, 3, 709,
-       81, 0, 47,
-       82, 0, 852
+       -1, 3, 730,
+       88, 0, 48,
+       89, 0, 878
 };
-static int parser_action_row711[] = {
+static int parser_action_row732[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row712[] = {
+static int parser_action_row733[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row713[] = {
+static int parser_action_row734[] = {
        2,
-       -1, 1, 375,
-       55, 0, 857
+       -1, 1, 388,
+       56, 0, 883
 };
-static int parser_action_row714[] = {
+static int parser_action_row735[] = {
        1,
-       -1, 1, 404
+       -1, 1, 417
 };
-static int parser_action_row715[] = {
+static int parser_action_row736[] = {
        1,
-       -1, 1, 403
+       -1, 1, 416
 };
-static int parser_action_row716[] = {
+static int parser_action_row737[] = {
        1,
-       -1, 1, 402
+       -1, 1, 415
 };
-static int parser_action_row717[] = {
+static int parser_action_row738[] = {
        3,
-       -1, 1, 371,
-       51, 0, 860,
-       80, 0, 181
+       -1, 1, 384,
+       52, 0, 886,
+       87, 0, 185
 };
-static int parser_action_row718[] = {
+static int parser_action_row739[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row719[] = {
+static int parser_action_row740[] = {
+       2,
+       -1, 3, 739,
+       59, 0, 889
+};
+static int parser_action_row741[] = {
+       33,
+       -1, 1, 440,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 143,
+       12, 0, 25,
+       15, 0, 27,
+       16, 0, 28,
+       22, 0, 29,
+       25, 0, 30,
+       26, 0, 31,
+       27, 0, 32,
+       33, 0, 34,
+       34, 0, 35,
+       35, 0, 36,
+       36, 0, 37,
+       37, 0, 38,
+       38, 0, 39,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       50, 0, 44,
+       51, 0, 45,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row742[] = {
+       3,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row743[] = {
        1,
        -1, 1, 141
 };
-static int parser_action_row720[] = {
+static int parser_action_row744[] = {
        3,
-       -1, 3, 719,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 743,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row721[] = {
+static int parser_action_row745[] = {
        1,
-       -1, 1, 193
+       -1, 1, 194
 };
-static int parser_action_row722[] = {
+static int parser_action_row746[] = {
        2,
-       -1, 3, 721,
-       56, 0, 864
+       -1, 3, 745,
+       57, 0, 894
 };
-static int parser_action_row723[] = {
+static int parser_action_row747[] = {
        1,
-       -1, 1, 474
+       -1, 1, 487
 };
-static int parser_action_row724[] = {
+static int parser_action_row748[] = {
        21,
-       -1, 1, 427,
-       12, 0, 694,
-       46, 0, 599,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       81, 0, 47,
-       82, 0, 865
+       -1, 1, 440,
+       12, 0, 715,
+       46, 0, 620,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       88, 0, 48,
+       89, 0, 895
 };
-static int parser_action_row725[] = {
+static int parser_action_row749[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row726[] = {
-       49,
-       -1, 1, 427,
-       12, 0, 153,
+static int parser_action_row750[] = {
+       50,
+       -1, 1, 440,
+       12, 0, 156,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 154,
+       22, 0, 157,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 155,
-       33, 0, 352,
-       34, 0, 353,
-       35, 0, 354,
-       36, 0, 355,
+       31, 0, 158,
+       33, 0, 368,
+       34, 0, 369,
+       35, 0, 370,
+       36, 0, 371,
        37, 0, 38,
-       38, 0, 156,
-       40, 0, 157,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       47, 0, 349,
-       48, 0, 158,
-       50, 0, 356,
-       51, 0, 45,
-       53, 0, 357,
-       64, 0, 358,
-       65, 0, 359,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 374,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       47, 0, 365,
+       48, 0, 161,
+       50, 0, 44,
+       51, 0, 372,
+       52, 0, 46,
+       54, 0, 373,
+       71, 0, 374,
+       72, 0, 375,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 390,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row727[] = {
+static int parser_action_row751[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row728[] = {
+static int parser_action_row752[] = {
        1,
-       -1, 1, 983
+       -1, 1, 1008
 };
-static int parser_action_row729[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row753[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row730[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row754[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row731[] = {
-       5,
-       -1, 1, 313,
-       51, 0, 242,
-       58, 0, 872,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row755[] = {
+       11,
+       -1, 1, 326,
+       52, 0, 253,
+       59, 0, 902,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row732[] = {
+static int parser_action_row756[] = {
        1,
-       -1, 1, 477
+       -1, 1, 490
 };
-static int parser_action_row733[] = {
+static int parser_action_row757[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row734[] = {
+static int parser_action_row758[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row735[] = {
+static int parser_action_row759[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row736[] = {
+static int parser_action_row760[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row737[] = {
-       23,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 394,
-       27, 0, 395,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row761[] = {
+       24,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 411,
+       27, 0, 412,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row738[] = {
+static int parser_action_row762[] = {
        1,
-       -1, 1, 985
+       -1, 1, 1010
 };
-static int parser_action_row739[] = {
+static int parser_action_row763[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row740[] = {
+static int parser_action_row764[] = {
        2,
-       -1, 1, 420,
-       57, 0, 191
+       -1, 1, 433,
+       58, 0, 196
 };
-static int parser_action_row741[] = {
+static int parser_action_row765[] = {
        2,
        -1, 1, 76,
-       14, 0, 880
+       14, 0, 910
 };
-static int parser_action_row742[] = {
+static int parser_action_row766[] = {
        2,
-       -1, 3, 741,
-       82, 0, 882
+       -1, 3, 765,
+       89, 0, 912
 };
-static int parser_action_row743[] = {
+static int parser_action_row767[] = {
        3,
-       -1, 3, 742,
-       0, 0, 81,
-       1, 0, 82
+       -1, 3, 766,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row744[] = {
+static int parser_action_row768[] = {
        2,
        -1, 1, 76,
-       14, 0, 880
+       14, 0, 910
 };
-static int parser_action_row745[] = {
+static int parser_action_row769[] = {
        2,
        -1, 1, 98,
-       58, 0, 885
+       59, 0, 915
 };
-static int parser_action_row746[] = {
+static int parser_action_row770[] = {
        1,
        -1, 1, 100
 };
-static int parser_action_row747[] = {
+static int parser_action_row771[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row748[] = {
+static int parser_action_row772[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row749[] = {
+static int parser_action_row773[] = {
        4,
        -1, 1, 118,
-       4, 0, 888,
-       14, 0, 889,
-       15, 0, 890
+       4, 0, 918,
+       14, 0, 919,
+       15, 0, 920
 };
-static int parser_action_row750[] = {
+static int parser_action_row774[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row751[] = {
+static int parser_action_row775[] = {
        1,
        -1, 1, 106
 };
-static int parser_action_row752[] = {
+static int parser_action_row776[] = {
        2,
        -1, 1, 102,
-       58, 0, 745
+       59, 0, 769
 };
-static int parser_action_row753[] = {
+static int parser_action_row777[] = {
        1,
-       -1, 1, 433
+       -1, 1, 446
 };
-static int parser_action_row754[] = {
+static int parser_action_row778[] = {
        1,
-       -1, 1, 435
+       -1, 1, 448
 };
-static int parser_action_row755[] = {
+static int parser_action_row779[] = {
        18,
-       -1, 3, 754,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       82, 0, 751
+       -1, 3, 778,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       89, 0, 775
 };
-static int parser_action_row756[] = {
+static int parser_action_row780[] = {
        2,
-       -1, 1, 428,
-       57, 0, 190
+       -1, 1, 441,
+       58, 0, 195
 };
-static int parser_action_row757[] = {
+static int parser_action_row781[] = {
        2,
-       -1, 3, 756,
-       57, 0, 191
+       -1, 3, 780,
+       58, 0, 196
 };
-static int parser_action_row758[] = {
+static int parser_action_row782[] = {
        2,
        -1, 1, 37,
-       53, 0, 896
+       54, 0, 926
 };
-static int parser_action_row759[] = {
+static int parser_action_row783[] = {
        2,
-       -1, 3, 758,
-       81, 0, 898
+       -1, 3, 782,
+       88, 0, 928
 };
-static int parser_action_row760[] = {
+static int parser_action_row784[] = {
        3,
-       -1, 3, 759,
-       81, 0, 899,
-       82, 0, 756
+       -1, 3, 783,
+       88, 0, 929,
+       89, 0, 780
 };
-static int parser_action_row761[] = {
+static int parser_action_row785[] = {
        1,
-       -1, 1, 411
+       -1, 1, 424
 };
-static int parser_action_row762[] = {
+static int parser_action_row786[] = {
        1,
-       -1, 1, 318
+       -1, 1, 331
 };
-static int parser_action_row763[] = {
+static int parser_action_row787[] = {
        1,
-       -1, 1, 185
+       -1, 1, 186
 };
-static int parser_action_row764[] = {
+static int parser_action_row788[] = {
        3,
-       -1, 3, 763,
-       31, 0, 901,
-       51, 0, 902
+       -1, 3, 787,
+       31, 0, 931,
+       52, 0, 932
 };
-static int parser_action_row765[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row789[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row766[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row790[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row767[] = {
-       4,
-       -1, 1, 300,
-       58, 0, 905,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row791[] = {
+       10,
+       -1, 1, 313,
+       59, 0, 935,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row768[] = {
+static int parser_action_row792[] = {
        1,
-       -1, 1, 176
+       -1, 1, 177
 };
-static int parser_action_row769[] = {
-       4,
-       -1, 1, 298,
-       58, 0, 907,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row793[] = {
+       10,
+       -1, 1, 311,
+       59, 0, 937,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row770[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row794[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row771[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 303,
-       58, 0, 910,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 303,
-       63, 1, 303,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row795[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 316,
+       59, 0, 940,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 316,
+       70, 1, 316,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row772[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row796[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row773[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 307,
-       57, 0, 191,
-       58, 0, 915,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 307,
-       63, 1, 307,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row797[] = {
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 320,
+       58, 0, 196,
+       59, 0, 945,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 320,
+       70, 1, 320,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row774[] = {
+static int parser_action_row798[] = {
        3,
-       -1, 1, 425,
-       12, 0, 919,
-       82, 0, 920
+       -1, 1, 438,
+       12, 0, 949,
+       89, 0, 950
 };
-static int parser_action_row775[] = {
+static int parser_action_row799[] = {
        1,
-       -1, 1, 364
+       -1, 1, 377
 };
-static int parser_action_row776[] = {
+static int parser_action_row800[] = {
        1,
-       -1, 1, 409
+       -1, 1, 422
 };
-static int parser_action_row777[] = {
+static int parser_action_row801[] = {
        2,
-       -1, 3, 776,
-       52, 0, 921
+       -1, 3, 800,
+       53, 0, 951
 };
-static int parser_action_row778[] = {
+static int parser_action_row802[] = {
        1,
-       -1, 1, 212
+       -1, 1, 213
 };
-static int parser_action_row779[] = {
+static int parser_action_row803[] = {
        1,
-       -1, 1, 231
+       -1, 1, 232
 };
-static int parser_action_row780[] = {
+static int parser_action_row804[] = {
        1,
-       -1, 1, 216
+       -1, 1, 217
 };
-static int parser_action_row781[] = {
+static int parser_action_row805[] = {
        1,
-       -1, 1, 235
+       -1, 1, 236
 };
-static int parser_action_row782[] = {
+static int parser_action_row806[] = {
        1,
-       -1, 1, 215
+       -1, 1, 216
 };
-static int parser_action_row783[] = {
+static int parser_action_row807[] = {
        1,
-       -1, 1, 234
+       -1, 1, 235
 };
-static int parser_action_row784[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row808[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row785[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row809[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row786[] = {
+static int parser_action_row810[] = {
        1,
-       -1, 1, 405
+       -1, 1, 418
 };
-static int parser_action_row787[] = {
+static int parser_action_row811[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row788[] = {
+static int parser_action_row812[] = {
        3,
-       -1, 3, 787,
-       81, 0, 47,
-       82, 0, 925
+       -1, 3, 811,
+       88, 0, 48,
+       89, 0, 955
 };
-static int parser_action_row789[] = {
+static int parser_action_row813[] = {
        2,
-       -1, 3, 788,
-       83, 0, 928
+       -1, 3, 812,
+       90, 0, 958
 };
-static int parser_action_row790[] = {
+static int parser_action_row814[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row791[] = {
+static int parser_action_row815[] = {
        1,
-       -1, 1, 994
+       -1, 1, 1019
 };
-static int parser_action_row792[] = {
+static int parser_action_row816[] = {
        2,
-       -1, 1, 414,
-       55, 0, 789
+       -1, 1, 427,
+       56, 0, 813
 };
-static int parser_action_row793[] = {
+static int parser_action_row817[] = {
        1,
-       -1, 1, 646
+       -1, 1, 661
 };
-static int parser_action_row794[] = {
+static int parser_action_row818[] = {
        1,
-       -1, 1, 699
+       -1, 1, 715
 };
-static int parser_action_row795[] = {
+static int parser_action_row819[] = {
        3,
-       -1, 3, 794,
-       31, 0, 931,
-       51, 0, 932
+       -1, 3, 818,
+       31, 0, 961,
+       52, 0, 962
 };
-static int parser_action_row796[] = {
+static int parser_action_row820[] = {
        1,
-       -1, 1, 681
+       -1, 1, 697
 };
-static int parser_action_row797[] = {
+static int parser_action_row821[] = {
        1,
-       -1, 1, 679
+       -1, 1, 695
 };
-static int parser_action_row798[] = {
+static int parser_action_row822[] = {
        2,
-       -1, 1, 684,
-       51, 0, 242
+       -1, 1, 700,
+       52, 0, 253
 };
-static int parser_action_row799[] = {
+static int parser_action_row823[] = {
        3,
-       -1, 1, 688,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 704,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row800[] = {
+static int parser_action_row824[] = {
        2,
-       -1, 1, 425,
-       82, 0, 935
+       -1, 1, 438,
+       89, 0, 965
 };
-static int parser_action_row801[] = {
+static int parser_action_row825[] = {
        1,
        -1, 1, 159
 };
-static int parser_action_row802[] = {
+static int parser_action_row826[] = {
        1,
-       -1, 1, 198
+       -1, 1, 199
 };
-static int parser_action_row803[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row827[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row804[] = {
+static int parser_action_row828[] = {
        1,
-       -1, 1, 248
+       -1, 1, 255
 };
-static int parser_action_row805[] = {
-       26,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 321,
-       61, 1, 321,
-       63, 1, 321,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row829[] = {
+       27,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 334,
+       68, 1, 334,
+       70, 1, 334,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row806[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row830[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 938,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 968,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row807[] = {
+static int parser_action_row831[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row808[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row832[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -9254,217 +9769,234 @@ static int parser_action_row808[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row809[] = {
+static int parser_action_row833[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row810[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row834[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 938,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 968,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row811[] = {
+static int parser_action_row835[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row812[] = {
-       25,
+static int parser_action_row836[] = {
+       26,
        -1, 1, 163,
-       12, 0, 153,
-       22, 0, 154,
-       24, 1, 821,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+       12, 0, 156,
+       22, 0, 157,
+       24, 1, 838,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row813[] = {
+static int parser_action_row837[] = {
        3,
        -1, 1, 168,
-       24, 1, 826,
-       49, 0, 174
+       24, 1, 843,
+       49, 0, 178
 };
-static int parser_action_row814[] = {
+static int parser_action_row838[] = {
        3,
        -1, 1, 165,
-       24, 1, 823,
-       49, 0, 174
+       24, 1, 840,
+       49, 0, 178
 };
-static int parser_action_row815[] = {
+static int parser_action_row839[] = {
        2,
        -1, 1, 167,
-       24, 1, 825
+       24, 1, 842
 };
-static int parser_action_row816[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row840[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 177,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 181,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row817[] = {
+static int parser_action_row841[] = {
+       3,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row842[] = {
        2,
-       -1, 3, 816,
-       11, 0, 954
+       -1, 3, 841,
+       11, 0, 985
 };
-static int parser_action_row818[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 309,
-       57, 0, 191,
-       58, 0, 192,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 309,
-       63, 1, 309,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row843[] = {
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 322,
+       58, 0, 196,
+       59, 0, 197,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 322,
+       70, 1, 322,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row819[] = {
+static int parser_action_row844[] = {
        1,
-       -1, 1, 243
+       -1, 1, 250
 };
-static int parser_action_row820[] = {
+static int parser_action_row845[] = {
        2,
        -1, 1, 161,
-       24, 1, 819
+       24, 1, 836
 };
-static int parser_action_row821[] = {
+static int parser_action_row846[] = {
        2,
        -1, 1, 162,
-       24, 1, 820
+       24, 1, 837
 };
-static int parser_action_row822[] = {
+static int parser_action_row847[] = {
        1,
-       -1, 1, 245
+       -1, 1, 252
 };
-static int parser_action_row823[] = {
+static int parser_action_row848[] = {
        4,
-       -1, 3, 822,
-       53, 0, 212,
-       61, 0, 213,
-       63, 0, 956
+       -1, 3, 847,
+       54, 0, 223,
+       68, 0, 224,
+       70, 0, 987
 };
-static int parser_action_row824[] = {
+static int parser_action_row849[] = {
        3,
-       -1, 3, 823,
-       41, 0, 957,
-       83, 0, 224
+       -1, 3, 848,
+       41, 0, 988,
+       90, 0, 235
 };
-static int parser_action_row825[] = {
+static int parser_action_row850[] = {
        3,
-       -1, 1, 424,
-       12, 0, 958,
-       82, 0, 959
+       -1, 1, 437,
+       12, 0, 989,
+       89, 0, 990
 };
-static int parser_action_row826[] = {
-       31,
-       -1, 1, 427,
-       9, 0, 803,
+static int parser_action_row851[] = {
+       32,
+       -1, 1, 440,
+       9, 0, 827,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
        22, 0, 29,
-       24, 0, 807,
+       24, 0, 831,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
@@ -9480,464 +10012,520 @@ static int parser_action_row826[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row827[] = {
+static int parser_action_row852[] = {
        2,
-       -1, 3, 826,
-       24, 0, 963
+       -1, 3, 851,
+       24, 0, 994
 };
-static int parser_action_row828[] = {
+static int parser_action_row853[] = {
        1,
-       -1, 1, 828
+       -1, 1, 845
 };
-static int parser_action_row829[] = {
+static int parser_action_row854[] = {
        1,
-       -1, 1, 829
+       -1, 1, 846
 };
-static int parser_action_row830[] = {
+static int parser_action_row855[] = {
        1,
-       -1, 1, 831
+       -1, 1, 848
 };
-static int parser_action_row831[] = {
+static int parser_action_row856[] = {
        1,
-       -1, 1, 830
+       -1, 1, 847
 };
-static int parser_action_row832[] = {
+static int parser_action_row857[] = {
        1,
-       -1, 1, 832
+       -1, 1, 849
 };
-static int parser_action_row833[] = {
+static int parser_action_row858[] = {
        1,
-       -1, 1, 833
+       -1, 1, 850
 };
-static int parser_action_row834[] = {
+static int parser_action_row859[] = {
+       1,
+       -1, 1, 851
+};
+static int parser_action_row860[] = {
        4,
-       -1, 1, 426,
-       12, 0, 964,
-       81, 0, 47,
-       82, 0, 965
+       -1, 1, 439,
+       12, 0, 995,
+       88, 0, 48,
+       89, 0, 996
 };
-static int parser_action_row835[] = {
+static int parser_action_row861[] = {
        1,
-       -1, 1, 252
+       -1, 1, 259
 };
-static int parser_action_row836[] = {
+static int parser_action_row862[] = {
        2,
-       -1, 3, 835,
-       49, 0, 174
+       -1, 3, 861,
+       49, 0, 178
 };
-static int parser_action_row837[] = {
+static int parser_action_row863[] = {
        2,
-       -1, 3, 836,
-       52, 0, 968
+       -1, 3, 862,
+       53, 0, 999
 };
-static int parser_action_row838[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row864[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row839[] = {
+static int parser_action_row865[] = {
        1,
-       -1, 1, 419
+       -1, 1, 432
 };
-static int parser_action_row840[] = {
+static int parser_action_row866[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row841[] = {
+static int parser_action_row867[] = {
        2,
-       -1, 3, 840,
-       83, 0, 971
+       -1, 3, 866,
+       90, 0, 1002
 };
-static int parser_action_row842[] = {
+static int parser_action_row868[] = {
        1,
-       -1, 1, 265
+       -1, 1, 277
 };
-static int parser_action_row843[] = {
+static int parser_action_row869[] = {
        1,
-       -1, 1, 300
+       -1, 1, 313
 };
-static int parser_action_row844[] = {
+static int parser_action_row870[] = {
        1,
-       -1, 1, 298
+       -1, 1, 311
 };
-static int parser_action_row845[] = {
+static int parser_action_row871[] = {
        2,
-       -1, 1, 303,
-       51, 0, 242
+       -1, 1, 316,
+       52, 0, 253
 };
-static int parser_action_row846[] = {
+static int parser_action_row872[] = {
        3,
-       -1, 1, 307,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 320,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row847[] = {
+static int parser_action_row873[] = {
        2,
-       -1, 1, 425,
-       82, 0, 974
+       -1, 1, 438,
+       89, 0, 1005
 };
-static int parser_action_row848[] = {
+static int parser_action_row874[] = {
        3,
-       -1, 3, 847,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 873,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row849[] = {
+static int parser_action_row875[] = {
        2,
        -1, 1, 144,
-       55, 0, 976
+       56, 0, 1007
 };
-static int parser_action_row850[] = {
+static int parser_action_row876[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row851[] = {
+static int parser_action_row877[] = {
        2,
        -1, 1, 28,
        13, 0, 26
 };
-static int parser_action_row852[] = {
+static int parser_action_row878[] = {
        4,
-       -1, 3, 851,
-       6, 0, 713,
-       17, 0, 714,
-       82, 0, 715
+       -1, 3, 877,
+       6, 0, 734,
+       17, 0, 735,
+       89, 0, 736
 };
-static int parser_action_row853[] = {
+static int parser_action_row879[] = {
        3,
-       -1, 1, 324,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 337,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row854[] = {
+static int parser_action_row880[] = {
        2,
-       -1, 3, 853,
-       82, 0, 983
+       -1, 3, 879,
+       89, 0, 1014
 };
-static int parser_action_row855[] = {
+static int parser_action_row881[] = {
        3,
-       -1, 3, 854,
-       81, 0, 47,
-       82, 0, 984
+       -1, 3, 880,
+       88, 0, 48,
+       89, 0, 1015
 };
-static int parser_action_row856[] = {
+static int parser_action_row882[] = {
        4,
-       -1, 3, 855,
-       6, 0, 713,
-       17, 0, 714,
-       82, 0, 715
+       -1, 3, 881,
+       6, 0, 734,
+       17, 0, 735,
+       89, 0, 736
 };
-static int parser_action_row857[] = {
+static int parser_action_row883[] = {
        2,
-       -1, 3, 856,
-       52, 0, 987
+       -1, 3, 882,
+       53, 0, 1018
 };
-static int parser_action_row858[] = {
+static int parser_action_row884[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row859[] = {
+static int parser_action_row885[] = {
        1,
-       -1, 1, 988
+       -1, 1, 1013
 };
-static int parser_action_row860[] = {
+static int parser_action_row886[] = {
        2,
-       -1, 1, 376,
-       55, 0, 857
+       -1, 1, 389,
+       56, 0, 883
 };
-static int parser_action_row861[] = {
+static int parser_action_row887[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row862[] = {
+static int parser_action_row888[] = {
        1,
-       -1, 1, 372
+       -1, 1, 385
 };
-static int parser_action_row863[] = {
+static int parser_action_row889[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row890[] = {
        3,
-       -1, 3, 862,
-       47, 0, 349,
-       81, 0, 350
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2
 };
-static int parser_action_row864[] = {
+static int parser_action_row891[] = {
+       1,
+       -1, 1, 263
+};
+static int parser_action_row892[] = {
+       2,
+       -1, 3, 891,
+       49, 0, 178
+};
+static int parser_action_row893[] = {
+       3,
+       -1, 3, 892,
+       47, 0, 365,
+       88, 0, 366
+};
+static int parser_action_row894[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row865[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row895[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row866[] = {
-       6,
-       -1, 1, 301,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 994,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row896[] = {
+       12,
+       -1, 1, 314,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 1028,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row867[] = {
+static int parser_action_row897[] = {
        18,
-       -1, 1, 424,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 995
+       -1, 1, 437,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 1029
 };
-static int parser_action_row868[] = {
+static int parser_action_row898[] = {
        1,
-       -1, 1, 399
+       -1, 1, 412
 };
-static int parser_action_row869[] = {
+static int parser_action_row899[] = {
        19,
-       -1, 1, 426,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       81, 0, 47,
-       82, 0, 996
+       -1, 1, 439,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       88, 0, 48,
+       89, 0, 1030
 };
-static int parser_action_row870[] = {
+static int parser_action_row900[] = {
        1,
-       -1, 1, 350
+       -1, 1, 363
 };
-static int parser_action_row871[] = {
+static int parser_action_row901[] = {
        1,
-       -1, 1, 352
+       -1, 1, 365
 };
-static int parser_action_row872[] = {
+static int parser_action_row902[] = {
        1,
-       -1, 1, 349
+       -1, 1, 362
 };
-static int parser_action_row873[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row903[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row874[] = {
+static int parser_action_row904[] = {
        2,
-       -1, 3, 873,
-       23, 0, 998
+       -1, 3, 903,
+       23, 0, 1032
 };
-static int parser_action_row875[] = {
+static int parser_action_row905[] = {
        2,
-       -1, 3, 874,
-       28, 0, 999
+       -1, 3, 904,
+       28, 0, 1033
 };
-static int parser_action_row876[] = {
-       21,
-       -1, 1, 427,
-       12, 0, 1000,
-       22, 0, 1001,
-       31, 0, 1002,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row906[] = {
+       22,
+       -1, 1, 440,
+       12, 0, 1034,
+       22, 0, 1035,
+       31, 0, 1036,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row877[] = {
+static int parser_action_row907[] = {
        1,
-       -1, 1, 348
+       -1, 1, 361
 };
-static int parser_action_row878[] = {
+static int parser_action_row908[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row879[] = {
+static int parser_action_row909[] = {
        1,
-       -1, 1, 355
+       -1, 1, 368
 };
-static int parser_action_row880[] = {
+static int parser_action_row910[] = {
        2,
-       -1, 3, 879,
-       82, 0, 1034
+       -1, 3, 909,
+       89, 0, 1069
 };
-static int parser_action_row881[] = {
+static int parser_action_row911[] = {
        4,
        -1, 1, 28,
-       0, 0, 81,
-       1, 0, 82,
+       0, 0, 83,
+       1, 0, 84,
        13, 0, 26
 };
-static int parser_action_row882[] = {
+static int parser_action_row912[] = {
        3,
-       -1, 3, 881,
-       0, 0, 81,
-       1, 0, 82
+       -1, 3, 911,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row883[] = {
+static int parser_action_row913[] = {
        2,
-       -1, 1, 421,
-       57, 0, 191
+       -1, 1, 434,
+       58, 0, 196
 };
-static int parser_action_row884[] = {
+static int parser_action_row914[] = {
        1,
        -1, 1, 18
 };
-static int parser_action_row885[] = {
+static int parser_action_row915[] = {
        3,
-       -1, 3, 884,
-       0, 0, 81,
-       1, 0, 82
+       -1, 3, 914,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row886[] = {
+static int parser_action_row916[] = {
        1,
        -1, 1, 101
 };
-static int parser_action_row887[] = {
+static int parser_action_row917[] = {
        2,
        -1, 1, 109,
-       82, 0, 1041
+       89, 0, 1076
 };
-static int parser_action_row888[] = {
+static int parser_action_row918[] = {
        3,
-       -1, 3, 887,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 917,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row889[] = {
+static int parser_action_row919[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row890[] = {
+static int parser_action_row920[] = {
        4,
        -1, 1, 28,
-       0, 0, 81,
-       1, 0, 82,
+       0, 0, 83,
+       1, 0, 84,
        13, 0, 26
 };
-static int parser_action_row891[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row921[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -9957,510 +10545,541 @@ static int parser_action_row891[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row892[] = {
+static int parser_action_row922[] = {
        3,
        -1, 1, 118,
-       4, 0, 888,
-       15, 0, 1049
+       4, 0, 918,
+       15, 0, 1084
 };
-static int parser_action_row893[] = {
+static int parser_action_row923[] = {
        3,
-       -1, 3, 892,
+       -1, 3, 922,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row894[] = {
+static int parser_action_row924[] = {
        1,
-       -1, 1, 452
+       -1, 1, 465
 };
-static int parser_action_row895[] = {
+static int parser_action_row925[] = {
        1,
        -1, 1, 105
 };
-static int parser_action_row896[] = {
+static int parser_action_row926[] = {
        1,
-       -1, 1, 434
+       -1, 1, 447
 };
-static int parser_action_row897[] = {
+static int parser_action_row927[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row898[] = {
+static int parser_action_row928[] = {
        5,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row899[] = {
+static int parser_action_row929[] = {
        1,
-       -1, 1, 429
+       -1, 1, 442
 };
-static int parser_action_row900[] = {
+static int parser_action_row930[] = {
        2,
-       -1, 1, 431,
-       57, 0, 190
+       -1, 1, 444,
+       58, 0, 195
 };
-static int parser_action_row901[] = {
+static int parser_action_row931[] = {
        2,
-       -1, 3, 900,
-       81, 0, 1061
+       -1, 3, 930,
+       88, 0, 1096
 };
-static int parser_action_row902[] = {
+static int parser_action_row932[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row903[] = {
+static int parser_action_row933[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row904[] = {
+static int parser_action_row934[] = {
        1,
-       -1, 1, 203
+       -1, 1, 204
 };
-static int parser_action_row905[] = {
+static int parser_action_row935[] = {
        1,
-       -1, 1, 222
+       -1, 1, 223
 };
-static int parser_action_row906[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row936[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row907[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row937[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row908[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row938[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row909[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row939[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row910[] = {
+static int parser_action_row940[] = {
        1,
-       -1, 1, 187
+       -1, 1, 188
 };
-static int parser_action_row911[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row941[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row912[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row942[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row913[] = {
-       4,
-       -1, 1, 302,
-       58, 0, 1070,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row943[] = {
+       10,
+       -1, 1, 315,
+       59, 0, 1105,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row914[] = {
+static int parser_action_row944[] = {
        1,
-       -1, 1, 177
+       -1, 1, 178
 };
-static int parser_action_row915[] = {
+static int parser_action_row945[] = {
        1,
-       -1, 1, 189
+       -1, 1, 190
 };
-static int parser_action_row916[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row946[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row917[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row947[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row918[] = {
-       4,
-       -1, 1, 306,
-       58, 0, 1074,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row948[] = {
+       10,
+       -1, 1, 319,
+       59, 0, 1109,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row919[] = {
+static int parser_action_row949[] = {
        1,
-       -1, 1, 179
+       -1, 1, 180
 };
-static int parser_action_row920[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row950[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row921[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 305,
-       58, 0, 1077,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 305,
-       63, 1, 305,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row951[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 318,
+       59, 0, 1112,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 318,
+       70, 1, 318,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row922[] = {
+static int parser_action_row952[] = {
        1,
-       -1, 1, 407
+       -1, 1, 420
 };
-static int parser_action_row923[] = {
+static int parser_action_row953[] = {
        1,
-       -1, 1, 214
+       -1, 1, 215
 };
-static int parser_action_row924[] = {
+static int parser_action_row954[] = {
        1,
-       -1, 1, 233
+       -1, 1, 234
 };
-static int parser_action_row925[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row955[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row926[] = {
+static int parser_action_row956[] = {
        3,
-       -1, 1, 705,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 721,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row927[] = {
+static int parser_action_row957[] = {
        2,
-       -1, 3, 926,
-       82, 0, 1083
+       -1, 3, 956,
+       89, 0, 1118
 };
-static int parser_action_row928[] = {
+static int parser_action_row958[] = {
        3,
-       -1, 3, 927,
-       81, 0, 47,
-       82, 0, 1084
+       -1, 3, 957,
+       88, 0, 48,
+       89, 0, 1119
 };
-static int parser_action_row929[] = {
+static int parser_action_row959[] = {
        4,
-       -1, 1, 676,
-       53, 1, 679,
-       61, 1, 679,
-       63, 1, 679
+       -1, 1, 692,
+       54, 1, 695,
+       68, 1, 695,
+       70, 1, 695
 };
-static int parser_action_row930[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row960[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row931[] = {
+static int parser_action_row961[] = {
        1,
-       -1, 1, 995
+       -1, 1, 1020
 };
-static int parser_action_row932[] = {
+static int parser_action_row962[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row933[] = {
+static int parser_action_row963[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row934[] = {
+static int parser_action_row964[] = {
        1,
-       -1, 1, 683
+       -1, 1, 699
 };
-static int parser_action_row935[] = {
+static int parser_action_row965[] = {
        1,
-       -1, 1, 687
+       -1, 1, 703
 };
-static int parser_action_row936[] = {
+static int parser_action_row966[] = {
        2,
-       -1, 1, 686,
-       51, 0, 242
+       -1, 1, 702,
+       52, 0, 253
 };
-static int parser_action_row937[] = {
+static int parser_action_row967[] = {
        1,
-       -1, 1, 199
+       -1, 1, 200
 };
-static int parser_action_row938[] = {
+static int parser_action_row968[] = {
        2,
-       -1, 1, 186,
-       24, 1, 844
+       -1, 1, 187,
+       24, 1, 862
 };
-static int parser_action_row939[] = {
+static int parser_action_row969[] = {
        3,
        -1, 1, 152,
-       24, 1, 817,
-       49, 1, 898
+       24, 1, 834,
+       49, 1, 919
 };
-static int parser_action_row940[] = {
-       30,
-       -1, 1, 427,
-       9, 0, 1090,
+static int parser_action_row970[] = {
+       31,
+       -1, 1, 440,
+       9, 0, 1125,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -10480,269 +11099,308 @@ static int parser_action_row940[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row941[] = {
+static int parser_action_row971[] = {
        1,
-       -1, 1, 853
+       -1, 1, 871
 };
-static int parser_action_row942[] = {
+static int parser_action_row972[] = {
        1,
-       -1, 1, 818
+       -1, 1, 835
 };
-static int parser_action_row943[] = {
+static int parser_action_row973[] = {
        2,
-       -1, 3, 942,
-       49, 0, 174
+       -1, 3, 972,
+       49, 0, 178
 };
-static int parser_action_row944[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row974[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row945[] = {
+static int parser_action_row975[] = {
        1,
-       -1, 1, 247
+       -1, 1, 254
 };
-static int parser_action_row946[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row976[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row947[] = {
+static int parser_action_row977[] = {
        1,
-       -1, 1, 856
+       -1, 1, 874
 };
-static int parser_action_row948[] = {
+static int parser_action_row978[] = {
        2,
-       -1, 3, 947,
-       49, 0, 174
+       -1, 3, 977,
+       49, 0, 178
 };
-static int parser_action_row949[] = {
+static int parser_action_row979[] = {
        3,
-       -1, 3, 948,
-       51, 0, 300,
-       82, 0, 301
+       -1, 3, 978,
+       52, 0, 312,
+       89, 0, 313
 };
-static int parser_action_row950[] = {
+static int parser_action_row980[] = {
        2,
        -1, 1, 164,
-       24, 1, 822
+       24, 1, 839
 };
-static int parser_action_row951[] = {
+static int parser_action_row981[] = {
        2,
        -1, 1, 169,
-       24, 1, 827
+       24, 1, 844
 };
-static int parser_action_row952[] = {
+static int parser_action_row982[] = {
        2,
        -1, 1, 166,
-       24, 1, 824
+       24, 1, 841
 };
-static int parser_action_row953[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row983[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row954[] = {
+static int parser_action_row984[] = {
        2,
-       -1, 1, 257,
-       24, 0, 1098
+       -1, 1, 269,
+       24, 0, 1133
 };
-static int parser_action_row955[] = {
+static int parser_action_row985[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 362,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row986[] = {
        3,
-       -1, 3, 954,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 985,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row956[] = {
+static int parser_action_row987[] = {
        2,
-       -1, 1, 180,
-       24, 1, 838
+       -1, 1, 181,
+       24, 1, 856
 };
-static int parser_action_row957[] = {
+static int parser_action_row988[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row958[] = {
-       26,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 317,
-       61, 1, 317,
-       63, 1, 317,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row989[] = {
+       27,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 330,
+       68, 1, 330,
+       70, 1, 330,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row959[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row990[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row960[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 311,
-       58, 0, 436,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 311,
-       63, 1, 311,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row991[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 324,
+       59, 0, 453,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 324,
+       70, 1, 324,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row961[] = {
+static int parser_action_row992[] = {
        3,
-       -1, 3, 960,
-       9, 0, 803,
-       24, 0, 807
+       -1, 3, 991,
+       9, 0, 827,
+       24, 0, 831
 };
-static int parser_action_row962[] = {
+static int parser_action_row993[] = {
        3,
-       -1, 3, 961,
+       -1, 3, 992,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row963[] = {
+static int parser_action_row994[] = {
        1,
-       -1, 1, 246
+       -1, 1, 253
 };
-static int parser_action_row964[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row995[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -10762,688 +11420,770 @@ static int parser_action_row964[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row965[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row996[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row966[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 315,
-       57, 0, 191,
-       58, 0, 441,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 315,
-       63, 1, 315,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row997[] = {
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 328,
+       58, 0, 196,
+       59, 0, 458,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 328,
+       70, 1, 328,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row967[] = {
+static int parser_action_row998[] = {
        3,
-       -1, 1, 425,
-       12, 0, 1109,
-       82, 0, 1110
+       -1, 1, 438,
+       12, 0, 1145,
+       89, 0, 1146
 };
-static int parser_action_row968[] = {
+static int parser_action_row999[] = {
        1,
-       -1, 1, 251
+       -1, 1, 258
 };
-static int parser_action_row969[] = {
+static int parser_action_row1000[] = {
        1,
-       -1, 1, 416
+       -1, 1, 429
 };
-static int parser_action_row970[] = {
+static int parser_action_row1001[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row971[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1002[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row972[] = {
+static int parser_action_row1003[] = {
        4,
-       -1, 1, 295,
-       53, 1, 298,
-       61, 1, 298,
-       63, 1, 298
+       -1, 1, 308,
+       54, 1, 311,
+       68, 1, 311,
+       70, 1, 311
 };
-static int parser_action_row973[] = {
+static int parser_action_row1004[] = {
        1,
-       -1, 1, 302
+       -1, 1, 315
 };
-static int parser_action_row974[] = {
+static int parser_action_row1005[] = {
        1,
-       -1, 1, 306
+       -1, 1, 319
 };
-static int parser_action_row975[] = {
+static int parser_action_row1006[] = {
        2,
-       -1, 1, 305,
-       51, 0, 242
+       -1, 1, 318,
+       52, 0, 253
 };
-static int parser_action_row976[] = {
+static int parser_action_row1007[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row977[] = {
+static int parser_action_row1008[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row978[] = {
+static int parser_action_row1009[] = {
        1,
-       -1, 1, 978
+       -1, 1, 1003
 };
-static int parser_action_row979[] = {
+static int parser_action_row1010[] = {
        2,
        -1, 1, 145,
-       55, 0, 976
+       56, 0, 1007
 };
-static int parser_action_row980[] = {
+static int parser_action_row1011[] = {
        2,
-       -1, 3, 979,
-       54, 0, 1117
+       -1, 3, 1010,
+       55, 0, 1153
 };
-static int parser_action_row981[] = {
+static int parser_action_row1012[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row982[] = {
+static int parser_action_row1013[] = {
        2,
-       -1, 1, 729,
-       80, 0, 533
+       -1, 1, 745,
+       87, 0, 550
 };
-static int parser_action_row983[] = {
+static int parser_action_row1014[] = {
        1,
-       -1, 1, 323
+       -1, 1, 336
 };
-static int parser_action_row984[] = {
+static int parser_action_row1015[] = {
        2,
-       -1, 1, 326,
-       51, 0, 242
+       -1, 1, 339,
+       52, 0, 253
 };
-static int parser_action_row985[] = {
+static int parser_action_row1016[] = {
        3,
-       -1, 1, 330,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 343,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row986[] = {
+static int parser_action_row1017[] = {
        2,
-       -1, 3, 985,
-       82, 0, 1122
+       -1, 3, 1016,
+       89, 0, 1158
 };
-static int parser_action_row987[] = {
+static int parser_action_row1018[] = {
        13,
-       -1, 1, 371,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       51, 0, 1123,
-       80, 0, 181,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       -1, 1, 384,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       52, 0, 1159,
+       87, 0, 185,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row988[] = {
+static int parser_action_row1019[] = {
        1,
-       -1, 1, 369
+       -1, 1, 382
 };
-static int parser_action_row989[] = {
+static int parser_action_row1020[] = {
        2,
        -1, 1, 28,
        13, 0, 26
 };
-static int parser_action_row990[] = {
+static int parser_action_row1021[] = {
        1,
-       -1, 1, 989
+       -1, 1, 1014
 };
-static int parser_action_row991[] = {
-       49,
-       -1, 1, 427,
-       12, 0, 153,
+static int parser_action_row1022[] = {
+       50,
+       -1, 1, 440,
+       12, 0, 156,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 154,
+       22, 0, 157,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 155,
-       33, 0, 352,
-       34, 0, 353,
-       35, 0, 354,
-       36, 0, 355,
+       31, 0, 158,
+       33, 0, 368,
+       34, 0, 369,
+       35, 0, 370,
+       36, 0, 371,
        37, 0, 38,
-       38, 0, 156,
-       40, 0, 157,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       47, 0, 349,
-       48, 0, 158,
-       50, 0, 356,
-       51, 0, 45,
-       53, 0, 357,
-       64, 0, 358,
-       65, 0, 359,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 374,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       47, 0, 365,
+       48, 0, 161,
+       50, 0, 44,
+       51, 0, 372,
+       52, 0, 46,
+       54, 0, 373,
+       71, 0, 374,
+       72, 0, 375,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 390,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row992[] = {
+static int parser_action_row1023[] = {
+       1,
+       -1, 1, 264
+};
+static int parser_action_row1024[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1025[] = {
+       1,
+       -1, 1, 262
+};
+static int parser_action_row1026[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row993[] = {
+static int parser_action_row1027[] = {
        2,
-       -1, 3, 992,
-       54, 0, 1131
+       -1, 3, 1026,
+       55, 0, 1168
 };
-static int parser_action_row994[] = {
+static int parser_action_row1028[] = {
        1,
-       -1, 1, 916
+       -1, 1, 938
 };
-static int parser_action_row995[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1029[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row996[] = {
-       5,
-       -1, 1, 303,
-       51, 0, 242,
-       58, 0, 1132,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1030[] = {
+       11,
+       -1, 1, 316,
+       52, 0, 253,
+       59, 0, 1169,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row997[] = {
-       6,
-       -1, 1, 307,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 1133,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1031[] = {
+       12,
+       -1, 1, 320,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 1170,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row998[] = {
+static int parser_action_row1032[] = {
        18,
-       -1, 1, 425,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 1134
+       -1, 1, 438,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 1171
 };
-static int parser_action_row999[] = {
+static int parser_action_row1033[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1000[] = {
+static int parser_action_row1034[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1001[] = {
+static int parser_action_row1035[] = {
        2,
-       -1, 1, 542,
-       51, 0, 242
+       -1, 1, 556,
+       52, 0, 253
 };
-static int parser_action_row1002[] = {
+static int parser_action_row1036[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1003[] = {
+static int parser_action_row1037[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1004[] = {
+static int parser_action_row1038[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1005[] = {
+static int parser_action_row1039[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1006[] = {
+static int parser_action_row1040[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1007[] = {
+static int parser_action_row1041[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1008[] = {
+static int parser_action_row1042[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1009[] = {
+static int parser_action_row1043[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1010[] = {
+static int parser_action_row1044[] = {
        16,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1146,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       51, 0, 45,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1183,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       52, 0, 46,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1011[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1045[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1012[] = {
+static int parser_action_row1046[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
+};
+static int parser_action_row1047[] = {
        3,
-       -1, 1, 524,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 538,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row1013[] = {
+static int parser_action_row1048[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1014[] = {
+static int parser_action_row1049[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1015[] = {
+static int parser_action_row1050[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1016[] = {
+static int parser_action_row1051[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1017[] = {
+static int parser_action_row1052[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1018[] = {
+static int parser_action_row1053[] = {
        1,
-       -1, 1, 565
+       -1, 1, 579
 };
-static int parser_action_row1019[] = {
+static int parser_action_row1054[] = {
        1,
-       -1, 1, 564
+       -1, 1, 578
 };
-static int parser_action_row1020[] = {
+static int parser_action_row1055[] = {
        3,
-       -1, 3, 1019,
-       41, 0, 1156,
-       83, 0, 1157
+       -1, 3, 1054,
+       41, 0, 1194,
+       90, 0, 1195
 };
-static int parser_action_row1021[] = {
+static int parser_action_row1056[] = {
        2,
-       -1, 1, 424,
-       82, 0, 1158
+       -1, 1, 437,
+       89, 0, 1196
 };
-static int parser_action_row1022[] = {
+static int parser_action_row1057[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1023[] = {
+static int parser_action_row1058[] = {
        4,
-       -1, 1, 481,
-       29, 0, 1160,
-       30, 0, 1161,
-       32, 0, 1162
+       -1, 1, 494,
+       29, 0, 1198,
+       30, 0, 1199,
+       32, 0, 1200
 };
-static int parser_action_row1024[] = {
+static int parser_action_row1059[] = {
        1,
-       -1, 1, 483
+       -1, 1, 496
 };
-static int parser_action_row1025[] = {
+static int parser_action_row1060[] = {
        3,
-       -1, 1, 488,
-       74, 0, 1163,
-       77, 0, 1164
+       -1, 1, 501,
+       81, 0, 1201,
+       84, 0, 1202
 };
-static int parser_action_row1026[] = {
+static int parser_action_row1061[] = {
        11,
-       -1, 1, 490,
-       39, 0, 1165,
-       64, 0, 1166,
-       65, 0, 1167,
-       70, 0, 1168,
-       71, 0, 1169,
-       72, 0, 1170,
-       73, 0, 1171,
-       75, 0, 1172,
-       76, 0, 1173,
-       78, 0, 1174
+       -1, 1, 503,
+       39, 0, 1203,
+       71, 0, 1204,
+       72, 0, 1205,
+       77, 0, 1206,
+       78, 0, 1207,
+       79, 0, 1208,
+       80, 0, 1209,
+       82, 0, 1210,
+       83, 0, 1211,
+       85, 0, 1212
 };
-static int parser_action_row1027[] = {
+static int parser_action_row1062[] = {
        4,
-       -1, 1, 501,
-       66, 0, 1175,
-       68, 0, 1176,
-       69, 0, 1177
+       -1, 1, 514,
+       73, 0, 1213,
+       75, 0, 1214,
+       76, 0, 1215
 };
-static int parser_action_row1028[] = {
+static int parser_action_row1063[] = {
        1,
-       -1, 1, 504
+       -1, 1, 517
 };
-static int parser_action_row1029[] = {
+static int parser_action_row1064[] = {
        2,
-       -1, 1, 508,
-       67, 0, 1178
+       -1, 1, 521,
+       74, 0, 1216
 };
-static int parser_action_row1030[] = {
+static int parser_action_row1065[] = {
        1,
-       -1, 1, 510
+       -1, 1, 523
 };
-static int parser_action_row1031[] = {
+static int parser_action_row1066[] = {
        3,
-       -1, 1, 513,
-       61, 0, 1179,
-       63, 0, 1180
+       -1, 1, 527,
+       68, 0, 1217,
+       70, 0, 1218
 };
-static int parser_action_row1032[] = {
+static int parser_action_row1067[] = {
        1,
-       -1, 1, 518
+       -1, 1, 532
 };
-static int parser_action_row1033[] = {
+static int parser_action_row1068[] = {
        3,
-       -1, 1, 426,
-       81, 0, 47,
-       82, 0, 1181
+       -1, 1, 439,
+       88, 0, 48,
+       89, 0, 1219
 };
-static int parser_action_row1034[] = {
+static int parser_action_row1069[] = {
        1,
-       -1, 1, 356
+       -1, 1, 369
 };
-static int parser_action_row1035[] = {
+static int parser_action_row1070[] = {
        2,
-       -1, 1, 422,
-       57, 0, 191
+       -1, 1, 435,
+       58, 0, 196
 };
-static int parser_action_row1036[] = {
+static int parser_action_row1071[] = {
        2,
-       -1, 3, 1035,
-       82, 0, 1183
+       -1, 3, 1070,
+       89, 0, 1221
 };
-static int parser_action_row1037[] = {
+static int parser_action_row1072[] = {
        1,
        -1, 1, 74
 };
-static int parser_action_row1038[] = {
+static int parser_action_row1073[] = {
        1,
-       -1, 1, 374
+       -1, 1, 387
 };
-static int parser_action_row1039[] = {
+static int parser_action_row1074[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1040[] = {
+static int parser_action_row1075[] = {
        1,
        -1, 1, 16
 };
-static int parser_action_row1041[] = {
+static int parser_action_row1076[] = {
        1,
        -1, 1, 17
 };
-static int parser_action_row1042[] = {
+static int parser_action_row1077[] = {
        3,
-       -1, 1, 371,
-       56, 0, 747,
-       80, 0, 181
+       -1, 1, 384,
+       57, 0, 771,
+       87, 0, 185
 };
-static int parser_action_row1043[] = {
+static int parser_action_row1078[] = {
        2,
-       -1, 3, 1042,
-       52, 0, 1191
+       -1, 3, 1077,
+       53, 0, 1229
 };
-static int parser_action_row1044[] = {
+static int parser_action_row1079[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       55, 0, 1192
+       56, 0, 1230
 };
-static int parser_action_row1045[] = {
+static int parser_action_row1080[] = {
        1,
        -1, 1, 147
 };
-static int parser_action_row1046[] = {
+static int parser_action_row1081[] = {
        21,
-       -1, 3, 1045,
-       41, 0, 1196,
-       47, 0, 349,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 373,
-       82, 0, 590
+       -1, 3, 1080,
+       41, 0, 1234,
+       47, 0, 365,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 389,
+       89, 0, 611
 };
-static int parser_action_row1047[] = {
+static int parser_action_row1082[] = {
        3,
        -1, 1, 77,
-       0, 1, 455,
-       1, 1, 455
+       0, 1, 468,
+       1, 1, 468
 };
-static int parser_action_row1048[] = {
+static int parser_action_row1083[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1049[] = {
+static int parser_action_row1084[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1050[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1085[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -11463,1456 +12203,1509 @@ static int parser_action_row1050[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1051[] = {
+static int parser_action_row1086[] = {
        3,
-       -1, 3, 1050,
+       -1, 3, 1085,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row1052[] = {
+static int parser_action_row1087[] = {
        1,
-       -1, 1, 453
+       -1, 1, 466
 };
-static int parser_action_row1053[] = {
+static int parser_action_row1088[] = {
        2,
-       -1, 3, 1052,
-       81, 0, 1207
+       -1, 3, 1087,
+       88, 0, 1245
 };
-static int parser_action_row1054[] = {
+static int parser_action_row1089[] = {
        2,
        -1, 1, 73,
        9, 1, 43
 };
-static int parser_action_row1055[] = {
+static int parser_action_row1090[] = {
        2,
-       -1, 3, 1054,
-       9, 0, 1209
+       -1, 3, 1089,
+       9, 0, 1247
 };
-static int parser_action_row1056[] = {
+static int parser_action_row1091[] = {
        1,
-       -1, 1, 972
+       -1, 1, 997
 };
-static int parser_action_row1057[] = {
+static int parser_action_row1092[] = {
        3,
-       -1, 3, 1056,
-       0, 0, 81,
-       1, 0, 82
+       -1, 3, 1091,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1058[] = {
+static int parser_action_row1093[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1059[] = {
+static int parser_action_row1094[] = {
        1,
        -1, 1, 72
 };
-static int parser_action_row1060[] = {
+static int parser_action_row1095[] = {
        5,
        -1, 1, 28,
-       6, 0, 1212,
+       6, 0, 1250,
        9, 1, 44,
        13, 0, 26,
-       82, 0, 1213
+       89, 0, 1251
 };
-static int parser_action_row1061[] = {
+static int parser_action_row1096[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1062[] = {
+static int parser_action_row1097[] = {
        1,
-       -1, 1, 430
+       -1, 1, 443
 };
-static int parser_action_row1063[] = {
+static int parser_action_row1098[] = {
        2,
-       -1, 3, 1062,
-       45, 0, 1219
+       -1, 3, 1097,
+       45, 0, 1257
 };
-static int parser_action_row1064[] = {
+static int parser_action_row1099[] = {
        4,
-       -1, 3, 1063,
-       31, 0, 1220,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 1098,
+       31, 0, 1258,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row1065[] = {
+static int parser_action_row1100[] = {
        1,
-       -1, 1, 202
+       -1, 1, 203
 };
-static int parser_action_row1066[] = {
+static int parser_action_row1101[] = {
        1,
-       -1, 1, 221
+       -1, 1, 222
 };
-static int parser_action_row1067[] = {
+static int parser_action_row1102[] = {
        1,
-       -1, 1, 200
+       -1, 1, 201
 };
-static int parser_action_row1068[] = {
+static int parser_action_row1103[] = {
        1,
-       -1, 1, 219
+       -1, 1, 220
 };
-static int parser_action_row1069[] = {
+static int parser_action_row1104[] = {
        1,
-       -1, 1, 205
+       -1, 1, 206
 };
-static int parser_action_row1070[] = {
+static int parser_action_row1105[] = {
        1,
-       -1, 1, 224
+       -1, 1, 225
 };
-static int parser_action_row1071[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1106[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1072[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1107[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1073[] = {
+static int parser_action_row1108[] = {
        1,
-       -1, 1, 209
+       -1, 1, 210
 };
-static int parser_action_row1074[] = {
+static int parser_action_row1109[] = {
        1,
-       -1, 1, 228
+       -1, 1, 229
 };
-static int parser_action_row1075[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1110[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1076[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1111[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1077[] = {
+static int parser_action_row1112[] = {
        1,
-       -1, 1, 188
+       -1, 1, 189
 };
-static int parser_action_row1078[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1113[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1079[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1114[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1080[] = {
-       4,
-       -1, 1, 304,
-       58, 0, 1228,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1115[] = {
+       10,
+       -1, 1, 317,
+       59, 0, 1266,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1081[] = {
+static int parser_action_row1116[] = {
        1,
-       -1, 1, 178
+       -1, 1, 179
 };
-static int parser_action_row1082[] = {
+static int parser_action_row1117[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1083[] = {
+static int parser_action_row1118[] = {
        1,
-       -1, 1, 704
+       -1, 1, 720
 };
-static int parser_action_row1084[] = {
+static int parser_action_row1119[] = {
        2,
-       -1, 1, 707,
-       51, 0, 242
+       -1, 1, 723,
+       52, 0, 253
 };
-static int parser_action_row1085[] = {
+static int parser_action_row1120[] = {
        3,
-       -1, 1, 711,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 727,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row1086[] = {
+static int parser_action_row1121[] = {
        2,
-       -1, 3, 1085,
-       82, 0, 1233
+       -1, 3, 1120,
+       89, 0, 1271
 };
-static int parser_action_row1087[] = {
+static int parser_action_row1122[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1088[] = {
+static int parser_action_row1123[] = {
        2,
-       -1, 3, 1087,
-       45, 0, 1235
+       -1, 3, 1122,
+       45, 0, 1273
 };
-static int parser_action_row1089[] = {
+static int parser_action_row1124[] = {
        4,
-       -1, 3, 1088,
-       31, 0, 1236,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 1123,
+       31, 0, 1274,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row1090[] = {
+static int parser_action_row1125[] = {
        1,
-       -1, 1, 685
+       -1, 1, 701
 };
-static int parser_action_row1091[] = {
+static int parser_action_row1126[] = {
        3,
        -1, 1, 151,
-       24, 1, 816,
-       49, 1, 897
+       24, 1, 833,
+       49, 1, 918
 };
-static int parser_action_row1092[] = {
+static int parser_action_row1127[] = {
        3,
        -1, 1, 150,
-       24, 1, 815,
-       49, 1, 896
+       24, 1, 832,
+       49, 1, 917
 };
-static int parser_action_row1093[] = {
+static int parser_action_row1128[] = {
        2,
-       -1, 1, 240,
-       24, 1, 852
+       -1, 1, 247,
+       24, 1, 870
 };
-static int parser_action_row1094[] = {
+static int parser_action_row1129[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1095[] = {
+static int parser_action_row1130[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1096[] = {
+static int parser_action_row1131[] = {
        2,
-       -1, 1, 249,
-       24, 1, 855
+       -1, 1, 256,
+       24, 1, 873
 };
-static int parser_action_row1097[] = {
+static int parser_action_row1132[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1098[] = {
+static int parser_action_row1133[] = {
        2,
-       -1, 1, 258,
-       24, 0, 1241
+       -1, 1, 270,
+       24, 0, 1279
 };
-static int parser_action_row1099[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1134[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1242,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 1280,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1100[] = {
+static int parser_action_row1135[] = {
+       3,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1136[] = {
        2,
-       -1, 3, 1099,
-       56, 0, 1245
+       -1, 3, 1135,
+       57, 0, 1284
 };
-static int parser_action_row1101[] = {
+static int parser_action_row1137[] = {
        5,
-       -1, 1, 427,
-       12, 0, 1246,
-       46, 0, 599,
-       81, 0, 47,
-       82, 0, 1247
+       -1, 1, 440,
+       12, 0, 1285,
+       46, 0, 620,
+       88, 0, 48,
+       89, 0, 1286
 };
-static int parser_action_row1102[] = {
+static int parser_action_row1138[] = {
        2,
-       -1, 1, 184,
-       24, 1, 842
+       -1, 1, 185,
+       24, 1, 860
 };
-static int parser_action_row1103[] = {
+static int parser_action_row1139[] = {
        2,
-       -1, 1, 190,
-       24, 1, 848
+       -1, 1, 191,
+       24, 1, 866
 };
-static int parser_action_row1104[] = {
+static int parser_action_row1140[] = {
        2,
-       -1, 1, 181,
-       24, 1, 839
+       -1, 1, 182,
+       24, 1, 857
 };
-static int parser_action_row1105[] = {
+static int parser_action_row1141[] = {
        1,
-       -1, 1, 244
+       -1, 1, 251
 };
-static int parser_action_row1106[] = {
+static int parser_action_row1142[] = {
        3,
-       -1, 3, 1105,
+       -1, 3, 1141,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1107[] = {
+static int parser_action_row1143[] = {
        1,
-       -1, 1, 242
+       -1, 1, 249
 };
-static int parser_action_row1108[] = {
+static int parser_action_row1144[] = {
        2,
-       -1, 1, 192,
-       24, 1, 850
+       -1, 1, 193,
+       24, 1, 868
 };
-static int parser_action_row1109[] = {
+static int parser_action_row1145[] = {
        2,
-       -1, 1, 183,
-       24, 1, 841
+       -1, 1, 184,
+       24, 1, 859
 };
-static int parser_action_row1110[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1146[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1111[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 313,
-       58, 0, 621,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 313,
-       63, 1, 313,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1147[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 326,
+       59, 0, 642,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 326,
+       70, 1, 326,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1112[] = {
+static int parser_action_row1148[] = {
        2,
-       -1, 3, 1111,
-       15, 0, 1252
+       -1, 3, 1147,
+       15, 0, 1291
 };
-static int parser_action_row1113[] = {
+static int parser_action_row1149[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1114[] = {
+static int parser_action_row1150[] = {
        1,
-       -1, 1, 304
+       -1, 1, 317
 };
-static int parser_action_row1115[] = {
+static int parser_action_row1151[] = {
        2,
-       -1, 3, 1114,
-       54, 0, 1254
+       -1, 3, 1150,
+       55, 0, 1293
 };
-static int parser_action_row1116[] = {
+static int parser_action_row1152[] = {
        3,
-       -1, 3, 1115,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 1151,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row1117[] = {
+static int parser_action_row1153[] = {
        1,
-       -1, 1, 979
+       -1, 1, 1004
 };
-static int parser_action_row1118[] = {
+static int parser_action_row1154[] = {
        2,
-       -1, 1, 729,
-       80, 0, 533
+       -1, 1, 745,
+       87, 0, 550
 };
-static int parser_action_row1119[] = {
+static int parser_action_row1155[] = {
        2,
-       -1, 3, 1118,
-       52, 0, 1257
+       -1, 3, 1154,
+       53, 0, 1296
 };
-static int parser_action_row1120[] = {
+static int parser_action_row1156[] = {
        1,
-       -1, 1, 730
+       -1, 1, 746
 };
-static int parser_action_row1121[] = {
+static int parser_action_row1157[] = {
        1,
-       -1, 1, 325
+       -1, 1, 338
 };
-static int parser_action_row1122[] = {
+static int parser_action_row1158[] = {
        1,
-       -1, 1, 329
+       -1, 1, 342
 };
-static int parser_action_row1123[] = {
+static int parser_action_row1159[] = {
        2,
-       -1, 1, 328,
-       51, 0, 242
+       -1, 1, 341,
+       52, 0, 253
 };
-static int parser_action_row1124[] = {
+static int parser_action_row1160[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1125[] = {
+static int parser_action_row1161[] = {
        1,
-       -1, 1, 377
+       -1, 1, 390
 };
-static int parser_action_row1126[] = {
+static int parser_action_row1162[] = {
        1,
-       -1, 1, 379
+       -1, 1, 392
 };
-static int parser_action_row1127[] = {
+static int parser_action_row1163[] = {
        1,
-       -1, 1, 380
+       -1, 1, 393
 };
-static int parser_action_row1128[] = {
+static int parser_action_row1164[] = {
        1,
-       -1, 1, 381
+       -1, 1, 394
 };
-static int parser_action_row1129[] = {
+static int parser_action_row1165[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1130[] = {
+static int parser_action_row1166[] = {
        2,
-       -1, 1, 393,
-       55, 0, 1261
+       -1, 1, 406,
+       56, 0, 1300
 };
-static int parser_action_row1131[] = {
+static int parser_action_row1167[] = {
+       1,
+       -1, 1, 265
+};
+static int parser_action_row1168[] = {
        2,
-       -1, 3, 1130,
-       54, 0, 1264
+       -1, 3, 1167,
+       55, 0, 1303
 };
-static int parser_action_row1132[] = {
+static int parser_action_row1169[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1133[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1170[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1134[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1171[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1135[] = {
-       5,
-       -1, 1, 305,
-       51, 0, 242,
-       58, 0, 1266,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1172[] = {
+       11,
+       -1, 1, 318,
+       52, 0, 253,
+       59, 0, 1305,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1136[] = {
-       23,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 394,
-       27, 0, 395,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1173[] = {
+       24,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 411,
+       27, 0, 412,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1137[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1174[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1138[] = {
+static int parser_action_row1175[] = {
        1,
-       -1, 1, 540
+       -1, 1, 554
 };
-static int parser_action_row1139[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1176[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1140[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 1000,
-       31, 0, 1002,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1177[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 1034,
+       31, 0, 1036,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1141[] = {
+static int parser_action_row1178[] = {
        3,
-       -1, 3, 1140,
-       47, 0, 1272,
-       81, 0, 1273
+       -1, 3, 1177,
+       47, 0, 1311,
+       88, 0, 1312
 };
-static int parser_action_row1142[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1179[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1143[] = {
+static int parser_action_row1180[] = {
        1,
-       -1, 1, 555
+       -1, 1, 569
 };
-static int parser_action_row1144[] = {
+static int parser_action_row1181[] = {
        1,
-       -1, 1, 556
+       -1, 1, 570
 };
-static int parser_action_row1145[] = {
+static int parser_action_row1182[] = {
        1,
-       -1, 1, 557
+       -1, 1, 571
 };
-static int parser_action_row1146[] = {
+static int parser_action_row1183[] = {
        1,
-       -1, 1, 558
+       -1, 1, 572
 };
-static int parser_action_row1147[] = {
+static int parser_action_row1184[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1148[] = {
+static int parser_action_row1185[] = {
        3,
-       -1, 3, 1147,
-       41, 0, 1156,
-       83, 0, 1277
+       -1, 3, 1184,
+       41, 0, 1194,
+       90, 0, 1316
 };
-static int parser_action_row1149[] = {
+static int parser_action_row1186[] = {
        3,
-       -1, 3, 1148,
-       61, 0, 1179,
-       63, 0, 1278
+       -1, 3, 1185,
+       68, 0, 1217,
+       70, 0, 1317
 };
-static int parser_action_row1150[] = {
+static int parser_action_row1187[] = {
        1,
-       -1, 1, 511
+       -1, 1, 525
 };
-static int parser_action_row1151[] = {
+static int parser_action_row1188[] = {
        1,
-       -1, 1, 522
+       -1, 1, 524
 };
-static int parser_action_row1152[] = {
+static int parser_action_row1189[] = {
        1,
-       -1, 1, 559
+       -1, 1, 536
 };
-static int parser_action_row1153[] = {
+static int parser_action_row1190[] = {
        1,
-       -1, 1, 560
+       -1, 1, 573
 };
-static int parser_action_row1154[] = {
+static int parser_action_row1191[] = {
        1,
-       -1, 1, 561
+       -1, 1, 574
 };
-static int parser_action_row1155[] = {
+static int parser_action_row1192[] = {
        1,
-       -1, 1, 563
+       -1, 1, 575
 };
-static int parser_action_row1156[] = {
+static int parser_action_row1193[] = {
        1,
-       -1, 1, 562
+       -1, 1, 577
 };
-static int parser_action_row1157[] = {
+static int parser_action_row1194[] = {
+       1,
+       -1, 1, 576
+};
+static int parser_action_row1195[] = {
        2,
-       -1, 1, 538,
-       51, 0, 242
+       -1, 1, 552,
+       52, 0, 253
 };
-static int parser_action_row1158[] = {
+static int parser_action_row1196[] = {
        1,
-       -1, 1, 520
+       -1, 1, 534
 };
-static int parser_action_row1159[] = {
+static int parser_action_row1197[] = {
        2,
-       -1, 1, 528,
-       51, 0, 242
+       -1, 1, 542,
+       52, 0, 253
 };
-static int parser_action_row1160[] = {
+static int parser_action_row1198[] = {
        3,
-       -1, 3, 1159,
-       53, 0, 1281,
-       54, 0, 1282
+       -1, 3, 1197,
+       54, 0, 1320,
+       55, 0, 1321
 };
-static int parser_action_row1161[] = {
+static int parser_action_row1199[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1162[] = {
+static int parser_action_row1200[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       24, 0, 1284
+       24, 0, 1323
 };
-static int parser_action_row1163[] = {
+static int parser_action_row1201[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1164[] = {
+static int parser_action_row1202[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1165[] = {
+static int parser_action_row1203[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1166[] = {
+static int parser_action_row1204[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1167[] = {
+static int parser_action_row1205[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1168[] = {
+static int parser_action_row1206[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1169[] = {
+static int parser_action_row1207[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1170[] = {
+static int parser_action_row1208[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1171[] = {
+static int parser_action_row1209[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1172[] = {
+static int parser_action_row1210[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1173[] = {
+static int parser_action_row1211[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1174[] = {
+static int parser_action_row1212[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1175[] = {
+static int parser_action_row1213[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1176[] = {
+static int parser_action_row1214[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1177[] = {
+static int parser_action_row1215[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1178[] = {
+static int parser_action_row1216[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1179[] = {
+static int parser_action_row1217[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1180[] = {
+static int parser_action_row1218[] = {
        1,
-       -1, 1, 554
+       -1, 1, 568
 };
-static int parser_action_row1181[] = {
+static int parser_action_row1219[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1182[] = {
+static int parser_action_row1220[] = {
        3,
-       -1, 1, 536,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 550,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row1183[] = {
+static int parser_action_row1221[] = {
        2,
-       -1, 1, 425,
-       82, 0, 1305
+       -1, 1, 438,
+       89, 0, 1344
 };
-static int parser_action_row1184[] = {
+static int parser_action_row1222[] = {
        2,
-       -1, 1, 423,
-       57, 0, 191
+       -1, 1, 436,
+       58, 0, 196
 };
-static int parser_action_row1185[] = {
+static int parser_action_row1223[] = {
        2,
-       -1, 3, 1184,
-       9, 0, 1306
+       -1, 3, 1222,
+       9, 0, 1345
 };
-static int parser_action_row1186[] = {
+static int parser_action_row1224[] = {
        1,
-       -1, 1, 990
+       -1, 1, 1015
 };
-static int parser_action_row1187[] = {
+static int parser_action_row1225[] = {
        2,
        -1, 1, 28,
        13, 0, 26
 };
-static int parser_action_row1188[] = {
+static int parser_action_row1226[] = {
        8,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       4, 1, 382,
-       9, 1, 382,
-       15, 1, 382,
-       28, 1, 382,
-       94, 1, 382
+       4, 1, 395,
+       9, 1, 395,
+       15, 1, 395,
+       28, 1, 395,
+       101, 1, 395
 };
-static int parser_action_row1189[] = {
+static int parser_action_row1227[] = {
        2,
        -1, 1, 112,
-       61, 0, 1309
+       68, 0, 1348
 };
-static int parser_action_row1190[] = {
+static int parser_action_row1228[] = {
        2,
-       -1, 1, 370,
-       56, 0, 747
+       -1, 1, 383,
+       57, 0, 771
 };
-static int parser_action_row1191[] = {
+static int parser_action_row1229[] = {
        1,
        -1, 1, 111
 };
-static int parser_action_row1192[] = {
+static int parser_action_row1230[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       56, 0, 747
+       57, 0, 771
 };
-static int parser_action_row1193[] = {
+static int parser_action_row1231[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1194[] = {
+static int parser_action_row1232[] = {
        1,
-       -1, 1, 974
+       -1, 1, 999
 };
-static int parser_action_row1195[] = {
+static int parser_action_row1233[] = {
        1,
        -1, 1, 107
 };
-static int parser_action_row1196[] = {
+static int parser_action_row1234[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       55, 0, 1192
+       56, 0, 1230
 };
-static int parser_action_row1197[] = {
+static int parser_action_row1235[] = {
        1,
        -1, 1, 122
 };
-static int parser_action_row1198[] = {
+static int parser_action_row1236[] = {
        2,
        -1, 1, 116,
-       55, 0, 1316
+       56, 0, 1355
 };
-static int parser_action_row1199[] = {
+static int parser_action_row1237[] = {
        1,
        -1, 1, 120
 };
-static int parser_action_row1200[] = {
+static int parser_action_row1238[] = {
        1,
        -1, 1, 121
 };
-static int parser_action_row1201[] = {
+static int parser_action_row1239[] = {
        2,
        -1, 1, 125,
-       63, 0, 1319
+       70, 0, 1358
 };
-static int parser_action_row1202[] = {
+static int parser_action_row1240[] = {
        1,
        -1, 1, 123
 };
-static int parser_action_row1203[] = {
+static int parser_action_row1241[] = {
        2,
        -1, 1, 78,
-       9, 0, 1320
+       9, 0, 1359
 };
-static int parser_action_row1204[] = {
+static int parser_action_row1242[] = {
        1,
-       -1, 1, 439
+       -1, 1, 452
 };
-static int parser_action_row1205[] = {
+static int parser_action_row1243[] = {
        1,
-       -1, 1, 450
+       -1, 1, 463
 };
-static int parser_action_row1206[] = {
+static int parser_action_row1244[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1207[] = {
+static int parser_action_row1245[] = {
        1,
-       -1, 1, 454
+       -1, 1, 467
 };
-static int parser_action_row1208[] = {
+static int parser_action_row1246[] = {
        3,
        -1, 1, 149,
-       56, 0, 294,
-       80, 0, 181
+       57, 0, 306,
+       87, 0, 185
 };
-static int parser_action_row1209[] = {
+static int parser_action_row1247[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       55, 0, 1324
+       56, 0, 1363
 };
-static int parser_action_row1210[] = {
+static int parser_action_row1248[] = {
        1,
        -1, 1, 26
 };
-static int parser_action_row1211[] = {
+static int parser_action_row1249[] = {
        1,
        -1, 1, 45
 };
-static int parser_action_row1212[] = {
+static int parser_action_row1250[] = {
        2,
-       -1, 3, 1211,
-       9, 0, 1328
+       -1, 3, 1249,
+       9, 0, 1367
 };
-static int parser_action_row1213[] = {
+static int parser_action_row1251[] = {
        1,
-       -1, 1, 963
+       -1, 1, 988
 };
-static int parser_action_row1214[] = {
+static int parser_action_row1252[] = {
        1,
-       -1, 1, 962
+       -1, 1, 987
 };
-static int parser_action_row1215[] = {
+static int parser_action_row1253[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row1216[] = {
-       51,
-       -1, 1, 388,
-       12, 0, 105,
+static int parser_action_row1254[] = {
+       52,
+       -1, 1, 401,
+       12, 0, 107,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 106,
+       22, 0, 108,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 107,
-       33, 0, 1330,
-       34, 0, 1331,
-       35, 0, 1332,
-       36, 0, 1333,
+       31, 0, 109,
+       33, 0, 1369,
+       34, 0, 1370,
+       35, 0, 1371,
+       36, 0, 1372,
        37, 0, 38,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       47, 0, 349,
-       48, 0, 114,
-       50, 0, 1334,
-       51, 0, 1335,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 1336,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 1337,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       47, 0, 365,
+       48, 0, 116,
+       50, 0, 44,
+       51, 0, 1373,
+       52, 0, 1374,
+       54, 0, 575,
+       71, 0, 1375,
+       72, 0, 1376,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 1377,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1217[] = {
+static int parser_action_row1255[] = {
        1,
        -1, 1, 73
 };
-static int parser_action_row1218[] = {
+static int parser_action_row1256[] = {
        1,
-       -1, 1, 973
+       -1, 1, 998
 };
-static int parser_action_row1219[] = {
+static int parser_action_row1257[] = {
        5,
        -1, 1, 28,
-       6, 0, 1212,
+       6, 0, 1250,
        9, 1, 42,
        13, 0, 26,
-       82, 0, 1213
+       89, 0, 1251
 };
-static int parser_action_row1220[] = {
+static int parser_action_row1258[] = {
        1,
-       -1, 1, 333
+       -1, 1, 346
 };
-static int parser_action_row1221[] = {
+static int parser_action_row1259[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1222[] = {
+static int parser_action_row1260[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1223[] = {
+static int parser_action_row1261[] = {
        1,
-       -1, 1, 204
+       -1, 1, 205
 };
-static int parser_action_row1224[] = {
+static int parser_action_row1262[] = {
        1,
-       -1, 1, 223
+       -1, 1, 224
 };
-static int parser_action_row1225[] = {
+static int parser_action_row1263[] = {
        1,
-       -1, 1, 208
+       -1, 1, 209
 };
-static int parser_action_row1226[] = {
+static int parser_action_row1264[] = {
        1,
-       -1, 1, 227
+       -1, 1, 228
 };
-static int parser_action_row1227[] = {
+static int parser_action_row1265[] = {
        1,
-       -1, 1, 207
+       -1, 1, 208
 };
-static int parser_action_row1228[] = {
+static int parser_action_row1266[] = {
        1,
-       -1, 1, 226
+       -1, 1, 227
 };
-static int parser_action_row1229[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1267[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1230[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1268[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1231[] = {
+static int parser_action_row1269[] = {
        2,
-       -1, 3, 1230,
-       24, 0, 1360
+       -1, 3, 1268,
+       24, 0, 1401
 };
-static int parser_action_row1232[] = {
+static int parser_action_row1270[] = {
        1,
-       -1, 1, 706
+       -1, 1, 722
 };
-static int parser_action_row1233[] = {
+static int parser_action_row1271[] = {
        1,
-       -1, 1, 710
+       -1, 1, 726
 };
-static int parser_action_row1234[] = {
+static int parser_action_row1272[] = {
        2,
-       -1, 1, 709,
-       51, 0, 242
+       -1, 1, 725,
+       52, 0, 253
 };
-static int parser_action_row1235[] = {
+static int parser_action_row1273[] = {
        1,
-       -1, 1, 415
+       -1, 1, 428
 };
-static int parser_action_row1236[] = {
+static int parser_action_row1274[] = {
        1,
-       -1, 1, 714
+       -1, 1, 730
 };
-static int parser_action_row1237[] = {
+static int parser_action_row1275[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1238[] = {
+static int parser_action_row1276[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1239[] = {
+static int parser_action_row1277[] = {
        2,
-       -1, 3, 1238,
-       23, 0, 1364
+       -1, 3, 1276,
+       23, 0, 1405
 };
-static int parser_action_row1240[] = {
+static int parser_action_row1278[] = {
        2,
-       -1, 3, 1239,
-       15, 0, 1365
+       -1, 3, 1277,
+       15, 0, 1406
 };
-static int parser_action_row1241[] = {
+static int parser_action_row1279[] = {
        2,
-       -1, 3, 1240,
-       28, 0, 1366
+       -1, 3, 1278,
+       28, 0, 1407
 };
-static int parser_action_row1242[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1280[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1242,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 1280,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1243[] = {
+static int parser_action_row1281[] = {
        2,
        -1, 1, 152,
-       24, 1, 817
+       24, 1, 834
 };
-static int parser_action_row1244[] = {
-       30,
-       -1, 1, 427,
-       9, 0, 1368,
+static int parser_action_row1282[] = {
+       31,
+       -1, 1, 440,
+       9, 0, 1409,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -12932,136 +13725,151 @@ static int parser_action_row1244[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1245[] = {
+static int parser_action_row1283[] = {
        1,
-       -1, 1, 861
+       -1, 1, 881
 };
-static int parser_action_row1246[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1284[] = {
+       2,
+       -1, 3, 1283,
+       15, 0, 1411
+};
+static int parser_action_row1285[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1247[] = {
-       26,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 319,
-       61, 1, 319,
-       63, 1, 319,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1286[] = {
+       27,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 332,
+       68, 1, 332,
+       70, 1, 332,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1248[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 301,
-       57, 0, 191,
-       58, 0, 764,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 301,
-       63, 1, 301,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1287[] = {
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 314,
+       58, 0, 196,
+       59, 0, 788,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 314,
+       70, 1, 314,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1249[] = {
+static int parser_action_row1288[] = {
        3,
-       -1, 1, 424,
-       12, 0, 1373,
-       82, 0, 1374
+       -1, 1, 437,
+       12, 0, 1415,
+       89, 0, 1416
 };
-static int parser_action_row1250[] = {
+static int parser_action_row1289[] = {
        4,
-       -1, 1, 426,
-       12, 0, 1375,
-       81, 0, 47,
-       82, 0, 1376
+       -1, 1, 439,
+       12, 0, 1417,
+       88, 0, 48,
+       89, 0, 1418
 };
-static int parser_action_row1251[] = {
+static int parser_action_row1290[] = {
        2,
-       -1, 1, 191,
-       24, 1, 849
+       -1, 1, 192,
+       24, 1, 867
 };
-static int parser_action_row1252[] = {
+static int parser_action_row1291[] = {
        2,
-       -1, 1, 182,
-       24, 1, 840
+       -1, 1, 183,
+       24, 1, 858
 };
-static int parser_action_row1253[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1292[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 140,
+       9, 0, 143,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -13081,2910 +13889,3115 @@ static int parser_action_row1253[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1254[] = {
+static int parser_action_row1293[] = {
        2,
-       -1, 3, 1253,
-       24, 0, 1380
+       -1, 3, 1292,
+       24, 0, 1422
 };
-static int parser_action_row1255[] = {
+static int parser_action_row1294[] = {
        2,
-       -1, 1, 729,
-       80, 0, 533
+       -1, 1, 745,
+       87, 0, 550
 };
-static int parser_action_row1256[] = {
+static int parser_action_row1295[] = {
        1,
        -1, 1, 146
 };
-static int parser_action_row1257[] = {
+static int parser_action_row1296[] = {
        1,
-       -1, 1, 568
+       -1, 1, 582
 };
-static int parser_action_row1258[] = {
+static int parser_action_row1297[] = {
        1,
-       -1, 1, 727
+       -1, 1, 743
 };
-static int parser_action_row1259[] = {
+static int parser_action_row1298[] = {
        1,
-       -1, 1, 327
+       -1, 1, 340
 };
-static int parser_action_row1260[] = {
-       49,
-       -1, 1, 427,
-       12, 0, 153,
+static int parser_action_row1299[] = {
+       50,
+       -1, 1, 440,
+       12, 0, 156,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 154,
+       22, 0, 157,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 155,
-       33, 0, 352,
-       34, 0, 353,
-       35, 0, 354,
-       36, 0, 355,
+       31, 0, 158,
+       33, 0, 368,
+       34, 0, 369,
+       35, 0, 370,
+       36, 0, 371,
        37, 0, 38,
-       38, 0, 156,
-       40, 0, 157,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       47, 0, 349,
-       48, 0, 158,
-       50, 0, 356,
-       51, 0, 45,
-       53, 0, 357,
-       64, 0, 358,
-       65, 0, 359,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 374,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       47, 0, 365,
+       48, 0, 161,
+       50, 0, 44,
+       51, 0, 372,
+       52, 0, 46,
+       54, 0, 373,
+       71, 0, 374,
+       72, 0, 375,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 390,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1261[] = {
+static int parser_action_row1300[] = {
        2,
-       -1, 3, 1260,
-       52, 0, 1383
+       -1, 3, 1299,
+       53, 0, 1425
 };
-static int parser_action_row1262[] = {
+static int parser_action_row1301[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1263[] = {
+static int parser_action_row1302[] = {
        1,
-       -1, 1, 992
+       -1, 1, 1017
 };
-static int parser_action_row1264[] = {
+static int parser_action_row1303[] = {
        2,
-       -1, 1, 394,
-       55, 0, 1261
+       -1, 1, 407,
+       56, 0, 1300
 };
-static int parser_action_row1265[] = {
+static int parser_action_row1304[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1266[] = {
+static int parser_action_row1305[] = {
        1,
        -1, 1, 142
 };
-static int parser_action_row1267[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1306[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1268[] = {
+static int parser_action_row1307[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1269[] = {
+static int parser_action_row1308[] = {
        1,
-       -1, 1, 358
+       -1, 1, 371
 };
-static int parser_action_row1270[] = {
+static int parser_action_row1309[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1271[] = {
+static int parser_action_row1310[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1272[] = {
+static int parser_action_row1311[] = {
        1,
-       -1, 1, 489
+       -1, 1, 502
 };
-static int parser_action_row1273[] = {
+static int parser_action_row1312[] = {
        2,
-       -1, 3, 1272,
-       81, 0, 1390
+       -1, 3, 1311,
+       88, 0, 1432
 };
-static int parser_action_row1274[] = {
+static int parser_action_row1313[] = {
        2,
-       -1, 1, 729,
-       80, 0, 533
+       -1, 1, 745,
+       87, 0, 550
 };
-static int parser_action_row1275[] = {
+static int parser_action_row1314[] = {
        3,
-       -1, 1, 515,
-       51, 0, 242,
-       63, 0, 1392
+       -1, 1, 529,
+       52, 0, 253,
+       70, 0, 1434
 };
-static int parser_action_row1276[] = {
+static int parser_action_row1315[] = {
        1,
-       -1, 1, 512
+       -1, 1, 526
 };
-static int parser_action_row1277[] = {
+static int parser_action_row1316[] = {
        3,
-       -1, 3, 1276,
-       47, 0, 1272,
-       81, 0, 1273
+       -1, 3, 1315,
+       47, 0, 1311,
+       88, 0, 1312
 };
-static int parser_action_row1278[] = {
+static int parser_action_row1317[] = {
        3,
-       -1, 1, 517,
-       61, 1, 520,
-       63, 1, 520
+       -1, 1, 531,
+       68, 1, 534,
+       70, 1, 534
 };
-static int parser_action_row1279[] = {
+static int parser_action_row1318[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1280[] = {
+static int parser_action_row1319[] = {
        1,
-       -1, 1, 537
+       -1, 1, 551
 };
-static int parser_action_row1281[] = {
+static int parser_action_row1320[] = {
        1,
-       -1, 1, 526
+       -1, 1, 540
 };
-static int parser_action_row1282[] = {
+static int parser_action_row1321[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1283[] = {
+static int parser_action_row1322[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1284[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 1000,
-       31, 0, 1002,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1323[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 1034,
+       31, 0, 1036,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1285[] = {
+static int parser_action_row1324[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1286[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 1000,
-       31, 0, 1002,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1325[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 1034,
+       31, 0, 1036,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1287[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 1000,
-       31, 0, 1002,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1326[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 1034,
+       31, 0, 1036,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1288[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1327[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1289[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1328[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1290[] = {
+static int parser_action_row1329[] = {
        3,
-       -1, 3, 1289,
-       47, 0, 1404,
-       81, 0, 1405
+       -1, 3, 1328,
+       47, 0, 1446,
+       88, 0, 1447
 };
-static int parser_action_row1291[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1330[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1292[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1331[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1293[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1332[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1294[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1333[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1295[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1334[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1296[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1335[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1297[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1336[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1298[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1337[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1299[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1338[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1300[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1339[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1301[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1340[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1302[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1341[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1303[] = {
-       19,
-       -1, 1, 427,
-       12, 0, 1000,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1342[] = {
+       20,
+       -1, 1, 440,
+       12, 0, 1034,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1304[] = {
+static int parser_action_row1343[] = {
        5,
-       -1, 1, 427,
-       12, 0, 1420,
-       46, 0, 1421,
-       81, 0, 47,
-       82, 0, 1422
+       -1, 1, 440,
+       12, 0, 1462,
+       46, 0, 1463,
+       88, 0, 48,
+       89, 0, 1464
 };
-static int parser_action_row1305[] = {
+static int parser_action_row1344[] = {
        1,
-       -1, 1, 534
+       -1, 1, 548
 };
-static int parser_action_row1306[] = {
+static int parser_action_row1345[] = {
        2,
-       -1, 1, 532,
-       51, 0, 242
+       -1, 1, 546,
+       52, 0, 253
 };
-static int parser_action_row1307[] = {
+static int parser_action_row1346[] = {
        1,
        -1, 1, 75
 };
-static int parser_action_row1308[] = {
+static int parser_action_row1347[] = {
        5,
        -1, 1, 79,
-       18, 0, 203,
-       19, 0, 204,
-       20, 0, 205,
-       21, 0, 206
+       18, 0, 214,
+       19, 0, 215,
+       20, 0, 216,
+       21, 0, 217
 };
-static int parser_action_row1309[] = {
+static int parser_action_row1348[] = {
        1,
-       -1, 1, 991
+       -1, 1, 1016
 };
-static int parser_action_row1310[] = {
+static int parser_action_row1349[] = {
        1,
        -1, 1, 114
 };
-static int parser_action_row1311[] = {
+static int parser_action_row1350[] = {
        2,
        -1, 1, 113,
-       61, 0, 1428
+       68, 0, 1470
 };
-static int parser_action_row1312[] = {
+static int parser_action_row1351[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1313[] = {
+static int parser_action_row1352[] = {
        1,
        -1, 1, 104
 };
-static int parser_action_row1314[] = {
+static int parser_action_row1353[] = {
        2,
-       -1, 3, 1313,
-       82, 0, 1041
+       -1, 3, 1352,
+       89, 0, 1076
 };
-static int parser_action_row1315[] = {
+static int parser_action_row1354[] = {
        1,
-       -1, 1, 975
+       -1, 1, 1000
 };
-static int parser_action_row1316[] = {
+static int parser_action_row1355[] = {
        1,
        -1, 1, 108
 };
-static int parser_action_row1317[] = {
+static int parser_action_row1356[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1318[] = {
+static int parser_action_row1357[] = {
        1,
-       -1, 1, 976
+       -1, 1, 1001
 };
-static int parser_action_row1319[] = {
+static int parser_action_row1358[] = {
        2,
        -1, 1, 117,
-       55, 0, 1316
+       56, 0, 1355
 };
-static int parser_action_row1320[] = {
+static int parser_action_row1359[] = {
        20,
-       -1, 3, 1319,
-       46, 0, 1433,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 47,
-       82, 0, 590
+       -1, 3, 1358,
+       46, 0, 1475,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 48,
+       89, 0, 611
 };
-static int parser_action_row1321[] = {
+static int parser_action_row1360[] = {
        1,
-       -1, 1, 456
+       -1, 1, 469
 };
-static int parser_action_row1322[] = {
+static int parser_action_row1361[] = {
        1,
-       -1, 1, 451
+       -1, 1, 464
 };
-static int parser_action_row1323[] = {
+static int parser_action_row1362[] = {
        1,
        -1, 1, 39
 };
-static int parser_action_row1324[] = {
+static int parser_action_row1363[] = {
        2,
        -1, 1, 149,
-       56, 0, 294
+       57, 0, 306
 };
-static int parser_action_row1325[] = {
+static int parser_action_row1364[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1326[] = {
+static int parser_action_row1365[] = {
        1,
-       -1, 1, 970
+       -1, 1, 995
 };
-static int parser_action_row1327[] = {
+static int parser_action_row1366[] = {
        2,
-       -1, 3, 1326,
-       54, 0, 1437
+       -1, 3, 1365,
+       55, 0, 1479
 };
-static int parser_action_row1328[] = {
+static int parser_action_row1367[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       55, 0, 1324
+       56, 0, 1363
 };
-static int parser_action_row1329[] = {
+static int parser_action_row1368[] = {
        1,
        -1, 1, 27
 };
-static int parser_action_row1330[] = {
+static int parser_action_row1369[] = {
        7,
-       -1, 3, 1329,
-       10, 0, 1440,
-       11, 0, 1441,
-       12, 0, 1442,
-       16, 0, 1443,
-       38, 0, 1444,
-       41, 0, 1445
+       -1, 3, 1368,
+       10, 0, 1482,
+       11, 0, 1483,
+       12, 0, 1484,
+       16, 0, 1485,
+       38, 0, 1486,
+       41, 0, 1487
 };
-static int parser_action_row1331[] = {
-       24,
-       -1, 1, 919,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1370[] = {
+       25,
+       -1, 1, 941,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1332[] = {
+static int parser_action_row1371[] = {
        2,
-       -1, 1, 924,
-       49, 0, 174
+       -1, 1, 946,
+       49, 0, 178
 };
-static int parser_action_row1333[] = {
+static int parser_action_row1372[] = {
        2,
-       -1, 1, 921,
-       49, 0, 174
+       -1, 1, 943,
+       49, 0, 178
 };
-static int parser_action_row1334[] = {
+static int parser_action_row1373[] = {
        1,
-       -1, 1, 923
+       -1, 1, 945
 };
-static int parser_action_row1335[] = {
+static int parser_action_row1374[] = {
        2,
-       -1, 3, 1334,
-       11, 0, 1449
+       -1, 3, 1373,
+       11, 0, 1491
 };
-static int parser_action_row1336[] = {
+static int parser_action_row1375[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1337[] = {
-       22,
-       -1, 1, 458,
-       12, 0, 153,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1376[] = {
+       23,
+       -1, 1, 470,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1338[] = {
-       6,
-       -1, 1, 690,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 1451,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1377[] = {
+       23,
+       -1, 1, 471,
+       12, 0, 156,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1339[] = {
+static int parser_action_row1378[] = {
+       12,
+       -1, 1, 706,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 1493,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
+};
+static int parser_action_row1379[] = {
        1,
-       -1, 1, 734
+       -1, 1, 750
 };
-static int parser_action_row1340[] = {
+static int parser_action_row1380[] = {
        1,
-       -1, 1, 917
+       -1, 1, 939
 };
-static int parser_action_row1341[] = {
+static int parser_action_row1381[] = {
        1,
-       -1, 1, 926
+       -1, 1, 948
 };
-static int parser_action_row1342[] = {
+static int parser_action_row1382[] = {
        1,
-       -1, 1, 928
+       -1, 1, 950
 };
-static int parser_action_row1343[] = {
+static int parser_action_row1383[] = {
        1,
-       -1, 1, 927
+       -1, 1, 949
 };
-static int parser_action_row1344[] = {
+static int parser_action_row1384[] = {
        1,
-       -1, 1, 929
+       -1, 1, 951
 };
-static int parser_action_row1345[] = {
+static int parser_action_row1385[] = {
        1,
-       -1, 1, 930
+       -1, 1, 952
 };
-static int parser_action_row1346[] = {
+static int parser_action_row1386[] = {
        1,
-       -1, 1, 389
+       -1, 1, 953
 };
-static int parser_action_row1347[] = {
+static int parser_action_row1387[] = {
+       1,
+       -1, 1, 402
+};
+static int parser_action_row1388[] = {
        3,
-       -1, 3, 1346,
-       41, 0, 263,
-       83, 0, 1454
+       -1, 3, 1387,
+       41, 0, 275,
+       90, 0, 1496
 };
-static int parser_action_row1348[] = {
+static int parser_action_row1389[] = {
        18,
-       -1, 1, 424,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 1455
+       -1, 1, 437,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 1497
 };
-static int parser_action_row1349[] = {
+static int parser_action_row1390[] = {
        1,
-       -1, 1, 738
+       -1, 1, 754
 };
-static int parser_action_row1350[] = {
+static int parser_action_row1391[] = {
        1,
-       -1, 1, 918
+       -1, 1, 940
 };
-static int parser_action_row1351[] = {
+static int parser_action_row1392[] = {
        1,
-       -1, 1, 735
+       -1, 1, 751
 };
-static int parser_action_row1352[] = {
+static int parser_action_row1393[] = {
        4,
-       -1, 1, 673,
-       53, 0, 212,
-       61, 0, 285,
-       63, 0, 1456
+       -1, 1, 689,
+       54, 0, 223,
+       68, 0, 297,
+       70, 0, 1498
 };
-static int parser_action_row1353[] = {
+static int parser_action_row1394[] = {
        1,
-       -1, 1, 392
+       -1, 1, 405
 };
-static int parser_action_row1354[] = {
+static int parser_action_row1395[] = {
        2,
-       -1, 1, 732,
-       55, 0, 1261
+       -1, 1, 748,
+       56, 0, 1300
 };
-static int parser_action_row1355[] = {
+static int parser_action_row1396[] = {
        1,
-       -1, 1, 736
+       -1, 1, 752
 };
-static int parser_action_row1356[] = {
+static int parser_action_row1397[] = {
        19,
-       -1, 1, 426,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       81, 0, 47,
-       82, 0, 1459
+       -1, 1, 439,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       88, 0, 48,
+       89, 0, 1501
 };
-static int parser_action_row1357[] = {
+static int parser_action_row1398[] = {
        2,
-       -1, 3, 1356,
-       45, 0, 1461
+       -1, 3, 1397,
+       45, 0, 1503
 };
-static int parser_action_row1358[] = {
+static int parser_action_row1399[] = {
        2,
-       -1, 3, 1357,
-       52, 0, 1462
+       -1, 3, 1398,
+       53, 0, 1504
 };
-static int parser_action_row1359[] = {
+static int parser_action_row1400[] = {
        1,
-       -1, 1, 206
+       -1, 1, 207
 };
-static int parser_action_row1360[] = {
+static int parser_action_row1401[] = {
        1,
-       -1, 1, 225
+       -1, 1, 226
 };
-static int parser_action_row1361[] = {
+static int parser_action_row1402[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1362[] = {
+static int parser_action_row1403[] = {
        1,
-       -1, 1, 708
+       -1, 1, 724
 };
-static int parser_action_row1363[] = {
+static int parser_action_row1404[] = {
        2,
-       -1, 3, 1362,
-       45, 0, 1464
+       -1, 3, 1403,
+       45, 0, 1506
 };
-static int parser_action_row1364[] = {
+static int parser_action_row1405[] = {
        2,
-       -1, 3, 1363,
-       52, 0, 1465
+       -1, 3, 1404,
+       53, 0, 1507
 };
-static int parser_action_row1365[] = {
-       33,
-       -1, 1, 427,
+static int parser_action_row1406[] = {
+       34,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 803,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 827,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       24, 0, 807,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       24, 0, 831,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1366[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1407[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 938,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 968,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1367[] = {
+static int parser_action_row1408[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1368[] = {
+static int parser_action_row1409[] = {
        1,
-       -1, 1, 862
+       -1, 1, 882
 };
-static int parser_action_row1369[] = {
+static int parser_action_row1410[] = {
        2,
        -1, 1, 151,
-       24, 1, 816
+       24, 1, 833
 };
-static int parser_action_row1370[] = {
+static int parser_action_row1411[] = {
        2,
        -1, 1, 150,
-       24, 1, 815
+       24, 1, 832
 };
-static int parser_action_row1371[] = {
+static int parser_action_row1412[] = {
+       33,
+       -1, 1, 440,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 968,
+       12, 0, 828,
+       15, 0, 829,
+       16, 0, 28,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
+       38, 0, 39,
+       42, 0, 40,
+       43, 0, 41,
+       44, 0, 42,
+       45, 0, 43,
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1413[] = {
        2,
-       -1, 1, 193,
-       24, 1, 851
+       -1, 1, 194,
+       24, 1, 869
 };
-static int parser_action_row1372[] = {
+static int parser_action_row1414[] = {
        2,
-       -1, 1, 185,
-       24, 1, 843
+       -1, 1, 186,
+       24, 1, 861
 };
-static int parser_action_row1373[] = {
+static int parser_action_row1415[] = {
        2,
-       -1, 1, 176,
-       24, 1, 834
+       -1, 1, 177,
+       24, 1, 852
 };
-static int parser_action_row1374[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1416[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1375[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 303,
-       58, 0, 910,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 303,
-       63, 1, 303,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1417[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 316,
+       59, 0, 940,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 316,
+       70, 1, 316,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1376[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1418[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1377[] = {
-       30,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 307,
-       57, 0, 191,
-       58, 0, 915,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 307,
-       63, 1, 307,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1419[] = {
+       37,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 320,
+       58, 0, 196,
+       59, 0, 945,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 320,
+       70, 1, 320,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1378[] = {
+static int parser_action_row1420[] = {
        3,
-       -1, 1, 425,
-       12, 0, 1474,
-       82, 0, 1475
+       -1, 1, 438,
+       12, 0, 1518,
+       89, 0, 1519
 };
-static int parser_action_row1379[] = {
+static int parser_action_row1421[] = {
        1,
-       -1, 1, 254
+       -1, 1, 261
 };
-static int parser_action_row1380[] = {
+static int parser_action_row1422[] = {
        2,
-       -1, 3, 1379,
-       49, 0, 174
+       -1, 3, 1421,
+       49, 0, 178
 };
-static int parser_action_row1381[] = {
+static int parser_action_row1423[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1382[] = {
+static int parser_action_row1424[] = {
        1,
-       -1, 1, 569
+       -1, 1, 583
 };
-static int parser_action_row1383[] = {
+static int parser_action_row1425[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1384[] = {
+static int parser_action_row1426[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1385[] = {
-       49,
-       -1, 1, 427,
-       12, 0, 153,
+static int parser_action_row1427[] = {
+       50,
+       -1, 1, 440,
+       12, 0, 156,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 154,
+       22, 0, 157,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 155,
-       33, 0, 352,
-       34, 0, 353,
-       35, 0, 354,
-       36, 0, 355,
+       31, 0, 158,
+       33, 0, 368,
+       34, 0, 369,
+       35, 0, 370,
+       36, 0, 371,
        37, 0, 38,
-       38, 0, 156,
-       40, 0, 157,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       47, 0, 349,
-       48, 0, 158,
-       50, 0, 356,
-       51, 0, 45,
-       53, 0, 357,
-       64, 0, 358,
-       65, 0, 359,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 374,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       47, 0, 365,
+       48, 0, 161,
+       50, 0, 44,
+       51, 0, 372,
+       52, 0, 46,
+       54, 0, 373,
+       71, 0, 374,
+       72, 0, 375,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 390,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1386[] = {
+static int parser_action_row1428[] = {
        1,
-       -1, 1, 993
+       -1, 1, 1018
 };
-static int parser_action_row1387[] = {
+static int parser_action_row1429[] = {
        1,
        -1, 1, 143
 };
-static int parser_action_row1388[] = {
+static int parser_action_row1430[] = {
        2,
-       -1, 1, 356,
-       24, 0, 1380
+       -1, 1, 369,
+       24, 0, 1422
 };
-static int parser_action_row1389[] = {
+static int parser_action_row1431[] = {
        2,
-       -1, 3, 1388,
-       15, 0, 1481
+       -1, 3, 1430,
+       15, 0, 1525
 };
-static int parser_action_row1390[] = {
+static int parser_action_row1432[] = {
        2,
-       -1, 3, 1389,
-       23, 0, 1482
+       -1, 3, 1431,
+       23, 0, 1526
 };
-static int parser_action_row1391[] = {
+static int parser_action_row1433[] = {
        2,
-       -1, 1, 729,
-       80, 0, 533
+       -1, 1, 745,
+       87, 0, 550
 };
-static int parser_action_row1392[] = {
+static int parser_action_row1434[] = {
        1,
-       -1, 1, 739
+       -1, 1, 755
 };
-static int parser_action_row1393[] = {
+static int parser_action_row1435[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1394[] = {
+static int parser_action_row1436[] = {
        1,
-       -1, 1, 514
+       -1, 1, 528
 };
-static int parser_action_row1395[] = {
+static int parser_action_row1437[] = {
        2,
-       -1, 3, 1394,
-       63, 0, 1392
+       -1, 3, 1436,
+       70, 0, 1434
 };
-static int parser_action_row1396[] = {
+static int parser_action_row1438[] = {
        5,
-       -1, 1, 427,
-       12, 0, 1420,
-       46, 0, 1421,
-       81, 0, 47,
-       82, 0, 1422
+       -1, 1, 440,
+       12, 0, 1462,
+       46, 0, 1463,
+       88, 0, 48,
+       89, 0, 1464
 };
-static int parser_action_row1397[] = {
+static int parser_action_row1439[] = {
        1,
-       -1, 1, 347
+       -1, 1, 360
 };
-static int parser_action_row1398[] = {
+static int parser_action_row1440[] = {
        1,
-       -1, 1, 346
+       -1, 1, 359
 };
-static int parser_action_row1399[] = {
+static int parser_action_row1441[] = {
        1,
-       -1, 1, 485
+       -1, 1, 498
 };
-static int parser_action_row1400[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 1000,
-       31, 0, 1002,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+static int parser_action_row1442[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 1034,
+       31, 0, 1036,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
 };
-static int parser_action_row1401[] = {
+static int parser_action_row1443[] = {
        1,
-       -1, 1, 484
+       -1, 1, 497
 };
-static int parser_action_row1402[] = {
+static int parser_action_row1444[] = {
        1,
-       -1, 1, 487
+       -1, 1, 500
 };
-static int parser_action_row1403[] = {
+static int parser_action_row1445[] = {
        3,
-       -1, 1, 495,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 508,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1404[] = {
+static int parser_action_row1446[] = {
        3,
-       -1, 1, 498,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 511,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1405[] = {
+static int parser_action_row1447[] = {
        2,
-       -1, 3, 1404,
-       81, 0, 1487
+       -1, 3, 1446,
+       88, 0, 1531
 };
-static int parser_action_row1406[] = {
+static int parser_action_row1448[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1407[] = {
+static int parser_action_row1449[] = {
        1,
-       -1, 1, 500
+       -1, 1, 513
 };
-static int parser_action_row1408[] = {
+static int parser_action_row1450[] = {
        4,
-       -1, 1, 502,
-       66, 0, 1175,
-       68, 0, 1176,
-       69, 0, 1177
+       -1, 1, 515,
+       73, 0, 1213,
+       75, 0, 1214,
+       76, 0, 1215
 };
-static int parser_action_row1409[] = {
+static int parser_action_row1451[] = {
        4,
-       -1, 1, 503,
-       66, 0, 1175,
-       68, 0, 1176,
-       69, 0, 1177
+       -1, 1, 516,
+       73, 0, 1213,
+       75, 0, 1214,
+       76, 0, 1215
 };
-static int parser_action_row1410[] = {
+static int parser_action_row1452[] = {
        3,
-       -1, 1, 491,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 504,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1411[] = {
+static int parser_action_row1453[] = {
        3,
-       -1, 1, 492,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 505,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1412[] = {
+static int parser_action_row1454[] = {
        3,
-       -1, 1, 493,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 506,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1413[] = {
+static int parser_action_row1455[] = {
        3,
-       -1, 1, 494,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 507,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1414[] = {
+static int parser_action_row1456[] = {
        3,
-       -1, 1, 496,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 509,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1415[] = {
+static int parser_action_row1457[] = {
        3,
-       -1, 1, 497,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 510,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1416[] = {
+static int parser_action_row1458[] = {
        3,
-       -1, 1, 499,
-       64, 0, 1166,
-       65, 0, 1167
+       -1, 1, 512,
+       71, 0, 1204,
+       72, 0, 1205
 };
-static int parser_action_row1417[] = {
+static int parser_action_row1459[] = {
        1,
-       -1, 1, 505
+       -1, 1, 518
 };
-static int parser_action_row1418[] = {
+static int parser_action_row1460[] = {
        1,
-       -1, 1, 506
+       -1, 1, 519
 };
-static int parser_action_row1419[] = {
+static int parser_action_row1461[] = {
        1,
-       -1, 1, 507
+       -1, 1, 520
 };
-static int parser_action_row1420[] = {
+static int parser_action_row1462[] = {
        1,
-       -1, 1, 509
+       -1, 1, 522
 };
-static int parser_action_row1421[] = {
+static int parser_action_row1463[] = {
        2,
-       -1, 1, 541,
-       51, 0, 242
+       -1, 1, 555,
+       52, 0, 253
 };
-static int parser_action_row1422[] = {
+static int parser_action_row1464[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1423[] = {
+static int parser_action_row1465[] = {
        3,
-       -1, 1, 523,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 537,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row1424[] = {
+static int parser_action_row1466[] = {
        2,
-       -1, 3, 1423,
-       83, 0, 1492
+       -1, 3, 1465,
+       90, 0, 1536
 };
-static int parser_action_row1425[] = {
+static int parser_action_row1467[] = {
        2,
-       -1, 1, 424,
-       82, 0, 1493
+       -1, 1, 437,
+       89, 0, 1537
 };
-static int parser_action_row1426[] = {
+static int parser_action_row1468[] = {
        3,
-       -1, 1, 426,
-       81, 0, 47,
-       82, 0, 1494
+       -1, 1, 439,
+       88, 0, 48,
+       89, 0, 1538
 };
-static int parser_action_row1427[] = {
+static int parser_action_row1469[] = {
        1,
-       -1, 1, 530
+       -1, 1, 544
 };
-static int parser_action_row1428[] = {
+static int parser_action_row1470[] = {
        4,
-       -1, 3, 1427,
-       6, 0, 713,
-       17, 0, 714,
-       82, 0, 715
+       -1, 3, 1469,
+       6, 0, 734,
+       17, 0, 735,
+       89, 0, 736
 };
-static int parser_action_row1429[] = {
+static int parser_action_row1471[] = {
        1,
        -1, 1, 115
 };
-static int parser_action_row1430[] = {
+static int parser_action_row1472[] = {
        1,
        -1, 1, 103
 };
-static int parser_action_row1431[] = {
+static int parser_action_row1473[] = {
        1,
        -1, 1, 110
 };
-static int parser_action_row1432[] = {
+static int parser_action_row1474[] = {
        21,
-       -1, 3, 1431,
-       41, 0, 1196,
-       47, 0, 349,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 373,
-       82, 0, 590
+       -1, 3, 1473,
+       41, 0, 1234,
+       47, 0, 365,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 389,
+       89, 0, 611
 };
-static int parser_action_row1433[] = {
+static int parser_action_row1475[] = {
        1,
-       -1, 1, 977
+       -1, 1, 1002
 };
-static int parser_action_row1434[] = {
+static int parser_action_row1476[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1435[] = {
+static int parser_action_row1477[] = {
        1,
        -1, 1, 124
 };
-static int parser_action_row1436[] = {
+static int parser_action_row1478[] = {
        1,
        -1, 1, 40
 };
-static int parser_action_row1437[] = {
+static int parser_action_row1479[] = {
        2,
-       -1, 3, 1436,
-       81, 0, 1207
+       -1, 3, 1478,
+       88, 0, 1245
 };
-static int parser_action_row1438[] = {
+static int parser_action_row1480[] = {
        1,
        -1, 1, 35
 };
-static int parser_action_row1439[] = {
+static int parser_action_row1481[] = {
        1,
-       -1, 1, 971
+       -1, 1, 996
 };
-static int parser_action_row1440[] = {
+static int parser_action_row1482[] = {
        2,
-       -1, 3, 1439,
-       54, 0, 1500
+       -1, 3, 1481,
+       55, 0, 1544
 };
-static int parser_action_row1441[] = {
+static int parser_action_row1483[] = {
        19,
-       -1, 3, 1440,
-       53, 0, 574,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 47,
-       82, 0, 590
+       -1, 3, 1482,
+       54, 0, 595,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 48,
+       89, 0, 611
 };
-static int parser_action_row1442[] = {
+static int parser_action_row1484[] = {
        2,
-       -1, 3, 1441,
-       81, 0, 1502
+       -1, 3, 1483,
+       88, 0, 1546
 };
-static int parser_action_row1443[] = {
+static int parser_action_row1485[] = {
        23,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       51, 0, 746,
-       53, 0, 574,
-       56, 0, 747,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 47,
-       82, 0, 590
+       52, 0, 770,
+       54, 0, 595,
+       57, 0, 771,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 48,
+       89, 0, 611
 };
-static int parser_action_row1444[] = {
+static int parser_action_row1486[] = {
        2,
-       -1, 3, 1443,
-       82, 0, 1505
+       -1, 3, 1485,
+       89, 0, 1549
 };
-static int parser_action_row1445[] = {
+static int parser_action_row1487[] = {
        23,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       51, 0, 746,
-       53, 0, 574,
-       56, 0, 747,
-       64, 0, 575,
-       65, 0, 576,
-       66, 0, 577,
-       67, 0, 578,
-       68, 0, 579,
-       69, 0, 580,
-       70, 0, 581,
-       71, 0, 582,
-       72, 0, 583,
-       73, 0, 584,
-       74, 0, 585,
-       75, 0, 586,
-       76, 0, 587,
-       77, 0, 588,
-       78, 0, 589,
-       81, 0, 47,
-       82, 0, 590
+       52, 0, 770,
+       54, 0, 595,
+       57, 0, 771,
+       71, 0, 596,
+       72, 0, 597,
+       73, 0, 598,
+       74, 0, 599,
+       75, 0, 600,
+       76, 0, 601,
+       77, 0, 602,
+       78, 0, 603,
+       79, 0, 604,
+       80, 0, 605,
+       81, 0, 606,
+       82, 0, 607,
+       83, 0, 608,
+       84, 0, 609,
+       85, 0, 610,
+       88, 0, 48,
+       89, 0, 611
 };
-static int parser_action_row1446[] = {
+static int parser_action_row1488[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1447[] = {
+static int parser_action_row1489[] = {
        1,
-       -1, 1, 920
+       -1, 1, 942
 };
-static int parser_action_row1448[] = {
+static int parser_action_row1490[] = {
        1,
-       -1, 1, 925
+       -1, 1, 947
 };
-static int parser_action_row1449[] = {
+static int parser_action_row1491[] = {
        1,
-       -1, 1, 922
+       -1, 1, 944
 };
-static int parser_action_row1450[] = {
+static int parser_action_row1492[] = {
        3,
-       -1, 3, 1449,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 1491,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row1451[] = {
-       49,
-       -1, 1, 427,
-       12, 0, 153,
+static int parser_action_row1493[] = {
+       50,
+       -1, 1, 440,
+       12, 0, 156,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 154,
+       22, 0, 157,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 155,
-       33, 0, 352,
-       34, 0, 353,
-       35, 0, 354,
-       36, 0, 355,
+       31, 0, 158,
+       33, 0, 368,
+       34, 0, 369,
+       35, 0, 370,
+       36, 0, 371,
        37, 0, 38,
-       38, 0, 156,
-       40, 0, 157,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       47, 0, 349,
-       48, 0, 158,
-       50, 0, 356,
-       51, 0, 45,
-       53, 0, 357,
-       64, 0, 358,
-       65, 0, 359,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 374,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       47, 0, 365,
+       48, 0, 161,
+       50, 0, 44,
+       51, 0, 372,
+       52, 0, 46,
+       54, 0, 373,
+       71, 0, 374,
+       72, 0, 375,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 390,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1452[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1494[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1453[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1495[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1454[] = {
-       4,
-       -1, 1, 689,
-       58, 0, 1513,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1496[] = {
+       10,
+       -1, 1, 705,
+       59, 0, 1557,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1455[] = {
-       4,
-       -1, 1, 680,
-       58, 0, 1515,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1497[] = {
+       10,
+       -1, 1, 696,
+       59, 0, 1559,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1456[] = {
-       5,
-       -1, 1, 692,
-       51, 0, 242,
-       58, 0, 1517,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1498[] = {
+       11,
+       -1, 1, 708,
+       52, 0, 253,
+       59, 0, 1561,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1457[] = {
+static int parser_action_row1499[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1458[] = {
-       4,
-       -1, 1, 703,
-       58, 0, 1521,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1500[] = {
+       10,
+       -1, 1, 719,
+       59, 0, 1565,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1459[] = {
+static int parser_action_row1501[] = {
        2,
-       -1, 1, 733,
-       55, 0, 1261
+       -1, 1, 749,
+       56, 0, 1300
 };
-static int parser_action_row1460[] = {
-       6,
-       -1, 1, 696,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 1523,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1502[] = {
+       12,
+       -1, 1, 712,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 1567,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1461[] = {
+static int parser_action_row1503[] = {
        18,
-       -1, 1, 425,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 1526
+       -1, 1, 438,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 1570
 };
-static int parser_action_row1462[] = {
+static int parser_action_row1504[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1463[] = {
+static int parser_action_row1505[] = {
        1,
-       -1, 1, 331
+       -1, 1, 344
 };
-static int parser_action_row1464[] = {
-       20,
-       -1, 1, 427,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1506[] = {
+       21,
+       -1, 1, 440,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1465[] = {
+static int parser_action_row1507[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1466[] = {
+static int parser_action_row1508[] = {
        1,
-       -1, 1, 712
+       -1, 1, 728
 };
-static int parser_action_row1467[] = {
+static int parser_action_row1509[] = {
        2,
-       -1, 3, 1466,
-       24, 0, 1530
+       -1, 3, 1508,
+       24, 0, 1574
 };
-static int parser_action_row1468[] = {
+static int parser_action_row1510[] = {
        1,
-       -1, 1, 858
+       -1, 1, 876
 };
-static int parser_action_row1469[] = {
+static int parser_action_row1511[] = {
        2,
-       -1, 3, 1468,
-       49, 0, 174
+       -1, 3, 1510,
+       49, 0, 178
 };
-static int parser_action_row1470[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1512[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1471[] = {
+static int parser_action_row1513[] = {
+       1,
+       -1, 1, 880
+};
+static int parser_action_row1514[] = {
        2,
-       -1, 1, 187,
-       24, 1, 845
+       -1, 3, 1513,
+       49, 0, 178
 };
-static int parser_action_row1472[] = {
+static int parser_action_row1515[] = {
        2,
-       -1, 1, 177,
-       24, 1, 835
+       -1, 1, 188,
+       24, 1, 863
 };
-static int parser_action_row1473[] = {
+static int parser_action_row1516[] = {
        2,
-       -1, 1, 189,
-       24, 1, 847
+       -1, 1, 178,
+       24, 1, 853
 };
-static int parser_action_row1474[] = {
+static int parser_action_row1517[] = {
        2,
-       -1, 1, 179,
-       24, 1, 837
+       -1, 1, 190,
+       24, 1, 865
 };
-static int parser_action_row1475[] = {
-       23,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 434,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1518[] = {
+       2,
+       -1, 1, 180,
+       24, 1, 855
 };
-static int parser_action_row1476[] = {
-       29,
-       -1, 1, 410,
-       12, 0, 105,
-       22, 0, 106,
-       31, 0, 107,
-       38, 0, 108,
-       40, 0, 109,
-       41, 1, 427,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       48, 0, 114,
-       51, 0, 115,
-       53, 1, 305,
-       58, 0, 1077,
-       59, 0, 193,
-       60, 0, 194,
-       61, 1, 305,
-       63, 1, 305,
-       65, 0, 116,
-       81, 0, 47,
-       82, 0, 117,
-       83, 1, 427,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+static int parser_action_row1519[] = {
+       24,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 451,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1477[] = {
+static int parser_action_row1520[] = {
+       36,
+       -1, 1, 423,
+       12, 0, 107,
+       22, 0, 108,
+       31, 0, 109,
+       38, 0, 110,
+       40, 0, 111,
+       41, 1, 440,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       48, 0, 116,
+       52, 0, 117,
+       54, 1, 318,
+       59, 0, 1112,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205,
+       68, 1, 318,
+       70, 1, 318,
+       71, 0, 118,
+       72, 0, 119,
+       88, 0, 48,
+       89, 0, 120,
+       90, 1, 440,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
+};
+static int parser_action_row1521[] = {
        1,
-       -1, 1, 253
+       -1, 1, 260
 };
-static int parser_action_row1478[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1522[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1479[] = {
+static int parser_action_row1523[] = {
        2,
-       -1, 3, 1478,
-       52, 0, 1536
+       -1, 3, 1522,
+       53, 0, 1581
 };
-static int parser_action_row1480[] = {
+static int parser_action_row1524[] = {
        1,
-       -1, 1, 373
+       -1, 1, 386
 };
-static int parser_action_row1481[] = {
+static int parser_action_row1525[] = {
        1,
-       -1, 1, 395
+       -1, 1, 408
 };
-static int parser_action_row1482[] = {
-       23,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 394,
-       27, 0, 395,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1526[] = {
+       24,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 411,
+       27, 0, 412,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1483[] = {
+static int parser_action_row1527[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1484[] = {
+static int parser_action_row1528[] = {
        1,
-       -1, 1, 740
+       -1, 1, 756
 };
-static int parser_action_row1485[] = {
+static int parser_action_row1529[] = {
        3,
-       -1, 3, 1484,
-       81, 0, 47,
-       82, 0, 1539
+       -1, 3, 1528,
+       88, 0, 48,
+       89, 0, 1584
 };
-static int parser_action_row1486[] = {
+static int parser_action_row1530[] = {
        2,
-       -1, 3, 1485,
-       83, 0, 1542
+       -1, 3, 1529,
+       90, 0, 1587
 };
-static int parser_action_row1487[] = {
+static int parser_action_row1531[] = {
        1,
-       -1, 1, 486
+       -1, 1, 499
 };
-static int parser_action_row1488[] = {
+static int parser_action_row1532[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1489[] = {
+static int parser_action_row1533[] = {
        1,
-       -1, 1, 479
+       -1, 1, 492
 };
-static int parser_action_row1490[] = {
+static int parser_action_row1534[] = {
        1,
-       -1, 1, 539
+       -1, 1, 553
 };
-static int parser_action_row1491[] = {
+static int parser_action_row1535[] = {
        3,
-       -1, 3, 1490,
-       31, 0, 1544,
-       51, 0, 1545
+       -1, 3, 1534,
+       31, 0, 1589,
+       52, 0, 1590
 };
-static int parser_action_row1492[] = {
+static int parser_action_row1536[] = {
        1,
-       -1, 1, 521
+       -1, 1, 535
 };
-static int parser_action_row1493[] = {
+static int parser_action_row1537[] = {
        1,
-       -1, 1, 519
+       -1, 1, 533
 };
-static int parser_action_row1494[] = {
+static int parser_action_row1538[] = {
        2,
-       -1, 1, 527,
-       51, 0, 242
+       -1, 1, 541,
+       52, 0, 253
 };
-static int parser_action_row1495[] = {
+static int parser_action_row1539[] = {
        3,
-       -1, 1, 535,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 549,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row1496[] = {
+static int parser_action_row1540[] = {
        2,
-       -1, 1, 425,
-       82, 0, 1548
+       -1, 1, 438,
+       89, 0, 1593
 };
-static int parser_action_row1497[] = {
-       51,
-       -1, 1, 427,
-       0, 0, 81,
-       1, 0, 82,
-       12, 0, 105,
+static int parser_action_row1541[] = {
+       52,
+       -1, 1, 440,
+       0, 0, 83,
+       1, 0, 84,
+       12, 0, 107,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 106,
+       22, 0, 108,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 107,
-       33, 0, 1330,
-       34, 0, 1331,
-       35, 0, 1332,
-       36, 0, 1333,
+       31, 0, 109,
+       33, 0, 1369,
+       34, 0, 1370,
+       35, 0, 1371,
+       36, 0, 1372,
        37, 0, 38,
-       38, 0, 108,
-       40, 0, 109,
-       42, 0, 110,
-       43, 0, 111,
-       44, 0, 112,
-       45, 0, 113,
-       47, 0, 349,
-       48, 0, 114,
-       50, 0, 1334,
-       51, 0, 1549,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 1336,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 1337,
-       84, 0, 118,
-       85, 0, 119,
-       86, 0, 120,
-       87, 0, 121,
-       88, 0, 53,
-       91, 0, 122
+       38, 0, 110,
+       40, 0, 111,
+       42, 0, 112,
+       43, 0, 113,
+       44, 0, 114,
+       45, 0, 115,
+       47, 0, 365,
+       48, 0, 116,
+       50, 0, 44,
+       51, 0, 1373,
+       52, 0, 1594,
+       54, 0, 575,
+       71, 0, 1375,
+       72, 0, 1376,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 1377,
+       91, 0, 121,
+       92, 0, 122,
+       93, 0, 123,
+       94, 0, 124,
+       95, 0, 54,
+       98, 0, 125
 };
-static int parser_action_row1498[] = {
+static int parser_action_row1542[] = {
        1,
        -1, 1, 119
 };
-static int parser_action_row1499[] = {
+static int parser_action_row1543[] = {
        5,
-       -1, 3, 1498,
-       31, 0, 1553,
-       47, 0, 1554,
-       51, 0, 1555,
-       81, 0, 350
+       -1, 3, 1542,
+       31, 0, 1598,
+       47, 0, 1599,
+       52, 0, 1600,
+       88, 0, 366
 };
-static int parser_action_row1500[] = {
+static int parser_action_row1544[] = {
        1,
        -1, 1, 38
 };
-static int parser_action_row1501[] = {
+static int parser_action_row1545[] = {
        1,
        -1, 1, 36
 };
-static int parser_action_row1502[] = {
+static int parser_action_row1546[] = {
        5,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       51, 0, 746,
-       56, 0, 747
+       52, 0, 770,
+       57, 0, 771
 };
-static int parser_action_row1503[] = {
+static int parser_action_row1547[] = {
        2,
-       -1, 3, 1502,
-       56, 0, 747
+       -1, 3, 1546,
+       57, 0, 771
 };
-static int parser_action_row1504[] = {
+static int parser_action_row1548[] = {
        3,
-       -1, 3, 1503,
-       14, 0, 1559,
-       15, 0, 1560
+       -1, 3, 1547,
+       14, 0, 1604,
+       15, 0, 1605
 };
-static int parser_action_row1505[] = {
+static int parser_action_row1549[] = {
        5,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       51, 0, 746,
-       56, 0, 747
+       52, 0, 770,
+       57, 0, 771
 };
-static int parser_action_row1506[] = {
+static int parser_action_row1550[] = {
        2,
        -1, 1, 149,
-       56, 0, 294
+       57, 0, 306
 };
-static int parser_action_row1507[] = {
+static int parser_action_row1551[] = {
        4,
        -1, 1, 118,
-       4, 0, 888,
-       14, 0, 889,
-       15, 0, 1564
+       4, 0, 918,
+       14, 0, 919,
+       15, 0, 1609
 };
-static int parser_action_row1508[] = {
+static int parser_action_row1552[] = {
        5,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       51, 0, 746,
-       56, 0, 747
+       52, 0, 770,
+       57, 0, 771
 };
-static int parser_action_row1509[] = {
+static int parser_action_row1553[] = {
        3,
-       -1, 3, 1508,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 1552,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row1510[] = {
+static int parser_action_row1554[] = {
        2,
-       -1, 3, 1509,
-       56, 0, 1570
+       -1, 3, 1553,
+       57, 0, 1615
 };
-static int parser_action_row1511[] = {
+static int parser_action_row1555[] = {
        2,
-       -1, 3, 1510,
-       52, 0, 1571
+       -1, 3, 1554,
+       53, 0, 1616
 };
-static int parser_action_row1512[] = {
+static int parser_action_row1556[] = {
        1,
-       -1, 1, 614
+       -1, 1, 629
 };
-static int parser_action_row1513[] = {
+static int parser_action_row1557[] = {
        1,
-       -1, 1, 633
+       -1, 1, 648
 };
-static int parser_action_row1514[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1558[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1515[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1559[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1516[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1560[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1517[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1561[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1518[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1562[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1519[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1563[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1520[] = {
-       4,
-       -1, 1, 691,
-       58, 0, 1578,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1564[] = {
+       10,
+       -1, 1, 707,
+       59, 0, 1623,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1521[] = {
+static int parser_action_row1565[] = {
        21,
-       -1, 1, 427,
-       12, 0, 654,
-       46, 0, 655,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       81, 0, 47,
-       82, 0, 1580
+       -1, 1, 440,
+       12, 0, 675,
+       46, 0, 676,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       88, 0, 48,
+       89, 0, 1625
 };
-static int parser_action_row1522[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1566[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1523[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1567[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1524[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1568[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1525[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1569[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1526[] = {
-       4,
-       -1, 1, 695,
-       58, 0, 1589,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1570[] = {
+       10,
+       -1, 1, 711,
+       59, 0, 1634,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1527[] = {
-       5,
-       -1, 1, 694,
-       51, 0, 242,
-       58, 0, 1591,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1571[] = {
+       11,
+       -1, 1, 710,
+       52, 0, 253,
+       59, 0, 1636,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1528[] = {
+static int parser_action_row1572[] = {
        2,
-       -1, 3, 1527,
-       52, 0, 1594
+       -1, 3, 1571,
+       53, 0, 1639
 };
-static int parser_action_row1529[] = {
+static int parser_action_row1573[] = {
        1,
-       -1, 1, 642
+       -1, 1, 657
 };
-static int parser_action_row1530[] = {
+static int parser_action_row1574[] = {
        2,
-       -1, 3, 1529,
-       52, 0, 1595
+       -1, 3, 1573,
+       53, 0, 1640
 };
-static int parser_action_row1531[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1575[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1242,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 1280,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1532[] = {
+static int parser_action_row1576[] = {
        2,
-       -1, 1, 251,
-       24, 1, 857
+       -1, 1, 258,
+       24, 1, 875
 };
-static int parser_action_row1533[] = {
+static int parser_action_row1577[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1534[] = {
+static int parser_action_row1578[] = {
        2,
-       -1, 1, 188,
-       24, 1, 846
+       -1, 1, 262,
+       24, 1, 879
 };
-static int parser_action_row1535[] = {
+static int parser_action_row1579[] = {
        2,
-       -1, 1, 178,
-       24, 1, 836
+       -1, 1, 189,
+       24, 1, 864
 };
-static int parser_action_row1536[] = {
+static int parser_action_row1580[] = {
+       2,
+       -1, 1, 179,
+       24, 1, 854
+};
+static int parser_action_row1581[] = {
        1,
-       -1, 1, 261
+       -1, 1, 273
 };
-static int parser_action_row1537[] = {
+static int parser_action_row1582[] = {
        2,
-       -1, 1, 371,
-       80, 0, 181
+       -1, 1, 384,
+       87, 0, 185
 };
-static int parser_action_row1538[] = {
+static int parser_action_row1583[] = {
        1,
-       -1, 1, 357
+       -1, 1, 370
 };
-static int parser_action_row1539[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1584[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1540[] = {
+static int parser_action_row1585[] = {
        3,
-       -1, 1, 544,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 558,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row1541[] = {
+static int parser_action_row1586[] = {
        2,
-       -1, 3, 1540,
-       82, 0, 1601
+       -1, 3, 1585,
+       89, 0, 1646
 };
-static int parser_action_row1542[] = {
+static int parser_action_row1587[] = {
        3,
-       -1, 3, 1541,
-       81, 0, 47,
-       82, 0, 1602
+       -1, 3, 1586,
+       88, 0, 48,
+       89, 0, 1647
 };
-static int parser_action_row1543[] = {
+static int parser_action_row1588[] = {
        3,
-       -1, 1, 516,
-       61, 1, 519,
-       63, 1, 519
+       -1, 1, 530,
+       68, 1, 533,
+       70, 1, 533
 };
-static int parser_action_row1544[] = {
+static int parser_action_row1589[] = {
        1,
-       -1, 1, 480
+       -1, 1, 493
 };
-static int parser_action_row1545[] = {
+static int parser_action_row1590[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1546[] = {
+static int parser_action_row1591[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1547[] = {
+static int parser_action_row1592[] = {
        1,
-       -1, 1, 525
+       -1, 1, 539
 };
-static int parser_action_row1548[] = {
+static int parser_action_row1593[] = {
        1,
-       -1, 1, 533
+       -1, 1, 547
 };
-static int parser_action_row1549[] = {
+static int parser_action_row1594[] = {
        2,
-       -1, 1, 531,
-       51, 0, 242
+       -1, 1, 545,
+       52, 0, 253
 };
-static int parser_action_row1550[] = {
+static int parser_action_row1595[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1551[] = {
+static int parser_action_row1596[] = {
        3,
-       -1, 3, 1550,
-       0, 0, 81,
-       1, 0, 82
+       -1, 3, 1595,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1552[] = {
+static int parser_action_row1597[] = {
        1,
-       -1, 1, 383
+       -1, 1, 396
 };
-static int parser_action_row1553[] = {
+static int parser_action_row1598[] = {
        3,
-       -1, 3, 1552,
-       0, 0, 81,
-       1, 0, 82
+       -1, 3, 1597,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1554[] = {
+static int parser_action_row1599[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1555[] = {
+static int parser_action_row1600[] = {
        2,
        -1, 1, 129,
-       81, 0, 539
+       88, 0, 559
 };
-static int parser_action_row1556[] = {
+static int parser_action_row1601[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1557[] = {
+static int parser_action_row1602[] = {
        1,
        -1, 1, 127
 };
-static int parser_action_row1558[] = {
+static int parser_action_row1603[] = {
        4,
        -1, 1, 118,
-       4, 0, 888,
-       14, 0, 889,
-       15, 0, 1612
+       4, 0, 918,
+       14, 0, 919,
+       15, 0, 1657
 };
-static int parser_action_row1559[] = {
+static int parser_action_row1604[] = {
        2,
        -1, 1, 76,
-       14, 0, 880
+       14, 0, 910
 };
-static int parser_action_row1560[] = {
+static int parser_action_row1605[] = {
        4,
        -1, 1, 28,
-       0, 0, 81,
-       1, 0, 82,
+       0, 0, 83,
+       1, 0, 84,
        13, 0, 26
 };
-static int parser_action_row1561[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1606[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16004,40 +17017,41 @@ static int parser_action_row1561[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1562[] = {
+static int parser_action_row1607[] = {
        2,
-       -1, 3, 1561,
-       15, 0, 1620
+       -1, 3, 1606,
+       15, 0, 1665
 };
-static int parser_action_row1563[] = {
+static int parser_action_row1608[] = {
        3,
-       -1, 3, 1562,
-       14, 0, 1559,
-       15, 0, 1621
+       -1, 3, 1607,
+       14, 0, 1604,
+       15, 0, 1666
 };
-static int parser_action_row1564[] = {
+static int parser_action_row1609[] = {
        4,
        -1, 1, 76,
-       14, 0, 1623,
-       15, 0, 1624,
-       58, 0, 1625
+       14, 0, 1668,
+       15, 0, 1669,
+       59, 0, 1670
 };
-static int parser_action_row1565[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1610[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16057,475 +17071,496 @@ static int parser_action_row1565[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1566[] = {
+static int parser_action_row1611[] = {
        3,
        -1, 1, 118,
-       4, 0, 888,
-       15, 0, 1629
+       4, 0, 918,
+       15, 0, 1674
 };
-static int parser_action_row1567[] = {
+static int parser_action_row1612[] = {
        3,
-       -1, 3, 1566,
+       -1, 3, 1611,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row1568[] = {
+static int parser_action_row1613[] = {
        1,
        -1, 1, 49
 };
-static int parser_action_row1569[] = {
+static int parser_action_row1614[] = {
        4,
        -1, 1, 118,
-       4, 0, 888,
-       14, 0, 889,
-       15, 0, 1632
+       4, 0, 918,
+       14, 0, 919,
+       15, 0, 1677
 };
-static int parser_action_row1570[] = {
+static int parser_action_row1615[] = {
        2,
        -1, 1, 76,
-       14, 0, 880
+       14, 0, 910
 };
-static int parser_action_row1571[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1616[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1572[] = {
+static int parser_action_row1617[] = {
        2,
-       -1, 1, 390,
-       80, 0, 181
+       -1, 1, 403,
+       87, 0, 185
 };
-static int parser_action_row1573[] = {
+static int parser_action_row1618[] = {
        1,
-       -1, 1, 613
+       -1, 1, 628
 };
-static int parser_action_row1574[] = {
+static int parser_action_row1619[] = {
        1,
-       -1, 1, 632
+       -1, 1, 647
 };
-static int parser_action_row1575[] = {
+static int parser_action_row1620[] = {
        1,
-       -1, 1, 604
+       -1, 1, 619
 };
-static int parser_action_row1576[] = {
+static int parser_action_row1621[] = {
        1,
-       -1, 1, 623
+       -1, 1, 638
 };
-static int parser_action_row1577[] = {
+static int parser_action_row1622[] = {
        1,
-       -1, 1, 616
+       -1, 1, 631
 };
-static int parser_action_row1578[] = {
+static int parser_action_row1623[] = {
        1,
-       -1, 1, 635
+       -1, 1, 650
 };
-static int parser_action_row1579[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1624[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1580[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1625[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1581[] = {
-       6,
-       -1, 1, 682,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 1641,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1626[] = {
+       12,
+       -1, 1, 698,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 1686,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1582[] = {
+static int parser_action_row1627[] = {
        2,
-       -1, 3, 1581,
-       83, 0, 1644
+       -1, 3, 1626,
+       90, 0, 1689
 };
-static int parser_action_row1583[] = {
+static int parser_action_row1628[] = {
        18,
-       -1, 1, 424,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 1645
+       -1, 1, 437,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 1690
 };
-static int parser_action_row1584[] = {
+static int parser_action_row1629[] = {
        1,
-       -1, 1, 737
+       -1, 1, 753
 };
-static int parser_action_row1585[] = {
+static int parser_action_row1630[] = {
        19,
-       -1, 1, 426,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       81, 0, 47,
-       82, 0, 1646
+       -1, 1, 439,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       88, 0, 48,
+       89, 0, 1691
 };
-static int parser_action_row1586[] = {
+static int parser_action_row1631[] = {
        1,
-       -1, 1, 621
+       -1, 1, 636
 };
-static int parser_action_row1587[] = {
+static int parser_action_row1632[] = {
        1,
-       -1, 1, 640
+       -1, 1, 655
 };
-static int parser_action_row1588[] = {
+static int parser_action_row1633[] = {
        1,
-       -1, 1, 620
+       -1, 1, 635
 };
-static int parser_action_row1589[] = {
+static int parser_action_row1634[] = {
        1,
-       -1, 1, 639
+       -1, 1, 654
 };
-static int parser_action_row1590[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1635[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1591[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1636[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1592[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1637[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1593[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1638[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1594[] = {
-       4,
-       -1, 1, 693,
-       58, 0, 1652,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1639[] = {
+       10,
+       -1, 1, 709,
+       59, 0, 1697,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1595[] = {
+static int parser_action_row1640[] = {
        1,
-       -1, 1, 332
+       -1, 1, 345
 };
-static int parser_action_row1596[] = {
+static int parser_action_row1641[] = {
        1,
-       -1, 1, 713
+       -1, 1, 729
 };
-static int parser_action_row1597[] = {
+static int parser_action_row1642[] = {
        1,
-       -1, 1, 854
+       -1, 1, 872
 };
-static int parser_action_row1598[] = {
+static int parser_action_row1643[] = {
        2,
-       -1, 3, 1597,
-       15, 0, 1654
+       -1, 3, 1642,
+       15, 0, 1699
 };
-static int parser_action_row1599[] = {
+static int parser_action_row1644[] = {
        1,
-       -1, 1, 378
+       -1, 1, 391
 };
-static int parser_action_row1600[] = {
+static int parser_action_row1645[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1601[] = {
+static int parser_action_row1646[] = {
        1,
-       -1, 1, 543
+       -1, 1, 557
 };
-static int parser_action_row1602[] = {
+static int parser_action_row1647[] = {
        2,
-       -1, 1, 546,
-       51, 0, 242
+       -1, 1, 560,
+       52, 0, 253
 };
-static int parser_action_row1603[] = {
+static int parser_action_row1648[] = {
        3,
-       -1, 1, 550,
-       51, 0, 242,
-       57, 0, 191
+       -1, 1, 564,
+       52, 0, 253,
+       58, 0, 196
 };
-static int parser_action_row1604[] = {
+static int parser_action_row1649[] = {
        2,
-       -1, 3, 1603,
-       82, 0, 1658
+       -1, 3, 1648,
+       89, 0, 1703
 };
-static int parser_action_row1605[] = {
+static int parser_action_row1650[] = {
        2,
-       -1, 3, 1604,
-       45, 0, 1659
+       -1, 3, 1649,
+       45, 0, 1704
 };
-static int parser_action_row1606[] = {
+static int parser_action_row1651[] = {
        4,
-       -1, 3, 1605,
-       31, 0, 1660,
-       47, 0, 349,
-       81, 0, 350
+       -1, 3, 1650,
+       31, 0, 1705,
+       47, 0, 365,
+       88, 0, 366
 };
-static int parser_action_row1607[] = {
+static int parser_action_row1652[] = {
        1,
-       -1, 1, 529
+       -1, 1, 543
 };
-static int parser_action_row1608[] = {
-       49,
-       -1, 1, 427,
-       12, 0, 153,
+static int parser_action_row1653[] = {
+       50,
+       -1, 1, 440,
+       12, 0, 156,
        15, 0, 27,
        16, 0, 28,
-       22, 0, 154,
+       22, 0, 157,
        25, 0, 30,
        26, 0, 31,
        27, 0, 32,
-       31, 0, 155,
-       33, 0, 352,
-       34, 0, 353,
-       35, 0, 354,
-       36, 0, 355,
+       31, 0, 158,
+       33, 0, 368,
+       34, 0, 369,
+       35, 0, 370,
+       36, 0, 371,
        37, 0, 38,
-       38, 0, 156,
-       40, 0, 157,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       47, 0, 349,
-       48, 0, 158,
-       50, 0, 356,
-       51, 0, 45,
-       53, 0, 357,
-       64, 0, 358,
-       65, 0, 359,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       80, 0, 181,
-       81, 0, 373,
-       82, 0, 374,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       47, 0, 365,
+       48, 0, 161,
+       50, 0, 44,
+       51, 0, 372,
+       52, 0, 46,
+       54, 0, 373,
+       71, 0, 374,
+       72, 0, 375,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       87, 0, 185,
+       88, 0, 389,
+       89, 0, 390,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1609[] = {
+static int parser_action_row1654[] = {
        1,
-       -1, 1, 384
+       -1, 1, 397
 };
-static int parser_action_row1610[] = {
+static int parser_action_row1655[] = {
        1,
-       -1, 1, 387
+       -1, 1, 400
 };
-static int parser_action_row1611[] = {
+static int parser_action_row1656[] = {
        2,
-       -1, 3, 1610,
-       47, 0, 1663
+       -1, 3, 1655,
+       47, 0, 1708
 };
-static int parser_action_row1612[] = {
+static int parser_action_row1657[] = {
        4,
-       -1, 3, 1611,
-       31, 0, 1664,
-       47, 0, 1665,
-       81, 0, 350
+       -1, 3, 1656,
+       31, 0, 1709,
+       47, 0, 1710,
+       88, 0, 366
 };
-static int parser_action_row1613[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1658[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16545,57 +17580,58 @@ static int parser_action_row1613[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1614[] = {
+static int parser_action_row1659[] = {
        3,
        -1, 1, 118,
-       4, 0, 888,
-       15, 0, 1668
+       4, 0, 918,
+       15, 0, 1713
 };
-static int parser_action_row1615[] = {
+static int parser_action_row1660[] = {
        3,
-       -1, 3, 1614,
+       -1, 3, 1659,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row1616[] = {
+static int parser_action_row1661[] = {
        1,
        -1, 1, 48
 };
-static int parser_action_row1617[] = {
+static int parser_action_row1662[] = {
        1,
        -1, 1, 67
 };
-static int parser_action_row1618[] = {
+static int parser_action_row1663[] = {
        1,
        -1, 1, 77
 };
-static int parser_action_row1619[] = {
+static int parser_action_row1664[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1620[] = {
+static int parser_action_row1665[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1621[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1666[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16615,22 +17651,23 @@ static int parser_action_row1621[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1622[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1667[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16650,34 +17687,35 @@ static int parser_action_row1622[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1623[] = {
+static int parser_action_row1668[] = {
        2,
-       -1, 3, 1622,
-       15, 0, 1675
+       -1, 3, 1667,
+       15, 0, 1720
 };
-static int parser_action_row1624[] = {
+static int parser_action_row1669[] = {
        4,
        -1, 1, 28,
-       0, 0, 81,
-       1, 0, 82,
+       0, 0, 83,
+       1, 0, 84,
        13, 0, 26
 };
-static int parser_action_row1625[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1670[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16697,42 +17735,43 @@ static int parser_action_row1625[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1626[] = {
+static int parser_action_row1671[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1627[] = {
+static int parser_action_row1672[] = {
        1,
        -1, 1, 57
 };
-static int parser_action_row1628[] = {
+static int parser_action_row1673[] = {
        2,
-       -1, 3, 1627,
-       15, 0, 1680
+       -1, 3, 1672,
+       15, 0, 1725
 };
-static int parser_action_row1629[] = {
+static int parser_action_row1674[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1630[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1675[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16752,32 +17791,33 @@ static int parser_action_row1630[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1631[] = {
+static int parser_action_row1676[] = {
        3,
-       -1, 3, 1630,
+       -1, 3, 1675,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row1632[] = {
+static int parser_action_row1677[] = {
        1,
        -1, 1, 68
 };
-static int parser_action_row1633[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1678[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -16797,330 +17837,360 @@ static int parser_action_row1633[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1634[] = {
+static int parser_action_row1679[] = {
        3,
        -1, 1, 118,
-       4, 0, 888,
-       15, 0, 1685
+       4, 0, 918,
+       15, 0, 1730
 };
-static int parser_action_row1635[] = {
+static int parser_action_row1680[] = {
        3,
-       -1, 3, 1634,
+       -1, 3, 1679,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row1636[] = {
+static int parser_action_row1681[] = {
        1,
        -1, 1, 50
 };
-static int parser_action_row1637[] = {
+static int parser_action_row1682[] = {
        1,
        -1, 1, 41
 };
-static int parser_action_row1638[] = {
+static int parser_action_row1683[] = {
        1,
-       -1, 1, 931
+       -1, 1, 954
 };
-static int parser_action_row1639[] = {
+static int parser_action_row1684[] = {
        1,
-       -1, 1, 391
+       -1, 1, 404
 };
-static int parser_action_row1640[] = {
+static int parser_action_row1685[] = {
        1,
-       -1, 1, 615
+       -1, 1, 630
 };
-static int parser_action_row1641[] = {
+static int parser_action_row1686[] = {
        1,
-       -1, 1, 634
+       -1, 1, 649
 };
-static int parser_action_row1642[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1687[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1643[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1688[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1644[] = {
-       4,
-       -1, 1, 681,
-       58, 0, 1690,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1689[] = {
+       10,
+       -1, 1, 697,
+       59, 0, 1735,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1645[] = {
-       4,
-       -1, 1, 679,
-       58, 0, 1692,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1690[] = {
+       10,
+       -1, 1, 695,
+       59, 0, 1737,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1646[] = {
-       5,
-       -1, 1, 684,
-       51, 0, 242,
-       58, 0, 1694,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1691[] = {
+       11,
+       -1, 1, 700,
+       52, 0, 253,
+       59, 0, 1739,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1647[] = {
-       6,
-       -1, 1, 688,
-       51, 0, 242,
-       57, 0, 191,
-       58, 0, 1697,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1692[] = {
+       12,
+       -1, 1, 704,
+       52, 0, 253,
+       58, 0, 196,
+       59, 0, 1742,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1648[] = {
+static int parser_action_row1693[] = {
        18,
-       -1, 1, 425,
-       53, 0, 555,
-       64, 0, 358,
-       65, 0, 556,
-       66, 0, 360,
-       67, 0, 361,
-       68, 0, 362,
-       69, 0, 363,
-       70, 0, 364,
-       71, 0, 365,
-       72, 0, 366,
-       73, 0, 367,
-       74, 0, 368,
-       75, 0, 369,
-       76, 0, 370,
-       77, 0, 371,
-       78, 0, 372,
-       82, 0, 1700
+       -1, 1, 438,
+       54, 0, 575,
+       71, 0, 576,
+       72, 0, 577,
+       73, 0, 376,
+       74, 0, 377,
+       75, 0, 378,
+       76, 0, 379,
+       77, 0, 380,
+       78, 0, 381,
+       79, 0, 382,
+       80, 0, 383,
+       81, 0, 384,
+       82, 0, 385,
+       83, 0, 386,
+       84, 0, 387,
+       85, 0, 388,
+       89, 0, 1745
 };
-static int parser_action_row1649[] = {
+static int parser_action_row1694[] = {
        1,
-       -1, 1, 619
+       -1, 1, 634
 };
-static int parser_action_row1650[] = {
+static int parser_action_row1695[] = {
        1,
-       -1, 1, 638
+       -1, 1, 653
 };
-static int parser_action_row1651[] = {
+static int parser_action_row1696[] = {
        1,
-       -1, 1, 618
+       -1, 1, 633
 };
-static int parser_action_row1652[] = {
+static int parser_action_row1697[] = {
        1,
-       -1, 1, 637
+       -1, 1, 652
 };
-static int parser_action_row1653[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1698[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1654[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1699[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1655[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1700[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 938,
-       12, 0, 804,
-       15, 0, 805,
+       9, 0, 968,
+       12, 0, 828,
+       15, 0, 829,
        16, 0, 28,
-       22, 0, 806,
-       25, 0, 808,
-       26, 0, 809,
-       27, 0, 810,
-       33, 0, 811,
-       34, 0, 812,
-       35, 0, 813,
-       36, 0, 814,
-       37, 0, 815,
+       22, 0, 830,
+       25, 0, 832,
+       26, 0, 833,
+       27, 0, 834,
+       33, 0, 835,
+       34, 0, 836,
+       35, 0, 837,
+       36, 0, 838,
+       37, 0, 839,
        38, 0, 39,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       50, 0, 816,
-       51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 817,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       50, 0, 840,
+       51, 0, 841,
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 842,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1656[] = {
+static int parser_action_row1701[] = {
        2,
-       -1, 3, 1655,
-       24, 0, 1705
+       -1, 3, 1700,
+       24, 0, 1750
 };
-static int parser_action_row1657[] = {
+static int parser_action_row1702[] = {
        1,
-       -1, 1, 545
+       -1, 1, 559
 };
-static int parser_action_row1658[] = {
+static int parser_action_row1703[] = {
        1,
-       -1, 1, 549
+       -1, 1, 563
 };
-static int parser_action_row1659[] = {
+static int parser_action_row1704[] = {
        2,
-       -1, 1, 548,
-       51, 0, 242
+       -1, 1, 562,
+       52, 0, 253
 };
-static int parser_action_row1660[] = {
+static int parser_action_row1705[] = {
        1,
-       -1, 1, 553
+       -1, 1, 567
 };
-static int parser_action_row1661[] = {
+static int parser_action_row1706[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1662[] = {
+static int parser_action_row1707[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1663[] = {
+static int parser_action_row1708[] = {
        2,
-       -1, 3, 1662,
-       52, 0, 1709
+       -1, 3, 1707,
+       53, 0, 1754
 };
-static int parser_action_row1664[] = {
+static int parser_action_row1709[] = {
        1,
        -1, 1, 131
 };
-static int parser_action_row1665[] = {
+static int parser_action_row1710[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1666[] = {
+static int parser_action_row1711[] = {
        4,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       81, 0, 539
+       88, 0, 559
 };
-static int parser_action_row1667[] = {
+static int parser_action_row1712[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1668[] = {
+static int parser_action_row1713[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1669[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1714[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -17140,50 +18210,51 @@ static int parser_action_row1669[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1670[] = {
+static int parser_action_row1715[] = {
        3,
-       -1, 3, 1669,
+       -1, 3, 1714,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row1671[] = {
+static int parser_action_row1716[] = {
        1,
        -1, 1, 55
 };
-static int parser_action_row1672[] = {
+static int parser_action_row1717[] = {
        1,
        -1, 1, 78
 };
-static int parser_action_row1673[] = {
+static int parser_action_row1718[] = {
        1,
        -1, 1, 63
 };
-static int parser_action_row1674[] = {
+static int parser_action_row1719[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1675[] = {
+static int parser_action_row1720[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1676[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1721[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -17203,63 +18274,65 @@ static int parser_action_row1676[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1677[] = {
+static int parser_action_row1722[] = {
        2,
        -1, 1, 74,
        15, 1, 77
 };
-static int parser_action_row1678[] = {
+static int parser_action_row1723[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1679[] = {
+static int parser_action_row1724[] = {
        2,
        -1, 1, 59,
-       9, 0, 1720
+       9, 0, 1765
 };
-static int parser_action_row1680[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1725[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1681[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1726[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -17279,40 +18352,41 @@ static int parser_action_row1681[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1682[] = {
+static int parser_action_row1727[] = {
        1,
        -1, 1, 51
 };
-static int parser_action_row1683[] = {
+static int parser_action_row1728[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1684[] = {
+static int parser_action_row1729[] = {
        1,
        -1, 1, 70
 };
-static int parser_action_row1685[] = {
+static int parser_action_row1730[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1686[] = {
-       32,
-       -1, 1, 427,
+static int parser_action_row1731[] = {
+       33,
+       -1, 1, 440,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 528,
+       9, 0, 545,
        12, 0, 25,
        15, 0, 27,
        16, 0, 28,
@@ -17332,760 +18406,802 @@ static int parser_action_row1686[] = {
        45, 0, 43,
        50, 0, 44,
        51, 0, 45,
-       53, 0, 46,
-       81, 0, 47,
-       82, 0, 48,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       52, 0, 46,
+       54, 0, 47,
+       88, 0, 48,
+       89, 0, 49,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1687[] = {
+static int parser_action_row1732[] = {
        3,
-       -1, 3, 1686,
+       -1, 3, 1731,
        28, 0, 33,
-       94, 0, 55
+       101, 0, 56
 };
-static int parser_action_row1688[] = {
+static int parser_action_row1733[] = {
        1,
        -1, 1, 69
 };
-static int parser_action_row1689[] = {
+static int parser_action_row1734[] = {
        1,
-       -1, 1, 606
+       -1, 1, 621
 };
-static int parser_action_row1690[] = {
+static int parser_action_row1735[] = {
        1,
-       -1, 1, 625
+       -1, 1, 640
 };
-static int parser_action_row1691[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1736[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1692[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1737[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1693[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1738[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1694[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1739[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1695[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1740[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1696[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1741[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1697[] = {
-       4,
-       -1, 1, 683,
-       58, 0, 1733,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1742[] = {
+       10,
+       -1, 1, 699,
+       59, 0, 1778,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1698[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+static int parser_action_row1743[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1699[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1744[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1700[] = {
-       4,
-       -1, 1, 687,
-       58, 0, 1737,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1745[] = {
+       10,
+       -1, 1, 703,
+       59, 0, 1782,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1701[] = {
-       5,
-       -1, 1, 686,
-       51, 0, 242,
-       58, 0, 1739,
-       59, 0, 193,
-       60, 0, 194
+static int parser_action_row1746[] = {
+       11,
+       -1, 1, 702,
+       52, 0, 253,
+       59, 0, 1784,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
 };
-static int parser_action_row1702[] = {
+static int parser_action_row1747[] = {
        1,
-       -1, 1, 617
+       -1, 1, 632
 };
-static int parser_action_row1703[] = {
+static int parser_action_row1748[] = {
        1,
-       -1, 1, 636
+       -1, 1, 651
 };
-static int parser_action_row1704[] = {
+static int parser_action_row1749[] = {
        1,
-       -1, 1, 860
+       -1, 1, 878
 };
-static int parser_action_row1705[] = {
+static int parser_action_row1750[] = {
        2,
-       -1, 3, 1704,
-       49, 0, 174
+       -1, 3, 1749,
+       49, 0, 178
 };
-static int parser_action_row1706[] = {
+static int parser_action_row1751[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1707[] = {
+static int parser_action_row1752[] = {
        1,
-       -1, 1, 547
+       -1, 1, 561
 };
-static int parser_action_row1708[] = {
+static int parser_action_row1753[] = {
        2,
-       -1, 3, 1707,
-       45, 0, 1744
+       -1, 3, 1752,
+       45, 0, 1789
 };
-static int parser_action_row1709[] = {
+static int parser_action_row1754[] = {
        2,
-       -1, 3, 1708,
-       52, 0, 1745
+       -1, 3, 1753,
+       53, 0, 1790
 };
-static int parser_action_row1710[] = {
+static int parser_action_row1755[] = {
        4,
-       -1, 3, 1709,
-       0, 0, 81,
-       1, 0, 82,
-       80, 0, 181
+       -1, 3, 1754,
+       0, 0, 83,
+       1, 0, 84,
+       87, 0, 185
 };
-static int parser_action_row1711[] = {
+static int parser_action_row1756[] = {
        2,
-       -1, 3, 1710,
-       47, 0, 1748
+       -1, 3, 1755,
+       47, 0, 1793
 };
-static int parser_action_row1712[] = {
+static int parser_action_row1757[] = {
        2,
-       -1, 3, 1711,
-       52, 0, 1749
+       -1, 3, 1756,
+       53, 0, 1794
 };
-static int parser_action_row1713[] = {
+static int parser_action_row1758[] = {
        2,
-       -1, 3, 1712,
-       52, 0, 1750
+       -1, 3, 1757,
+       53, 0, 1795
 };
-static int parser_action_row1714[] = {
+static int parser_action_row1759[] = {
        1,
        -1, 1, 46
 };
-static int parser_action_row1715[] = {
+static int parser_action_row1760[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1716[] = {
+static int parser_action_row1761[] = {
        1,
        -1, 1, 56
 };
-static int parser_action_row1717[] = {
+static int parser_action_row1762[] = {
        1,
        -1, 1, 65
 };
-static int parser_action_row1718[] = {
+static int parser_action_row1763[] = {
        1,
        -1, 1, 64
 };
-static int parser_action_row1719[] = {
+static int parser_action_row1764[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1720[] = {
+static int parser_action_row1765[] = {
        2,
        -1, 1, 78,
-       9, 0, 1306
+       9, 0, 1345
 };
-static int parser_action_row1721[] = {
+static int parser_action_row1766[] = {
        1,
        -1, 1, 61
 };
-static int parser_action_row1722[] = {
+static int parser_action_row1767[] = {
        2,
        -1, 1, 76,
-       14, 0, 880
+       14, 0, 910
 };
-static int parser_action_row1723[] = {
+static int parser_action_row1768[] = {
        2,
        -1, 1, 60,
-       9, 0, 1754
+       9, 0, 1799
 };
-static int parser_action_row1724[] = {
+static int parser_action_row1769[] = {
        1,
        -1, 1, 53
 };
-static int parser_action_row1725[] = {
+static int parser_action_row1770[] = {
        1,
        -1, 1, 52
 };
-static int parser_action_row1726[] = {
+static int parser_action_row1771[] = {
        2,
-       -1, 1, 438,
-       9, 0, 1203
+       -1, 1, 451,
+       9, 0, 1241
 };
-static int parser_action_row1727[] = {
+static int parser_action_row1772[] = {
        1,
        -1, 1, 71
 };
-static int parser_action_row1728[] = {
+static int parser_action_row1773[] = {
        1,
-       -1, 1, 605
+       -1, 1, 620
 };
-static int parser_action_row1729[] = {
+static int parser_action_row1774[] = {
        1,
-       -1, 1, 624
+       -1, 1, 639
 };
-static int parser_action_row1730[] = {
+static int parser_action_row1775[] = {
        1,
-       -1, 1, 603
+       -1, 1, 618
 };
-static int parser_action_row1731[] = {
+static int parser_action_row1776[] = {
        1,
-       -1, 1, 622
+       -1, 1, 637
 };
-static int parser_action_row1732[] = {
+static int parser_action_row1777[] = {
        1,
-       -1, 1, 608
+       -1, 1, 623
 };
-static int parser_action_row1733[] = {
+static int parser_action_row1778[] = {
        1,
-       -1, 1, 627
+       -1, 1, 642
 };
-static int parser_action_row1734[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1779[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row1735[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1780[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row1736[] = {
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1781[] = {
        1,
-       -1, 1, 612
+       -1, 1, 627
 };
-static int parser_action_row1737[] = {
+static int parser_action_row1782[] = {
        1,
-       -1, 1, 631
+       -1, 1, 646
 };
-static int parser_action_row1738[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1783[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row1739[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1784[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row1740[] = {
-       24,
-       -1, 1, 473,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
-       41, 1, 427,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1785[] = {
+       25,
+       -1, 1, 486,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
+       41, 1, 440,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       83, 1, 427,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row1741[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       90, 1, 440,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1786[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row1742[] = {
-       4,
-       -1, 1, 685,
-       58, 0, 1762,
-       59, 0, 193,
-       60, 0, 194
-};
-static int parser_action_row1743[] = {
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1787[] = {
+       10,
+       -1, 1, 701,
+       59, 0, 1807,
+       60, 0, 198,
+       61, 0, 199,
+       62, 0, 200,
+       63, 0, 201,
+       64, 0, 202,
+       65, 0, 203,
+       66, 0, 204,
+       67, 0, 205
+};
+static int parser_action_row1788[] = {
        2,
-       -1, 1, 253,
-       24, 1, 859
-};
-static int parser_action_row1744[] = {
-       21,
-       -1, 1, 427,
-       12, 0, 1000,
-       22, 0, 1001,
-       31, 0, 1002,
-       38, 0, 1003,
-       40, 0, 1004,
-       42, 0, 1005,
-       43, 0, 1006,
-       44, 0, 1007,
-       45, 0, 1008,
-       48, 0, 1009,
-       51, 0, 45,
-       65, 0, 1010,
-       81, 0, 47,
-       82, 0, 1011,
-       84, 0, 1012,
-       85, 0, 1013,
-       86, 0, 1014,
-       87, 0, 1015,
-       88, 0, 53,
-       91, 0, 1016
+       -1, 1, 260,
+       24, 1, 877
 };
-static int parser_action_row1745[] = {
+static int parser_action_row1789[] = {
+       22,
+       -1, 1, 440,
+       12, 0, 1034,
+       22, 0, 1035,
+       31, 0, 1036,
+       38, 0, 1037,
+       40, 0, 1038,
+       42, 0, 1039,
+       43, 0, 1040,
+       44, 0, 1041,
+       45, 0, 1042,
+       48, 0, 1043,
+       52, 0, 46,
+       71, 0, 1044,
+       72, 0, 1045,
+       88, 0, 48,
+       89, 0, 1046,
+       91, 0, 1047,
+       92, 0, 1048,
+       93, 0, 1049,
+       94, 0, 1050,
+       95, 0, 54,
+       98, 0, 1051
+};
+static int parser_action_row1790[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1746[] = {
+static int parser_action_row1791[] = {
        1,
-       -1, 1, 551
+       -1, 1, 565
 };
-static int parser_action_row1747[] = {
+static int parser_action_row1792[] = {
        3,
-       -1, 3, 1746,
-       0, 0, 81,
-       1, 0, 82
+       -1, 3, 1791,
+       0, 0, 83,
+       1, 0, 84
 };
-static int parser_action_row1748[] = {
+static int parser_action_row1793[] = {
        1,
-       -1, 1, 385
+       -1, 1, 398
 };
-static int parser_action_row1749[] = {
+static int parser_action_row1794[] = {
        3,
-       -1, 1, 445,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1750[] = {
+static int parser_action_row1795[] = {
        1,
        -1, 1, 128
 };
-static int parser_action_row1751[] = {
+static int parser_action_row1796[] = {
        1,
        -1, 1, 126
 };
-static int parser_action_row1752[] = {
+static int parser_action_row1797[] = {
        1,
        -1, 1, 47
 };
-static int parser_action_row1753[] = {
+static int parser_action_row1798[] = {
        1,
        -1, 1, 66
 };
-static int parser_action_row1754[] = {
+static int parser_action_row1799[] = {
        1,
        -1, 1, 58
 };
-static int parser_action_row1755[] = {
+static int parser_action_row1800[] = {
        1,
        -1, 1, 62
 };
-static int parser_action_row1756[] = {
+static int parser_action_row1801[] = {
        1,
        -1, 1, 54
 };
-static int parser_action_row1757[] = {
+static int parser_action_row1802[] = {
        1,
-       -1, 1, 607
+       -1, 1, 622
 };
-static int parser_action_row1758[] = {
+static int parser_action_row1803[] = {
        1,
-       -1, 1, 626
+       -1, 1, 641
 };
-static int parser_action_row1759[] = {
+static int parser_action_row1804[] = {
        1,
-       -1, 1, 611
+       -1, 1, 626
 };
-static int parser_action_row1760[] = {
+static int parser_action_row1805[] = {
        1,
-       -1, 1, 630
+       -1, 1, 645
 };
-static int parser_action_row1761[] = {
+static int parser_action_row1806[] = {
        1,
-       -1, 1, 610
+       -1, 1, 625
 };
-static int parser_action_row1762[] = {
+static int parser_action_row1807[] = {
        1,
-       -1, 1, 629
+       -1, 1, 644
 };
-static int parser_action_row1763[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+static int parser_action_row1808[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
-};
-static int parser_action_row1764[] = {
-       22,
-       -1, 1, 427,
-       12, 0, 153,
-       22, 0, 154,
-       31, 0, 155,
-       38, 0, 156,
-       40, 0, 157,
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
+};
+static int parser_action_row1809[] = {
+       23,
+       -1, 1, 440,
+       12, 0, 156,
+       22, 0, 157,
+       31, 0, 158,
+       38, 0, 159,
+       40, 0, 160,
        42, 0, 40,
        43, 0, 41,
        44, 0, 42,
        45, 0, 43,
-       48, 0, 158,
-       51, 0, 45,
-       53, 0, 46,
-       65, 0, 159,
-       81, 0, 47,
-       82, 0, 160,
-       84, 0, 49,
-       85, 0, 50,
-       86, 0, 51,
-       87, 0, 52,
-       88, 0, 53,
-       91, 0, 54
+       48, 0, 161,
+       52, 0, 46,
+       54, 0, 47,
+       71, 0, 162,
+       72, 0, 163,
+       88, 0, 48,
+       89, 0, 164,
+       91, 0, 50,
+       92, 0, 51,
+       93, 0, 52,
+       94, 0, 53,
+       95, 0, 54,
+       98, 0, 55
 };
-static int parser_action_row1765[] = {
+static int parser_action_row1810[] = {
        1,
-       -1, 1, 482
+       -1, 1, 495
 };
-static int parser_action_row1766[] = {
+static int parser_action_row1811[] = {
        2,
-       -1, 3, 1765,
-       52, 0, 1770
+       -1, 3, 1810,
+       53, 0, 1815
 };
-static int parser_action_row1767[] = {
+static int parser_action_row1812[] = {
        1,
-       -1, 1, 386
+       -1, 1, 399
 };
-static int parser_action_row1768[] = {
+static int parser_action_row1813[] = {
        2,
-       -1, 3, 1767,
-       52, 0, 1771
+       -1, 3, 1812,
+       53, 0, 1816
 };
-static int parser_action_row1769[] = {
+static int parser_action_row1814[] = {
        1,
-       -1, 1, 609
+       -1, 1, 624
 };
-static int parser_action_row1770[] = {
+static int parser_action_row1815[] = {
        1,
-       -1, 1, 628
+       -1, 1, 643
 };
-static int parser_action_row1771[] = {
+static int parser_action_row1816[] = {
        1,
-       -1, 1, 552
+       -1, 1, 566
 };
-static int parser_action_row1772[] = {
+static int parser_action_row1817[] = {
        1,
        -1, 1, 130
 };
@@ -19862,7 +20978,52 @@ const int* const parser_action_table[] = {
        parser_action_row1769,
        parser_action_row1770,
        parser_action_row1771,
-       parser_action_row1772
+       parser_action_row1772,
+       parser_action_row1773,
+       parser_action_row1774,
+       parser_action_row1775,
+       parser_action_row1776,
+       parser_action_row1777,
+       parser_action_row1778,
+       parser_action_row1779,
+       parser_action_row1780,
+       parser_action_row1781,
+       parser_action_row1782,
+       parser_action_row1783,
+       parser_action_row1784,
+       parser_action_row1785,
+       parser_action_row1786,
+       parser_action_row1787,
+       parser_action_row1788,
+       parser_action_row1789,
+       parser_action_row1790,
+       parser_action_row1791,
+       parser_action_row1792,
+       parser_action_row1793,
+       parser_action_row1794,
+       parser_action_row1795,
+       parser_action_row1796,
+       parser_action_row1797,
+       parser_action_row1798,
+       parser_action_row1799,
+       parser_action_row1800,
+       parser_action_row1801,
+       parser_action_row1802,
+       parser_action_row1803,
+       parser_action_row1804,
+       parser_action_row1805,
+       parser_action_row1806,
+       parser_action_row1807,
+       parser_action_row1808,
+       parser_action_row1809,
+       parser_action_row1810,
+       parser_action_row1811,
+       parser_action_row1812,
+       parser_action_row1813,
+       parser_action_row1814,
+       parser_action_row1815,
+       parser_action_row1816,
+       parser_action_row1817
 };
 
 static int parser_goto_row1[] = {
@@ -19876,39 +21037,39 @@ static int parser_goto_row2[] = {
 static int parser_goto_row3[] = {
        3,
        -1, 5,
-       15, 84,
-       22, 84
+       15, 86,
+       22, 86
 };
 static int parser_goto_row4[] = {
        9,
        -1, 6,
-       17, 92,
-       24, 92,
-       87, 92,
-       91, 92,
-       101, 92,
-       103, 92,
-       233, 92,
-       239, 92
+       17, 94,
+       24, 94,
+       89, 94,
+       93, 94,
+       103, 94,
+       105, 94,
+       244, 94,
+       250, 94
 };
 static int parser_goto_row5[] = {
        16,
        -1, 7,
        4, 20,
-       15, 85,
-       16, 88,
-       17, 93,
-       22, 99,
-       23, 102,
-       24, 104,
-       86, 232,
-       87, 234,
-       91, 236,
-       100, 238,
-       101, 240,
-       103, 241,
-       233, 447,
-       239, 449
+       15, 87,
+       16, 90,
+       17, 95,
+       22, 101,
+       23, 104,
+       24, 106,
+       88, 243,
+       89, 245,
+       93, 247,
+       102, 249,
+       103, 251,
+       105, 252,
+       244, 464,
+       250, 466
 };
 static int parser_goto_row6[] = {
        1,
@@ -19920,142 +21081,142 @@ static int parser_goto_row7[] = {
 };
 static int parser_goto_row8[] = {
        10,
-       -1, 710,
-       12, 56,
-       21, 98,
-       90, 235,
-       94, 235,
-       181, 347,
-       533, 707,
-       1059, 1214,
-       1186, 1307,
-       1218, 1214
+       -1, 731,
+       12, 57,
+       21, 100,
+       92, 246,
+       96, 246,
+       185, 360,
+       550, 728,
+       1094, 1252,
+       1224, 1346,
+       1256, 1252
 };
 static int parser_goto_row9[] = {
        1,
-       -1, 417
+       -1, 434
 };
 static int parser_goto_row10[] = {
        1,
-       -1, 897
+       -1, 927
 };
 static int parser_goto_row11[] = {
        2,
-       -1, 1325,
-       1327, 1438
+       -1, 1364,
+       1366, 1480
 };
 static int parser_goto_row12[] = {
        2,
-       -1, 1208,
-       1436, 1499
+       -1, 1246,
+       1478, 1543
 };
 static int parser_goto_row13[] = {
        2,
-       -1, 1053,
-       1060, 1216
+       -1, 1088,
+       1095, 1254
 };
 static int parser_goto_row14[] = {
        2,
-       -1, 1054,
-       1057, 1211
+       -1, 1089,
+       1092, 1249
 };
 static int parser_goto_row15[] = {
        2,
-       -1, 1055,
-       1060, 1217
+       -1, 1090,
+       1095, 1255
 };
 static int parser_goto_row16[] = {
        1,
-       -1, 1056
+       -1, 1091
 };
 static int parser_goto_row17[] = {
        6,
-       -1, 881,
-       743, 884,
-       1558, 1616,
-       1563, 1626,
-       1569, 1636,
-       1721, 1753
+       -1, 911,
+       767, 914,
+       1603, 1661,
+       1608, 1671,
+       1614, 1681,
+       1766, 1798
 };
 static int parser_goto_row18[] = {
        7,
-       -1, 891,
-       1503, 1561,
-       1506, 1565,
-       1557, 1613,
-       1562, 1622,
-       1563, 1627,
-       1568, 1633
+       -1, 921,
+       1547, 1606,
+       1550, 1610,
+       1602, 1658,
+       1607, 1667,
+       1608, 1672,
+       1613, 1678
 };
 static int parser_goto_row19[] = {
        8,
-       -1, 207,
-       98, 237,
-       235, 448,
-       347, 538,
-       707, 851,
-       710, 855,
-       1214, 1329,
-       1307, 1427
+       -1, 218,
+       100, 248,
+       246, 465,
+       360, 555,
+       728, 877,
+       731, 881,
+       1252, 1368,
+       1346, 1469
 };
 static int parser_goto_row20[] = {
        4,
-       -1, 591,
-       593, 752,
-       594, 753,
-       754, 895
+       -1, 612,
+       614, 776,
+       615, 777,
+       778, 925
 };
 static int parser_goto_row21[] = {
        6,
-       -1, 748,
-       1442, 1503,
-       1444, 1506,
-       1501, 1557,
-       1504, 1562,
-       1507, 1568
+       -1, 772,
+       1484, 1547,
+       1486, 1550,
+       1545, 1602,
+       1548, 1607,
+       1551, 1613
 };
 static int parser_goto_row22[] = {
        1,
-       -1, 1042
+       -1, 1077
 };
 static int parser_goto_row23[] = {
        2,
-       -1, 1193,
-       1195, 1314
+       -1, 1231,
+       1233, 1353
 };
 static int parser_goto_row24[] = {
        2,
-       -1, 1043,
-       1313, 1430
+       -1, 1078,
+       1352, 1472
 };
 static int parser_goto_row25[] = {
        8,
-       -1, 892,
-       891, 1050,
-       1506, 1566,
-       1557, 1614,
-       1565, 1630,
-       1568, 1634,
-       1613, 1669,
-       1633, 1686
+       -1, 922,
+       921, 1085,
+       1550, 1611,
+       1602, 1659,
+       1610, 1675,
+       1613, 1679,
+       1658, 1714,
+       1678, 1731
 };
 static int parser_goto_row26[] = {
        2,
-       -1, 1317,
-       1318, 1432
+       -1, 1356,
+       1357, 1474
 };
 static int parser_goto_row27[] = {
        2,
-       -1, 1197,
-       1431, 1497
+       -1, 1235,
+       1473, 1541
 };
 static int parser_goto_row28[] = {
        1,
-       -1, 1198
+       -1, 1236
 };
 static int parser_goto_row29[] = {
        1,
-       -1, 1199
+       -1, 1237
 };
 static int parser_goto_row30[] = {
        1,
@@ -20063,20 +21224,20 @@ static int parser_goto_row30[] = {
 };
 static int parser_goto_row31[] = {
        1,
-       -1, 57
+       -1, 58
 };
 static int parser_goto_row32[] = {
        10,
-       -1, 58,
-       892, 1051,
-       897, 1057,
-       1050, 1206,
-       1566, 1631,
-       1614, 1670,
-       1630, 1683,
-       1634, 1687,
-       1669, 1715,
-       1686, 1726
+       -1, 59,
+       922, 1086,
+       927, 1092,
+       1085, 1244,
+       1611, 1676,
+       1659, 1715,
+       1675, 1728,
+       1679, 1732,
+       1714, 1760,
+       1731, 1771
 };
 static int parser_goto_row33[] = {
        1,
@@ -20085,1453 +21246,1499 @@ static int parser_goto_row33[] = {
 static int parser_goto_row34[] = {
        5,
        -1, 10,
-       16, 89,
-       23, 89,
-       86, 89,
-       100, 89
+       16, 91,
+       23, 91,
+       88, 91,
+       102, 91
 };
 static int parser_goto_row35[] = {
        24,
-       -1, 375,
-       187, 351,
-       469, 640,
-       488, 663,
-       509, 680,
-       546, 721,
-       705, 848,
-       719, 848,
-       847, 848,
-       862, 848,
-       887, 1044,
-       954, 1099,
-       1045, 1200,
-       1063, 1221,
-       1088, 1237,
-       1115, 1255,
-       1215, 1338,
-       1431, 1200,
-       1449, 1509,
-       1496, 1338,
-       1498, 1556,
-       1508, 1569,
-       1605, 1661,
-       1611, 1666
+       -1, 391,
+       192, 367,
+       486, 661,
+       505, 684,
+       526, 701,
+       566, 745,
+       726, 874,
+       743, 874,
+       873, 874,
+       892, 874,
+       917, 1079,
+       985, 1135,
+       1080, 1238,
+       1098, 1259,
+       1123, 1275,
+       1151, 1294,
+       1253, 1378,
+       1473, 1238,
+       1491, 1553,
+       1540, 1378,
+       1542, 1601,
+       1552, 1614,
+       1650, 1706,
+       1656, 1711
 };
 static int parser_goto_row36[] = {
        4,
-       -1, 849,
-       719, 863,
-       847, 975,
-       862, 991
+       -1, 875,
+       743, 893,
+       873, 1006,
+       892, 1025
 };
 static int parser_goto_row37[] = {
        2,
-       -1, 977,
-       978, 1116
+       -1, 1008,
+       1009, 1152
 };
 static int parser_goto_row38[] = {
        5,
-       -1, 749,
-       1041, 1188,
-       1189, 1310,
-       1191, 1311,
-       1502, 1558
+       -1, 773,
+       1076, 1226,
+       1227, 1349,
+       1229, 1350,
+       1546, 1603
 };
 static int parser_goto_row39[] = {
-       6,
-       -1, 295,
-       296, 490,
-       397, 565,
-       1207, 1322,
-       1323, 1435,
-       1505, 1563
+       8,
+       -1, 307,
+       308, 507,
+       362, 556,
+       414, 586,
+       557, 739,
+       1245, 1361,
+       1362, 1477,
+       1549, 1608
 };
 static int parser_goto_row40[] = {
-       28,
-       -1, 141,
-       31, 149,
-       342, 529,
-       527, 700,
-       667, 834,
-       807, 944,
-       809, 149,
-       890, 1048,
-       963, 1106,
-       1049, 1205,
-       1098, 529,
-       1241, 700,
-       1252, 1378,
-       1365, 834,
-       1530, 1106,
-       1560, 1619,
-       1564, 1628,
-       1612, 1667,
-       1620, 1673,
-       1621, 1674,
-       1624, 1678,
-       1629, 1682,
-       1632, 1684,
-       1654, 1378,
-       1668, 1714,
-       1675, 1718,
-       1680, 1722,
-       1685, 1725
+       30,
+       -1, 144,
+       31, 152,
+       355, 546,
+       544, 721,
+       688, 860,
+       740, 890,
+       831, 974,
+       833, 152,
+       920, 1083,
+       994, 1142,
+       1084, 1243,
+       1133, 546,
+       1279, 721,
+       1291, 1420,
+       1406, 860,
+       1411, 890,
+       1574, 1142,
+       1605, 1664,
+       1609, 1673,
+       1657, 1712,
+       1665, 1718,
+       1666, 1719,
+       1669, 1723,
+       1674, 1727,
+       1677, 1729,
+       1699, 1420,
+       1713, 1759,
+       1720, 1763,
+       1725, 1767,
+       1730, 1770
 };
 static int parser_goto_row41[] = {
        1,
-       -1, 59
+       -1, 60
 };
 static int parser_goto_row42[] = {
        2,
-       -1, 60,
-       825, 960
+       -1, 61,
+       850, 991
 };
 static int parser_goto_row43[] = {
        4,
-       -1, 291,
-       530, 702,
-       939, 1091,
-       1243, 1369
+       -1, 303,
+       547, 723,
+       969, 1126,
+       1281, 1410
 };
 static int parser_goto_row44[] = {
        4,
-       -1, 209,
-       211, 419,
-       487, 419,
-       1105, 419
+       -1, 220,
+       222, 436,
+       504, 436,
+       1141, 436
 };
 static int parser_goto_row45[] = {
        16,
-       -1, 142,
-       12, 61,
-       21, 61,
-       90, 61,
-       94, 61,
-       143, 292,
-       210, 418,
-       420, 418,
-       486, 418,
-       530, 292,
-       662, 418,
-       666, 818,
-       825, 961,
-       939, 292,
-       1243, 292,
-       1364, 818
+       -1, 145,
+       12, 62,
+       21, 62,
+       92, 62,
+       96, 62,
+       146, 304,
+       221, 435,
+       437, 435,
+       503, 435,
+       547, 304,
+       683, 435,
+       687, 843,
+       850, 992,
+       969, 304,
+       1281, 304,
+       1405, 843
 };
 static int parser_goto_row46[] = {
-       16,
-       -1, 175,
-       36, 176,
-       144, 293,
-       150, 299,
-       353, 544,
-       354, 545,
-       812, 950,
-       813, 951,
-       835, 967,
-       942, 1092,
-       947, 1095,
-       1331, 1447,
-       1332, 1448,
-       1379, 1476,
-       1468, 1531,
-       1704, 1742
+       18,
+       -1, 179,
+       36, 180,
+       147, 305,
+       153, 311,
+       369, 564,
+       370, 565,
+       836, 980,
+       837, 981,
+       861, 998,
+       891, 1024,
+       972, 1127,
+       977, 1130,
+       1370, 1489,
+       1371, 1490,
+       1421, 1520,
+       1510, 1575,
+       1513, 1577,
+       1749, 1787
 };
 static int parser_goto_row47[] = {
-       19,
-       -1, 62,
-       188, 376,
-       666, 819,
-       725, 376,
-       805, 819,
-       809, 819,
-       990, 376,
-       1098, 819,
-       1215, 1339,
-       1241, 819,
-       1259, 376,
-       1364, 819,
-       1365, 819,
-       1384, 376,
-       1450, 376,
-       1496, 1339,
-       1530, 819,
-       1607, 376,
-       1654, 819
+       20,
+       -1, 63,
+       193, 392,
+       687, 844,
+       749, 392,
+       829, 844,
+       833, 844,
+       1021, 392,
+       1133, 844,
+       1253, 1379,
+       1279, 844,
+       1298, 392,
+       1405, 844,
+       1406, 844,
+       1411, 844,
+       1426, 392,
+       1492, 392,
+       1540, 1379,
+       1574, 844,
+       1652, 392,
+       1699, 844
 };
 static int parser_goto_row48[] = {
-       17,
-       -1, 63,
-       188, 377,
-       666, 820,
-       725, 377,
-       805, 820,
-       809, 820,
-       990, 377,
-       1098, 820,
-       1241, 820,
-       1259, 377,
-       1364, 820,
-       1365, 820,
-       1384, 377,
-       1450, 377,
-       1530, 820,
-       1607, 377,
-       1654, 820
+       18,
+       -1, 64,
+       193, 393,
+       687, 845,
+       749, 393,
+       829, 845,
+       833, 845,
+       1021, 393,
+       1133, 845,
+       1279, 845,
+       1298, 393,
+       1405, 845,
+       1406, 845,
+       1411, 845,
+       1426, 393,
+       1492, 393,
+       1574, 845,
+       1652, 393,
+       1699, 845
 };
 static int parser_goto_row49[] = {
        52,
-       -1, 195,
-       196, 404,
-       215, 424,
-       224, 433,
-       226, 437,
-       228, 442,
-       438, 615,
-       443, 619,
-       446, 622,
-       557, 437,
-       559, 442,
-       600, 765,
-       623, 784,
-       730, 622,
-       766, 906,
-       768, 908,
-       770, 911,
-       772, 916,
-       865, 765,
-       912, 1071,
-       917, 1075,
-       920, 1078,
-       959, 437,
-       965, 442,
-       995, 911,
-       996, 916,
-       1079, 1229,
-       1110, 622,
-       1134, 1078,
-       1247, 765,
-       1337, 1452,
-       1374, 911,
-       1376, 916,
-       1453, 1514,
-       1454, 1516,
-       1455, 1518,
-       1457, 1522,
-       1459, 1524,
-       1475, 1078,
-       1519, 1579,
-       1525, 1590,
-       1526, 1592,
-       1580, 1642,
-       1593, 1653,
-       1643, 1691,
-       1644, 1693,
-       1645, 1695,
-       1646, 1698,
-       1696, 1734,
-       1699, 1738,
-       1700, 1740,
-       1741, 1763
+       -1, 206,
+       207, 421,
+       226, 441,
+       235, 450,
+       237, 454,
+       239, 459,
+       455, 636,
+       460, 640,
+       463, 643,
+       578, 454,
+       580, 459,
+       621, 789,
+       644, 808,
+       754, 643,
+       790, 936,
+       792, 938,
+       794, 941,
+       796, 946,
+       895, 789,
+       942, 1106,
+       947, 1110,
+       950, 1113,
+       990, 454,
+       996, 459,
+       1029, 941,
+       1030, 946,
+       1114, 1267,
+       1146, 643,
+       1171, 1113,
+       1286, 789,
+       1377, 1494,
+       1416, 941,
+       1418, 946,
+       1495, 1558,
+       1496, 1560,
+       1497, 1562,
+       1499, 1566,
+       1501, 1568,
+       1519, 1113,
+       1563, 1624,
+       1569, 1635,
+       1570, 1637,
+       1625, 1687,
+       1638, 1698,
+       1688, 1736,
+       1689, 1738,
+       1690, 1740,
+       1691, 1743,
+       1741, 1779,
+       1744, 1783,
+       1745, 1785,
+       1786, 1808
 };
 static int parser_goto_row50[] = {
        10,
-       -1, 64,
-       188, 378,
-       725, 378,
-       990, 378,
-       1215, 1340,
-       1259, 378,
-       1384, 378,
-       1450, 378,
-       1496, 1340,
-       1607, 378
+       -1, 65,
+       193, 394,
+       749, 394,
+       1021, 394,
+       1253, 1380,
+       1298, 394,
+       1426, 394,
+       1492, 394,
+       1540, 1380,
+       1652, 394
 };
 static int parser_goto_row51[] = {
        1,
-       -1, 65
+       -1, 66
 };
 static int parser_goto_row52[] = {
        3,
-       -1, 821,
-       825, 962,
-       960, 1104
+       -1, 846,
+       850, 993,
+       991, 1140
 };
 static int parser_goto_row53[] = {
        10,
-       -1, 66,
-       188, 379,
-       725, 379,
-       990, 379,
-       1215, 1341,
-       1259, 379,
-       1384, 379,
-       1450, 379,
-       1496, 1341,
-       1607, 379
+       -1, 67,
+       193, 395,
+       749, 395,
+       1021, 395,
+       1253, 1381,
+       1298, 395,
+       1426, 395,
+       1492, 395,
+       1540, 1381,
+       1652, 395
 };
 static int parser_goto_row54[] = {
        10,
-       -1, 67,
-       188, 380,
-       725, 380,
-       990, 380,
-       1215, 1342,
-       1259, 380,
-       1384, 380,
-       1450, 380,
-       1496, 1342,
-       1607, 380
+       -1, 68,
+       193, 396,
+       749, 396,
+       1021, 396,
+       1253, 1382,
+       1298, 396,
+       1426, 396,
+       1492, 396,
+       1540, 1382,
+       1652, 396
 };
 static int parser_goto_row55[] = {
        10,
-       -1, 68,
-       188, 381,
-       725, 381,
-       990, 381,
-       1215, 1343,
-       1259, 381,
-       1384, 381,
-       1450, 381,
-       1496, 1343,
-       1607, 381
+       -1, 69,
+       193, 397,
+       749, 397,
+       1021, 397,
+       1253, 1383,
+       1298, 397,
+       1426, 397,
+       1492, 397,
+       1540, 1383,
+       1652, 397
 };
 static int parser_goto_row56[] = {
        10,
-       -1, 69,
-       188, 382,
-       725, 382,
-       990, 382,
-       1215, 1344,
-       1259, 382,
-       1384, 382,
-       1450, 382,
-       1496, 1344,
-       1607, 382
+       -1, 70,
+       193, 398,
+       749, 398,
+       1021, 398,
+       1253, 1384,
+       1298, 398,
+       1426, 398,
+       1492, 398,
+       1540, 1384,
+       1652, 398
 };
 static int parser_goto_row57[] = {
        2,
-       -1, 178,
-       815, 952
+       -1, 363,
+       984, 1134
 };
 static int parser_goto_row58[] = {
-       126,
-       -1, 383,
-       34, 161,
-       38, 179,
-       147, 297,
-       148, 298,
-       178, 341,
-       189, 396,
-       192, 401,
-       195, 402,
-       222, 429,
-       244, 451,
-       255, 459,
-       305, 497,
-       352, 543,
-       403, 569,
-       404, 570,
-       421, 459,
-       423, 604,
-       424, 605,
-       425, 606,
-       432, 609,
-       433, 610,
-       436, 612,
-       437, 613,
-       441, 616,
-       442, 617,
-       450, 459,
-       542, 720,
-       548, 401,
-       562, 732,
-       611, 459,
-       614, 777,
-       615, 778,
-       618, 779,
-       619, 780,
-       621, 781,
-       622, 782,
-       664, 801,
-       728, 612,
-       729, 616,
-       736, 877,
-       764, 903,
-       765, 904,
-       783, 922,
-       784, 923,
-       802, 936,
-       811, 949,
-       815, 953,
-       837, 969,
-       864, 993,
-       872, 781,
-       905, 1064,
-       906, 1065,
-       907, 1066,
-       908, 1067,
-       910, 1068,
-       911, 1069,
-       915, 1072,
-       916, 1073,
-       924, 1081,
-       929, 1086,
-       943, 1093,
-       945, 1094,
-       952, 1097,
-       970, 1112,
-       994, 903,
-       1070, 1222,
-       1071, 1223,
-       1074, 1224,
-       1075, 1225,
-       1077, 1226,
-       1078, 1227,
-       1132, 1068,
-       1133, 1072,
-       1135, 1267,
-       1136, 1269,
-       1138, 1270,
-       1228, 1358,
-       1229, 1359,
-       1245, 1370,
-       1266, 1226,
-       1330, 1446,
-       1451, 1511,
-       1452, 1512,
-       1469, 1532,
-       1477, 1535,
-       1481, 877,
-       1513, 1572,
-       1514, 1573,
-       1515, 1574,
-       1516, 1575,
-       1517, 1576,
-       1518, 1577,
-       1521, 1585,
-       1522, 1586,
-       1523, 1587,
-       1524, 1588,
-       1538, 1599,
-       1570, 1637,
-       1578, 1639,
-       1579, 1640,
-       1589, 1648,
-       1590, 1649,
-       1591, 1650,
-       1592, 1651,
-       1641, 1688,
-       1642, 1689,
-       1652, 1701,
-       1653, 1702,
-       1679, 1721,
-       1690, 1727,
-       1691, 1728,
-       1692, 1729,
-       1693, 1730,
-       1694, 1731,
-       1695, 1732,
-       1697, 1735,
-       1698, 1736,
-       1733, 1756,
-       1734, 1757,
-       1737, 1758,
-       1738, 1759,
-       1739, 1760,
-       1740, 1761,
-       1762, 1768,
-       1763, 1769
+       10,
+       -1, 71,
+       193, 399,
+       749, 399,
+       1021, 399,
+       1253, 1385,
+       1298, 399,
+       1426, 399,
+       1492, 399,
+       1540, 1385,
+       1652, 399
 };
 static int parser_goto_row59[] = {
-       1,
-       -1, 162
+       2,
+       -1, 182,
+       839, 982
 };
 static int parser_goto_row60[] = {
-       6,
-       -1, 163,
-       306, 498,
-       503, 674,
-       505, 676,
-       506, 677,
-       675, 841
+       130,
+       -1, 400,
+       34, 165,
+       38, 183,
+       150, 309,
+       151, 310,
+       182, 354,
+       191, 364,
+       194, 413,
+       197, 418,
+       206, 419,
+       233, 446,
+       255, 468,
+       266, 476,
+       317, 514,
+       368, 563,
+       420, 590,
+       421, 591,
+       438, 476,
+       440, 625,
+       441, 626,
+       442, 627,
+       449, 630,
+       450, 631,
+       453, 633,
+       454, 634,
+       458, 637,
+       459, 638,
+       467, 476,
+       562, 744,
+       568, 418,
+       583, 756,
+       632, 476,
+       635, 801,
+       636, 802,
+       639, 803,
+       640, 804,
+       642, 805,
+       643, 806,
+       685, 825,
+       752, 633,
+       753, 637,
+       760, 907,
+       788, 933,
+       789, 934,
+       807, 952,
+       808, 953,
+       826, 966,
+       835, 979,
+       839, 983,
+       863, 1000,
+       888, 1022,
+       894, 1027,
+       902, 805,
+       935, 1099,
+       936, 1100,
+       937, 1101,
+       938, 1102,
+       940, 1103,
+       941, 1104,
+       945, 1107,
+       946, 1108,
+       954, 1116,
+       959, 1121,
+       973, 1128,
+       975, 1129,
+       982, 1132,
+       984, 364,
+       1001, 1148,
+       1023, 1166,
+       1028, 933,
+       1105, 1260,
+       1106, 1261,
+       1109, 1262,
+       1110, 1263,
+       1112, 1264,
+       1113, 1265,
+       1169, 1103,
+       1170, 1107,
+       1172, 1306,
+       1173, 1308,
+       1175, 1309,
+       1266, 1399,
+       1267, 1400,
+       1284, 1412,
+       1305, 1264,
+       1369, 1488,
+       1493, 1555,
+       1494, 1556,
+       1511, 1576,
+       1521, 1580,
+       1525, 907,
+       1557, 1617,
+       1558, 1618,
+       1559, 1619,
+       1560, 1620,
+       1561, 1621,
+       1562, 1622,
+       1565, 1630,
+       1566, 1631,
+       1567, 1632,
+       1568, 1633,
+       1583, 1644,
+       1615, 1682,
+       1623, 1684,
+       1624, 1685,
+       1634, 1693,
+       1635, 1694,
+       1636, 1695,
+       1637, 1696,
+       1686, 1733,
+       1687, 1734,
+       1697, 1746,
+       1698, 1747,
+       1724, 1766,
+       1735, 1772,
+       1736, 1773,
+       1737, 1774,
+       1738, 1775,
+       1739, 1776,
+       1740, 1777,
+       1742, 1780,
+       1743, 1781,
+       1778, 1801,
+       1779, 1802,
+       1782, 1803,
+       1783, 1804,
+       1784, 1805,
+       1785, 1806,
+       1807, 1813,
+       1808, 1814
 };
 static int parser_goto_row61[] = {
        1,
-       -1, 164
+       -1, 166
 };
 static int parser_goto_row62[] = {
-       10,
-       -1, 165,
-       507, 678,
-       508, 679,
-       512, 683,
-       513, 684,
-       514, 685,
-       515, 686,
-       516, 687,
-       517, 688,
-       518, 689
+       6,
+       -1, 167,
+       318, 515,
+       520, 695,
+       522, 697,
+       523, 698,
+       696, 867
 };
 static int parser_goto_row63[] = {
-       3,
-       -1, 166,
-       510, 681,
-       511, 682
+       1,
+       -1, 168
 };
 static int parser_goto_row64[] = {
-       5,
-       -1, 167,
-       519, 690,
-       520, 691,
-       521, 692,
-       522, 693
+       10,
+       -1, 169,
+       524, 699,
+       525, 700,
+       529, 704,
+       530, 705,
+       531, 706,
+       532, 707,
+       533, 708,
+       534, 709,
+       535, 710
 };
 static int parser_goto_row65[] = {
-       7,
-       -1, 168,
-       116, 256,
-       159, 311,
-       247, 454,
-       308, 500,
-       359, 311,
-       1336, 256
+       3,
+       -1, 170,
+       527, 702,
+       528, 703
 };
 static int parser_goto_row66[] = {
-       1,
-       -1, 169
+       5,
+       -1, 171,
+       536, 711,
+       537, 712,
+       538, 713,
+       539, 714
 };
 static int parser_goto_row67[] = {
-       53,
-       -1, 170,
-       12, 70,
-       21, 70,
-       27, 70,
-       31, 70,
-       90, 70,
-       94, 70,
-       143, 70,
-       158, 309,
-       188, 384,
-       210, 70,
-       342, 70,
-       420, 70,
-       486, 70,
-       527, 70,
-       530, 70,
-       662, 70,
-       666, 822,
-       667, 70,
-       725, 384,
-       805, 822,
-       807, 70,
-       809, 822,
-       825, 70,
-       890, 70,
-       939, 70,
-       963, 70,
-       990, 384,
-       1049, 70,
-       1098, 822,
-       1241, 822,
-       1243, 70,
-       1252, 70,
-       1259, 384,
-       1364, 822,
-       1365, 822,
-       1384, 384,
-       1450, 384,
-       1530, 822,
-       1560, 70,
-       1564, 70,
-       1607, 384,
-       1612, 70,
-       1620, 70,
-       1621, 70,
-       1624, 70,
-       1629, 70,
-       1632, 70,
-       1654, 822,
-       1668, 70,
-       1675, 70,
-       1680, 70,
-       1685, 70
+       11,
+       -1, 172,
+       118, 267,
+       119, 268,
+       162, 323,
+       163, 324,
+       258, 471,
+       320, 517,
+       374, 323,
+       375, 324,
+       1375, 267,
+       1376, 268
 };
 static int parser_goto_row68[] = {
        1,
-       -1, 71
+       -1, 173
 };
 static int parser_goto_row69[] = {
-       26,
-       -1, 72,
-       875, 1017,
-       1009, 1017,
-       1010, 1017,
-       1139, 1017,
-       1141, 1017,
-       1283, 1017,
-       1285, 1017,
-       1286, 1017,
-       1287, 1017,
-       1288, 1017,
-       1290, 1017,
-       1291, 1017,
-       1292, 1017,
-       1293, 1017,
-       1294, 1017,
-       1295, 1017,
-       1296, 1017,
-       1297, 1017,
-       1298, 1017,
-       1299, 1017,
-       1300, 1017,
-       1301, 1017,
-       1302, 1017,
-       1399, 1017,
-       1743, 1017
+       55,
+       -1, 174,
+       12, 72,
+       21, 72,
+       27, 72,
+       31, 72,
+       92, 72,
+       96, 72,
+       146, 72,
+       161, 321,
+       193, 401,
+       221, 72,
+       355, 72,
+       437, 72,
+       503, 72,
+       544, 72,
+       547, 72,
+       683, 72,
+       687, 847,
+       688, 72,
+       740, 72,
+       749, 401,
+       829, 847,
+       831, 72,
+       833, 847,
+       850, 72,
+       920, 72,
+       969, 72,
+       994, 72,
+       1021, 401,
+       1084, 72,
+       1133, 847,
+       1279, 847,
+       1281, 72,
+       1291, 72,
+       1298, 401,
+       1405, 847,
+       1406, 847,
+       1411, 847,
+       1426, 401,
+       1492, 401,
+       1574, 847,
+       1605, 72,
+       1609, 72,
+       1652, 401,
+       1657, 72,
+       1665, 72,
+       1666, 72,
+       1669, 72,
+       1674, 72,
+       1677, 72,
+       1699, 847,
+       1713, 72,
+       1720, 72,
+       1725, 72,
+       1730, 72
 };
 static int parser_goto_row70[] = {
        1,
-       -1, 385
+       -1, 73
 };
 static int parser_goto_row71[] = {
-       2,
-       -1, 552,
-       554, 727
+       27,
+       -1, 74,
+       905, 1052,
+       1043, 1052,
+       1044, 1052,
+       1045, 1052,
+       1176, 1052,
+       1178, 1052,
+       1322, 1052,
+       1324, 1052,
+       1325, 1052,
+       1326, 1052,
+       1327, 1052,
+       1329, 1052,
+       1330, 1052,
+       1331, 1052,
+       1332, 1052,
+       1333, 1052,
+       1334, 1052,
+       1335, 1052,
+       1336, 1052,
+       1337, 1052,
+       1338, 1052,
+       1339, 1052,
+       1340, 1052,
+       1341, 1052,
+       1441, 1052,
+       1788, 1052
 };
 static int parser_goto_row72[] = {
        1,
-       -1, 397
+       -1, 402
 };
 static int parser_goto_row73[] = {
        2,
-       -1, 567,
-       568, 737
+       -1, 572,
+       574, 751
 };
 static int parser_goto_row74[] = {
-       4,
-       -1, 398,
-       736, 878,
-       1135, 1268,
-       1481, 1537
+       1,
+       -1, 414
 };
 static int parser_goto_row75[] = {
-       85,
-       -1, 73,
-       25, 123,
-       48, 123,
-       114, 123,
-       223, 123,
-       225, 123,
-       226, 123,
-       227, 123,
-       228, 123,
-       245, 123,
-       445, 123,
-       446, 123,
-       463, 123,
-       465, 123,
-       466, 123,
-       467, 123,
-       468, 123,
-       470, 123,
-       471, 123,
-       472, 123,
-       473, 123,
-       474, 123,
-       475, 123,
-       476, 123,
-       477, 123,
-       478, 123,
-       479, 123,
-       480, 123,
-       481, 123,
-       482, 123,
-       598, 123,
-       600, 123,
-       635, 123,
-       769, 123,
-       770, 123,
-       771, 123,
-       772, 123,
-       804, 123,
-       817, 123,
-       875, 1018,
-       919, 123,
-       920, 123,
-       957, 123,
-       958, 123,
-       959, 123,
-       964, 123,
-       965, 123,
-       986, 123,
-       1009, 1018,
-       1010, 1018,
-       1109, 123,
-       1110, 123,
-       1139, 1018,
-       1141, 1018,
-       1215, 123,
-       1246, 123,
-       1247, 123,
-       1283, 1018,
-       1285, 1018,
-       1286, 1018,
-       1287, 1018,
-       1288, 1018,
-       1290, 1018,
-       1291, 1018,
-       1292, 1018,
-       1293, 1018,
-       1294, 1018,
-       1295, 1018,
-       1296, 1018,
-       1297, 1018,
-       1298, 1018,
-       1299, 1018,
-       1300, 1018,
-       1301, 1018,
-       1302, 1018,
-       1373, 123,
-       1374, 123,
-       1375, 123,
-       1376, 123,
-       1399, 1018,
-       1463, 123,
-       1474, 123,
-       1475, 123,
-       1496, 123,
-       1743, 1018
+       2,
+       -1, 588,
+       589, 761
 };
 static int parser_goto_row76[] = {
-       1,
-       -1, 74
+       4,
+       -1, 415,
+       760, 908,
+       1172, 1307,
+       1525, 1582
 };
 static int parser_goto_row77[] = {
-       1,
-       -1, 75
+       86,
+       -1, 75,
+       25, 126,
+       49, 126,
+       116, 126,
+       234, 126,
+       236, 126,
+       237, 126,
+       238, 126,
+       239, 126,
+       256, 126,
+       462, 126,
+       463, 126,
+       480, 126,
+       482, 126,
+       483, 126,
+       484, 126,
+       485, 126,
+       487, 126,
+       488, 126,
+       489, 126,
+       490, 126,
+       491, 126,
+       492, 126,
+       493, 126,
+       494, 126,
+       495, 126,
+       496, 126,
+       497, 126,
+       498, 126,
+       499, 126,
+       619, 126,
+       621, 126,
+       656, 126,
+       793, 126,
+       794, 126,
+       795, 126,
+       796, 126,
+       828, 126,
+       842, 126,
+       905, 1053,
+       949, 126,
+       950, 126,
+       988, 126,
+       989, 126,
+       990, 126,
+       995, 126,
+       996, 126,
+       1017, 126,
+       1043, 1053,
+       1044, 1053,
+       1045, 1053,
+       1145, 126,
+       1146, 126,
+       1176, 1053,
+       1178, 1053,
+       1253, 126,
+       1285, 126,
+       1286, 126,
+       1322, 1053,
+       1324, 1053,
+       1325, 1053,
+       1326, 1053,
+       1327, 1053,
+       1329, 1053,
+       1330, 1053,
+       1331, 1053,
+       1332, 1053,
+       1333, 1053,
+       1334, 1053,
+       1335, 1053,
+       1336, 1053,
+       1337, 1053,
+       1338, 1053,
+       1339, 1053,
+       1340, 1053,
+       1341, 1053,
+       1415, 126,
+       1416, 126,
+       1417, 126,
+       1418, 126,
+       1441, 1053,
+       1505, 126,
+       1518, 126,
+       1519, 126,
+       1540, 126,
+       1788, 1053
 };
 static int parser_goto_row78[] = {
-       2,
-       -1, 218,
-       221, 427
+       1,
+       -1, 76
 };
 static int parser_goto_row79[] = {
        1,
-       -1, 219
+       -1, 77
 };
 static int parser_goto_row80[] = {
        2,
-       -1, 220,
-       221, 428
+       -1, 229,
+       232, 444
 };
 static int parser_goto_row81[] = {
-       15,
-       -1, 182,
-       145, 296,
-       188, 386,
-       725, 386,
-       990, 386,
-       1041, 1189,
-       1207, 1323,
-       1215, 1345,
-       1259, 386,
-       1384, 386,
-       1450, 386,
-       1496, 1550,
-       1571, 1638,
-       1607, 386,
-       1709, 1746
+       1,
+       -1, 230
 };
 static int parser_goto_row82[] = {
-       45,
-       -1, 541,
-       40, 183,
-       41, 184,
-       42, 185,
-       43, 186,
-       49, 198,
-       50, 199,
-       51, 200,
-       52, 201,
-       54, 202,
-       110, 248,
-       111, 249,
-       112, 250,
-       113, 251,
-       118, 258,
-       119, 259,
-       120, 260,
-       121, 261,
-       122, 262,
-       220, 426,
-       428, 607,
-       539, 718,
-       716, 861,
-       724, 869,
-       726, 871,
-       735, 876,
-       986, 1124,
-       1005, 1142,
-       1006, 1143,
-       1007, 1144,
-       1008, 1145,
-       1012, 1151,
-       1013, 1152,
-       1014, 1153,
-       1015, 1154,
-       1016, 1155,
-       1041, 1190,
-       1131, 1265,
-       1264, 1386,
-       1281, 1396,
-       1282, 1397,
-       1383, 1479,
-       1405, 1488,
-       1487, 1543,
-       1536, 1598
+       2,
+       -1, 231,
+       232, 445
 };
 static int parser_goto_row83[] = {
-       1,
-       -1, 348
+       16,
+       -1, 186,
+       148, 308,
+       193, 403,
+       362, 557,
+       749, 403,
+       1021, 403,
+       1076, 1227,
+       1245, 1362,
+       1253, 1386,
+       1298, 403,
+       1426, 403,
+       1492, 403,
+       1540, 1595,
+       1616, 1683,
+       1652, 403,
+       1754, 1791
 };
 static int parser_goto_row84[] = {
-       4,
-       -1, 1036,
-       889, 1046,
-       1559, 1617,
-       1623, 1676
+       45,
+       -1, 561,
+       40, 187,
+       41, 188,
+       42, 189,
+       43, 190,
+       50, 209,
+       51, 210,
+       52, 211,
+       53, 212,
+       55, 213,
+       112, 259,
+       113, 260,
+       114, 261,
+       115, 262,
+       121, 270,
+       122, 271,
+       123, 272,
+       124, 273,
+       125, 274,
+       231, 443,
+       445, 628,
+       559, 742,
+       737, 887,
+       748, 899,
+       750, 901,
+       759, 906,
+       1017, 1160,
+       1039, 1179,
+       1040, 1180,
+       1041, 1181,
+       1042, 1182,
+       1047, 1189,
+       1048, 1190,
+       1049, 1191,
+       1050, 1192,
+       1051, 1193,
+       1076, 1228,
+       1168, 1304,
+       1303, 1428,
+       1320, 1438,
+       1321, 1439,
+       1425, 1523,
+       1447, 1532,
+       1531, 1588,
+       1581, 1643
 };
 static int parser_goto_row85[] = {
-       3,
-       -1, 1037,
-       537, 711,
-       850, 980
+       1,
+       -1, 361
 };
 static int parser_goto_row86[] = {
-       2,
-       -1, 712,
-       988, 1127
+       4,
+       -1, 1071,
+       919, 1081,
+       1604, 1662,
+       1668, 1721
 };
 static int parser_goto_row87[] = {
-       1,
-       -1, 1125
+       3,
+       -1, 1072,
+       554, 732,
+       876, 1011
 };
 static int parser_goto_row88[] = {
        2,
-       -1, 858,
-       859, 989
+       -1, 733,
+       1019, 1163
 };
 static int parser_goto_row89[] = {
-       4,
-       -1, 1184,
-       1047, 1202,
-       1618, 1671,
-       1677, 1719
+       1,
+       -1, 1161
 };
 static int parser_goto_row90[] = {
        2,
-       -1, 1185,
-       1187, 1308
+       -1, 884,
+       885, 1020
 };
 static int parser_goto_row91[] = {
-       1,
-       -1, 1058
+       4,
+       -1, 1222,
+       1082, 1240,
+       1663, 1716,
+       1722, 1764
 };
 static int parser_goto_row92[] = {
-       4,
-       -1, 1128,
-       1259, 1382,
-       1450, 1510,
-       1607, 1662
+       2,
+       -1, 1223,
+       1225, 1347
 };
 static int parser_goto_row93[] = {
-       3,
-       -1, 1262,
-       1263, 1385,
-       1458, 1385
+       1,
+       -1, 1093
 };
 static int parser_goto_row94[] = {
        4,
-       -1, 1129,
-       188, 387,
-       725, 870,
-       1384, 1480
+       -1, 1164,
+       1298, 1424,
+       1492, 1554,
+       1652, 1707
 };
 static int parser_goto_row95[] = {
-       4,
-       -1, 716,
-       851, 981,
-       855, 986,
-       1427, 1496
+       3,
+       -1, 1301,
+       1302, 1427,
+       1500, 1427
 };
 static int parser_goto_row96[] = {
-       85,
-       -1, 124,
-       48, 196,
-       105, 243,
-       117, 257,
-       160, 312,
-       177, 312,
-       223, 430,
-       226, 438,
-       228, 443,
-       263, 461,
-       265, 462,
-       288, 484,
-       334, 430,
-       336, 524,
-       337, 525,
-       374, 196,
-       446, 623,
-       453, 629,
-       485, 660,
-       499, 672,
-       526, 699,
-       557, 438,
-       559, 443,
-       598, 761,
-       600, 766,
-       654, 793,
-       656, 795,
-       694, 761,
-       695, 842,
-       730, 623,
-       770, 912,
-       772, 917,
-       797, 933,
-       798, 934,
-       817, 196,
-       844, 972,
-       845, 973,
-       852, 982,
-       865, 766,
-       920, 1079,
-       925, 1082,
-       935, 1089,
-       957, 430,
-       959, 438,
-       965, 443,
-       974, 1113,
-       983, 1120,
-       984, 1121,
-       995, 912,
-       996, 917,
-       1000, 1137,
-       1011, 1150,
-       1083, 1231,
-       1084, 1232,
-       1110, 623,
-       1122, 1258,
-       1134, 1079,
-       1156, 1279,
-       1158, 1280,
-       1181, 1304,
-       1233, 1361,
-       1246, 761,
-       1247, 766,
-       1274, 1393,
-       1305, 1426,
-       1337, 1453,
-       1374, 912,
-       1376, 917,
-       1420, 1489,
-       1422, 1491,
-       1455, 1519,
-       1459, 1525,
-       1475, 1079,
-       1493, 1546,
-       1494, 1547,
-       1526, 1593,
-       1539, 1600,
-       1548, 1606,
-       1580, 1643,
-       1601, 1656,
-       1602, 1657,
-       1645, 1696,
-       1646, 1699,
-       1658, 1706,
-       1700, 1741
+       4,
+       -1, 1165,
+       193, 404,
+       749, 900,
+       1426, 1524
 };
 static int parser_goto_row97[] = {
-       34,
-       -1, 125,
-       48, 197,
-       223, 431,
-       225, 435,
-       226, 439,
-       227, 440,
-       228, 444,
-       445, 620,
-       446, 624,
-       598, 762,
-       600, 767,
-       769, 909,
-       770, 913,
-       771, 914,
-       772, 918,
-       804, 937,
-       817, 955,
-       919, 1076,
-       920, 1080,
-       957, 1101,
-       958, 1102,
-       959, 1103,
-       964, 1107,
-       965, 1108,
-       1109, 1250,
-       1110, 1251,
-       1246, 1371,
-       1247, 1372,
-       1373, 1470,
-       1374, 1471,
-       1375, 1472,
-       1376, 1473,
-       1474, 1533,
-       1475, 1534
+       4,
+       -1, 737,
+       877, 1012,
+       881, 1017,
+       1469, 1540
 };
 static int parser_goto_row98[] = {
-       6,
-       -1, 215,
-       137, 287,
-       170, 333,
-       254, 287,
-       309, 333,
-       1351, 1457
+       86,
+       -1, 325,
+       25, 127,
+       49, 207,
+       107, 254,
+       120, 269,
+       156, 127,
+       234, 447,
+       237, 455,
+       239, 460,
+       275, 478,
+       277, 479,
+       300, 501,
+       347, 447,
+       349, 541,
+       350, 542,
+       390, 207,
+       463, 644,
+       470, 650,
+       502, 681,
+       516, 693,
+       543, 720,
+       578, 455,
+       580, 460,
+       619, 785,
+       621, 790,
+       675, 817,
+       677, 819,
+       715, 785,
+       716, 868,
+       754, 644,
+       794, 942,
+       796, 947,
+       821, 963,
+       822, 964,
+       828, 127,
+       842, 207,
+       870, 1003,
+       871, 1004,
+       878, 1013,
+       895, 790,
+       950, 1114,
+       955, 1117,
+       965, 1124,
+       988, 447,
+       990, 455,
+       996, 460,
+       1005, 1149,
+       1014, 1156,
+       1015, 1157,
+       1029, 942,
+       1030, 947,
+       1034, 1174,
+       1046, 1188,
+       1118, 1269,
+       1119, 1270,
+       1146, 644,
+       1158, 1297,
+       1171, 1114,
+       1194, 1318,
+       1196, 1319,
+       1219, 1343,
+       1271, 1402,
+       1285, 785,
+       1286, 790,
+       1313, 1435,
+       1344, 1468,
+       1377, 1495,
+       1416, 942,
+       1418, 947,
+       1462, 1533,
+       1464, 1535,
+       1497, 1563,
+       1501, 1569,
+       1519, 1114,
+       1537, 1591,
+       1538, 1592,
+       1570, 1638,
+       1584, 1645,
+       1593, 1651,
+       1625, 1688,
+       1646, 1701,
+       1647, 1702,
+       1690, 1741,
+       1691, 1744,
+       1703, 1751,
+       1745, 1786
 };
 static int parser_goto_row99[] = {
-       1,
-       -1, -1
+       34,
+       -1, 128,
+       49, 208,
+       234, 448,
+       236, 452,
+       237, 456,
+       238, 457,
+       239, 461,
+       462, 641,
+       463, 645,
+       619, 786,
+       621, 791,
+       793, 939,
+       794, 943,
+       795, 944,
+       796, 948,
+       828, 967,
+       842, 986,
+       949, 1111,
+       950, 1115,
+       988, 1137,
+       989, 1138,
+       990, 1139,
+       995, 1143,
+       996, 1144,
+       1145, 1289,
+       1146, 1290,
+       1285, 1413,
+       1286, 1414,
+       1415, 1514,
+       1416, 1515,
+       1417, 1516,
+       1418, 1517,
+       1518, 1578,
+       1519, 1579
 };
 static int parser_goto_row100[] = {
-       4,
-       -1, 460,
-       421, 597,
-       450, 626,
-       611, 776
+       6,
+       -1, 226,
+       140, 299,
+       174, 346,
+       265, 299,
+       321, 346,
+       1392, 1499
 };
 static int parser_goto_row101[] = {
-       2,
-       -1, 790,
-       791, 930
+       1,
+       -1, -1
 };
 static int parser_goto_row102[] = {
-       3,
-       -1, 302,
-       563, 733,
-       948, 1096
+       4,
+       -1, 477,
+       438, 618,
+       467, 647,
+       632, 800
 };
 static int parser_goto_row103[] = {
        2,
-       -1, 303,
-       493, 668
+       -1, 814,
+       815, 960
 };
 static int parser_goto_row104[] = {
-       2,
-       -1, 740,
-       572, 743
+       3,
+       -1, 314,
+       584, 757,
+       978, 1131
 };
 static int parser_goto_row105[] = {
-       146,
-       -1, 171,
-       12, 76,
-       21, 76,
-       25, 126,
-       27, 76,
-       31, 76,
-       48, 126,
-       90, 76,
-       94, 76,
-       114, 253,
-       143, 76,
-       158, 310,
-       188, 388,
-       210, 76,
-       223, 126,
-       225, 126,
-       226, 126,
-       227, 126,
-       228, 126,
-       245, 126,
-       342, 76,
-       420, 76,
-       422, 601,
-       445, 126,
-       446, 126,
-       463, 126,
-       465, 126,
-       466, 126,
-       467, 126,
-       468, 126,
-       470, 126,
-       471, 126,
-       472, 126,
-       473, 126,
-       474, 126,
-       475, 126,
-       476, 126,
-       477, 126,
-       478, 126,
-       479, 126,
-       480, 126,
-       481, 126,
-       482, 126,
-       483, 657,
-       486, 76,
-       523, 696,
-       527, 76,
-       530, 76,
-       598, 126,
-       600, 126,
-       631, 788,
-       635, 126,
-       662, 76,
-       666, 823,
-       667, 76,
-       673, 840,
-       723, 601,
-       725, 388,
-       769, 126,
-       770, 126,
-       771, 126,
-       772, 126,
-       804, 126,
-       805, 823,
-       807, 76,
-       809, 823,
-       817, 126,
-       825, 76,
-       875, 1019,
-       890, 76,
-       919, 126,
-       920, 126,
-       939, 76,
-       957, 126,
-       958, 126,
-       959, 126,
-       963, 76,
-       964, 126,
-       965, 126,
-       990, 388,
-       1009, 1147,
-       1010, 1019,
-       1049, 76,
-       1098, 823,
-       1100, 601,
-       1109, 126,
-       1110, 126,
-       1139, 1019,
-       1141, 1019,
-       1215, 1346,
-       1241, 823,
-       1243, 76,
-       1246, 126,
-       1247, 126,
-       1252, 76,
-       1259, 388,
-       1283, 1019,
-       1285, 1019,
-       1286, 1019,
-       1287, 1019,
-       1288, 1019,
-       1290, 1019,
-       1291, 1019,
-       1292, 1019,
-       1293, 1019,
-       1294, 1019,
-       1295, 1019,
-       1296, 1019,
-       1297, 1019,
-       1298, 1019,
-       1299, 1019,
-       1300, 1019,
-       1301, 1019,
-       1302, 1019,
-       1303, 1423,
-       1364, 823,
-       1365, 823,
-       1373, 126,
-       1374, 126,
-       1375, 126,
-       1376, 126,
-       1384, 388,
-       1395, 1485,
-       1399, 1019,
-       1450, 388,
-       1463, 126,
-       1474, 126,
-       1475, 126,
-       1496, 1346,
-       1520, 1581,
-       1530, 823,
-       1560, 76,
-       1564, 76,
-       1607, 388,
-       1612, 76,
-       1620, 76,
-       1621, 76,
-       1624, 76,
-       1629, 76,
-       1632, 76,
-       1654, 823,
-       1668, 76,
-       1675, 76,
-       1680, 76,
-       1685, 76,
-       1743, 1019
+       2,
+       -1, 315,
+       510, 689
 };
 static int parser_goto_row106[] = {
-       1,
-       -1, 757
+       2,
+       -1, 764,
+       593, 767
 };
 static int parser_goto_row107[] = {
-       6,
-       -1, 1201,
-       415, 592,
-       1319, 1434,
-       1440, 1501,
-       1442, 1504,
-       1444, 1507
-};
-static int parser_goto_row108[] = {
-       22,
-       -1, 77,
-       79, 229,
-       139, 229,
-       173, 229,
-       393, 229,
-       594, 229,
-       603, 229,
-       659, 229,
-       698, 229,
-       741, 229,
-       759, 229,
-       833, 229,
-       854, 229,
-       868, 229,
-       927, 229,
-       1032, 229,
-       1035, 229,
-       1249, 229,
-       1355, 229,
-       1425, 229,
-       1541, 229,
-       1584, 229
-};
-static int parser_goto_row109[] = {
-       175,
-       -1, 172,
+       149,
+       -1, 175,
        12, 78,
        21, 78,
-       25, 127,
+       25, 129,
        27, 78,
        31, 78,
-       48, 127,
-       79, 230,
-       90, 78,
-       94, 78,
-       114, 127,
-       139, 289,
-       143, 78,
-       173, 338,
-       188, 389,
-       210, 78,
-       223, 127,
-       225, 127,
-       226, 127,
-       227, 127,
-       228, 127,
-       245, 127,
-       342, 78,
-       393, 560,
-       415, 593,
-       420, 78,
-       422, 602,
-       445, 127,
-       446, 127,
-       463, 127,
-       465, 127,
-       466, 127,
-       467, 127,
-       468, 127,
-       470, 127,
-       471, 127,
-       472, 127,
-       473, 127,
-       474, 127,
-       475, 127,
-       476, 127,
-       477, 127,
-       478, 127,
-       479, 127,
-       480, 127,
-       481, 127,
-       482, 127,
-       483, 658,
-       486, 78,
-       523, 697,
-       527, 78,
-       530, 78,
-       594, 754,
-       596, 758,
-       598, 127,
-       600, 127,
-       603, 773,
-       631, 658,
-       635, 127,
-       659, 799,
-       662, 78,
-       666, 824,
-       667, 78,
-       673, 697,
-       698, 846,
-       709, 853,
-       723, 866,
-       725, 389,
-       759, 900,
-       769, 127,
-       770, 127,
-       771, 127,
-       772, 127,
-       787, 926,
-       804, 127,
-       805, 824,
-       807, 78,
-       809, 824,
-       817, 127,
-       825, 78,
-       833, 966,
-       854, 985,
-       868, 997,
-       875, 1020,
-       890, 78,
-       919, 127,
-       920, 127,
-       927, 1085,
-       939, 78,
-       957, 127,
-       958, 127,
-       959, 127,
-       963, 78,
-       964, 127,
-       965, 127,
-       990, 389,
-       1009, 1020,
-       1010, 1020,
-       1032, 1182,
-       1045, 593,
-       1049, 78,
-       1098, 824,
-       1100, 1248,
-       1109, 127,
-       1110, 127,
-       1139, 1020,
-       1141, 1020,
-       1215, 1347,
-       1241, 824,
-       1243, 78,
-       1246, 127,
-       1247, 127,
-       1249, 1377,
-       1252, 78,
-       1259, 389,
-       1283, 1020,
-       1285, 1020,
-       1286, 1020,
-       1287, 1020,
-       1288, 1020,
-       1290, 1020,
-       1291, 1020,
-       1292, 1020,
-       1293, 1020,
-       1294, 1020,
-       1295, 1020,
-       1296, 1020,
-       1297, 1020,
-       1298, 1020,
-       1299, 1020,
-       1300, 1020,
-       1301, 1020,
-       1302, 1020,
-       1303, 1424,
-       1319, 593,
-       1355, 1460,
-       1364, 824,
-       1365, 824,
-       1373, 127,
-       1374, 127,
-       1375, 127,
-       1376, 127,
-       1384, 389,
-       1395, 1424,
-       1399, 1020,
-       1425, 1495,
-       1431, 593,
-       1440, 593,
-       1442, 593,
-       1444, 593,
-       1450, 389,
-       1463, 127,
-       1474, 127,
-       1475, 127,
-       1484, 1540,
-       1496, 1347,
-       1520, 1582,
-       1530, 824,
-       1541, 1603,
-       1560, 78,
-       1564, 78,
-       1584, 1647,
-       1607, 389,
-       1612, 78,
-       1620, 78,
-       1621, 78,
-       1624, 78,
-       1629, 78,
-       1632, 78,
-       1654, 824,
-       1668, 78,
-       1675, 78,
-       1680, 78,
-       1685, 78,
-       1743, 1020
+       49, 129,
+       92, 78,
+       96, 78,
+       116, 264,
+       146, 78,
+       161, 322,
+       193, 405,
+       221, 78,
+       234, 129,
+       236, 129,
+       237, 129,
+       238, 129,
+       239, 129,
+       256, 129,
+       355, 78,
+       437, 78,
+       439, 622,
+       462, 129,
+       463, 129,
+       480, 129,
+       482, 129,
+       483, 129,
+       484, 129,
+       485, 129,
+       487, 129,
+       488, 129,
+       489, 129,
+       490, 129,
+       491, 129,
+       492, 129,
+       493, 129,
+       494, 129,
+       495, 129,
+       496, 129,
+       497, 129,
+       498, 129,
+       499, 129,
+       500, 678,
+       503, 78,
+       540, 717,
+       544, 78,
+       547, 78,
+       619, 129,
+       621, 129,
+       652, 812,
+       656, 129,
+       683, 78,
+       687, 848,
+       688, 78,
+       694, 866,
+       740, 78,
+       747, 622,
+       749, 405,
+       793, 129,
+       794, 129,
+       795, 129,
+       796, 129,
+       828, 129,
+       829, 848,
+       831, 78,
+       833, 848,
+       842, 129,
+       850, 78,
+       905, 1054,
+       920, 78,
+       949, 129,
+       950, 129,
+       969, 78,
+       988, 129,
+       989, 129,
+       990, 129,
+       994, 78,
+       995, 129,
+       996, 129,
+       1021, 405,
+       1043, 1184,
+       1044, 1054,
+       1045, 1054,
+       1084, 78,
+       1133, 848,
+       1136, 622,
+       1145, 129,
+       1146, 129,
+       1176, 1054,
+       1178, 1054,
+       1253, 1387,
+       1279, 848,
+       1281, 78,
+       1285, 129,
+       1286, 129,
+       1291, 78,
+       1298, 405,
+       1322, 1054,
+       1324, 1054,
+       1325, 1054,
+       1326, 1054,
+       1327, 1054,
+       1329, 1054,
+       1330, 1054,
+       1331, 1054,
+       1332, 1054,
+       1333, 1054,
+       1334, 1054,
+       1335, 1054,
+       1336, 1054,
+       1337, 1054,
+       1338, 1054,
+       1339, 1054,
+       1340, 1054,
+       1341, 1054,
+       1342, 1465,
+       1405, 848,
+       1406, 848,
+       1411, 848,
+       1415, 129,
+       1416, 129,
+       1417, 129,
+       1418, 129,
+       1426, 405,
+       1437, 1529,
+       1441, 1054,
+       1492, 405,
+       1505, 129,
+       1518, 129,
+       1519, 129,
+       1540, 1387,
+       1564, 1626,
+       1574, 848,
+       1605, 78,
+       1609, 78,
+       1652, 405,
+       1657, 78,
+       1665, 78,
+       1666, 78,
+       1669, 78,
+       1674, 78,
+       1677, 78,
+       1699, 848,
+       1713, 78,
+       1720, 78,
+       1725, 78,
+       1730, 78,
+       1788, 1054
+};
+static int parser_goto_row108[] = {
+       1,
+       -1, 781
+};
+static int parser_goto_row109[] = {
+       6,
+       -1, 1239,
+       432, 613,
+       1358, 1476,
+       1482, 1545,
+       1484, 1548,
+       1486, 1551
 };
 static int parser_goto_row110[] = {
-       12,
-       -1, 1204,
-       1205, 1321,
-       1619, 1672,
-       1628, 1681,
-       1667, 1713,
-       1673, 1716,
-       1674, 1717,
-       1682, 1723,
-       1684, 1724,
-       1714, 1751,
-       1718, 1752,
-       1725, 1755
+       22,
+       -1, 79,
+       81, 240,
+       142, 240,
+       177, 240,
+       410, 240,
+       615, 240,
+       624, 240,
+       680, 240,
+       719, 240,
+       765, 240,
+       783, 240,
+       859, 240,
+       880, 240,
+       898, 240,
+       957, 240,
+       1067, 240,
+       1070, 240,
+       1288, 240,
+       1396, 240,
+       1467, 240,
+       1586, 240,
+       1629, 240
 };
 static int parser_goto_row111[] = {
-       14,
-       -1, 83,
-       742, 883,
-       880, 1038,
-       881, 1039,
-       884, 1040,
-       889, 1047,
-       1056, 1210,
-       1496, 1551,
-       1550, 1608,
-       1552, 1609,
-       1559, 1618,
-       1623, 1677,
-       1709, 1747,
-       1746, 1766
+       178,
+       -1, 176,
+       12, 80,
+       21, 80,
+       25, 130,
+       27, 80,
+       31, 80,
+       49, 130,
+       81, 241,
+       92, 80,
+       96, 80,
+       116, 130,
+       142, 301,
+       146, 80,
+       177, 351,
+       193, 406,
+       221, 80,
+       234, 130,
+       236, 130,
+       237, 130,
+       238, 130,
+       239, 130,
+       256, 130,
+       355, 80,
+       410, 581,
+       432, 614,
+       437, 80,
+       439, 623,
+       462, 130,
+       463, 130,
+       480, 130,
+       482, 130,
+       483, 130,
+       484, 130,
+       485, 130,
+       487, 130,
+       488, 130,
+       489, 130,
+       490, 130,
+       491, 130,
+       492, 130,
+       493, 130,
+       494, 130,
+       495, 130,
+       496, 130,
+       497, 130,
+       498, 130,
+       499, 130,
+       500, 679,
+       503, 80,
+       540, 718,
+       544, 80,
+       547, 80,
+       615, 778,
+       617, 782,
+       619, 130,
+       621, 130,
+       624, 797,
+       652, 679,
+       656, 130,
+       680, 823,
+       683, 80,
+       687, 849,
+       688, 80,
+       694, 718,
+       719, 872,
+       730, 879,
+       740, 80,
+       747, 896,
+       749, 406,
+       783, 930,
+       793, 130,
+       794, 130,
+       795, 130,
+       796, 130,
+       811, 956,
+       828, 130,
+       829, 849,
+       831, 80,
+       833, 849,
+       842, 130,
+       850, 80,
+       859, 997,
+       880, 1016,
+       898, 1031,
+       905, 1055,
+       920, 80,
+       949, 130,
+       950, 130,
+       957, 1120,
+       969, 80,
+       988, 130,
+       989, 130,
+       990, 130,
+       994, 80,
+       995, 130,
+       996, 130,
+       1021, 406,
+       1043, 1055,
+       1044, 1055,
+       1045, 1055,
+       1067, 1220,
+       1080, 614,
+       1084, 80,
+       1133, 849,
+       1136, 1287,
+       1145, 130,
+       1146, 130,
+       1176, 1055,
+       1178, 1055,
+       1253, 1388,
+       1279, 849,
+       1281, 80,
+       1285, 130,
+       1286, 130,
+       1288, 1419,
+       1291, 80,
+       1298, 406,
+       1322, 1055,
+       1324, 1055,
+       1325, 1055,
+       1326, 1055,
+       1327, 1055,
+       1329, 1055,
+       1330, 1055,
+       1331, 1055,
+       1332, 1055,
+       1333, 1055,
+       1334, 1055,
+       1335, 1055,
+       1336, 1055,
+       1337, 1055,
+       1338, 1055,
+       1339, 1055,
+       1340, 1055,
+       1341, 1055,
+       1342, 1466,
+       1358, 614,
+       1396, 1502,
+       1405, 849,
+       1406, 849,
+       1411, 849,
+       1415, 130,
+       1416, 130,
+       1417, 130,
+       1418, 130,
+       1426, 406,
+       1437, 1466,
+       1441, 1055,
+       1467, 1539,
+       1473, 614,
+       1482, 614,
+       1484, 614,
+       1486, 614,
+       1492, 406,
+       1505, 130,
+       1518, 130,
+       1519, 130,
+       1528, 1585,
+       1540, 1388,
+       1564, 1627,
+       1574, 849,
+       1586, 1648,
+       1605, 80,
+       1609, 80,
+       1629, 1692,
+       1652, 406,
+       1657, 80,
+       1665, 80,
+       1666, 80,
+       1669, 80,
+       1674, 80,
+       1677, 80,
+       1699, 849,
+       1713, 80,
+       1720, 80,
+       1725, 80,
+       1730, 80,
+       1788, 1055
 };
 static int parser_goto_row112[] = {
-       54,
-       -1, 146,
+       12,
+       -1, 1242,
+       1243, 1360,
+       1664, 1717,
+       1673, 1726,
+       1712, 1758,
+       1718, 1761,
+       1719, 1762,
+       1727, 1768,
+       1729, 1769,
+       1759, 1796,
+       1763, 1797,
+       1770, 1800
+};
+static int parser_goto_row113[] = {
+       14,
+       -1, 85,
+       766, 913,
+       910, 1073,
+       911, 1074,
+       914, 1075,
+       919, 1082,
+       1091, 1248,
+       1540, 1596,
+       1595, 1653,
+       1597, 1654,
+       1604, 1663,
+       1668, 1722,
+       1754, 1792,
+       1791, 1811
+};
+static int parser_goto_row114[] = {
+       56,
+       -1, 149,
        0, 11,
        4, 11,
        15, 11,
@@ -21540,544 +22747,545 @@ static int parser_goto_row112[] = {
        22, 11,
        23, 11,
        24, 11,
-       27, 143,
-       31, 143,
-       61, 210,
-       86, 11,
-       87, 11,
-       91, 11,
-       100, 11,
-       101, 11,
+       27, 146,
+       31, 146,
+       62, 221,
+       88, 11,
+       89, 11,
+       93, 11,
+       102, 11,
        103, 11,
-       211, 420,
-       233, 11,
-       239, 11,
-       292, 486,
-       342, 530,
-       487, 662,
-       527, 530,
-       666, 825,
-       667, 143,
-       805, 939,
-       807, 530,
-       809, 939,
-       890, 530,
-       961, 210,
-       963, 530,
-       1049, 530,
-       1098, 1243,
-       1105, 420,
-       1241, 1243,
-       1252, 143,
-       1364, 825,
-       1365, 939,
-       1530, 1243,
-       1560, 530,
-       1564, 530,
-       1612, 530,
-       1620, 530,
-       1621, 530,
-       1624, 530,
-       1629, 530,
-       1632, 530,
-       1654, 939,
-       1668, 530,
-       1675, 530,
-       1680, 530,
-       1685, 530
+       105, 11,
+       222, 437,
+       244, 11,
+       250, 11,
+       304, 503,
+       355, 547,
+       504, 683,
+       544, 547,
+       687, 850,
+       688, 146,
+       740, 146,
+       829, 969,
+       831, 547,
+       833, 969,
+       920, 547,
+       992, 221,
+       994, 547,
+       1084, 547,
+       1133, 1281,
+       1141, 437,
+       1279, 1281,
+       1291, 146,
+       1405, 850,
+       1406, 969,
+       1411, 969,
+       1574, 1281,
+       1605, 547,
+       1609, 547,
+       1657, 547,
+       1665, 547,
+       1666, 547,
+       1669, 547,
+       1674, 547,
+       1677, 547,
+       1699, 969,
+       1713, 547,
+       1720, 547,
+       1725, 547,
+       1730, 547
 };
-static int parser_goto_row113[] = {
-       249,
-       -1, 94,
+static int parser_goto_row115[] = {
+       255,
+       -1, 96,
        0, 12,
        4, 21,
        15, 21,
-       16, 90,
+       16, 92,
        22, 21,
-       23, 90,
-       29, 147,
-       30, 148,
-       32, 151,
-       33, 152,
-       39, 180,
-       45, 188,
-       46, 189,
-       75, 222,
-       86, 90,
-       100, 90,
-       106, 244,
-       107, 245,
-       108, 246,
-       109, 247,
-       115, 255,
-       154, 305,
-       155, 306,
-       156, 307,
-       157, 308,
-       190, 399,
-       191, 400,
-       203, 405,
-       204, 406,
-       205, 407,
-       206, 408,
-       212, 421,
+       23, 92,
+       29, 150,
+       30, 151,
+       32, 154,
+       33, 155,
+       39, 184,
+       44, 191,
+       46, 193,
+       47, 194,
+       77, 233,
+       88, 92,
+       102, 92,
+       108, 255,
+       109, 256,
+       110, 257,
+       111, 258,
+       117, 266,
+       157, 317,
+       158, 318,
+       159, 319,
+       160, 320,
+       195, 416,
+       196, 417,
        214, 422,
-       219, 425,
-       242, 450,
-       252, 455,
-       266, 463,
-       267, 465,
-       268, 466,
-       269, 467,
-       270, 468,
-       271, 469,
-       272, 470,
-       273, 471,
-       274, 472,
-       275, 473,
-       276, 474,
-       277, 475,
-       278, 476,
-       279, 477,
-       280, 478,
-       281, 479,
-       282, 480,
-       283, 481,
-       284, 482,
-       286, 483,
-       294, 488,
-       297, 491,
-       298, 492,
-       300, 493,
-       302, 494,
-       304, 496,
-       313, 503,
-       314, 505,
-       315, 506,
-       316, 507,
-       317, 508,
-       318, 509,
-       319, 510,
-       320, 511,
-       321, 512,
-       322, 513,
-       323, 514,
-       324, 515,
-       325, 516,
-       326, 517,
-       327, 518,
-       328, 519,
-       329, 520,
-       330, 521,
-       331, 522,
-       332, 523,
-       346, 537,
-       357, 189,
-       385, 550,
-       387, 553,
-       394, 562,
-       395, 563,
-       396, 564,
-       409, 571,
-       410, 572,
-       417, 596,
-       429, 608,
-       434, 611,
-       451, 627,
-       457, 631,
-       459, 632,
-       464, 635,
-       489, 664,
-       495, 670,
-       497, 671,
-       501, 673,
-       504, 675,
-       532, 705,
-       536, 709,
-       540, 719,
-       549, 723,
-       551, 725,
-       566, 736,
-       592, 750,
-       599, 763,
-       606, 774,
-       628, 787,
-       655, 794,
-       665, 802,
-       668, 836,
-       669, 837,
-       703, 847,
-       706, 850,
-       711, 856,
-       717, 862,
-       732, 873,
-       733, 874,
-       734, 875,
-       738, 879,
-       746, 886,
-       747, 887,
-       749, 894,
-       786, 924,
-       789, 929,
-       806, 943,
-       808, 945,
-       810, 948,
-       839, 970,
-       849, 979,
-       857, 988,
-       860, 990,
-       863, 992,
-       877, 1033,
-       888, 1045,
-       896, 1052,
-       897, 1059,
-       901, 1062,
-       902, 1063,
-       931, 1087,
-       932, 1088,
-       956, 1100,
-       969, 1111,
-       975, 1114,
-       976, 1115,
-       980, 1118,
-       991, 1130,
-       998, 1135,
-       999, 1136,
-       1001, 1138,
-       1002, 1139,
-       1003, 1140,
-       1004, 1141,
-       1021, 1159,
-       1038, 1186,
-       1043, 1194,
-       1047, 1186,
-       1057, 1059,
-       1060, 1218,
-       1081, 1230,
-       1086, 1234,
-       1093, 1238,
-       1094, 1239,
-       1096, 1240,
-       1112, 1253,
-       1123, 1259,
-       1128, 1260,
-       1146, 1276,
-       1160, 1283,
-       1161, 1285,
-       1162, 1286,
-       1163, 1287,
-       1164, 1288,
-       1165, 1289,
-       1166, 1290,
-       1167, 1291,
-       1168, 1292,
-       1169, 1293,
-       1170, 1294,
-       1171, 1295,
-       1172, 1296,
-       1173, 1297,
-       1174, 1298,
-       1175, 1299,
-       1176, 1300,
-       1177, 1301,
-       1178, 1302,
-       1180, 1303,
-       1187, 1186,
-       1191, 1312,
-       1192, 1313,
-       1195, 1315,
-       1208, 1326,
-       1220, 1356,
-       1221, 1357,
-       1236, 1362,
-       1237, 1363,
-       1261, 1384,
-       1267, 1387,
-       1269, 1388,
-       1270, 1389,
-       1278, 1395,
-       1284, 1399,
-       1311, 1429,
-       1316, 1431,
-       1324, 1436,
-       1327, 1439,
-       1335, 1450,
-       1360, 1463,
-       1366, 1469,
-       1380, 1477,
-       1382, 1478,
-       1392, 1484,
-       1421, 1490,
-       1433, 1498,
-       1442, 750,
-       1444, 750,
-       1445, 1508,
-       1456, 1520,
-       1461, 1527,
-       1464, 1529,
-       1482, 1538,
-       1501, 750,
-       1504, 750,
-       1507, 750,
-       1532, 1597,
-       1544, 1604,
-       1545, 1605,
-       1549, 1607,
-       1553, 1610,
-       1555, 1611,
-       1599, 1655,
-       1618, 1186,
-       1625, 1679,
-       1660, 1707,
-       1661, 1708,
-       1664, 1710,
-       1665, 1711,
-       1666, 1712,
-       1677, 1186,
-       1705, 1743,
-       1744, 1765,
-       1748, 1767
+       215, 423,
+       216, 424,
+       217, 425,
+       223, 438,
+       225, 439,
+       230, 442,
+       253, 467,
+       263, 472,
+       278, 480,
+       279, 482,
+       280, 483,
+       281, 484,
+       282, 485,
+       283, 486,
+       284, 487,
+       285, 488,
+       286, 489,
+       287, 490,
+       288, 491,
+       289, 492,
+       290, 493,
+       291, 494,
+       292, 495,
+       293, 496,
+       294, 497,
+       295, 498,
+       296, 499,
+       298, 500,
+       306, 505,
+       309, 508,
+       310, 509,
+       312, 510,
+       314, 511,
+       316, 513,
+       326, 520,
+       327, 522,
+       328, 523,
+       329, 524,
+       330, 525,
+       331, 526,
+       332, 527,
+       333, 528,
+       334, 529,
+       335, 530,
+       336, 531,
+       337, 532,
+       338, 533,
+       339, 534,
+       340, 535,
+       341, 536,
+       342, 537,
+       343, 538,
+       344, 539,
+       345, 540,
+       359, 554,
+       363, 558,
+       373, 194,
+       402, 570,
+       404, 573,
+       411, 583,
+       412, 584,
+       413, 585,
+       426, 592,
+       427, 593,
+       434, 617,
+       446, 629,
+       451, 632,
+       468, 648,
+       474, 652,
+       476, 653,
+       481, 656,
+       506, 685,
+       512, 691,
+       514, 692,
+       518, 694,
+       521, 696,
+       549, 726,
+       553, 730,
+       560, 743,
+       569, 747,
+       571, 749,
+       587, 760,
+       613, 774,
+       620, 787,
+       627, 798,
+       649, 811,
+       676, 818,
+       686, 826,
+       689, 862,
+       690, 863,
+       724, 873,
+       727, 876,
+       732, 882,
+       738, 888,
+       741, 892,
+       756, 903,
+       757, 904,
+       758, 905,
+       762, 909,
+       770, 916,
+       771, 917,
+       773, 924,
+       810, 954,
+       813, 959,
+       830, 973,
+       832, 975,
+       834, 978,
+       840, 984,
+       865, 1001,
+       875, 1010,
+       883, 1019,
+       886, 1021,
+       889, 1023,
+       893, 1026,
+       907, 1068,
+       918, 1080,
+       926, 1087,
+       927, 1094,
+       931, 1097,
+       932, 1098,
+       961, 1122,
+       962, 1123,
+       987, 1136,
+       1000, 1147,
+       1006, 1150,
+       1007, 1151,
+       1011, 1154,
+       1025, 1167,
+       1032, 1172,
+       1033, 1173,
+       1035, 1175,
+       1036, 1176,
+       1037, 1177,
+       1038, 1178,
+       1056, 1197,
+       1073, 1224,
+       1078, 1232,
+       1082, 1224,
+       1092, 1094,
+       1095, 1256,
+       1116, 1268,
+       1121, 1272,
+       1128, 1276,
+       1129, 1277,
+       1131, 1278,
+       1134, 1283,
+       1148, 1292,
+       1159, 1298,
+       1164, 1299,
+       1183, 1315,
+       1198, 1322,
+       1199, 1324,
+       1200, 1325,
+       1201, 1326,
+       1202, 1327,
+       1203, 1328,
+       1204, 1329,
+       1205, 1330,
+       1206, 1331,
+       1207, 1332,
+       1208, 1333,
+       1209, 1334,
+       1210, 1335,
+       1211, 1336,
+       1212, 1337,
+       1213, 1338,
+       1214, 1339,
+       1215, 1340,
+       1216, 1341,
+       1218, 1342,
+       1225, 1224,
+       1229, 1351,
+       1230, 1352,
+       1233, 1354,
+       1246, 1365,
+       1258, 1397,
+       1259, 1398,
+       1274, 1403,
+       1275, 1404,
+       1300, 1426,
+       1306, 1429,
+       1308, 1430,
+       1309, 1431,
+       1317, 1437,
+       1323, 1441,
+       1350, 1471,
+       1355, 1473,
+       1363, 1478,
+       1366, 1481,
+       1374, 1492,
+       1401, 1505,
+       1407, 1511,
+       1422, 1521,
+       1424, 1522,
+       1434, 1528,
+       1463, 1534,
+       1475, 1542,
+       1484, 774,
+       1486, 774,
+       1487, 1552,
+       1498, 1564,
+       1503, 1571,
+       1506, 1573,
+       1526, 1583,
+       1545, 774,
+       1548, 774,
+       1551, 774,
+       1576, 1642,
+       1589, 1649,
+       1590, 1650,
+       1594, 1652,
+       1598, 1655,
+       1600, 1656,
+       1644, 1700,
+       1663, 1224,
+       1670, 1724,
+       1705, 1752,
+       1706, 1753,
+       1709, 1755,
+       1710, 1756,
+       1711, 1757,
+       1722, 1224,
+       1750, 1788,
+       1789, 1810,
+       1793, 1812
 };
-static int parser_goto_row114[] = {
+static int parser_goto_row116[] = {
        1,
        -1, 13
 };
-static int parser_goto_row115[] = {
+static int parser_goto_row117[] = {
        1,
        -1, 14
 };
-static int parser_goto_row116[] = {
-       4,
-       -1, 893,
-       1506, 1567,
-       1557, 1615,
-       1568, 1635
-};
-static int parser_goto_row117[] = {
-       13,
-       -1, 390,
-       389, 558,
-       393, 561,
-       560, 731,
-       866, 558,
-       868, 561,
-       997, 731,
-       1347, 558,
-       1355, 561,
-       1460, 731,
-       1582, 558,
-       1584, 561,
-       1647, 731
-};
 static int parser_goto_row118[] = {
-       5,
-       -1, 391,
-       723, 867,
-       1215, 1348,
-       1496, 1348,
-       1520, 1583
+       4,
+       -1, 923,
+       1550, 1612,
+       1602, 1660,
+       1613, 1680
 };
 static int parser_goto_row119[] = {
-       1,
-       -1, 1406
+       13,
+       -1, 407,
+       406, 579,
+       410, 582,
+       581, 755,
+       896, 579,
+       898, 582,
+       1031, 755,
+       1388, 579,
+       1396, 582,
+       1502, 755,
+       1627, 579,
+       1629, 582,
+       1692, 755
 };
 static int parser_goto_row120[] = {
-       2,
-       -1, 1021,
-       1743, 1764
+       5,
+       -1, 408,
+       747, 897,
+       1253, 1389,
+       1540, 1389,
+       1564, 1628
 };
 static int parser_goto_row121[] = {
        1,
-       -1, 1022
+       -1, 1448
 };
 static int parser_goto_row122[] = {
-       6,
-       -1, 1023,
-       1139, 1271,
-       1283, 1398,
-       1285, 1400,
-       1286, 1401,
-       1399, 1486
+       2,
+       -1, 1056,
+       1788, 1809
 };
 static int parser_goto_row123[] = {
        1,
-       -1, 1024
+       -1, 1057
 };
 static int parser_goto_row124[] = {
-       10,
-       -1, 1025,
-       1287, 1402,
-       1288, 1403,
-       1292, 1409,
-       1293, 1410,
-       1294, 1411,
-       1295, 1412,
-       1296, 1413,
-       1297, 1414,
-       1298, 1415
+       6,
+       -1, 1058,
+       1176, 1310,
+       1322, 1440,
+       1324, 1442,
+       1325, 1443,
+       1441, 1530
 };
 static int parser_goto_row125[] = {
-       3,
-       -1, 1026,
-       1290, 1407,
-       1291, 1408
+       1,
+       -1, 1059
 };
 static int parser_goto_row126[] = {
-       5,
-       -1, 1027,
-       1299, 1416,
-       1300, 1417,
-       1301, 1418,
-       1302, 1419
+       10,
+       -1, 1060,
+       1326, 1444,
+       1327, 1445,
+       1331, 1451,
+       1332, 1452,
+       1333, 1453,
+       1334, 1454,
+       1335, 1455,
+       1336, 1456,
+       1337, 1457
 };
 static int parser_goto_row127[] = {
        3,
-       -1, 1028,
-       1010, 1149,
-       1141, 1275
+       -1, 1061,
+       1329, 1449,
+       1330, 1450
 };
 static int parser_goto_row128[] = {
-       1,
-       -1, 1029
+       5,
+       -1, 1062,
+       1338, 1458,
+       1339, 1459,
+       1340, 1460,
+       1341, 1461
 };
 static int parser_goto_row129[] = {
-       2,
-       -1, 1030,
-       1009, 1148
+       4,
+       -1, 1063,
+       1044, 1186,
+       1045, 1187,
+       1178, 1314
 };
 static int parser_goto_row130[] = {
        1,
-       -1, 1031
+       -1, 1064
 };
 static int parser_goto_row131[] = {
-       4,
-       -1, 345,
-       246, 453,
-       307, 499,
-       455, 630
+       2,
+       -1, 1065,
+       1043, 1185
 };
 static int parser_goto_row132[] = {
        1,
-       -1, -1
+       -1, 1066
 };
 static int parser_goto_row133[] = {
-       1,
-       -1, 1349
+       4,
+       -1, 358,
+       257, 470,
+       319, 516,
+       472, 651
 };
 static int parser_goto_row134[] = {
-       4,
-       -1, 128,
-       1215, 1350,
-       1463, 1528,
-       1496, 1350
+       1,
+       -1, -1
 };
 static int parser_goto_row135[] = {
        1,
-       -1, 129
+       -1, 1390
 };
 static int parser_goto_row136[] = {
-       6,
-       -1, 130,
-       245, 452,
-       463, 634,
-       465, 636,
-       466, 637,
-       635, 792
+       4,
+       -1, 131,
+       1253, 1391,
+       1505, 1572,
+       1540, 1391
 };
 static int parser_goto_row137[] = {
        1,
-       -1, 131
+       -1, 132
 };
 static int parser_goto_row138[] = {
-       10,
-       -1, 132,
-       467, 638,
-       468, 639,
-       472, 643,
-       473, 644,
-       474, 645,
-       475, 646,
-       476, 647,
-       477, 648,
-       478, 649
+       6,
+       -1, 133,
+       256, 469,
+       480, 655,
+       482, 657,
+       483, 658,
+       656, 816
 };
 static int parser_goto_row139[] = {
-       3,
-       -1, 133,
-       470, 641,
-       471, 642
+       1,
+       -1, 134
 };
 static int parser_goto_row140[] = {
-       5,
-       -1, 134,
-       479, 650,
-       480, 651,
-       481, 652,
-       482, 653
+       10,
+       -1, 135,
+       484, 659,
+       485, 660,
+       489, 664,
+       490, 665,
+       491, 666,
+       492, 667,
+       493, 668,
+       494, 669,
+       495, 670
 };
 static int parser_goto_row141[] = {
-       1,
-       -1, 135
+       3,
+       -1, 136,
+       487, 662,
+       488, 663
 };
 static int parser_goto_row142[] = {
-       1,
-       -1, 136
+       5,
+       -1, 137,
+       496, 671,
+       497, 672,
+       498, 673,
+       499, 674
 };
 static int parser_goto_row143[] = {
-       4,
-       -1, 137,
-       114, 254,
-       1215, 1351,
-       1496, 1351
+       1,
+       -1, 138
 };
 static int parser_goto_row144[] = {
-       2,
-       -1, 138,
-       986, 1126
+       1,
+       -1, 139
 };
 static int parser_goto_row145[] = {
-       1,
-       -1, 534
+       4,
+       -1, 140,
+       116, 265,
+       1253, 1392,
+       1540, 1392
 };
 static int parser_goto_row146[] = {
-       7,
-       -1, 535,
-       531, 704,
-       981, 1119,
-       1117, 1256,
-       1254, 1381,
-       1273, 1391,
-       1390, 1483
+       2,
+       -1, 141,
+       1017, 1162
 };
 static int parser_goto_row147[] = {
        1,
-       -1, 708
+       -1, 551
 };
 static int parser_goto_row148[] = {
-       1,
-       -1, -1
+       7,
+       -1, 552,
+       548, 725,
+       1012, 1155,
+       1153, 1295,
+       1293, 1423,
+       1312, 1433,
+       1432, 1527
 };
 static int parser_goto_row149[] = {
-       2,
-       -1, 1352,
-       1496, 1552
+       1,
+       -1, 729
 };
 static int parser_goto_row150[] = {
        1,
-       -1, 1353
+       -1, -1
 };
 static int parser_goto_row151[] = {
        2,
-       -1, 1274,
-       1276, 1394
+       -1, 1393,
+       1540, 1597
 };
 static int parser_goto_row152[] = {
        1,
-       -1, -1
+       -1, 1394
 };
 static int parser_goto_row153[] = {
-       1,
-       -1, -1
+       2,
+       -1, 1313,
+       1315, 1436
 };
 static int parser_goto_row154[] = {
        1,
@@ -22120,71 +23328,74 @@ static int parser_goto_row163[] = {
        -1, -1
 };
 static int parser_goto_row164[] = {
-       7,
-       -1, 940,
-       809, 946,
-       1098, 1244,
-       1241, 1367,
-       1365, 1467,
-       1530, 1596,
-       1654, 1703
+       1,
+       -1, -1
 };
 static int parser_goto_row165[] = {
-       3,
-       -1, 941,
-       666, 826,
-       1364, 1466
+       1,
+       -1, -1
 };
 static int parser_goto_row166[] = {
-       1,
-       -1, 827
+       8,
+       -1, 970,
+       833, 976,
+       1133, 1282,
+       1279, 1408,
+       1406, 1509,
+       1411, 1512,
+       1574, 1641,
+       1699, 1748
 };
 static int parser_goto_row167[] = {
-       1,
-       -1, 828
+       3,
+       -1, 971,
+       687, 851,
+       1405, 1508
 };
 static int parser_goto_row168[] = {
        1,
-       -1, 829
+       -1, 852
 };
 static int parser_goto_row169[] = {
        1,
-       -1, 830
+       -1, 853
 };
 static int parser_goto_row170[] = {
        1,
-       -1, 831
+       -1, 854
 };
 static int parser_goto_row171[] = {
        1,
-       -1, 832
+       -1, 855
 };
 static int parser_goto_row172[] = {
        1,
-       -1, -1
+       -1, 856
 };
 static int parser_goto_row173[] = {
-       8,
-       -1, 144,
-       31, 150,
-       667, 835,
-       805, 942,
-       809, 947,
-       1252, 1379,
-       1365, 1468,
-       1654, 1704
+       1,
+       -1, 857
 };
 static int parser_goto_row174[] = {
        1,
-       -1, -1
+       -1, 858
 };
 static int parser_goto_row175[] = {
        1,
-       -1, 392
+       -1, -1
 };
 static int parser_goto_row176[] = {
-       1,
-       -1, 1354
+       10,
+       -1, 147,
+       31, 153,
+       688, 861,
+       740, 891,
+       829, 972,
+       833, 977,
+       1291, 1421,
+       1406, 1510,
+       1411, 1513,
+       1699, 1749
 };
 static int parser_goto_row177[] = {
        1,
@@ -22192,262 +23403,277 @@ static int parser_goto_row177[] = {
 };
 static int parser_goto_row178[] = {
        1,
-       -1, -1
+       -1, 409
 };
 static int parser_goto_row179[] = {
        1,
-       -1, 1215
+       -1, 1395
 };
 static int parser_goto_row180[] = {
+       1,
+       -1, -1
+};
+static int parser_goto_row181[] = {
+       1,
+       -1, -1
+};
+static int parser_goto_row182[] = {
+       1,
+       -1, 1253
+};
+static int parser_goto_row183[] = {
        2,
        -1, 15,
        4, 22
 };
-static int parser_goto_row181[] = {
+static int parser_goto_row184[] = {
        4,
        -1, 16,
        4, 23,
-       15, 86,
-       22, 100
+       15, 88,
+       22, 102
 };
-static int parser_goto_row182[] = {
+static int parser_goto_row185[] = {
        8,
        -1, 17,
        4, 24,
-       15, 87,
-       16, 91,
-       22, 101,
-       23, 103,
-       86, 233,
-       100, 239
-};
-static int parser_goto_row183[] = {
-       1,
-       -1, 1327
-};
-static int parser_goto_row184[] = {
-       1,
-       -1, 1060
-};
-static int parser_goto_row185[] = {
-       1,
-       -1, 1195
+       15, 89,
+       16, 93,
+       22, 103,
+       23, 105,
+       88, 244,
+       102, 250
 };
 static int parser_goto_row186[] = {
        1,
-       -1, 1318
+       -1, 1366
 };
 static int parser_goto_row187[] = {
        1,
-       -1, 978
+       -1, 1095
 };
 static int parser_goto_row188[] = {
-       3,
-       -1, 211,
-       292, 487,
-       961, 1105
+       1,
+       -1, 1233
 };
 static int parser_goto_row189[] = {
        1,
-       -1, 554
+       -1, 1357
 };
 static int parser_goto_row190[] = {
        1,
-       -1, 568
+       -1, 1009
 };
 static int parser_goto_row191[] = {
-       1,
-       -1, 221
+       3,
+       -1, 222,
+       304, 504,
+       992, 1141
 };
 static int parser_goto_row192[] = {
        1,
-       -1, 859
+       -1, 574
 };
 static int parser_goto_row193[] = {
        1,
-       -1, 1187
+       -1, 589
 };
 static int parser_goto_row194[] = {
-       2,
-       -1, 1263,
-       1353, 1458
+       1,
+       -1, 232
 };
 static int parser_goto_row195[] = {
        1,
-       -1, 791
+       -1, 885
 };
 static int parser_goto_row196[] = {
-       159,
-       -1, 173,
-       12, 79,
-       21, 79,
-       25, 139,
-       27, 79,
-       31, 79,
-       48, 139,
-       90, 79,
-       94, 79,
-       114, 139,
-       143, 79,
-       188, 393,
-       210, 79,
-       223, 139,
-       225, 139,
-       226, 139,
-       227, 139,
-       228, 139,
-       245, 139,
-       342, 79,
-       415, 594,
-       420, 79,
-       422, 603,
-       445, 139,
-       446, 139,
-       463, 139,
-       465, 139,
-       466, 139,
-       467, 139,
-       468, 139,
-       470, 139,
-       471, 139,
-       472, 139,
-       473, 139,
-       474, 139,
-       475, 139,
-       476, 139,
-       477, 139,
-       478, 139,
-       479, 139,
-       480, 139,
-       481, 139,
-       482, 139,
-       483, 659,
-       486, 79,
-       523, 698,
-       527, 79,
-       530, 79,
-       571, 741,
-       572, 741,
-       596, 759,
-       598, 139,
-       600, 139,
-       631, 659,
-       635, 139,
-       662, 79,
-       666, 833,
-       667, 79,
-       673, 698,
-       709, 854,
-       723, 868,
-       725, 393,
-       769, 139,
-       770, 139,
-       771, 139,
-       772, 139,
-       787, 927,
-       804, 139,
-       805, 833,
-       807, 79,
-       809, 833,
-       817, 139,
-       825, 79,
-       875, 1032,
-       879, 1035,
-       890, 79,
-       919, 139,
-       920, 139,
-       939, 79,
-       957, 139,
-       958, 139,
-       959, 139,
-       963, 79,
-       964, 139,
-       965, 139,
-       990, 393,
-       1009, 1032,
-       1010, 1032,
-       1045, 594,
-       1049, 79,
-       1098, 833,
-       1100, 1249,
-       1109, 139,
-       1110, 139,
-       1139, 1032,
-       1141, 1032,
-       1215, 1355,
-       1241, 833,
-       1243, 79,
-       1246, 139,
-       1247, 139,
-       1252, 79,
-       1259, 393,
-       1283, 1032,
-       1285, 1032,
-       1286, 1032,
-       1287, 1032,
-       1288, 1032,
-       1290, 1032,
-       1291, 1032,
-       1292, 1032,
-       1293, 1032,
-       1294, 1032,
-       1295, 1032,
-       1296, 1032,
-       1297, 1032,
-       1298, 1032,
-       1299, 1032,
-       1300, 1032,
-       1301, 1032,
-       1302, 1032,
-       1303, 1425,
-       1319, 594,
-       1364, 833,
-       1365, 833,
-       1373, 139,
-       1374, 139,
-       1375, 139,
-       1376, 139,
-       1384, 393,
-       1395, 1425,
-       1399, 1032,
-       1431, 594,
-       1440, 594,
-       1442, 594,
-       1444, 594,
-       1450, 393,
-       1463, 139,
-       1474, 139,
-       1475, 139,
-       1484, 1541,
-       1496, 1355,
-       1520, 1584,
-       1530, 833,
-       1560, 79,
-       1564, 79,
-       1607, 393,
-       1612, 79,
-       1620, 79,
-       1621, 79,
-       1624, 79,
-       1629, 79,
-       1632, 79,
-       1654, 833,
-       1668, 79,
-       1675, 79,
-       1680, 79,
-       1685, 79,
-       1743, 1032
+       1,
+       -1, 1225
 };
 static int parser_goto_row197[] = {
        2,
-       -1, 18,
-       13, 80
+       -1, 1302,
+       1394, 1500
 };
 static int parser_goto_row198[] = {
+       1,
+       -1, 815
+};
+static int parser_goto_row199[] = {
+       162,
+       -1, 177,
+       12, 81,
+       21, 81,
+       25, 142,
+       27, 81,
+       31, 81,
+       49, 142,
+       92, 81,
+       96, 81,
+       116, 142,
+       146, 81,
+       193, 410,
+       221, 81,
+       234, 142,
+       236, 142,
+       237, 142,
+       238, 142,
+       239, 142,
+       256, 142,
+       355, 81,
+       432, 615,
+       437, 81,
+       439, 624,
+       462, 142,
+       463, 142,
+       480, 142,
+       482, 142,
+       483, 142,
+       484, 142,
+       485, 142,
+       487, 142,
+       488, 142,
+       489, 142,
+       490, 142,
+       491, 142,
+       492, 142,
+       493, 142,
+       494, 142,
+       495, 142,
+       496, 142,
+       497, 142,
+       498, 142,
+       499, 142,
+       500, 680,
+       503, 81,
+       540, 719,
+       544, 81,
+       547, 81,
+       592, 765,
+       593, 765,
+       617, 783,
+       619, 142,
+       621, 142,
+       652, 680,
+       656, 142,
+       683, 81,
+       687, 859,
+       688, 81,
+       694, 719,
+       730, 880,
+       740, 81,
+       747, 898,
+       749, 410,
+       793, 142,
+       794, 142,
+       795, 142,
+       796, 142,
+       811, 957,
+       828, 142,
+       829, 859,
+       831, 81,
+       833, 859,
+       842, 142,
+       850, 81,
+       905, 1067,
+       909, 1070,
+       920, 81,
+       949, 142,
+       950, 142,
+       969, 81,
+       988, 142,
+       989, 142,
+       990, 142,
+       994, 81,
+       995, 142,
+       996, 142,
+       1021, 410,
+       1043, 1067,
+       1044, 1067,
+       1045, 1067,
+       1080, 615,
+       1084, 81,
+       1133, 859,
+       1136, 1288,
+       1145, 142,
+       1146, 142,
+       1176, 1067,
+       1178, 1067,
+       1253, 1396,
+       1279, 859,
+       1281, 81,
+       1285, 142,
+       1286, 142,
+       1291, 81,
+       1298, 410,
+       1322, 1067,
+       1324, 1067,
+       1325, 1067,
+       1326, 1067,
+       1327, 1067,
+       1329, 1067,
+       1330, 1067,
+       1331, 1067,
+       1332, 1067,
+       1333, 1067,
+       1334, 1067,
+       1335, 1067,
+       1336, 1067,
+       1337, 1067,
+       1338, 1067,
+       1339, 1067,
+       1340, 1067,
+       1341, 1067,
+       1342, 1467,
+       1358, 615,
+       1405, 859,
+       1406, 859,
+       1411, 859,
+       1415, 142,
+       1416, 142,
+       1417, 142,
+       1418, 142,
+       1426, 410,
+       1437, 1467,
+       1441, 1067,
+       1473, 615,
+       1482, 615,
+       1484, 615,
+       1486, 615,
+       1492, 410,
+       1505, 142,
+       1518, 142,
+       1519, 142,
+       1528, 1586,
+       1540, 1396,
+       1564, 1629,
+       1574, 859,
+       1605, 81,
+       1609, 81,
+       1652, 410,
+       1657, 81,
+       1665, 81,
+       1666, 81,
+       1669, 81,
+       1674, 81,
+       1677, 81,
+       1699, 859,
+       1713, 81,
+       1720, 81,
+       1725, 81,
+       1730, 81,
+       1788, 1067
+};
+static int parser_goto_row200[] = {
+       2,
+       -1, 18,
+       13, 82
+};
+static int parser_goto_row201[] = {
        3,
        -1, 19,
-       18, 96,
-       80, 231
+       18, 98,
+       82, 242
 };
 
 const int* const parser_goto_table[] = {
@@ -22648,5 +23874,8 @@ const int* const parser_goto_table[] = {
        parser_goto_row195,
        parser_goto_row196,
        parser_goto_row197,
-       parser_goto_row198
+       parser_goto_row198,
+       parser_goto_row199,
+       parser_goto_row200,
+       parser_goto_row201
 };
index 1e11840..cd4f205 100644 (file)
@@ -30,7 +30,7 @@ redef class ToolContext
 
                var eof = tree.n_eof
                if eof isa AError then
-                       self.fatal_error(null, "Fatal Error: {eof.message}")
+                       self.fatal_error(null, "Fatal Error: {eof.message}.")
                        abort
                end
                return tree.n_base.as(not null)
@@ -43,7 +43,7 @@ redef class ToolContext
                var nmodule = parse_module(string)
                var nclassdefs = nmodule.n_classdefs
                if nclassdefs.length != 1 then
-                       self.fatal_error(null, "Fatal Error: not a classdef")
+                       self.fatal_error(null, "Fatal Error: not a classdef.")
                        abort
                end
                return nclassdefs.first
@@ -57,7 +57,7 @@ redef class ToolContext
                var nclassdef = parse_classdef(mod_string)
                var npropdefs = nclassdef.n_propdefs
                if npropdefs.length != 1 then
-                       self.fatal_error(null, "Fatal Error: not a propdef")
+                       self.fatal_error(null, "Fatal Error: not a propdef.")
                        abort
                end
                return npropdefs.first
@@ -91,7 +91,7 @@ redef class ToolContext
                var nclassdef = parse_classdef(mod_string).as(AStdClassdef)
                var nsuperclasses = nclassdef.n_propdefs
                if nsuperclasses.length != 1 then
-                       self.fatal_error(null, "Fatal Error: not a super class declaration")
+                       self.fatal_error(null, "Fatal Error: not a super class declaration.")
                        abort
                end
                return nsuperclasses.first
index 0a32484..5f0faf1 100644 (file)
@@ -110,7 +110,6 @@ redef class ToolContext
 
                        for phase in phases do
                                if phase.disabled then continue
-                               self.info(" phase: {phase}", 3)
                                assert phase.toolcontext == self
                                var errcount = self.error_count
                                phase.process_nmodule(nmodule)
@@ -148,7 +147,7 @@ redef class ToolContext
                var time1 = get_time
                self.info("*** END SEMANTIC ANALYSIS: {time1-time0} ***", 2)
 
-               errors_info
+               self.check_errors
        end
 
        # Process the given `phase` on the `npropdef`
@@ -223,7 +222,7 @@ abstract class Phase
        end
 
        # By default, the name is the lowercased prefix of the classname
-       redef fun to_s do return class_name.strip_extension("Phase").to_lower
+       redef fun to_s do return class_name.strip_extension("Phase").to_snake_case
 
        # Is the phase globally disabled?
        # A disabled phase is not called automatically called by `ToolContext::run_phases` and cie.
index c04bd28..2958c4b 100644 (file)
@@ -42,7 +42,7 @@ class AndroidPlatform
 
        redef fun supports_linker_script do return false
 
-       redef fun toolchain(toolcontext) do return new AndroidToolchain(toolcontext)
+       redef fun toolchain(toolcontext, compiler) do return new AndroidToolchain(toolcontext, compiler)
 end
 
 class AndroidToolchain
@@ -57,25 +57,23 @@ class AndroidToolchain
                return "{android_project_root}/jni/nit_compile/"
        end
 
-       redef fun default_outname(mainmodule) do return "{mainmodule.name}.apk"
+       redef fun default_outname do return "{super}.apk"
 
-       redef fun write_files(compiler, compile_dir, cfiles)
+       redef fun write_files(compile_dir, cfiles)
        do
                var android_project_root = android_project_root.as(not null)
-               var project = toolcontext.modelbuilder.android_project_for(compiler.mainmodule)
-               var short_project_name = compiler.mainmodule.name.replace("-", "_")
+               var project = new AndroidProject(toolcontext.modelbuilder, compiler.mainmodule)
                var release = toolcontext.opt_release.value
 
                var app_name = project.name
-               if app_name == null then app_name = compiler.mainmodule.name
                if not release then app_name += " Debug"
 
-               var app_package = project.java_package
-               if app_package == null then app_package = "org.nitlanguage.{short_project_name}"
+               var short_project_name = project.short_name
+
+               var app_package = project.namespace
                if not release then app_package += "_debug"
 
                var app_version = project.version
-               if app_version == null then app_version = "1.0"
 
                var app_min_api = project.min_api
                if app_min_api == null then app_min_api = 10
@@ -107,7 +105,7 @@ class AndroidToolchain
                if not dir.file_exists then dir.mkdir
 
                # compile normal C files
-               super(compiler, compile_dir, cfiles)
+               super
 
                # Gather extra C files generated elsewhere than in super
                for f in compiler.extern_bodies do
@@ -181,14 +179,15 @@ $(call import-module,android/native_app_glue)
 
                ### generate AndroidManifest.xml
                dir = android_project_root
-               """<?xml version="1.0" encoding="utf-8"?>
+               var manifest_file = new FileWriter.open("{dir}/AndroidManifest.xml")
+               manifest_file.write """
+<?xml version="1.0" encoding="utf-8"?>
 <!-- BEGIN_INCLUDE(manifest) -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
         package="{{{app_package}}}"
         android:versionCode="{{{project.version_code}}}"
         android:versionName="{{{app_version}}}">
 
-    <!-- This is the platform API where NativeActivity was introduced. -->
     <uses-sdk
         android:minSdkVersion="{{{app_min_api}}}"
         android:targetSdkVersion="{{{app_target_api}}}"
@@ -200,22 +199,23 @@ $(call import-module,android/native_app_glue)
                android:debuggable="{{{not release}}}"
                {{{icon_declaration}}}
                android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation">
+"""
 
-        <!-- Our activity is the built-in NativeActivity framework class.
-             This will take care of integrating with our NDK code. -->
-        <activity android:name="android.app.NativeActivity"
+               for activity in project.activities do
+                       manifest_file.write """
+        <activity android:name="{{{activity}}}"
                 android:label="@string/app_name"
                 {{{project.manifest_activity_attributes.join("\n")}}}
                 {{{icon_declaration}}}>
-            <!-- Tell NativeActivity the name of our .so -->
-            <meta-data android:name=\"android.app.lib_name\"
-                    android:value=\"main\" />
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+"""
+               end
 
+               manifest_file.write """
 {{{project.manifest_application_lines.join("\n")}}}
 
     </application>
@@ -224,7 +224,8 @@ $(call import-module,android/native_app_glue)
 
 </manifest>
 <!-- END_INCLUDE(manifest) -->
-               """.write_to_file("{dir}/AndroidManifest.xml")
+"""
+               manifest_file.close
 
                ### Link to png sources
                # libpng is not available on Android NDK
@@ -308,12 +309,12 @@ $(call import-module,android/native_app_glue)
                end
        end
 
-       redef fun write_makefile(compiler, compile_dir, cfiles)
+       redef fun write_makefile(compile_dir, cfiles)
        do
                # Do nothing, already done in `write_files`
        end
 
-       redef fun compile_c_code(compiler, compile_dir)
+       redef fun compile_c_code(compile_dir)
        do
                var android_project_root = android_project_root.as(not null)
                var short_project_name = compiler.mainmodule.name.replace("-", "_")
@@ -341,8 +342,9 @@ $(call import-module,android/native_app_glue)
                        var tsa_server= "TSA_SERVER".environ
 
                        if key_alias.is_empty then
-                               toolcontext.fatal_error(null,
-                                       "Fatal Error: the environment variable `KEY_ALIAS` must be set to use the `--release` option on Android projects.")
+                               toolcontext.error(null,
+                                       "Error: the environment variable `KEY_ALIAS` must be set to use the `--release` option on Android projects.")
+                               return
                        end
 
                        args = ["jarsigner", "-sigalg", "MD5withRSA", "-digestalg", "SHA1", apk_path, key_alias]
index 484c0a6..347c4dc 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Annotations to gather metadata on Android projects. Get the metadata
-# by calling `ModelBuilder::android_project_for`.
+# Additionnal annotations to gather metadata on Android projects
 module android_annotations
 
-private import parser_util
-import modelize
-import literal
-import semantize
-private import annotation
+intrude import app_annotations
 
 # Metadata associated to an Android project
 class AndroidProject
-       # Name of the resulting application
-       var name: nullable String = null
-
-       # Java package used to identify the APK
-       var java_package: nullable String = null
-
-       # Version of the Android application and APK
-       var version: nullable String = null
-
-       # Numerical version code of the Android application and APK
-       var version_code: Int = 0
+       super AppProject
 
        # Custom lines to add to the AndroidManifest.xml in the <manifest> node
        var manifest_lines = new Array[String]
@@ -56,128 +41,51 @@ class AndroidProject
        # Maximum API level on which the application will be allowed to run
        var max_api: nullable Int = null
 
-       redef fun to_s do return """
-name: {{{name or else "null"}}}
-namespace: {{{java_package or else "null"}}}
-version: {{{version or else "null"}}}"""
-end
+       # Activities to declare in the manifest
+       var activities = new Array[String]
 
-redef class ModelBuilder
-       # Get the `AndroidProject` gathered from `mmodule` and its importations
-       fun android_project_for(mmodule: MModule): AndroidProject
+       init
        do
-               var project = new AndroidProject
-
-               var annot = lookup_annotation_on_modules("app_name", mmodule)
-               if annot != null then project.name = annot.arg_as_string(self)
-
-               annot =  lookup_annotation_on_modules("app_version", mmodule)
-               if annot != null then project.version =  annot.as_version(self)
-
-               annot = lookup_annotation_on_modules("java_package", mmodule)
-               if annot != null then project.java_package = annot.arg_as_string(self)
-
-               var annots = collect_annotations_on_modules("min_api_version", mmodule)
+               var annots = modelbuilder.collect_annotations_on_modules("min_api_version", mainmodule)
                if not annots.is_empty then
-                       var i = annots.pop.arg_as_int(self)
+                       var i = annots.pop.arg_as_int(modelbuilder)
                        if i == null then i = 0
-                       project.min_api = i
+                       min_api = i
                        for an in annots do
-                               i = an.arg_as_int(self)
+                               i = an.arg_as_int(modelbuilder)
                                if i == null then continue
-                               project.min_api = project.min_api.max(i)
+                               min_api = min_api.max(i)
                        end
                end
 
-               annots = collect_annotations_on_modules("max_api_version", mmodule)
+               annots = modelbuilder.collect_annotations_on_modules("max_api_version", mainmodule)
                if not annots.is_empty then
-                       var i = annots.pop.arg_as_int(self)
+                       var i = annots.pop.arg_as_int(modelbuilder)
                        if i == null then i = 0
-                       project.max_api = i
+                       max_api = i
                        for an in annots do
-                               i = an.arg_as_int(self)
+                               i = an.arg_as_int(modelbuilder)
                                if i == null then continue
-                               project.max_api = project.max_api.min(i)
+                               max_api = max_api.min(i)
                        end
                end
 
-               annot = lookup_annotation_on_modules("target_api_version", mmodule)
-               if annot != null then project.target_api = annot.arg_as_int(self) or else 0
+               var annot = modelbuilder.lookup_annotation_on_modules("target_api_version", mainmodule)
+               if annot != null then target_api = annot.arg_as_int(modelbuilder) or else 0
 
-               annots = collect_annotations_on_modules("android_manifest", mmodule)
-               for an in annots do project.manifest_lines.add an.arg_as_string(self) or else ""
+               annots = modelbuilder.collect_annotations_on_modules("android_manifest", mainmodule)
+               for an in annots do manifest_lines.add an.arg_as_string(modelbuilder) or else ""
 
-               annots = collect_annotations_on_modules("android_manifest_application", mmodule)
-               for an in annots do project.manifest_application_lines.add an.arg_as_string(self) or else ""
+               annots = modelbuilder.collect_annotations_on_modules("android_manifest_application", mainmodule)
+               for an in annots do manifest_application_lines.add an.arg_as_string(modelbuilder) or else ""
 
-               annots = collect_annotations_on_modules("android_manifest_activity", mmodule)
-               for an in annots do project.manifest_activity_attributes.add an.arg_as_string(self) or else ""
+               annots = modelbuilder.collect_annotations_on_modules("android_manifest_activity", mainmodule)
+               for an in annots do manifest_activity_attributes.add an.arg_as_string(modelbuilder) or else ""
 
-               # Get the date and time (down to the minute) as string
-               var local_time = new Tm.localtime
-               var local_time_s = local_time.strftime("%y%m%d%H%M")
-               project.version_code = local_time_s.to_i
-
-               toolcontext.check_errors
-
-               return project
-       end
-end
-
-redef class AAnnotation
-       # Returns a version string (example: "1.5.6b42a7c") from an annotation `version(1, 5, git_revision)`.
-       #
-       # The user can enter as many fields as needed. The call to `git_revision` will be replaced by the short
-       # revision number. If the working tree is dirty, it will append another field with "d" for dirty.
-       private fun as_version(modelbuilder: ModelBuilder): String
-       do
-               var version_fields = new Array[Object]
-
-               var args = n_args
-               if args.length < 1 then
-                       modelbuilder.error(self, "Annotation error: \"{name}\" expects at least a single argument.")
-                       return ""
-               else
-                       for arg in args do
-                               var format_error = "Annotation error: \"{name}\" expects its arguments to be of type Int or a call to `git_revision`"
-
-                               var value
-                               value = arg.as_int
-                               if value != null then
-                                       version_fields.add value
-                                       continue
-                               end
-
-                               value = arg.as_string
-                               if value != null then
-                                       version_fields.add value
-                               end
-
-                               value = arg.as_id
-                               if value == "git_revision" then
-                                       # Get Git short revision
-                                       var proc = new ProcessReader("git", "rev-parse", "--short", "HEAD")
-                                       proc.wait
-                                       assert proc.status == 0
-                                       var lines = proc.read_all
-                                       var revision = lines.split("\n").first
-
-                                       # Is it dirty?
-                                       # If not, the return of `git diff --shortstat` is an empty line
-                                       proc = new ProcessReader("git", "diff-index", "--quiet", "HEAD")
-                                       proc.wait
-                                       var dirty = proc.status != 0
-                                       if dirty then revision += ".d"
-
-                                       version_fields.add revision
-                                       continue
-                               end
-
-                               modelbuilder.error(self, format_error)
-                               return ""
-                       end
+               annots = modelbuilder.collect_annotations_on_modules("android_activity", mainmodule)
+               for an in annots do
+                       var activity = an.arg_as_string(modelbuilder)
+                       if activity != null then activities.add activity
                end
-
-               return version_fields.join(".")
        end
 end
diff --git a/src/platform/app_annotations.nit b/src/platform/app_annotations.nit
new file mode 100644 (file)
index 0000000..62fbbb0
--- /dev/null
@@ -0,0 +1,132 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Annotations to gather metadata on `app.nit` projects
+module app_annotations
+
+private import parser_util
+import modelize
+import literal
+import semantize
+private import annotation
+
+# Metadata associated to an `app.nit` project
+class AppProject
+       # Pretty name of the resulting application
+       var name: String = mainmodule.first_real_mmodule.name is lazy
+
+       # Short project name used in `namespace` and configuration files
+       var short_name: String = mainmodule.name.replace("-", "_") is lazy
+
+       # Namespace/package used to identify the application
+       var namespace = "org.nitlanguage.{short_name}" is lazy
+
+       # Version of the application
+       var version = "0.1"
+
+       # Numerical version code of the application
+       var version_code: Int is lazy do
+
+               # Get the date and time (down to the minute) as string
+               var local_time = new Tm.localtime
+               var local_time_s = local_time.strftime("%y%m%d%H%M")
+               return local_time_s.to_i
+       end
+
+       private var modelbuilder: ModelBuilder
+       private var mainmodule: MModule
+
+       init
+       do
+               var annot = modelbuilder.lookup_annotation_on_modules("app_name", mainmodule)
+               if annot != null then
+                       var val = annot.arg_as_string(modelbuilder)
+                       if val != null then name = val
+               end
+
+               annot = modelbuilder.lookup_annotation_on_modules("app_version", mainmodule)
+               if annot != null then version = annot.as_version(modelbuilder)
+
+               annot = modelbuilder.lookup_annotation_on_modules("app_namespace", mainmodule)
+               if annot != null then
+                       var val = annot.arg_as_string(modelbuilder)
+                       if val != null then namespace = val
+               end
+
+               modelbuilder.toolcontext.check_errors
+       end
+
+       redef fun to_s do return """
+name: {{{name}}}
+namespace: {{{namespace}}}
+version: {{{version}}}"""
+end
+
+redef class AAnnotation
+       # Returns a version string (example: "1.5.6b42a7c") from an annotation `version(1, 5, git_revision)`.
+       #
+       # The user can enter as many fields as needed. The call to `git_revision` will be replaced by the short
+       # revision number. If the working tree is dirty, it will append another field with "d" for dirty.
+       private fun as_version(modelbuilder: ModelBuilder): String
+       do
+               var version_fields = new Array[Object]
+
+               var args = n_args
+               if args.length < 1 then
+                       modelbuilder.error(self, "Syntax Error: `{name}` expects at least one argument.")
+                       return ""
+               else
+                       for arg in args do
+                               var format_error = "Syntax Eror: `{name}` expects its arguments to be of type Int or a call to `git_revision`."
+
+                               var value
+                               value = arg.as_int
+                               if value != null then
+                                       version_fields.add value
+                                       continue
+                               end
+
+                               value = arg.as_string
+                               if value != null then
+                                       version_fields.add value
+                               end
+
+                               value = arg.as_id
+                               if value == "git_revision" then
+                                       # Get Git short revision
+                                       var proc = new ProcessReader("git", "rev-parse", "--short", "HEAD")
+                                       proc.wait
+                                       assert proc.status == 0
+                                       var lines = proc.read_all
+                                       var revision = lines.split("\n").first
+
+                                       # Is it dirty?
+                                       # If not, the return of `git diff --shortstat` is an empty line
+                                       proc = new ProcessReader("git", "diff-index", "--quiet", "HEAD")
+                                       proc.wait
+                                       var dirty = proc.status != 0
+                                       if dirty then revision += ".d"
+
+                                       version_fields.add revision
+                                       continue
+                               end
+
+                               modelbuilder.error(self, format_error)
+                               return ""
+                       end
+               end
+
+               return version_fields.join(".")
+       end
+end
index 3e9199a..90e361e 100644 (file)
@@ -35,17 +35,17 @@ class EmscriptenPlatform
        redef fun supports_libunwind do return false
        redef fun supports_libgc do return false
        redef fun supports_linker_script do return false
-       redef fun toolchain(toolcontext) do return new EnscriptenToolchain(toolcontext)
+       redef fun toolchain(toolcontext, compiler) do return new EnscriptenToolchain(toolcontext, compiler)
 end
 
 class EnscriptenToolchain
        super MakefileToolchain
 
-       redef fun makefile_name(mainmodule) do return "{mainmodule.name}.js.mk"
+       redef fun makefile_name do return "{super}.js.mk"
 
-       redef fun default_outname(mainmodule) do return "{super}.js"
+       redef fun default_outname do return "{super}.js"
 
-       redef fun write_makefile(compiler, compile_dir, cfiles)
+       redef fun write_makefile(compile_dir, cfiles)
        do
                super
 
diff --git a/src/platform/ios.nit b/src/platform/ios.nit
new file mode 100644 (file)
index 0000000..27c05c6
--- /dev/null
@@ -0,0 +1,121 @@
+# This file is part of NIT ( http://www.nitlanguage.org )
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Compile programs for the iOS platform
+module ios
+
+import platform
+import compiler::abstract_compiler
+import xcode_templates
+import app_annotations
+
+redef class ToolContext
+       redef fun platform_from_name(name)
+       do
+               if name == "ios" then return new IOSPlatform
+               return super
+       end
+end
+
+private class IOSPlatform
+       super Platform
+
+       redef fun supports_libunwind do return false
+       redef fun supports_libgc do return false
+       redef fun toolchain(toolcontext, compiler) do return new IOSToolchain(toolcontext, compiler)
+end
+
+private class IosProject
+       super AppProject
+
+       redef fun namespace do return super.to_camel_case
+end
+
+private class IOSToolchain
+       super MakefileToolchain
+
+       # Root of the iOS project, usually `.nit_compile/ios/`
+       var ios_project_root: String is noinit
+
+       # `app.nit` project for the current compilation target
+       var app_project = new IosProject(compiler.modelbuilder, compiler.mainmodule) is lazy
+
+       redef fun default_outname do return "{super}.app"
+
+       # Compile C files in `ios_project_root/app_project.name`
+       redef fun compile_dir
+       do
+               ios_project_root = super/"ios"
+               return ios_project_root/app_project.short_name
+       end
+
+       redef fun write_files(compile_dir, cfiles)
+       do
+               # Clear the project directory before writing anything
+               if ios_project_root.file_exists then ios_project_root.rmdir
+               compile_dir.mkdir
+
+               super
+       end
+
+       redef fun write_makefile(compile_dir, cfiles)
+       do
+               var project_name = app_project.short_name
+
+               # Create an XCode project directory
+               var dir = ios_project_root/project_name+".xcodeproj"
+               if not dir.file_exists then dir.mkdir
+
+               # Create a PBX project file
+               var pbx = new PbxprojectTemplate(project_name)
+
+               ## Register all source files
+               for file in cfiles do pbx.add_file new PbxFile(file)
+               for file in compiler.extern_bodies do
+                       pbx.add_file new PbxFile(file.filename.basename(""))
+               end
+
+               ## TODO Register asset files
+
+               pbx.write_to_file dir/"project.pbxproj"
+
+               # Create the plist in the same directory as the generated C code
+               if not compile_dir.file_exists then compile_dir.mkdir
+               var plist = new PlistTemplate(app_project.name, app_project.namespace,
+                       app_project.version, app_project.version_code.to_s)
+               plist.write_to_file compile_dir/"Info.plist"
+       end
+
+       redef fun compile_c_code(compile_dir)
+       do
+               var project_name = app_project.short_name
+               var release = toolcontext.opt_release.value
+               var outfile = outfile(compiler.mainmodule)
+
+               # Compile with `xcodebuild`
+               #
+               # TODO support more than the iPhone and the simulator.
+               var args = ["sh", "-c", "cd {ios_project_root}; " +
+                       "xcodebuild -target '{project_name}' " +
+                       "-destination 'platform=iOS Simulator,name=iPhone' " +
+                       "-configuration {if release then "Release" else "Debug"} " +
+                       "-sdk iphonesimulator build"]
+               toolcontext.exec_and_check(args, "iOS project error")
+
+               # Move compiled app to destination
+               if outfile.file_exists then outfile.rmdir
+               args = ["mv", "{ios_project_root}/build/Debug-iphonesimulator/{project_name}.app", outfile]
+               toolcontext.exec_and_check(args, "iOS project error")
+       end
+end
index 40069c4..8fafcd1 100644 (file)
@@ -44,21 +44,21 @@ private class PlatformPhase
                # Do some validity checks and print errors if the annotation is used incorrectly
                var modelbuilder = toolcontext.modelbuilder
                if not nmoduledecl isa AModuledecl then
-                       modelbuilder.error(nat, "Syntax error: only the declaration of modules may use \"{annotation_name}\".")
+                       modelbuilder.error(nat, "Syntax Error: only the declaration of modules may use `{annotation_name}`.")
                        return
                end
 
                var args = nat.n_args
                var platform_name
                if args.length > 1 then
-                       modelbuilder.error(nat, "Syntax error: \"{annotation_name}\" expects at most a single argument.")
+                       modelbuilder.error(nat, "Syntax Error: `{annotation_name}` expects at most a single argument.")
                        return
                else if args.is_empty then
                        platform_name = nmoduledecl.n_name.collect_text
                else
                        platform_name = args.first.as_string
                        if platform_name == null then
-                               var format_error = "Syntax error: \"{annotation_name}\" expects its argument to be the name of the target platform as a String literal."
+                               var format_error = "Syntax Error: `{annotation_name}` expects its argument to be the name of the target platform as a String literal."
                                modelbuilder.error(nat, format_error)
                                return
                        end
@@ -69,13 +69,13 @@ private class PlatformPhase
 
                var platform = toolcontext.platform_from_name(platform_name)
                if platform == null then
-                       toolcontext.error(nat.location, "Error: target platform \"{platform_name}\" unknown")
+                       toolcontext.error(nat.location, "Error: target platform `{platform_name}` unknown.")
                        return
                end
 
                var previous_target_platform = mmodule.target_platform
                if previous_target_platform != null and previous_target_platform != platform then
-                       modelbuilder.error(nat, "Syntax error: a target platform has already been defined as \"{previous_target_platform}\".")
+                       modelbuilder.error(nat, "Syntax Error: a target platform has already been defined as `{previous_target_platform}`.")
                end
 
                mmodule.local_target_platform = platform
index d7103db..8136187 100644 (file)
@@ -37,13 +37,13 @@ class PnaclPlatform
 
        redef fun no_main do return true
 
-       redef fun toolchain(toolcontext) do return new PnaclToolchain(toolcontext)
+       redef fun toolchain(toolcontext, compiler) do return new PnaclToolchain(toolcontext, compiler)
 end
 
 class PnaclToolchain
        super MakefileToolchain
 
-       redef fun write_files(compiler, compile_dir, cfiles)
+       redef fun write_files(compile_dir, cfiles)
        do
                var app_name = compiler.mainmodule.name
 
@@ -52,7 +52,7 @@ class PnaclToolchain
                if not dir.file_exists then dir.mkdir
 
                # compile normal C files
-               super(compiler, compile_dir, cfiles)
+               super
 
                # Gather extra C files generated elsewhere than in super
                for f in compiler.extern_bodies do
@@ -238,12 +238,12 @@ function updateStatus(opt_message) {
                """.write_to_file(file)
        end
 
-       redef fun write_makefile(compiler, compile_dir, cfiles)
+       redef fun write_makefile(compile_dir, cfiles)
        do
                # Do nothing, already done in `write_files`
        end
 
-       redef fun compile_c_code(compiler, compile_dir)
+       redef fun compile_c_code(compile_dir)
        do
                # Generate the pexe
                toolcontext.exec_and_check(["make", "-C", compile_dir, "-j", "4"], "PNaCl project error")
diff --git a/src/platform/xcode_templates.nit b/src/platform/xcode_templates.nit
new file mode 100644 (file)
index 0000000..aa6cc5b
--- /dev/null
@@ -0,0 +1,557 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Templates and other services to create XCode projects
+module xcode_templates
+
+import template
+
+import platform
+import compiler::abstract_compiler
+
+redef class Sys
+       # Map to identify the PBX file type for a given file extension
+       private var pbx_file_types: Map[String, String] is lazy do
+               var map = new HashMap[String, String]
+
+               # Source code
+               map["m"] =                      "sourcecode.c.objc"
+               map["c"] =                      "sourcecode.c.c"
+               map["h"] =                      "sourcecode.c.h"
+               map["cpp"] =            "sourcecode.cpp.cpp"
+               map["hpp"] =            "sourcecode.cpp.h"
+               map["vsh"] =            "sourcecode.glsl"
+               map["fsh"] =            "sourcecode.glsl"
+
+               # Images
+               map["png"] =            "image.png"
+               map["gif"] =            "image.gif"
+               map["jpg"] =            "image.jpeg"
+               map["jpeg"] =           "image.jpeg"
+               map["pdf"] =            "image.pdf"
+               map["ico"] =            "image.ico"
+
+               # Others
+               map["app"] =            "wrapper.application"
+               map["plist"] =          "text.plist.xml"
+               map["storyboard"] =     "file.storyboard"
+               map["xib"] =            "file.xib"
+               map["xcassets"] =       "folder.assetcatalog"
+               map["xctest"] =         "wrapper.cfbundle"
+
+               return map
+       end
+
+       # Generator of PBX UUIDs quique to an execution of the compiler
+       private var pbx_uuid_generator = new PbxUUIDGenerator is lazy
+end
+
+# Generator of PBX UUIDs
+#
+# PBX UUID are composed of 24 hex characters.
+# They only need to be unique within the same project.
+#
+# This implementation simply counts upward from 0.
+class PbxUUIDGenerator
+       private var seed = 0
+
+       # Generate a new UUID
+       fun next_uuid: String
+       do
+               seed += 1
+
+               var hex_val = seed.to_hex.to_upper
+               return "0"*(24-hex_val.length) + hex_val
+       end
+end
+
+# Reference to a file for the PBX format of a project file
+#
+# TODO create subclasses for different file types, this is currently for
+# compilable source files only.
+class PbxFile
+
+       # Path to `self`
+       var path: String
+
+       # UUID for build elements
+       private var build_uuid: String = sys.pbx_uuid_generator.next_uuid is lazy
+
+       # File reference UUID
+       private var ref_uuid: String = sys.pbx_uuid_generator.next_uuid is lazy
+
+       # Documentation to add besides this file in the template
+       private fun doc: String do return path
+
+       # PBX file type for `self`
+       fun file_type: String
+       do
+               var map = sys.pbx_file_types
+               var ext = path.file_extension
+               if ext != null and map.keys.has(ext) then return map[ext]
+               return "unknown"
+       end
+
+       # PBX description of this file
+       private fun description: Writable do return """
+               {{{ref_uuid}}} /* {{{doc}}} */ = {
+                       isa = PBXFileReference;
+                       fileEncoding = 4;
+                       lastKnownFileType = {{{file_type}}};
+                       path = {{{path}}};
+                       sourceTree = "<group>";
+                       };
+"""
+
+       private fun add_to_project(project: PbxprojectTemplate)
+       do
+               project.source_files.add self
+               project.files.add self
+       end
+end
+
+# Template for a PBX project file, usually a `project.pbcproj`
+#
+# This file list all information required to build an XCode project.
+# It would usually be written and read by XCode.
+# From the command line, xcodebuild can read this file but not write it.
+#
+# Information in the file (simplified list):
+#
+# * Compilable source files
+# * Asset files
+# * Build configurations (Release and debug modes, cflags, etc.)
+# * List of files composing the project
+class PbxprojectTemplate
+       super Template
+
+       # Name of the project
+       var name: String
+
+       # All body/implementation source files to be compiled
+       private var source_files = new Array[PbxFile]
+
+       # All asset files added to the app package
+       private var asset_files = new Array[PbxFile]
+
+       # All files used by this project
+       private var files = new Array[PbxFile]
+
+       # Add `file` to this project
+       fun add_file(file: PbxFile) do file.add_to_project(self)
+
+       redef fun rendering
+       do
+               add """
+// !$*UTF8*$!
+{
+       archiveVersion = 1;
+       classes = {
+       };
+       objectVersion = 46;
+       objects = {
+
+/* Begin PBXBuildFile section */
+"""
+
+               # List build files (compilable sources and assets) with their reference UUID
+               for array in [source_files, asset_files] do for file in array do add """
+               {{{file.build_uuid}}} /* {{{file.doc}}} */ = {
+                       isa = PBXBuildFile;
+                       fileRef = {{{file.ref_uuid}}} /* {{{file.doc}}} */;
+                       };
+"""
+
+               add """
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+               AF9F83EA1A5F0D21004B62C0 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = AF9F83C41A5F0D21004B62C0 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = AF9F83CB1A5F0D21004B62C0;
+                       remoteInfo = {{{name}}};
+               };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+       /* Static generated files */
+               AF9F83CC1A5F0D21004B62C0 /* {{{name}}}.app */ = {
+                       isa = PBXFileReference;
+                       explicitFileType = wrapper.application;
+                       includeInIndex = 0;
+                       path = {{{name}}}.app;
+                       sourceTree = BUILT_PRODUCTS_DIR;
+                       };
+               AF9F83D01A5F0D21004B62C0 /* Info.plist */ = {
+                       isa = PBXFileReference;
+                       lastKnownFileType = text.plist.xml;
+                       path = Info.plist;
+                       sourceTree = "<group>";
+                       };
+               AF9F83DE1A5F0D21004B62C0 /* Base */ = {
+                       isa = PBXFileReference;
+                       lastKnownFileType = file.storyboard;
+                       name = Base;
+                       path = Base.lproj/Main.storyboard;
+                       sourceTree = "<group>";
+                       };
+               AF9F83E01A5F0D21004B62C0 /* Images.xcassets */ = {
+                       isa = PBXFileReference;
+                       lastKnownFileType = folder.assetcatalog;
+                       path = Images.xcassets;
+                       sourceTree = "<group>";
+                       };
+               AF9F83E31A5F0D21004B62C0 /* Base */ = {
+                       isa = PBXFileReference;
+                       lastKnownFileType = file.xib;
+                       name = Base;
+                       path = Base.lproj/LaunchScreen.xib;
+                       sourceTree = "<group>";
+                       };
+
+       /* Changing generated files */
+"""
+               # Describe all known files
+               for file in files do add file.description
+
+               add """
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+               AF9F83C91A5F0D21004B62C0 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+               AF9F83C31A5F0D21004B62C0 = {
+                       isa = PBXGroup;
+                       children = (
+                               AF9F83CE1A5F0D21004B62C0 /* {{{name}}} */,
+                               AF9F83CD1A5F0D21004B62C0 /* Products */,
+                       );
+                       sourceTree = "<group>";
+               };
+               AF9F83CD1A5F0D21004B62C0 /* Products */ = {
+                       isa = PBXGroup;
+                       children = (
+                               AF9F83CC1A5F0D21004B62C0 /* {{{name}}}.app */,
+                       );
+                       name = Products;
+                       sourceTree = "<group>";
+               };
+               AF9F83CE1A5F0D21004B62C0 /* {{{name}}} */ = {
+                       isa = PBXGroup;
+                       children = (
+"""
+                       # Reference all known files
+                       for file in files do add """
+                               {{{file.ref_uuid}}} /* {{{file.doc}}} */,
+"""
+
+               add """
+                       );
+                       path = {{{name}}};
+                       sourceTree = "<group>";
+               };
+               AF9F83CF1A5F0D21004B62C0 /* Supporting Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               AF9F83D01A5F0D21004B62C0 /* Info.plist */,
+                               AF9F83D11A5F0D21004B62C0 /* main.m */,
+                       );
+                       name = "Supporting Files";
+                       sourceTree = "<group>";
+               };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+               AF9F83CB1A5F0D21004B62C0 /* {{{name}}} */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AF9F83F31A5F0D21004B62C0 /* Build configuration list for PBXNativeTarget "{{{name}}}" */;
+                       buildPhases = (
+                               AF9F83C81A5F0D21004B62C0 /* Sources */,
+                               AF9F83C91A5F0D21004B62C0 /* Frameworks */,
+                               AF9F83CA1A5F0D21004B62C0 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = {{{name}}};
+                       productName = {{{name}}};
+                       productReference = AF9F83CC1A5F0D21004B62C0 /* {{{name}}}.app */;
+                       productType = "com.apple.product-type.application";
+               };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+               AF9F83C41A5F0D21004B62C0 /* Project object */ = {
+                       isa = PBXProject;
+                       attributes = {
+                               LastUpgradeCheck = 0610;
+                               TargetAttributes = {
+                                       AF9F83CB1A5F0D21004B62C0 = {
+                                               CreatedOnToolsVersion = 6.1.1;
+                                       };
+                               };
+                       };
+                       buildConfigurationList = AF9F83C71A5F0D21004B62C0 /* Build configuration list for PBXProject "{{{name}}}" */;
+                       compatibilityVersion = "Xcode 3.2";
+                       developmentRegion = English;
+                       hasScannedForEncodings = 0;
+                       knownRegions = (
+                               en,
+                               Base,
+                       );
+                       mainGroup = AF9F83C31A5F0D21004B62C0;
+                       productRefGroup = AF9F83CD1A5F0D21004B62C0 /* Products */;
+                       projectDirPath = "";
+                       projectRoot = "";
+                       targets = (
+                               AF9F83CB1A5F0D21004B62C0 /* {{{name}}} */,
+                       );
+               };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+               AF9F83CA1A5F0D21004B62C0 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+"""
+               # Reference all asset files by their build UUID
+               for file in asset_files do add """
+                               {{{file.build_uuid}}} /* {{{file.doc}}} */,
+"""
+
+               add """
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+               AF9F83C81A5F0D21004B62C0 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+"""
+               # Reference all compilable source files by their build UUID
+               for file in source_files do add """
+                               {{{file.build_uuid}}} /* {{{file.doc}}} */,
+"""
+               add """
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+               AF9F83DD1A5F0D21004B62C0 /* Main.storyboard */ = {
+                       isa = PBXVariantGroup;
+                       children = (
+                               AF9F83DE1A5F0D21004B62C0 /* Base */,
+                       );
+                       name = Main.storyboard;
+                       sourceTree = "<group>";
+               };
+               AF9F83E21A5F0D21004B62C0 /* LaunchScreen.xib */ = {
+                       isa = PBXVariantGroup;
+                       children = (
+                               AF9F83E31A5F0D21004B62C0 /* Base */,
+                       );
+                       name = LaunchScreen.xib;
+                       sourceTree = "<group>";
+               };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+               AF9F83F11A5F0D21004B62C0 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+                               CLANG_CXX_LIBRARY = "libc++";
+                               CLANG_ENABLE_MODULES = YES;
+                               CLANG_ENABLE_OBJC_ARC = YES;
+                               CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+                               CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+                               COPY_PHASE_STRIP = NO;
+                               ENABLE_STRICT_OBJC_MSGSEND = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu99;
+                               GCC_DYNAMIC_NO_PIC = NO;
+                               GCC_OPTIMIZATION_LEVEL = 0;
+                               GCC_PREPROCESSOR_DEFINITIONS = (
+                                       "DEBUG=1",
+                                       "$(inherited)",
+                               );
+                               GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+                               GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+                               GCC_WARN_UNDECLARED_SELECTOR = YES;
+                               GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+                               IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+                               MTL_ENABLE_DEBUG_INFO = YES;
+                               ONLY_ACTIVE_ARCH = YES;
+                               SDKROOT = iphoneos;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                       };
+                       name = Debug;
+               };
+               AF9F83F21A5F0D21004B62C0 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+                               CLANG_CXX_LIBRARY = "libc++";
+                               CLANG_ENABLE_MODULES = YES;
+                               CLANG_ENABLE_OBJC_ARC = YES;
+                               CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+                               CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+                               "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+                               COPY_PHASE_STRIP = YES;
+                               ENABLE_NS_ASSERTIONS = NO;
+                               ENABLE_STRICT_OBJC_MSGSEND = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu99;
+                               GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+                               GCC_WARN_UNDECLARED_SELECTOR = YES;
+                               GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+                               IPHONEOS_DEPLOYMENT_TARGET = 8.1;
+                               MTL_ENABLE_DEBUG_INFO = NO;
+                               SDKROOT = iphoneos;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                       };
+                       name = Release;
+               };
+               AF9F83F41A5F0D21004B62C0 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+                               INFOPLIST_FILE = {{{name}}}/Info.plist;
+                               LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Debug;
+               };
+               AF9F83F51A5F0D21004B62C0 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+                               INFOPLIST_FILE = {{{name}}}/Info.plist;
+                               LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Release;
+               };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+               AF9F83C71A5F0D21004B62C0 /* Build configuration list for PBXProject "{{{name}}}" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AF9F83F11A5F0D21004B62C0 /* Debug */,
+                               AF9F83F21A5F0D21004B62C0 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               AF9F83F31A5F0D21004B62C0 /* Build configuration list for PBXNativeTarget "{{{name}}}" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               AF9F83F41A5F0D21004B62C0 /* Debug */,
+                               AF9F83F51A5F0D21004B62C0 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+               };
+/* End XCConfigurationList section */
+       };
+       rootObject = AF9F83C41A5F0D21004B62C0 /* Project object */;
+}
+"""
+       end
+end
+
+# Template for a property list used by XCode for iOS projects
+class PlistTemplate
+       super Template
+
+       # Value of CFBundleName, pretty name of the application
+       var product_name: String
+
+       # Value of CFBundleIdentifier, namespace of the app
+       var bundle_identifier: String
+
+       # Value of CFBundleShortVersionString, human readable version
+       var short_version: String
+
+       # Value of CFBundleVersion, often a revision number
+       var bundle_version: String
+
+       redef fun rendering
+       do
+               add """
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>CFBundleDevelopmentRegion</key>
+       <string>en</string>
+       <key>CFBundleExecutable</key>
+       <string>$(EXECUTABLE_NAME)</string>
+       <key>CFBundleIdentifier</key>
+       <string>{{{bundle_identifier}}}</string>
+       <key>CFBundleInfoDictionaryVersion</key>
+       <string>6.0</string>
+       <key>CFBundleName</key>
+       <string>{{{product_name}}}</string>
+       <key>CFBundlePackageType</key>
+       <string>APPL</string>
+       <key>CFBundleShortVersionString</key>
+       <string>{{{short_version}}}</string>
+       <key>CFBundleSignature</key>
+       <string>\\?\\?\\?\\?</string>
+       <key>CFBundleVersion</key>
+       <string>{{{bundle_version}}}</string>
+       <key>LSRequiresIPhoneOS</key>
+       <true/>
+       <key>UIRequiredDeviceCapabilities</key>
+       <array>
+               <string>armv7</string>
+       </array>
+       <key>UISupportedInterfaceOrientations</key>
+       <array>
+               <string>UIInterfaceOrientationPortrait</string>
+               <string>UIInterfaceOrientationLandscapeLeft</string>
+               <string>UIInterfaceOrientationLandscapeRight</string>
+       </array>
+       <key>UISupportedInterfaceOrientations~ipad</key>
+       <array>
+               <string>UIInterfaceOrientationPortrait</string>
+               <string>UIInterfaceOrientationPortraitUpsideDown</string>
+               <string>UIInterfaceOrientationLandscapeLeft</string>
+               <string>UIInterfaceOrientationLandscapeRight</string>
+       </array>
+</dict>
+</plist>
+"""
+       end
+end
index 83d5a58..963ba76 100644 (file)
@@ -2015,66 +2015,7 @@ redef class ABinopExpr
 
        redef fun bin_expr1 do return n_expr
        redef fun bin_expr2 do return n_expr2
-end
-
-redef class AEqExpr
-       redef fun bin_op do return "=="
-end
-
-redef class AGeExpr
-       redef fun bin_op do return ">="
-end
-
-redef class AGgExpr
-       redef fun bin_op do return ">>"
-end
-
-redef class AGtExpr
-       redef fun bin_op do return ">"
-end
-
-redef class ALeExpr
-       redef fun bin_op do return "<="
-end
-
-redef class ALlExpr
-       redef fun bin_op do return "<<"
-end
-
-redef class ALtExpr
-       redef fun bin_op do return "<"
-end
-
-redef class AMinusExpr
-       redef fun bin_op do return "-"
-end
-
-redef class ANeExpr
-       redef fun bin_op do return "!="
-end
-
-redef class APercentExpr
-       redef fun bin_op do return "%"
-end
-
-redef class APlusExpr
-       redef fun bin_op do return "+"
-end
-
-redef class ASlashExpr
-       redef fun bin_op do return "/"
-end
-
-redef class AStarExpr
-       redef fun bin_op do return "*"
-end
-
-redef class AStarstarExpr
-       redef fun bin_op do return "**"
-end
-
-redef class AStarshipExpr
-       redef fun bin_op do return "<=>"
+       redef fun bin_op do return operator
 end
 
 redef class AIsaExpr
@@ -2103,6 +2044,13 @@ end
 
 # Syntax
 
+redef class AUplusExpr
+       redef fun accept_pretty_printer(v) do
+               v.consume "+"
+               v.visit n_expr
+       end
+end
+
 redef class AUminusExpr
        redef fun accept_pretty_printer(v) do
                v.consume "-"
index f5c1dc2..81e14fa 100644 (file)
@@ -93,7 +93,7 @@ class RapidTypeAnalysis
                var mtype = callsite.recv
                var anchor = callsite.anchor
                if anchor != null then mtype = mtype.anchor_to(callsite.mmodule, anchor)
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
                if mtype isa MClassType then mtype = mtype.mclass.intro.bound_mtype
                var mproperty = callsite.mproperty
                var res = live_targets_cache[mtype, mproperty]
@@ -225,9 +225,9 @@ class RapidTypeAnalysis
                                var node = self.modelbuilder.mpropdef2node(mmethoddef)
                                var elttype = mmethoddef.msignature.mparameters[vararg_rank].mtype
                                #elttype = elttype.anchor_to(self.mainmodule, v.receiver)
-                               var vararg = self.mainmodule.get_primitive_class("Array").get_mtype([elttype])
+                               var vararg = self.mainmodule.array_type(elttype)
                                v.add_type(vararg)
-                               var native = self.mainmodule.get_primitive_class("NativeArray").get_mtype([elttype])
+                               var native = self.mainmodule.native_array_type(elttype)
                                v.add_type(native)
                                v.add_monomorphic_send(vararg, self.modelbuilder.force_get_primitive_method(node, "with_native", vararg.mclass, self.mainmodule))
                        end
@@ -321,7 +321,7 @@ class RapidTypeAnalysis
        do
                var d = mtype.length
                if d > 255 then
-                       self.modelbuilder.toolcontext.fatal_error(null, "Fatal error: limitation in the rapidtype analysis engine: a type depth of {d} is too important, the problematic type is {mtype}.")
+                       self.modelbuilder.toolcontext.fatal_error(null, "Fatal Error: limitation in the rapidtype analysis engine: a type depth of {d} is too important, the problematic type is `{mtype}`.")
                end
        end
 
@@ -389,7 +389,6 @@ class RapidTypeAnalysis
                if mproperty.mpropdefs.length <= 1 then return
                # If all definitions of a method are live, we can remove the definition of the totry set
                for d in mproperty.mpropdefs do
-                       if d.is_abstract then continue
                        if not live_methoddefs.has(d) then return
                end
                #print "full property: {mpropdef.mproperty} for {mpropdef.mproperty.mpropdefs.length} definitions"
@@ -466,17 +465,12 @@ class RapidTypeVisitor
        do
                mtype = mtype.anchor_to(self.analysis.mainmodule, self.receiver)
                if mtype isa MNullType then return null
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
                assert mtype isa MClassType
                assert not mtype.need_anchor
                return mtype
        end
 
-       fun get_class(name: String): MClass
-       do
-               return analysis.mainmodule.get_primitive_class(name)
-       end
-
        fun get_method(recv: MType, name: String): MMethod
        do
                var mtype = cleanup_type(recv)
@@ -541,18 +535,20 @@ redef class AArrayExpr
        do
                var mtype = self.mtype.as(MClassType)
                v.add_type(mtype)
-               var native = v.analysis.mainmodule.get_primitive_class("NativeArray").get_mtype([mtype.arguments.first])
+               var native = v.analysis.mainmodule.native_array_type(mtype.arguments.first)
                v.add_type(native)
                mtype = v.cleanup_type(mtype).as(not null)
                var prop = v.get_method(mtype, "with_native")
                v.add_monomorphic_send(mtype, prop)
+               v.add_callsite(with_capacity_callsite)
+               v.add_callsite(push_callsite)
        end
 end
 
 redef class AStringFormExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               var native = v.get_class("NativeString").mclass_type
+               var native = v.analysis.mainmodule.native_string_type
                v.add_type(native)
                var prop = v.get_method(native, "to_s_with_length")
                v.add_monomorphic_send(native, prop)
@@ -562,13 +558,17 @@ end
 redef class ASuperstringExpr
        redef fun accept_rapid_type_visitor(v)
        do
-               var arraytype = v.get_class("Array").get_mtype([v.get_class("Object").mclass_type])
+               var mmodule = v.analysis.mainmodule
+               var object_type = mmodule.object_type
+               var arraytype = mmodule.array_type(object_type)
                v.add_type(arraytype)
-               v.add_type(v.get_class("NativeArray").get_mtype([v.get_class("Object").mclass_type]))
+               var nattype = mmodule.native_array_type(object_type)
+               v.add_type(nattype)
                var prop = v.get_method(arraytype, "join")
                v.add_monomorphic_send(arraytype, prop)
                var prop2 = v.get_method(arraytype, "with_native")
                v.add_monomorphic_send(arraytype, prop2)
+               v.add_monomorphic_send(nattype, v.get_method(nattype, "native_to_s"))
        end
 end
 
index b16eaf5..cb4b70a 100644 (file)
@@ -56,8 +56,10 @@ redef class AMethPropdef
        # Collect initializers and build the auto-init
        fun do_auto_super_init(modelbuilder: ModelBuilder)
        do
-               var mclassdef = self.parent.as(AClassdef).mclassdef.as(not null)
-               var mpropdef = self.mpropdef.as(not null)
+               var mclassdef = self.parent.as(AClassdef).mclassdef
+               if mclassdef == null then return # skip error
+               var mpropdef = self.mpropdef
+               if mpropdef == null then return # skip error
                var mmodule = mpropdef.mclassdef.mmodule
                var anchor = mclassdef.bound_mtype
                var recvtype = mclassdef.mclass.mclass_type
@@ -67,13 +69,10 @@ redef class AMethPropdef
 
                # Collect only for constructors
                if not mpropdef.mproperty.is_init or mpropdef.mproperty.is_new then
-                       if nosuper != null then modelbuilder.error(nosuper, "Error: nosuper only in `init`")
+                       if nosuper != null then modelbuilder.error(nosuper, "Error: `nosuper` only allowed in `init`.")
                        return
                end
 
-               # FIXME: THIS IS STUPID (be here to keep the old code working)
-               if not mpropdef.mclassdef.is_intro then return
-
                # Do we inherit for a constructor?
                var skip = true
                for cd in mclassdef.in_hierarchy.direct_greaters do
@@ -90,7 +89,7 @@ redef class AMethPropdef
                        v.enter_visit(nblock)
                        var anode = v.has_explicit_super_init
                        if anode != null then
-                               if nosuper != null then modelbuilder.error(anode, "Error: method is annotated nosuper but a constructor call is present")
+                               if nosuper != null then modelbuilder.error(anode, "Error: method is annotated `nosuper` but a super-constructor call is present.")
                                return
                        end
                        if v.is_broken then return # skip
@@ -102,6 +101,7 @@ redef class AMethPropdef
                if not mpropdef.is_intro then
                        auto_super_call = true
                        mpropdef.has_supercall = true
+                       modelbuilder.toolcontext.info("Auto-super call for {mpropdef}", 4)
                        return
                end
 
@@ -119,7 +119,7 @@ redef class AMethPropdef
                                candidate = modelbuilder.try_get_mproperty_by_name2(self, mmodule, msupertype, "init")
                        end
                        if candidate == null then
-                               modelbuilder.error(self, "Error: Cannot do an implicit constructor call in {mpropdef}; there is no constructor named {mpropdef.mproperty.name} in {msupertype}.")
+                               modelbuilder.error(self, "Error: cannot do an implicit constructor call in `{mpropdef}`; there is no constructor named `{mpropdef.mproperty.name}` in `{msupertype}`.")
                                return
                        end
                        assert candidate isa MMethod
@@ -136,6 +136,7 @@ redef class AMethPropdef
 
                        var callsite = new CallSite(self, recvtype, mmodule, anchor, true, candidate, candidatedef, msignature, false)
                        auto_super_inits.add(callsite)
+                       modelbuilder.toolcontext.info("Old-style auto-super init for {mpropdef} to {candidate.full_name}", 4)
                end
 
                # No old style? The look for new-style super constructors (called from a old style constructor)
@@ -157,7 +158,7 @@ redef class AMethPropdef
                                        var i = 0
                                        for p in spd.initializers do
                                                if p != candidatedef.initializers[i] then
-                                                       modelbuilder.error(self, "Error: Cannot do an implicit constructor call to comflicting for inherited inits {spd}({spd.initializers.join(", ")}) and {candidatedef}({candidatedef.initializers.join(", ")}). NOTE: Do not mix old-style and new-style init!")
+                                                       modelbuilder.error(self, "Error: cannot do an implicit constructor call to conflicting inherited inits `{spd}({spd.initializers.join(", ")}`) and `{candidatedef}({candidatedef.initializers.join(", ")}`). NOTE: Do not mix old-style and new-style init!")
                                                        return
                                                end
                                                i += 1
@@ -170,9 +171,10 @@ redef class AMethPropdef
 
                        var callsite = new CallSite(self, recvtype, mmodule, anchor, true, the_root_init_mmethod, candidatedef, msignature, false)
                        auto_super_inits.add(callsite)
+                       modelbuilder.toolcontext.info("Auto-super init for {mpropdef} to {the_root_init_mmethod.full_name}", 4)
                end
                if auto_super_inits.is_empty then
-                       modelbuilder.error(self, "Error: No constructors to call implicitely in {mpropdef}. Call one explicitely.")
+                       modelbuilder.error(self, "Error: no constructors to call implicitly in `{mpropdef}`. Call one explicitly.")
                        return
                end
 
@@ -182,7 +184,7 @@ redef class AMethPropdef
                        var msig = mpropdef.msignature.as(not null)
                        var supermsig = auto_super_init.msignature
                        if supermsig.arity > msig.arity then
-                               modelbuilder.error(self, "Error: Cannot do an implicit constructor call to {auto_super_init_def}{supermsig}. Expected at least {supermsig.arity} arguments, got {msig.arity}.")
+                               modelbuilder.error(self, "Error: cannot do an implicit constructor call to `{auto_super_init_def}{supermsig}`. Expected at least `{supermsig.arity}` arguments, got `{msig.arity}`.")
                                continue
                        end
                        var i = 0
@@ -191,7 +193,7 @@ redef class AMethPropdef
                                var sub = p.mtype
                                var sup = sp.mtype
                                if not sub.is_subtype(mmodule, anchor, sup) then
-                                       modelbuilder.error(self, "Error: Cannot do an implicit constructor call to {auto_super_init_def}{supermsig}. Expected argument #{i} of type {sp.mtype}, got implicit argument {p.name} of type {p.mtype}.")
+                                       modelbuilder.error(self, "Error: cannot do an implicit constructor call to `{auto_super_init_def}{supermsig}`. Expected argument #{i} of type `{sp.mtype}`, got implicit argument `{p.name}` of type `{p.mtype}`.")
                                        break
                                end
                                i += 1
index b4ba420..b0e833a 100644 (file)
@@ -78,7 +78,7 @@ private class FlowVisitor
        fun printflow
        do
                var file = new FileWriter.open("flow.dot")
-               file.write("digraph \{\n")
+               file.write("digraph \{\nnode[shape=box];")
                for f in flows do
                        var s = ""
                        if f.node isa AExpr then
@@ -86,13 +86,14 @@ private class FlowVisitor
                        end
                        file.write "F{f.object_id} [label=\"{f.object_id}\\n{f.node.location}\\n{f.node.class_name}\\n{f.name}{s}\"];\n"
                        for p in f.previous do
-                               file.write "F{p.object_id} -> F{f.object_id};\n"
+                               s = ""
+                               if f.when_true == p then s = "[label=TRUE, style=dotted]"
+                               if f.when_false == p then s = "[label=FALSE, style=dotted]"
+                               if f.when_true == p and f.when_false == p then s = "[label=TRUE_FALSE, style=dotted]"
+                               file.write "F{p.object_id} -> F{f.object_id}{s};\n"
                        end
-                       if f.when_true != f then
-                               file.write "F{f.object_id} -> F{f.when_true.object_id}[label=TRUE, style=dotted];\n"
-                       end
-                       if f.when_false != f then
-                               file.write "F{f.object_id} -> F{f.when_false.object_id}[label=FALSE,style=dotted];\n"
+                       for p in f.loops do
+                               file.write "F{p.object_id} -> F{f.object_id}[label=LOOP, style=dashed, constraint=false];\n"
                        end
                end
                file.write("\}\n")
@@ -395,7 +396,7 @@ redef class AWhileExpr
                var after_block = v.current_flow_context
 
                before_loop.add_loop(after_block)
-               v.merge_continues_to(after_block, self.continue_mark)
+               v.merge_continues_to(before_loop, self.continue_mark)
 
                v.current_flow_context = after_expr.when_false
                v.merge_breaks(self.break_mark)
@@ -412,7 +413,7 @@ redef class ALoopExpr
                var after_block = v.current_flow_context
 
                before_loop.add_loop(after_block)
-               v.merge_continues_to(after_block, self.continue_mark)
+               v.merge_continues_to(before_loop, self.continue_mark)
 
                v.make_unreachable_flow
                v.merge_breaks(self.break_mark)
@@ -431,13 +432,21 @@ redef class AForExpr
                var after_block = v.current_flow_context
 
                before_loop.add_loop(after_block)
-               v.merge_continues_to(after_block, self.continue_mark)
+               v.merge_continues_to(before_loop, self.continue_mark)
 
                v.make_merge_flow(v.current_flow_context, before_loop)
                v.merge_breaks(self.break_mark)
        end
 end
 
+redef class AWithExpr
+       redef fun accept_flow_visitor(v)
+       do
+               super
+               v.merge_breaks(self.break_mark)
+       end
+end
+
 redef class AAssertExpr
        redef fun accept_flow_visitor(v)
        do
index 82fa0a4..27c7ddd 100644 (file)
@@ -70,7 +70,7 @@ private class LocalVarInitVisitor
 
                var flow = node.after_flow_context.as(not null)
                if not flow.is_variable_set(variable) then
-                       self.toolcontext.error(node.hot_location, "Error: variable '{variable}' is possibly unset.")
+                       self.toolcontext.error(node.hot_location, "Error: possibly unset variable `{variable}`.")
                        # Remove the variable to avoid repeating errors
                        self.maybe_unset_vars.remove(variable)
                end
index 6b4e973..4ea5f27 100644 (file)
@@ -99,7 +99,7 @@ private class ScopeVisitor
                var name = variable.name
                var found = search_variable(name)
                if found != null then
-                       self.error(node, "Error: A variable named `{name}' already exists")
+                       self.error(node, "Error: a variable named `{name}` already exists.")
                        return false
                end
                scopes.first.variables[name] = variable
@@ -160,14 +160,14 @@ private class ScopeVisitor
                        if nid == null then
                                var res = search_label("")
                                if res != null then
-                                       self.error(nlabel, "Syntax error: anonymous label already defined.")
+                                       self.error(nlabel, "Syntax Error: anonymous label already defined.")
                                end
                                name = ""
                        else
                                name = nid.text
                                var found = self.search_label(name)
                                if found != null then
-                                       self.error(nlabel, "Syntax error: label {name} already defined.")
+                                       self.error(nlabel, "Syntax Error: label `{name}` already defined.")
                                end
                        end
                else
@@ -190,7 +190,7 @@ private class ScopeVisitor
                        if nid == null then
                                var res = search_label("")
                                if res == null then
-                                       self.error(nlabel, "Syntax error: invalid anonymous label.")
+                                       self.error(nlabel, "Syntax Error: invalid anonymous label.")
                                        return null
                                end
                                return res
@@ -198,7 +198,7 @@ private class ScopeVisitor
                        var name = nid.text
                        var res = search_label(name)
                        if res == null then
-                               self.error(nlabel, "Syntax error: invalid label {name}.")
+                               self.error(nlabel, "Syntax Error: invalid label `{name}`.")
                                return null
                        end
                        return res
@@ -209,7 +209,7 @@ private class ScopeVisitor
                                        return res
                                end
                        end
-                       self.error(node, "Syntax Error: 'break' statement outside block.")
+                       self.error(node, "Syntax Error: `break` statement outside block.")
                        return null
                end
        end
@@ -411,6 +411,24 @@ redef class AForExpr
        end
 end
 
+redef class AWithExpr
+       # The break escape mark associated with the 'with'
+       var break_mark: nullable EscapeMark
+
+       redef fun accept_scope_visitor(v)
+       do
+               v.scopes.unshift(new Scope)
+
+               var escapemark = v.make_escape_mark(n_label, true)
+               self.break_mark = escapemark
+
+               v.enter_visit(n_expr)
+               v.enter_visit_block(n_block, escapemark)
+
+               v.shift_scope
+       end
+end
+
 redef class AVarFormExpr
        # The associated variable
        var variable: nullable Variable
@@ -425,7 +443,7 @@ redef class ACallFormExpr
                        if variable != null then
                                var n: AExpr
                                if not n_args.n_exprs.is_empty or n_args isa AParExprs then
-                                       v.error(self, "Error: {name} is variable, not a function.")
+                                       v.error(self, "Error: `{name}` is a variable, not a method.")
                                        return
                                end
                                n = variable_create(variable)
index 343edbd..e798ab2 100644 (file)
@@ -52,6 +52,7 @@ private class TypeVisitor
        # Is `self` use restricted?
        # * no explicit `self`
        # * method called on the implicit self must be top-level
+       # Currently only used for `new` factory since there is no valid receiver inside
        var is_toplevel_context = false
 
        init
@@ -71,7 +72,7 @@ private class TypeVisitor
                        selfvariable.declared_type = mclass.mclass_type
 
                        var mprop = mpropdef.mproperty
-                       if mprop isa MMethod and (mprop.is_toplevel or mprop.is_new) then
+                       if mprop isa MMethod and mprop.is_new then
                                is_toplevel_context = true
                        end
                end
@@ -104,18 +105,23 @@ private class TypeVisitor
        # If `sub` is a safe subtype of `sup` then return `sub`.
        # If `sub` is an unsafe subtype (ie an implicit cast is required), then return `sup`.
        #
-       # The point of the return type is to determinate the usable type on an expression:
+       # The point of the return type is to determinate the usable type on an expression when `autocast` is true:
        # If the suptype is safe, then the return type is the one on the expression typed by `sub`.
        # Is the subtype is unsafe, then the return type is the one of an implicit cast on `sup`.
-       fun check_subtype(node: ANode, sub, sup: MType): nullable MType
+       fun check_subtype(node: ANode, sub, sup: MType, autocast: Bool): nullable MType
        do
                if self.is_subtype(sub, sup) then return sub
-               if self.is_subtype(sub, self.anchor_to(sup)) then
+               if autocast and self.is_subtype(sub, self.anchor_to(sup)) then
                        # FIXME workaround to the current unsafe typing policy. To remove once fixed virtual types exists.
                        #node.debug("Unsafe typing: expected {sup}, got {sub}")
                        return sup
                end
-               self.modelbuilder.error(node, "Type error: expected {sup}, got {sub}")
+               if sub.need_anchor then
+                       var u = anchor_to(sub)
+                       self.modelbuilder.error(node, "Type Error: expected `{sup}`, got `{sub}: {u}`.")
+               else
+                       self.modelbuilder.error(node, "Type Error: expected `{sup}`, got `{sub}`.")
+               end
                return null
        end
 
@@ -144,7 +150,7 @@ private class TypeVisitor
                        end
                        return null # forward error
                end
-               self.error(nexpr, "Type error: expected expression.")
+               self.error(nexpr, "Error: expected an expression.")
                return null
        end
 
@@ -160,7 +166,7 @@ private class TypeVisitor
 
                if sup == null then return null # Forward error
 
-               var res = check_subtype(nexpr, sub, sup)
+               var res = check_subtype(nexpr, sub, sup, true)
                if res != sub then
                        nexpr.implicit_cast_to = res
                end
@@ -187,13 +193,41 @@ private class TypeVisitor
                if sup == null then return null # Forward error
 
                if sup == sub then
-                       self.modelbuilder.warning(node, "useless-type-test", "Warning: Expression is already a {sup}.")
+                       self.modelbuilder.warning(node, "useless-type-test", "Warning: expression is already a `{sup}`.")
                else if self.is_subtype(sub, sup) then
-                       self.modelbuilder.warning(node, "useless-type-test", "Warning: Expression is already a {sup} since it is a {sub}.")
+                       self.modelbuilder.warning(node, "useless-type-test", "Warning: expression is already a `{sup}` since it is a `{sub}`.")
                end
                return sup
        end
 
+       # Can `mtype` be null (up to the current knowledge)?
+       fun can_be_null(mtype: MType): Bool
+       do
+               if mtype isa MNullableType or mtype isa MNullType then return true
+               if mtype isa MFormalType then
+                       var x = anchor_to(mtype)
+                       if x isa MNullableType or x isa MNullType then return true
+               end
+               return false
+       end
+
+       # Check that `mtype` can be null (up to the current knowledge).
+       #
+       # If not then display a `useless-null-test` warning on node and return false.
+       # Else return true.
+       fun check_can_be_null(anode: ANode, mtype: MType): Bool
+       do
+               if can_be_null(mtype) then return true
+
+               if mtype isa MFormalType then
+                       var res = anchor_to(mtype)
+                       modelbuilder.warning(anode, "useless-null-test", "Warning: expression is not null, since it is a `{mtype}: {res}`.")
+               else
+                       modelbuilder.warning(anode, "useless-null-test", "Warning: expression is not null, since it is a `{mtype}`.")
+               end
+               return false
+       end
+
        # Special verification on != and == for null
        # Return true
        fun null_test(anode: ABinopExpr)
@@ -206,23 +240,27 @@ private class TypeVisitor
                if not mtype2 isa MNullType then return
 
                # Check of useless null
-               if not mtype isa MNullableType then
-                       if not anchor_to(mtype) isa MNullableType then
-                               modelbuilder.warning(anode, "useless-null-test", "Warning: expression is not null, since it is a `{mtype}`.")
-                       end
-                       return
+               if not check_can_be_null(anode.n_expr, mtype) then return
+
+               if mtype isa MNullType then
+                       # Because of type adaptation, we cannot just stop here
+                       # so return use `null` as a bottom type that will be merged easily (cf) `merge_types`
+                       mtype = null
+               else
+                       mtype = mtype.as_notnull
                end
 
                # Check for type adaptation
                var variable = anode.n_expr.its_variable
                if variable == null then return
 
+               # One is null (mtype2 see above) the other is not null
                if anode isa AEqExpr then
-                       anode.after_flow_context.when_true.set_var(variable, mtype2)
-                       anode.after_flow_context.when_false.set_var(variable, mtype.mtype)
+                       anode.after_flow_context.when_true.set_var(self, variable, mtype2)
+                       anode.after_flow_context.when_false.set_var(self, variable, mtype)
                else if anode isa ANeExpr then
-                       anode.after_flow_context.when_false.set_var(variable, mtype2)
-                       anode.after_flow_context.when_true.set_var(variable, mtype.mtype)
+                       anode.after_flow_context.when_false.set_var(self, variable, mtype2)
+                       anode.after_flow_context.when_true.set_var(self, variable, mtype)
                else
                        abort
                end
@@ -246,10 +284,7 @@ private class TypeVisitor
 
        fun get_mclass(node: ANode, name: String): nullable MClass
        do
-               var mclass = modelbuilder.try_get_mclass_by_name(node, mmodule, name)
-               if mclass == null then
-                       self.modelbuilder.error(node, "Type Error: missing primitive class `{name}'.")
-               end
+               var mclass = modelbuilder.get_mclass_by_name(node, mmodule, name)
                return mclass
        end
 
@@ -268,9 +303,11 @@ private class TypeVisitor
                if recvtype isa MNullType then
                        # `null` only accepts some methods of object.
                        if name == "==" or name == "!=" or name == "is_same_instance" then
-                               unsafe_type = mmodule.object_type.as_nullable
+                               var objclass = get_mclass(node, "Object")
+                               if objclass == null then return null # Forward error
+                               unsafe_type = objclass.mclass_type
                        else
-                               self.error(node, "Error: Method '{name}' call on 'null'.")
+                               self.error(node, "Error: method `{name}` called on `null`.")
                                return null
                        end
                end
@@ -282,11 +319,12 @@ private class TypeVisitor
                end
 
                if mproperty == null then
-                       #self.modelbuilder.error(node, "Type error: property {name} not found in {unsafe_type} (ie {recvtype})")
                        if recv_is_self then
-                               self.modelbuilder.error(node, "Error: Method or variable '{name}' unknown in {recvtype}.")
+                               self.modelbuilder.error(node, "Error: method or variable `{name}` unknown in `{recvtype}`.")
+                       else if recvtype.need_anchor then
+                               self.modelbuilder.error(node, "Error: method `{name}` does not exists in `{recvtype}: {unsafe_type}`.")
                        else
-                               self.modelbuilder.error(node, "Error: Method '{name}' doesn't exists in {recvtype}.")
+                               self.modelbuilder.error(node, "Error: method `{name}` does not exists in `{recvtype}`.")
                        end
                        return null
                end
@@ -294,14 +332,14 @@ private class TypeVisitor
                assert mproperty isa MMethod
 
                if is_toplevel_context and recv_is_self and not mproperty.is_toplevel then
-                       error(node, "Error: '{name}' is not a top-level method, thus need a receiver.")
+                       error(node, "Error: `{name}` is not a top-level method, thus need a receiver.")
                end
                if not recv_is_self and mproperty.is_toplevel then
-                       error(node, "Error: cannot call '{name}', a top-level method, with a receiver.")
+                       error(node, "Error: cannot call `{name}`, a top-level method, with a receiver.")
                end
 
                if mproperty.visibility == protected_visibility and not recv_is_self and self.mmodule.visibility_for(mproperty.intro_mclassdef.mmodule) < intrude_visibility and not modelbuilder.toolcontext.opt_ignore_visibility.value then
-                       self.modelbuilder.error(node, "Error: Method '{name}' is protected and can only acceded by self.")
+                       self.modelbuilder.error(node, "Error: method `{name}` is protected and can only accessed by `self`.")
                        return null
                end
 
@@ -309,32 +347,33 @@ private class TypeVisitor
                if info != null and self.mpropdef.mproperty.deprecation == null then
                        var mdoc = info.mdoc
                        if mdoc != null then
-                               self.modelbuilder.warning(node, "deprecated-method", "Deprecation Warning: Method '{name}' is deprecated: {mdoc.content.first}")
+                               self.modelbuilder.warning(node, "deprecated-method", "Deprecation Warning: method `{name}` is deprecated: {mdoc.content.first}")
                        else
-                               self.modelbuilder.warning(node, "deprecated-method", "Deprecation Warning: Method '{name}' is deprecated.")
+                               self.modelbuilder.warning(node, "deprecated-method", "Deprecation Warning: method `{name}` is deprecated.")
                        end
                end
 
                var propdefs = mproperty.lookup_definitions(self.mmodule, unsafe_type)
                var mpropdef
                if propdefs.length == 0 then
-                       self.modelbuilder.error(node, "Type error: no definition found for property {name} in {unsafe_type}")
+                       self.modelbuilder.error(node, "Type Error: no definition found for property `{name}` in `{unsafe_type}`.")
                        return null
                else if propdefs.length == 1 then
                        mpropdef = propdefs.first
                else
-                       self.modelbuilder.warning(node, "property-conflict", "Warning: conflicting property definitions for property {name} in {unsafe_type}: {propdefs.join(" ")}")
+                       self.modelbuilder.warning(node, "property-conflict", "Warning: conflicting property definitions for property `{name}` in `{unsafe_type}`: {propdefs.join(" ")}")
                        mpropdef = mproperty.intro
                end
 
 
-               var msignature = mpropdef.new_msignature or else mpropdef.msignature.as(not null)
+               var msignature = mpropdef.new_msignature or else mpropdef.msignature
+               if msignature == null then return null # skip error
                msignature = resolve_for(msignature, recvtype, recv_is_self).as(MSignature)
 
                var erasure_cast = false
                var rettype = mpropdef.msignature.return_mtype
                if not recv_is_self and rettype != null then
-                       rettype = rettype.as_notnullable
+                       rettype = rettype.undecorate
                        if rettype isa MParameterType then
                                var erased_rettype = msignature.return_mtype
                                assert erased_rettype != null
@@ -359,48 +398,76 @@ private class TypeVisitor
        # Visit the expressions of args and check their conformity with the corresponding type in signature
        # The point of this method is to handle varargs correctly
        # Note: The signature must be correctly adapted
-       fun check_signature(node: ANode, args: Array[AExpr], name: String, msignature: MSignature): Bool
+       fun check_signature(node: ANode, args: Array[AExpr], mproperty: MProperty, msignature: MSignature): nullable SignatureMap
        do
                var vararg_rank = msignature.vararg_rank
                if vararg_rank >= 0 then
                        if args.length < msignature.arity then
-                               #self.modelbuilder.error(node, "Error: Incorrect number of parameters. Got {args.length}, expected at least {msignature.arity}. Signature is {msignature}")
-                               self.modelbuilder.error(node, "Error: arity mismatch; prototype is '{name}{msignature}'")
-                               return false
+                               modelbuilder.error(node, "Error: expected at least {msignature.arity} argument(s) for `{mproperty}{msignature}`; got {args.length}. See introduction at `{mproperty.full_name}`.")
+                               return null
                        end
                else if args.length != msignature.arity then
-                       self.modelbuilder.error(node, "Error: Incorrect number of parameters. Got {args.length}, expected {msignature.arity}. Signature is {msignature}")
-                       return false
+                       if msignature.arity == msignature.min_arity then
+                               modelbuilder.error(node, "Error: expected {msignature.arity} argument(s) for `{mproperty}{msignature}`; got {args.length}. See introduction at `{mproperty.full_name}`.")
+                               return null
+                       end
+                       if args.length > msignature.arity then
+                               modelbuilder.error(node, "Error: expected at most {msignature.arity} argument(s) for `{mproperty}{msignature}`; got {args.length}. See introduction at `{mproperty.full_name}`.")
+                               return null
+                       end
+                       if args.length < msignature.min_arity then
+                               modelbuilder.error(node, "Error: expected at least {msignature.min_arity} argument(s) for `{mproperty}{msignature}`; got {args.length}. See introduction at `{mproperty.full_name}`.")
+                               return null
+                       end
                end
 
                #debug("CALL {unsafe_type}.{msignature}")
 
+               # Associate each parameter to a position in the arguments
+               var map = new SignatureMap
+
+               var setted = args.length - msignature.min_arity
                var vararg_decl = args.length - msignature.arity
+               var j = 0
                for i in [0..msignature.arity[ do
-                       var j = i
-                       if i == vararg_rank then continue # skip the vararg
-                       if i > vararg_rank then
-                               j = i + vararg_decl
+                       var param = msignature.mparameters[i]
+                       if param.is_default then
+                               if setted > 0 then
+                                       setted -= 1
+                               else
+                                       continue
+                               end
+                       end
+                       var arg = args[j]
+                       map.map[i] = j
+                       j += 1
+
+                       if i == vararg_rank then
+                               j += vararg_decl
+                               continue # skip the vararg
                        end
-                       var paramtype = msignature.mparameters[i].mtype
-                       self.visit_expr_subtype(args[j], paramtype)
+
+                       var paramtype = param.mtype
+                       self.visit_expr_subtype(arg, paramtype)
                end
                if vararg_rank >= 0 then
                        var paramtype = msignature.mparameters[vararg_rank].mtype
                        var first = args[vararg_rank]
                        if vararg_decl == 0 and first isa AVarargExpr then
                                var mclass = get_mclass(node, "Array")
-                               if mclass == null then return false # Forward error
+                               if mclass == null then return null # Forward error
                                var array_mtype = mclass.get_mtype([paramtype])
                                self.visit_expr_subtype(first.n_expr, array_mtype)
                                first.mtype  = first.n_expr.mtype
                        else
-                               for j in [vararg_rank..vararg_rank+vararg_decl] do
-                                       self.visit_expr_subtype(args[j], paramtype)
+                               map.vararg_decl = vararg_decl + 1
+                               for i in [vararg_rank..vararg_rank+vararg_decl] do
+                                       self.visit_expr_subtype(args[i], paramtype)
                                end
                        end
                end
-               return true
+
+               return map
        end
 
        fun error(node: ANode, message: String)
@@ -410,11 +477,10 @@ private class TypeVisitor
 
        fun get_variable(node: AExpr, variable: Variable): nullable MType
        do
+               if not variable.is_adapted then return variable.declared_type
+
                var flow = node.after_flow_context
-               if flow == null then
-                       self.error(node, "No context!")
-                       return null
-               end
+               if flow == null then return null # skip error
 
                if flow.vars.has_key(variable) then
                        return flow.vars[variable]
@@ -422,7 +488,7 @@ private class TypeVisitor
                        #node.debug("*** START Collected for {variable}")
                        var mtypes = flow.collect_types(variable)
                        #node.debug("**** END Collected for {variable}")
-                       if mtypes == null or mtypes.length == 0 then
+                       if mtypes.length == 0 then
                                return variable.declared_type
                        else if mtypes.length == 1 then
                                return mtypes.first
@@ -434,12 +500,18 @@ private class TypeVisitor
                end
        end
 
+       # Some variables where type-adapted during the visit
+       var dirty = false
+
+       # Some loops had been visited during the visit
+       var has_loop = false
+
        fun set_variable(node: AExpr, variable: Variable, mtype: nullable MType)
        do
                var flow = node.after_flow_context
                assert flow != null
 
-               flow.set_var(variable, mtype)
+               flow.set_var(self, variable, mtype)
        end
 
        fun merge_types(node: ANode, col: Array[nullable MType]): nullable MType
@@ -450,7 +522,7 @@ private class TypeVisitor
                        var found = true
                        for t2 in col do
                                if t2 == null then continue # return null
-                               if t2 isa MNullableType or t2 isa MNullType then
+                               if can_be_null(t2) and not can_be_null(t1) then
                                        t1 = t1.as_nullable
                                end
                                if not is_subtype(t2, t1) then found = false
@@ -465,6 +537,20 @@ private class TypeVisitor
        end
 end
 
+# Mapping between parameters and arguments in a call.
+#
+# Parameters and arguments are not stored in the class but referenced by their position (starting from 0)
+#
+# The point of this class is to help engine and other things to map arguments in the AST to parameters of the model.
+class SignatureMap
+       # Associate a parameter to an argument
+       var map = new ArrayMap[Int, Int]
+
+       # The length of the vararg sequence
+       # 0 if no vararg or if reverse vararg (cf `AVarargExpr`)
+       var vararg_decl: Int = 0
+end
+
 # A specific method call site with its associated informations.
 class CallSite
        # The associated node for location
@@ -497,58 +583,73 @@ class CallSite
        # Is a implicit cast required on erasure typing policy?
        var erasure_cast: Bool
 
+       # The mapping used on the call to associate arguments to parameters
+       # If null then no specific association is required.
+       var signaturemap: nullable SignatureMap = null
+
        private fun check_signature(v: TypeVisitor, args: Array[AExpr]): Bool
        do
-               return v.check_signature(self.node, args, self.mproperty.name, self.msignature)
+               var map = v.check_signature(self.node, args, self.mproperty, self.msignature)
+               signaturemap = map
+               return map == null
        end
 end
 
 redef class Variable
        # The declared type of the variable
        var declared_type: nullable MType
+
+       # Was the variable type-adapted?
+       # This is used to speedup type retrieval while it remains `false`
+       private var is_adapted = false
 end
 
 redef class FlowContext
        # Store changes of types because of type evolution
        private var vars = new HashMap[Variable, nullable MType]
-       private var cache = new HashMap[Variable, nullable Array[nullable MType]]
 
        # Adapt the variable to a static type
        # Warning1: do not modify vars directly.
        # Warning2: sub-flow may have cached a unadapted variable
-       private fun set_var(variable: Variable, mtype: nullable MType)
+       private fun set_var(v: TypeVisitor, variable: Variable, mtype: nullable MType)
        do
+               if variable.declared_type == mtype and not variable.is_adapted then return
+               if vars.has_key(variable) and vars[variable] == mtype then return
                self.vars[variable] = mtype
-               self.cache.keys.remove(variable)
+               v.dirty = true
+               variable.is_adapted = true
+               #node.debug "set {variable} to {mtype or else "X"}"
        end
 
-       private fun collect_types(variable: Variable): nullable Array[nullable MType]
+       # Look in the flow and previous flow and collect all first reachable type adaptation of a local variable
+       private fun collect_types(variable: Variable): Array[nullable MType]
        do
-               if cache.has_key(variable) then
-                       return cache[variable]
-               end
-               var res: nullable Array[nullable MType] = null
-               if vars.has_key(variable) then
-                       var mtype = vars[variable]
-                       res = [mtype]
-               else if self.previous.is_empty then
-                       # Root flow
-                       res = [variable.declared_type]
-               else
-                       for flow in self.previous do
-                               if flow.is_unreachable then continue
-                               var r2 = flow.collect_types(variable)
-                               if r2 == null then continue
-                               if res == null then
-                                       res = r2.to_a
-                               else
-                                       for t in r2 do
-                                               if not res.has(t) then res.add(t)
-                                       end
+               #node.debug "flow for {variable}"
+               var res = new Array[nullable MType]
+
+               var todo = [self]
+               var seen = new HashSet[FlowContext]
+               while not todo.is_empty do
+                       var f = todo.pop
+                       if f.is_unreachable then continue
+                       if seen.has(f) then continue
+                       seen.add f
+
+                       if f.vars.has_key(variable) then
+                               # Found something. Collect it and do not process further on this path
+                               res.add f.vars[variable]
+                               #f.node.debug "process {variable}: got {f.vars[variable] or else "X"}"
+                       else
+                               todo.add_all f.previous
+                               todo.add_all f.loops
+                               if f.previous.is_empty then
+                                       # Root flowcontext mean a parameter or something related
+                                       res.add variable.declared_type
+                                       #f.node.debug "root process {variable}: got {variable.declared_type or else "X"}"
                                end
                        end
                end
-               cache[variable] = res
+               #self.node.debug "##### end flow for {variable}: {res.join(" ")}"
                return res
        end
 end
@@ -569,14 +670,18 @@ redef class AMethPropdef
                var nblock = self.n_block
                if nblock == null then return
 
-               var mpropdef = self.mpropdef.as(not null)
+               var mpropdef = self.mpropdef
+               if mpropdef == null then return # skip error
+
                var v = new TypeVisitor(modelbuilder, mpropdef.mclassdef.mmodule, mpropdef)
                self.selfvariable = v.selfvariable
 
                var mmethoddef = self.mpropdef.as(not null)
-               for i in [0..mmethoddef.msignature.arity[ do
-                       var mtype = mmethoddef.msignature.mparameters[i].mtype
-                       if mmethoddef.msignature.vararg_rank == i then
+               var msignature = mmethoddef.msignature
+               if msignature == null then return # skip error
+               for i in [0..msignature.arity[ do
+                       var mtype = msignature.mparameters[i].mtype
+                       if msignature.vararg_rank == i then
                                var arrayclass = v.get_mclass(self.n_signature.n_params[i], "Array")
                                if arrayclass == null then return # Skip error
                                mtype = arrayclass.get_mtype([mtype])
@@ -585,11 +690,16 @@ redef class AMethPropdef
                        assert variable != null
                        variable.declared_type = mtype
                end
-               v.visit_stmt(nblock)
 
-               if not nblock.after_flow_context.is_unreachable and mmethoddef.msignature.return_mtype != null then
+               loop
+                       v.dirty = false
+                       v.visit_stmt(nblock)
+                       if not v.has_loop or not v.dirty then break
+               end
+
+               if not nblock.after_flow_context.is_unreachable and msignature.return_mtype != null then
                        # We reach the end of the function without having a return, it is bad
-                       v.error(self, "Control error: Reached end of function (a 'return' with a value was expected).")
+                       v.error(self, "Error: reached end of function; expected `return` with a value.")
                end
        end
 end
@@ -597,7 +707,11 @@ end
 redef class AAttrPropdef
        redef fun do_typing(modelbuilder: ModelBuilder)
        do
-               var mpropdef = self.mpropdef.as(not null)
+               if not has_value then return
+
+               var mpropdef = self.mpropdef
+               if mpropdef == null then return # skip error
+
                var v = new TypeVisitor(modelbuilder, mpropdef.mclassdef.mmodule, mpropdef)
                self.selfvariable = v.selfvariable
 
@@ -611,7 +725,7 @@ redef class AAttrPropdef
                        v.visit_stmt(nblock)
                        if not nblock.after_flow_context.is_unreachable then
                                # We reach the end of the init without having a return, it is bad
-                               v.error(self, "Control error: Reached end of block (a 'return' with a value was expected).")
+                               v.error(self, "Error: reached end of block; expected `return`.")
                        end
                end
        end
@@ -696,7 +810,9 @@ redef class AVardeclExpr
 
                var decltype = mtype
                if mtype == null or mtype isa MNullType then
-                       decltype = v.get_mclass(self, "Object").mclass_type.as_nullable
+                       var objclass = v.get_mclass(self, "Object")
+                       if objclass == null then return # skip error
+                       decltype = objclass.mclass_type.as_nullable
                        if mtype == null then mtype = decltype
                end
 
@@ -705,6 +821,7 @@ redef class AVardeclExpr
 
                #debug("var {variable}: {mtype}")
 
+               self.mtype = mtype
                self.is_typed = true
        end
 end
@@ -754,18 +871,11 @@ redef class AReassignFormExpr
        # Return the static type of the value to store.
        private fun resolve_reassignment(v: TypeVisitor, readtype, writetype: MType): nullable MType
        do
-               var reassign_name: String
-               if self.n_assign_op isa APlusAssignOp then
-                       reassign_name = "+"
-               else if self.n_assign_op isa AMinusAssignOp then
-                       reassign_name = "-"
-               else
-                       abort
-               end
+               var reassign_name = self.n_assign_op.operator
 
                self.read_type = readtype
 
-               var callsite = v.get_method(self, readtype, reassign_name, false)
+               var callsite = v.get_method(self.n_assign_op, readtype, reassign_name, false)
                if callsite == null then return null # Skip error
                self.reassign_callsite = callsite
 
@@ -776,7 +886,7 @@ redef class AReassignFormExpr
                var value_type = v.visit_expr_subtype(self.n_value, msignature.mparameters.first.mtype)
                if value_type == null then return null # Skip error
 
-               v.check_subtype(self, rettype, writetype)
+               v.check_subtype(self, rettype, writetype, false)
                return rettype
        end
 end
@@ -844,10 +954,10 @@ redef class AReturnExpr
                                v.visit_expr_subtype(nexpr, ret_type)
                        else
                                v.visit_expr(nexpr)
-                               v.error(self, "Error: Return with value in a procedure.")
+                               v.error(nexpr, "Error: `return` with value in a procedure.")
                        end
                else if ret_type != null then
-                       v.error(self, "Error: Return without value in a function.")
+                       v.error(self, "Error: `return` without value in a function.")
                end
                self.is_typed = true
        end
@@ -890,7 +1000,7 @@ redef class AIfexprExpr
 
                var t = v.merge_types(self, [t1, t2])
                if t == null then
-                       v.error(self, "Type Error: ambiguous type {t1} vs {t2}")
+                       v.error(self, "Type Error: ambiguous type `{t1}` vs `{t2}`.")
                end
                self.mtype = t
        end
@@ -907,8 +1017,8 @@ end
 redef class AWhileExpr
        redef fun accept_typing(v)
        do
+               v.has_loop = true
                v.visit_expr_bool(n_expr)
-
                v.visit_stmt(n_block)
                self.is_typed = true
        end
@@ -917,6 +1027,7 @@ end
 redef class ALoopExpr
        redef fun accept_typing(v)
        do
+               v.has_loop = true
                v.visit_stmt(n_block)
                self.is_typed = true
        end
@@ -938,7 +1049,7 @@ redef class AForExpr
        private fun do_type_iterator(v: TypeVisitor, mtype: MType)
        do
                if mtype isa MNullType then
-                       v.error(self, "Type error: 'for' cannot iterate over 'null'")
+                       v.error(self, "Type Error: `for` cannot iterate over `null`.")
                        return
                end
 
@@ -949,7 +1060,7 @@ redef class AForExpr
                # check iterator method
                var itdef = v.get_method(self, mtype, "iterator", n_expr isa ASelfExpr)
                if itdef == null then
-                       v.error(self, "Type Error: 'for' expects a type providing 'iterator' method, got '{mtype}'.")
+                       v.error(self, "Type Error: `for` expects a type providing an `iterator` method, got `{mtype}`.")
                        return
                end
                self.method_iterator = itdef
@@ -957,7 +1068,7 @@ redef class AForExpr
                # check that iterator return something
                var ittype = itdef.msignature.return_mtype
                if ittype == null then
-                       v.error(self, "Type Error: 'for' expects method 'iterator' to return an 'Iterator' or 'MapIterator' type'.")
+                       v.error(self, "Type Error: `for` expects the method `iterator` to return an `Iterator` or `MapIterator` type.")
                        return
                end
 
@@ -972,7 +1083,7 @@ redef class AForExpr
                        var coltype = ittype.supertype_to(v.mmodule, v.anchor, colit_cla)
                        var variables =  self.variables
                        if variables.length != 1 then
-                               v.error(self, "Type Error: 'for' expects only one variable when using 'Iterator'.")
+                               v.error(self, "Type Error: `for` expects only one variable when using `Iterator`.")
                        else
                                variables.first.declared_type = coltype.arguments.first
                        end
@@ -984,7 +1095,7 @@ redef class AForExpr
                        var coltype = ittype.supertype_to(v.mmodule, v.anchor, mapit_cla)
                        var variables = self.variables
                        if variables.length != 2 then
-                               v.error(self, "Type Error: 'for' expects two variables when using 'MapIterator'.")
+                               v.error(self, "Type Error: `for` expects two variables when using `MapIterator`.")
                        else
                                variables[0].declared_type = coltype.arguments[0]
                                variables[1].declared_type = coltype.arguments[1]
@@ -993,34 +1104,34 @@ redef class AForExpr
                end
 
                if not is_col and not is_map then
-                       v.error(self, "Type Error: 'for' expects method 'iterator' to return an 'Iterator' or 'MapIterator' type'.")
+                       v.error(self, "Type Error: `for` expects the method `iterator` to return an `Iterator` or `MapIterator` type.")
                        return
                end
 
                # anchor formal and virtual types
                if mtype.need_anchor then mtype = v.anchor_to(mtype)
 
-               mtype = mtype.as_notnullable
+               mtype = mtype.undecorate
                self.coltype = mtype.as(MClassType)
 
                # get methods is_ok, next, item
                var ikdef = v.get_method(self, ittype, "is_ok", false)
                if ikdef == null then
-                       v.error(self, "Type Error: 'for' expects a method 'is_ok' in 'Iterator' type {ittype}.")
+                       v.error(self, "Type Error: `for` expects a method `is_ok` in type `{ittype}`.")
                        return
                end
                self.method_is_ok = ikdef
 
                var itemdef = v.get_method(self, ittype, "item", false)
                if itemdef == null then
-                       v.error(self, "Type Error: 'for' expects a method 'item' in 'Iterator' type {ittype}.")
+                       v.error(self, "Type Error: `for` expects a method `item` in type `{ittype}`.")
                        return
                end
                self.method_item = itemdef
 
                var nextdef = v.get_method(self, ittype, "next", false)
                if nextdef == null then
-                       v.error(self, "Type Error: 'for' expects a method 'next' in 'Iterator' type {ittype}.")
+                       v.error(self, "Type Error: `for` expects a method `next` in type {ittype}.")
                        return
                end
                self.method_next = nextdef
@@ -1030,7 +1141,7 @@ redef class AForExpr
                if is_map then
                        var keydef = v.get_method(self, ittype, "key", false)
                        if keydef == null then
-                               v.error(self, "Type Error: 'for' expects a method 'key' in 'Iterator' type {ittype}.")
+                               v.error(self, "Type Error: `for` expects a method `key` in type `{ittype}`.")
                                return
                        end
                        self.method_key = keydef
@@ -1052,12 +1163,32 @@ redef class AForExpr
 
        redef fun accept_typing(v)
        do
+               v.has_loop = true
                var mtype = v.visit_expr(n_expr)
                if mtype == null then return
 
                self.do_type_iterator(v, mtype)
 
                v.visit_stmt(n_block)
+
+               self.mtype = n_block.mtype
+               self.is_typed = true
+       end
+end
+
+redef class AWithExpr
+       var method_start: nullable CallSite
+       var method_finish: nullable CallSite
+
+       redef fun accept_typing(v: TypeVisitor)
+       do
+               var mtype = v.visit_expr(n_expr)
+               if mtype == null then return
+
+               method_start = v.get_method(self, mtype, "start", n_expr isa ASelfExpr)
+               method_finish = v.get_method(self, mtype, "finish", n_expr isa ASelfExpr)
+
+               v.visit_stmt(n_block)
                self.mtype = n_block.mtype
                self.is_typed = true
        end
@@ -1119,12 +1250,18 @@ redef class AOrElseExpr
                        return # Skip error
                end
 
-               t1 = t1.as_notnullable
+               if t1 isa MNullType then
+                       v.error(n_expr, "Type Error: `or else` on `null`.")
+               else if v.check_can_be_null(n_expr, t1) then
+                       t1 = t1.as_notnull
+               end
 
                var t = v.merge_types(self, [t1, t2])
                if t == null then
-                       t = v.mmodule.object_type
-                       if t2 isa MNullableType then
+                       var c = v.get_mclass(self, "Object")
+                       if c == null then return # forward error
+                       t = c.mclass_type
+                       if v.can_be_null(t2) then
                                t = t.as_nullable
                        end
                        #v.error(self, "Type Error: ambiguous type {t1} vs {t2}")
@@ -1189,8 +1326,11 @@ redef class ASuperstringExpr
                var mclass = v.get_mclass(self, "String")
                if mclass == null then return # Forward error
                self.mtype = mclass.mclass_type
+               var objclass = v.get_mclass(self, "Object")
+               if objclass == null then return # Forward error
+               var objtype = objclass.mclass_type
                for nexpr in self.n_exprs do
-                       v.visit_expr_subtype(nexpr, v.mmodule.object_type)
+                       v.visit_expr_subtype(nexpr, objtype)
                end
        end
 end
@@ -1238,13 +1378,15 @@ redef class AArrayExpr
                        end
                        set_comprehension(e)
                        if mtype != null then
-                               if v.check_subtype(e, t, mtype) == null then return # Skip error
+                               if v.check_subtype(e, t, mtype, false) == null then return # Forward error
                                if t == mtype then useless = true
                        else
                                mtypes.add(t)
                        end
                end
                if mtype == null then
+                       # Ensure monotony for type adaptation on loops
+                       if self.element_mtype != null then mtypes.add self.element_mtype
                        mtype = v.merge_types(self, mtypes)
                end
                if mtype == null or mtype isa MNullType then
@@ -1288,7 +1430,7 @@ redef class ARangeExpr
                else if v.is_subtype(t2, t1) then
                        mtype = mclass.get_mtype([t1])
                else
-                       v.error(self, "Type Error: Cannot create range: {t1} vs {t2}")
+                       v.error(self, "Type Error: cannot create range: `{t1}` vs `{t2}`.")
                        return
                end
 
@@ -1329,7 +1471,7 @@ redef class AIsaExpr
                        #var from = if orig != null then orig.to_s else "invalid"
                        #var to = if mtype != null then mtype.to_s else "invalid"
                        #debug("adapt {variable}: {from} -> {to}")
-                       self.after_flow_context.when_true.set_var(variable, mtype)
+                       self.after_flow_context.when_true.set_var(v, variable, mtype)
                end
 
                self.mtype = v.type_bool(self)
@@ -1350,25 +1492,15 @@ redef class AAsNotnullExpr
                if mtype == null then return # Forward error
 
                if mtype isa MNullType then
-                       v.error(self, "Type error: as(not null) on null")
-                       return
-               end
-               if mtype isa MNullableType then
-                       self.mtype = mtype.mtype
+                       v.error(self, "Type Error: `as(not null)` on `null`.")
                        return
                end
-               self.mtype = mtype
 
-               if mtype isa MClassType then
-                       v.modelbuilder.warning(self, "useless-type-test", "Warning: expression is already not null, since it is a `{mtype}`.")
-                       return
-               end
-               assert mtype.need_anchor
-               var u = v.anchor_to(mtype)
-               if not u isa MNullableType then
-                       v.modelbuilder.warning(self, "useless-type-test", "Warning: expression is already not null, since it is a `{mtype}: {u}`.")
-                       return
+               if v.check_can_be_null(n_expr, mtype) then
+                       mtype = mtype.as_notnull
                end
+
+               self.mtype = mtype
        end
 end
 
@@ -1391,7 +1523,7 @@ redef class ASelfExpr
        redef fun accept_typing(v)
        do
                if v.is_toplevel_context and not self isa AImplicitSelfExpr then
-                       v.error(self, "Error: self cannot be used in top-level method.")
+                       v.error(self, "Error: `self` cannot be used in top-level method.")
                end
                var variable = v.selfvariable
                self.its_variable = variable
@@ -1399,6 +1531,15 @@ redef class ASelfExpr
        end
 end
 
+redef class AImplicitSelfExpr
+       # Is the implicit receiver `sys`?
+       #
+       # By default, the implicit receiver is `self`.
+       # But when there is not method for `self`, `sys` is used as a fall-back.
+       # Is this case this flag is set to `true`.
+       var is_sys = false
+end
+
 ## MESSAGE SENDING AND PROPERTY
 
 redef class ASendExpr
@@ -1407,13 +1548,39 @@ redef class ASendExpr
 
        redef fun accept_typing(v)
        do
-               var recvtype = v.visit_expr(self.n_expr)
+               var nrecv = self.n_expr
+               var recvtype = v.visit_expr(nrecv)
                var name = self.property_name
+               var node = self.property_node
 
                if recvtype == null then return # Forward error
 
-               var callsite = v.get_method(self, recvtype, name, self.n_expr isa ASelfExpr)
-               if callsite == null then return
+               var callsite = null
+               var unsafe_type = v.anchor_to(recvtype)
+               var mproperty = v.try_get_mproperty_by_name2(node, unsafe_type, name)
+               if mproperty == null and nrecv isa AImplicitSelfExpr then
+                       # Special fall-back search in `sys` when noting found in the implicit receiver.
+                       var sysclass = v.try_get_mclass(node, "Sys")
+                       if sysclass != null then
+                               var systype = sysclass.mclass_type
+                               mproperty = v.try_get_mproperty_by_name2(node, systype, name)
+                               if mproperty != null then
+                                       callsite = v.get_method(node, systype, name, false)
+                                       if callsite == null then return # Forward error
+                                       # Update information, we are looking at `sys` now, not `self`
+                                       nrecv.is_sys = true
+                                       nrecv.its_variable = null
+                                       nrecv.mtype = systype
+                                       recvtype = systype
+                               end
+                       end
+               end
+               if callsite == null then
+                       # If still nothing, just exit
+                       callsite = v.get_method(node, recvtype, name, nrecv isa ASelfExpr)
+                       if callsite == null then return
+               end
+
                self.callsite = callsite
                var msignature = callsite.msignature
 
@@ -1424,10 +1591,10 @@ redef class ASendExpr
                if callsite.mproperty.is_init then
                        var vmpropdef = v.mpropdef
                        if not (vmpropdef isa MMethodDef and vmpropdef.mproperty.is_init) then
-                               v.error(self, "Can call a init only in another init")
+                               v.error(node, "Error: an `init` can only be called from another `init`.")
                        end
                        if vmpropdef isa MMethodDef and vmpropdef.mproperty.is_root_init and not callsite.mproperty.is_root_init then
-                               v.error(self, "Error: {vmpropdef} cannot call a factory {callsite.mproperty}")
+                               v.error(node, "Error: `{vmpropdef}` cannot call a factory `{callsite.mproperty}`.")
                        end
                end
 
@@ -1443,6 +1610,11 @@ redef class ASendExpr
        # Each subclass simply provide the correct name.
        private fun property_name: String is abstract
 
+       # The node identifying the name (id, operator, etc) for messages.
+       #
+       # Is `self` by default
+       private fun property_node: ANode do return self
+
        # An array of all arguments (excluding self)
        fun raw_arguments: Array[AExpr] do return compute_raw_arguments
 
@@ -1451,9 +1623,10 @@ end
 
 redef class ABinopExpr
        redef fun compute_raw_arguments do return [n_expr2]
+       redef fun property_name do return operator
+       redef fun property_node do return n_op
 end
 redef class AEqExpr
-       redef fun property_name do return "=="
        redef fun accept_typing(v)
        do
                super
@@ -1461,51 +1634,16 @@ redef class AEqExpr
        end
 end
 redef class ANeExpr
-       redef fun property_name do return "!="
        redef fun accept_typing(v)
        do
                super
                v.null_test(self)
        end
 end
-redef class ALtExpr
-       redef fun property_name do return "<"
-end
-redef class ALeExpr
-       redef fun property_name do return "<="
-end
-redef class ALlExpr
-       redef fun property_name do return "<<"
-end
-redef class AGtExpr
-       redef fun property_name do return ">"
-end
-redef class AGeExpr
-       redef fun property_name do return ">="
-end
-redef class AGgExpr
-       redef fun property_name do return ">>"
-end
-redef class APlusExpr
-       redef fun property_name do return "+"
-end
-redef class AMinusExpr
-       redef fun property_name do return "-"
-end
-redef class AStarshipExpr
-       redef fun property_name do return "<=>"
-end
-redef class AStarExpr
-       redef fun property_name do return "*"
-end
-redef class AStarstarExpr
-       redef fun property_name do return "**"
-end
-redef class ASlashExpr
-       redef fun property_name do return "/"
-end
-redef class APercentExpr
-       redef fun property_name do return "%"
+
+redef class AUplusExpr
+       redef fun property_name do return "unary +"
+       redef fun compute_raw_arguments do return new Array[AExpr]
 end
 
 redef class AUminusExpr
@@ -1516,11 +1654,13 @@ end
 
 redef class ACallExpr
        redef fun property_name do return n_id.text
+       redef fun property_node do return n_id
        redef fun compute_raw_arguments do return n_args.to_a
 end
 
 redef class ACallAssignExpr
        redef fun property_name do return n_id.text + "="
+       redef fun property_node do return n_id
        redef fun compute_raw_arguments
        do
                var res = n_args.to_a
@@ -1552,11 +1692,12 @@ redef class ASendReassignFormExpr
        do
                var recvtype = v.visit_expr(self.n_expr)
                var name = self.property_name
+               var node = self.property_node
 
                if recvtype == null then return # Forward error
 
                var for_self = self.n_expr isa ASelfExpr
-               var callsite = v.get_method(self, recvtype, name, for_self)
+               var callsite = v.get_method(node, recvtype, name, for_self)
 
                if callsite == null then return
                self.callsite = callsite
@@ -1567,11 +1708,11 @@ redef class ASendReassignFormExpr
 
                var readtype = callsite.msignature.return_mtype
                if readtype == null then
-                       v.error(self, "Error: {name} is not a function")
+                       v.error(node, "Error: `{name}` is not a function.")
                        return
                end
 
-               var wcallsite = v.get_method(self, recvtype, name + "=", self.n_expr isa ASelfExpr)
+               var wcallsite = v.get_method(node, recvtype, name + "=", self.n_expr isa ASelfExpr)
                if wcallsite == null then return
                self.write_callsite = wcallsite
 
@@ -1588,6 +1729,7 @@ end
 
 redef class ACallReassignExpr
        redef fun property_name do return n_id.text
+       redef fun property_node do return n_id
        redef fun compute_raw_arguments do return n_args.to_a
 end
 
@@ -1598,6 +1740,7 @@ end
 
 redef class AInitExpr
        redef fun property_name do return "init"
+       redef fun property_node do return n_kwinit
        redef fun compute_raw_arguments do return n_args.to_a
 end
 
@@ -1624,7 +1767,7 @@ redef class ASuperExpr
                assert recvtype != null
                var mproperty = v.mpropdef.mproperty
                if not mproperty isa MMethod then
-                       v.error(self, "Error: super only usable in a method")
+                       v.error(self, "Error: `super` only usable in a `method`.")
                        return
                end
                var superprops = mproperty.lookup_super_definitions(v.mmodule, anchor)
@@ -1633,7 +1776,7 @@ redef class ASuperExpr
                                process_superinit(v)
                                return
                        end
-                       v.error(self, "Error: No super method to call for {mproperty}.")
+                       v.error(self, "Error: no super method to call for `{mproperty}`.")
                        return
                end
                # FIXME: covariance of return type in linear extension?
@@ -1643,7 +1786,7 @@ redef class ASuperExpr
                msignature = v.resolve_for(msignature, recvtype, true).as(MSignature)
                var args = self.n_args.to_a
                if args.length > 0 then
-                       v.check_signature(self, args, mproperty.name, msignature)
+                       signaturemap = v.check_signature(self, args, mproperty, msignature)
                end
                self.mtype = msignature.return_mtype
                self.is_typed = true
@@ -1651,6 +1794,10 @@ redef class ASuperExpr
                mpropdef = v.mpropdef.as(MMethodDef)
        end
 
+       # The mapping used on the call to associate arguments to parameters.
+       # If null then no specific association is required.
+       var signaturemap: nullable SignatureMap
+
        private fun process_superinit(v: TypeVisitor)
        do
                var anchor = v.anchor
@@ -1673,7 +1820,7 @@ redef class ASuperExpr
                                continue
                        end
                        if superprop != null and superprop.mproperty != candidate and not superprop.mproperty.is_root_init then
-                               v.error(self, "Error: conflicting super constructor to call for {mproperty}: {candidate.full_name}, {superprop.mproperty.full_name}")
+                               v.error(self, "Error: conflicting super constructor to call for `{mproperty}`: `{candidate.full_name}`, `{superprop.mproperty.full_name}`")
                                return
                        end
                        var candidatedefs = candidate.lookup_definitions(v.mmodule, anchor)
@@ -1682,13 +1829,13 @@ redef class ASuperExpr
                                candidatedefs.add(superprop)
                        end
                        if candidatedefs.length > 1 then
-                               v.error(self, "Error: conflicting property definitions for property {mproperty} in {recvtype}: {candidatedefs.join(", ")}")
+                               v.error(self, "Error: conflicting property definitions for property `{mproperty}` in `{recvtype}`: {candidatedefs.join(", ")}")
                                return
                        end
                        superprop = candidatedefs.first
                end
                if superprop == null then
-                       v.error(self, "Error: No super method to call for {mproperty}.")
+                       v.error(self, "Error: no super method to call for `{mproperty}`.")
                        return
                end
 
@@ -1704,7 +1851,7 @@ redef class ASuperExpr
                else
                        # Check there is at least enough parameters
                        if mpropdef.msignature.arity < msignature.arity then
-                               v.error(self, "Error: Not enough implicit arguments to pass. Got {mpropdef.msignature.arity}, expected at least {msignature.arity}. Signature is {msignature}")
+                               v.error(self, "Error: not enough implicit arguments to pass. Got `{mpropdef.msignature.arity}`, expected at least `{msignature.arity}`. Signature is `{msignature}`.")
                                return
                        end
                        # Check that each needed parameter is conform
@@ -1712,7 +1859,7 @@ redef class ASuperExpr
                        for sp in msignature.mparameters do
                                var p = mpropdef.msignature.mparameters[i]
                                if not v.is_subtype(p.mtype, sp.mtype) then
-                                       v.error(self, "Type error: expected argument #{i} of type {sp.mtype}, got implicit argument {p.name} of type {p.mtype}. Signature is {msignature}")
+                                       v.error(self, "Type Error: expected argument #{i} of type `{sp.mtype}`, got implicit argument `{p.name}` of type `{p.mtype}`. Signature is {msignature}")
                                        return
                                end
                                i += 1
@@ -1739,30 +1886,50 @@ redef class ANewExpr
 
                if not recvtype isa MClassType then
                        if recvtype isa MNullableType then
-                               v.error(self, "Type error: cannot instantiate the nullable type {recvtype}.")
+                               v.error(self, "Type Error: cannot instantiate the nullable type `{recvtype}`.")
+                               return
+                       else if recvtype isa MFormalType then
+                               v.error(self, "Type Error: cannot instantiate the formal type `{recvtype}`.")
                                return
                        else
-                               v.error(self, "Type error: cannot instantiate the formal type {recvtype}.")
+                               v.error(self, "Type Error: cannot instantiate the type `{recvtype}`.")
                                return
                        end
                end
 
                self.recvtype = recvtype
+               var kind = recvtype.mclass.kind
 
                var name: String
                var nid = self.n_id
+               var node: ANode
                if nid != null then
                        name = nid.text
+                       node = nid
                else
                        name = "new"
+                       node = self.n_kwnew
+               end
+               if name == "intern" then
+                       if kind != concrete_kind then
+                               v.error(self, "Type Error: cannot instantiate {kind} {recvtype}.")
+                               return
+                       end
+                       if n_args.n_exprs.not_empty then
+                               v.error(n_args, "Type Error: the intern constructor expects no arguments.")
+                               return
+                       end
+                       # Our job is done
+                       self.mtype = recvtype
+                       return
                end
-               var callsite = v.get_method(self, recvtype, name, false)
+
+               var callsite = v.get_method(node, recvtype, name, false)
                if callsite == null then return
 
                if not callsite.mproperty.is_new then
-                       var kind = recvtype.mclass.kind
                        if kind != concrete_kind then
-                               v.error(self, "Type Error: Cannot instantiate {kind} {recvtype}.")
+                               v.error(self, "Type Error: cannot instantiate {kind} `{recvtype}`.")
                                return
                        end
                        self.mtype = recvtype
@@ -1774,7 +1941,7 @@ redef class ANewExpr
                self.callsite = callsite
 
                if not callsite.mproperty.is_init_for(recvtype.mclass) then
-                       v.error(self, "Error: {name} is not a constructor.")
+                       v.error(self, "Error: `{name}` is not a constructor.")
                        return
                end
 
@@ -1786,27 +1953,28 @@ end
 ####
 
 redef class AAttrFormExpr
-       # The attribute acceded.
+       # The attribute accessed.
        var mproperty: nullable MAttribute
 
        # The static type of the attribute.
        var attr_type: nullable MType
 
-       # Resolve the attribute acceded.
+       # Resolve the attribute accessed.
        private fun resolve_property(v: TypeVisitor)
        do
                var recvtype = v.visit_expr(self.n_expr)
                if recvtype == null then return # Skip error
-               var name = self.n_id.text
+               var node = self.n_id
+               var name = node.text
                if recvtype isa MNullType then
-                       v.error(self, "Error: Attribute '{name}' access on 'null'.")
+                       v.error(node, "Error: attribute `{name}` access on `null`.")
                        return
                end
 
                var unsafe_type = v.anchor_to(recvtype)
-               var mproperty = v.try_get_mproperty_by_name2(self, unsafe_type, name)
+               var mproperty = v.try_get_mproperty_by_name2(node, unsafe_type, name)
                if mproperty == null then
-                       v.modelbuilder.error(self, "Error: Attribute {name} doesn't exists in {recvtype}.")
+                       v.modelbuilder.error(node, "Error: attribute `{name}` does not exist in `{recvtype}`.")
                        return
                end
                assert mproperty isa MAttribute
@@ -1815,7 +1983,8 @@ redef class AAttrFormExpr
                var mpropdefs = mproperty.lookup_definitions(v.mmodule, unsafe_type)
                assert mpropdefs.length == 1
                var mpropdef = mpropdefs.first
-               var attr_type = mpropdef.static_mtype.as(not null)
+               var attr_type = mpropdef.static_mtype
+               if attr_type == null then return # skip error
                attr_type = v.resolve_for(attr_type, recvtype, self.n_expr isa ASelfExpr)
                self.attr_type = attr_type
        end
@@ -1864,7 +2033,7 @@ redef class AIssetAttrExpr
                var recvtype = self.n_expr.mtype.as(not null)
                var bound = v.resolve_for(mtype, recvtype, false)
                if bound isa MNullableType then
-                       v.error(self, "Error: isset on a nullable attribute.")
+                       v.error(n_id, "Type Error: `isset` on a nullable attribute.")
                end
                self.mtype = v.type_bool(self)
        end
@@ -1876,7 +2045,7 @@ redef class AVarargExpr
                # This kind of pseudo-expression can be only processed trough a signature
                # See `check_signature`
                # Other cases are a syntax error.
-               v.error(self, "Syntax error: unexpected `...`")
+               v.error(self, "Syntax Error: unexpected `...`.")
        end
 end
 
index 89682cc..6ad8038 100644 (file)
@@ -19,7 +19,9 @@ module test_parser
 
 import parser
 import parser_util
+import astutil
 
+# A basic visitor that prints AST trees to the screen
 class PrintTreeVisitor
        super Visitor
        private var rank: Int = 0
@@ -41,6 +43,7 @@ var only_lexer = false
 var need_help = false
 var no_file = false
 var interactive = false
+var xml = false
 
 while not args.is_empty and args.first.chars.first == '-' do
        if args.first == "-n" then
@@ -49,6 +52,8 @@ while not args.is_empty and args.first.chars.first == '-' do
                only_lexer = true
        else if args.first == "-p" then
                only_lexer = false
+       else if args.first == "-x" then
+               xml = true
        else if args.first == "-e" then
                no_file = true
        else if args.first == "-i" then
@@ -71,15 +76,16 @@ if (args.is_empty and not interactive) or need_help then
        print("  -n     do not print anything")
        print("  -l     only lexer")
        print("  -p     lexer and parser (default)")
+       print("  -x     instead of a ascii tree, output a XML document")
        print("  -e     instead on files, each argument is a content to parse")
        print("  -i     tree to parse are read interactively")
        print("  -h     print this help")
 else if interactive then
        if only_lexer then
-               print "Error: -l and -i are incompatibles"
+               print "Error: -l and -i are incompatible"
                exit 1
        else if no_file then
-               print "Error: -e and -i are incompatibles"
+               print "Error: -e and -i are incompatible"
                exit 1
        else if not args.is_empty then
                print "Error: -i works without arguments"
@@ -138,7 +144,10 @@ else
                                return
                        end
 
-                       if not no_print then
+                       if xml then
+                               tree.parentize_tokens
+                               tree.to_xml.write_to(stdout)
+                       else if not no_print then
                                (new PrintTreeVisitor).enter_visit(tree)
                        end
                end
index 8fd5908..767cf95 100644 (file)
@@ -62,6 +62,6 @@ var model = new Model
 var modelbuilder = new ModelBuilder(model, toolcontext)
 
 # Here we load an process all modules passed on the command line
-var mmodules = modelbuilder.parse(arguments)
+var mmodules = modelbuilder.parse_full(arguments)
 modelbuilder.run_phases
 toolcontext.run_global_phases(mmodules)
index d6de328..7d4afe6 100644 (file)
@@ -25,8 +25,8 @@ class NitUnitExecutor
        # The prefix of the generated Nit source-file
        var prefix: String
 
-       # The module to import
-       var mmodule: MModule
+       # The module to import, if any
+       var mmodule: nullable MModule
 
        # The XML node associated to the module
        var testsuite: HTMLTag
@@ -57,8 +57,8 @@ class NitUnitExecutor
                if not (ast isa AModule or ast isa ABlockExpr or ast isa AExpr) then
                        var message = ""
                        if ast isa AError then message = " At {ast.location}: {ast.message}."
-                       toolcontext.warning(ndoc.location, "invalid-block", "Error: There is a block of code that is not valid Nit, thus not considered a nitunit. To suppress this warning, enclose the block with a fence tagged `nitish` or `raw` (see `man nitdoc`).{message}")
-                       failures.add("{ndoc.location}: Invalid block of code.{message}")
+                       toolcontext.warning(mdoc.location, "invalid-block", "Error: there is a block of invalid Nit code, thus not considered a nitunit. To suppress this warning, enclose the block with a fence tagged `nitish` or `raw` (see `man nitdoc`).{message}")
+                       failures.add("{mdoc.location}: Invalid block of code.{message}")
                        return
                end
 
@@ -72,8 +72,8 @@ class NitUnitExecutor
                blocks.last.add(text)
        end
 
-       # The associated node to localize warnings
-       var ndoc: nullable ADoc = null
+       # The associated documentation object
+       var mdoc: nullable MDoc = null
 
        # used to generate distinct names
        var cpt = 0
@@ -82,14 +82,14 @@ class NitUnitExecutor
        # Fill `docunits` with new discovered unit of tests.
        #
        # `tc` (testcase) is the pre-filled XML node
-       fun extract(ndoc: ADoc, tc: HTMLTag)
+       fun extract(mdoc: MDoc, tc: HTMLTag)
        do
                blocks.clear
                failures.clear
 
-               self.ndoc = ndoc
+               self.mdoc = mdoc
 
-               work(ndoc.to_mdoc)
+               work(mdoc)
 
                toolcontext.check_errors
 
@@ -106,7 +106,7 @@ class NitUnitExecutor
                if blocks.is_empty then return
 
                for block in blocks do
-                       docunits.add new DocUnit(ndoc, tc, block.join(""))
+                       docunits.add new DocUnit(mdoc, tc, block.join(""))
                end
        end
 
@@ -144,11 +144,7 @@ class NitUnitExecutor
                var dir = file.dirname
                if dir != "" then dir.mkdir
                var f
-               f = new FileWriter.open(file)
-               f.write("# GENERATED FILE\n")
-               f.write("# Docunits extracted from comments\n")
-               f.write("import {mmodule.name}\n")
-               f.write("\n")
+               f = create_unitfile(file)
                var i = 0
                for du in dus do
 
@@ -166,14 +162,7 @@ class NitUnitExecutor
 
                if toolcontext.opt_noact.value then return
 
-               var nit_dir = toolcontext.nit_dir
-               var nitg = nit_dir/"bin/nitg"
-               if not nitg.file_exists then
-                       toolcontext.error(null, "Cannot find nitg. Set envvar NIT_DIR.")
-                       toolcontext.check_errors
-               end
-               var cmd = "{nitg} --ignore-visibility --no-color '{file}' -I {mmodule.location.file.filename.dirname} >'{file}.out1' 2>&1 </dev/null -o '{file}.bin'"
-               var res = sys.system(cmd)
+               var res = compile_unitfile(file)
 
                if res != 0 then
                        # Compilation error.
@@ -208,7 +197,7 @@ class NitUnitExecutor
                                var ne = new HTMLTag("error")
                                ne.attr("message", msg)
                                tc.add ne
-                               toolcontext.warning(du.ndoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                               toolcontext.warning(du.mdoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
                                toolcontext.modelbuilder.failed_entities += 1
                        end
                        toolcontext.check_errors
@@ -229,27 +218,14 @@ class NitUnitExecutor
 
                toolcontext.info("Execute doc-unit {tc.attrs["name"]} in {file}", 1)
 
-               var dir = file.dirname
-               if dir != "" then dir.mkdir
                var f
-               f = new FileWriter.open(file)
-               f.write("# GENERATED FILE\n")
-               f.write("# Example extracted from a documentation\n")
-               f.write("import {mmodule.name}\n")
-               f.write("\n")
+               f = create_unitfile(file)
                f.write(du.block)
                f.close
 
                if toolcontext.opt_noact.value then return
 
-               var nit_dir = toolcontext.nit_dir
-               var nitg = nit_dir/"bin/nitg"
-               if not nitg.file_exists then
-                       toolcontext.error(null, "Cannot find nitg. Set envvar NIT_DIR.")
-                       toolcontext.check_errors
-               end
-               var cmd = "{nitg} --ignore-visibility --no-color '{file}' -I {mmodule.location.file.filename.dirname} >'{file}.out1' 2>&1 </dev/null -o '{file}.bin'"
-               var res = sys.system(cmd)
+               var res = compile_unitfile(file)
                var res2 = 0
                if res == 0 then
                        res2 = sys.system("{file.to_program_name}.bin >>'{file}.out1' 2>&1 </dev/null")
@@ -272,25 +248,68 @@ class NitUnitExecutor
                        var ne = new HTMLTag("failure")
                        ne.attr("message", msg)
                        tc.add ne
-                       toolcontext.warning(du.ndoc.location, "failure", "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(du.mdoc.location, "failure", "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                else if res2 != 0 then
                        var ne = new HTMLTag("error")
                        ne.attr("message", msg)
                        tc.add ne
-                       toolcontext.warning(du.ndoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(du.mdoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                end
                toolcontext.check_errors
 
                testsuite.add(tc)
        end
+
+       # Create and fill the header of a unit file `file`.
+       #
+       # A unit file is a Nit source file generated from one
+       # or more docunits that will be compiled and executed.
+       #
+       # The handled on the file is returned and must be completed and closed.
+       #
+       # `file` should be a valid filepath for a Nit source file.
+       private fun create_unitfile(file: String): Writer
+       do
+               var dir = file.dirname
+               if dir != "" then dir.mkdir
+               var f
+               f = new FileWriter.open(file)
+               f.write("# GENERATED FILE\n")
+               f.write("# Docunits extracted from comments\n")
+               if mmodule != null then
+                       f.write("import {mmodule.name}\n")
+               end
+               f.write("\n")
+               return f
+       end
+
+       # Compile an unit file and return the compiler return code
+       #
+       # Can terminate the program if the compiler is not found
+       private fun compile_unitfile(file: String): Int
+       do
+               var nit_dir = toolcontext.nit_dir
+               var nitc = nit_dir/"bin/nitc"
+               if not nitc.file_exists then
+                       toolcontext.error(null, "Error: cannot find nitc. Set envvar NIT_DIR.")
+                       toolcontext.check_errors
+               end
+               var opts = new Array[String]
+               if mmodule != null then
+                       opts.add "-I {mmodule.location.file.filename.dirname}"
+               end
+               var cmd = "{nitc} --ignore-visibility --no-color '{file}' {opts.join(" ")} >'{file}.out1' 2>&1 </dev/null -o '{file}.bin'"
+               var res = sys.system(cmd)
+               return res
+       end
 end
 
 # A unit-test to run
 class DocUnit
-       # The original comment node
-       var ndoc: ADoc
+       # The doc that contains self
+       var mdoc: MDoc
 
        # The XML node that contains the information about the execution
        var testcase: HTMLTag
@@ -350,7 +369,7 @@ redef class ModelBuilder
                        # NOTE: jenkins expects a '.' in the classname attr
                        tc.attr("classname", "nitunit." + mmodule.full_name + ".<module>")
                        tc.attr("name", "<module>")
-                       d2m.extract(ndoc, tc)
+                       d2m.extract(ndoc.to_mdoc, tc)
                end label x
                for nclassdef in nmodule.n_classdefs do
                        var mclassdef = nclassdef.mclassdef
@@ -363,7 +382,7 @@ redef class ModelBuilder
                                        tc = new HTMLTag("testcase")
                                        tc.attr("classname", "nitunit." + mmodule.full_name + "." + mclassdef.mclass.full_name)
                                        tc.attr("name", "<class>")
-                                       d2m.extract(ndoc, tc)
+                                       d2m.extract(ndoc.to_mdoc, tc)
                                end
                        end
                        for npropdef in nclassdef.n_propdefs do
@@ -376,7 +395,7 @@ redef class ModelBuilder
                                        tc = new HTMLTag("testcase")
                                        tc.attr("classname", "nitunit." + mmodule.full_name + "." + mclassdef.mclass.full_name)
                                        tc.attr("name", mpropdef.mproperty.full_name)
-                                       d2m.extract(ndoc, tc)
+                                       d2m.extract(ndoc.to_mdoc, tc)
                                end
                        end
                end
@@ -385,4 +404,67 @@ redef class ModelBuilder
 
                return ts
        end
+
+       # Extracts and executes all the docunits in the readme of the `mgroup`
+       # Returns a JUnit-compatible `<testsuite>` XML element that contains the results of the executions.
+       fun test_group(mgroup: MGroup): HTMLTag
+       do
+               var ts = new HTMLTag("testsuite")
+               toolcontext.info("nitunit: doc-unit group {mgroup}", 2)
+
+               # usually, only the default module must be imported in the unit test.
+               var o = mgroup.default_mmodule
+
+               ts.attr("package", mgroup.full_name)
+
+               var prefix = toolcontext.test_dir
+               prefix = prefix.join_path(mgroup.to_s)
+               var d2m = new NitUnitExecutor(toolcontext, prefix, o, ts)
+
+               var tc
+
+               total_entities += 1
+               var mdoc = mgroup.mdoc
+               if mdoc == null then return ts
+
+               doc_entities += 1
+               tc = new HTMLTag("testcase")
+               # NOTE: jenkins expects a '.' in the classname attr
+               tc.attr("classname", "nitunit." + mgroup.full_name)
+               tc.attr("name", "<group>")
+               d2m.extract(mdoc, tc)
+
+               d2m.run_tests
+
+               return ts
+       end
+
+       # Test a document object unrelated to a Nit entity
+       fun test_mdoc(mdoc: MDoc): HTMLTag
+       do
+               var ts = new HTMLTag("testsuite")
+               var file = mdoc.location.to_s
+
+               toolcontext.info("nitunit: doc-unit file {file}", 2)
+
+               ts.attr("package", file)
+
+               var prefix = toolcontext.test_dir / "file"
+               var d2m = new NitUnitExecutor(toolcontext, prefix, null, ts)
+
+               var tc
+
+               total_entities += 1
+               doc_entities += 1
+
+               tc = new HTMLTag("testcase")
+               # NOTE: jenkins expects a '.' in the classname attr
+               tc.attr("classname", "nitunit.<file>")
+               tc.attr("name", file)
+
+               d2m.extract(mdoc, tc)
+               d2m.run_tests
+
+               return ts
+       end
 end
index ad0b20a..7ab177c 100644 (file)
@@ -185,17 +185,17 @@ class TestSuite
 
        # Compile all `test_cases` cases in one file.
        fun compile do
-               # find nitg
+               # find nitc
                var nit_dir = toolcontext.nit_dir
-               var nitg = nit_dir/"bin/nitg"
-               if not nitg.file_exists then
-                       toolcontext.error(null, "Cannot find nitg. Set envvar NIT_DIR.")
+               var nitc = nit_dir/"bin/nitc"
+               if not nitc.file_exists then
+                       toolcontext.error(null, "Error: cannot find nitc. Set envvar NIT_DIR.")
                        toolcontext.check_errors
                end
                # compile test suite
                var file = test_file
                var include_dir = mmodule.location.file.filename.dirname
-               var cmd = "{nitg} --no-color '{file}.nit' -I {include_dir} -o '{file}.bin' > '{file}.out' 2>&1 </dev/null"
+               var cmd = "{nitc} --no-color '{file}.nit' -I {include_dir} -o '{file}.bin' > '{file}.out' 2>&1 </dev/null"
                var res = sys.system(cmd)
                var f = new FileReader.open("{file}.out")
                var msg = f.read_all
@@ -223,7 +223,7 @@ class TestCase
        # Test method to be compiled and tested.
        var test_method: MMethodDef
 
-       # `ToolContext` to use to display messages and find `nitg` bin.
+       # `ToolContext` to use to display messages and find `nitc` bin.
        var toolcontext: ToolContext
 
        # `MMethodDef` to call before the test case.
index 62c184a..8196aeb 100644 (file)
@@ -41,9 +41,21 @@ class Message
 
        # The human-readable description of the message.
        #
-       # It should be short and fit on a single line.
-       # It should also have meaningful information first in case
-       # on truncation by an IDE for instance.
+       # eg. "Error: cannot find method `foo`."
+       #
+       # A good message should:
+       #
+       # * start with a message type like "Error:", "Syntax Error:", "Warning:".
+       #   The type is capitalized and terminated by a column.
+       #   The rest on the message starts with a lowercase letter and is terminated with a dot.
+       #
+       # * be short and fit on a single line.
+       #
+       # * have meaningful information first.
+       #   This helps the reader and remain usable
+       #   when truncated, by an IDE for instance.
+       #
+       # * enclose identifiers, keywords and pieces of code with back-quotes.
        var text: String
 
        # Comparisons are made on message locations.
@@ -54,6 +66,11 @@ class Message
                return location.as(not null) < other.location.as(not null)
        end
 
+       redef fun ==(other): Bool do
+               if not other isa Message then return false
+               return location == other.location and tag == other.tag and text == other.text
+       end
+
        redef fun to_s: String
        do
                var l = location
@@ -91,6 +108,24 @@ class Message
        end
 end
 
+redef class Location
+       # Errors and warnings associated to this location.
+       var messages: nullable Array[Message]
+
+       # Add a message to `self`
+       #
+       # See `messages`
+       private fun add_message(m: Message)
+       do
+               var ms = messages
+               if ms == null then
+                       ms = new Array[Message]
+                       messages = ms
+               end
+               ms.add m
+       end
+end
+
 # Global context for tools
 class ToolContext
        # Number of errors
@@ -134,13 +169,13 @@ class ToolContext
                return tags.has("all") or tags.has(tag)
        end
 
-       # Output all current stacked messages and display total error informations
+       # Output all current stacked messages
        #
        # Return true if no errors occurred.
        #
        # If some errors occurred, the behavior depends on the value of `keep_going`.
-       # If `keep_going` is false, then the program exits.
-       # Else, the error count and the warning count are reset and false is returned.
+       # If `keep_going` is false, then the total error informations is displayed and the program exits.
+       # Else, false is returned.
        fun check_errors: Bool
        do
                if messages.length > 0 then
@@ -158,32 +193,40 @@ class ToolContext
                end
 
                if error_count > 0 then
-                       errors_info
-                       if not keep_going then exit(1)
+                       if not keep_going then
+                               errors_info
+                               exit(1)
+                       end
                        return false
                end
                return true
        end
 
-       # Display (and reset) total error informations
+       # Display total error informations
        fun errors_info
        do
                if error_count == 0 and warning_count == 0 then return
                if opt_no_color.value then return
                sys.stderr.write "Errors: {error_count}. Warnings: {warning_count}.\n"
-               error_count = 0
-               warning_count = 0
        end
 
        # Display an error
-       fun error(l: nullable Location, s: String)
+       #
+       # Return the message (to add information)
+       fun error(l: nullable Location, s: String): Message
        do
-               messages.add(new Message(l,null,s))
+               var m = new Message(l,null,s)
+               if messages.has(m) then return m
+               if l != null then l.add_message m
+               messages.add m
                error_count = error_count + 1
                if opt_stop_on_first_error.value then check_errors
+               return m
        end
 
        # Add an error, show errors and quit
+       #
+       # Because the program will quit, nothing is returned.
        fun fatal_error(l: nullable Location, s: String)
        do
                error(l,s)
@@ -200,14 +243,20 @@ class ToolContext
        # * They always are real issues (no false positive)
        #
        # First-level warnings are displayed by default (except if option `-q` is given).
-       fun warning(l: nullable Location, tag: String, text: String)
+       #
+       # Return the message (to add information) or null if the warning is disabled
+       fun warning(l: nullable Location, tag: String, text: String): nullable Message
        do
-               if opt_warning.value.has("no-{tag}") then return
-               if not opt_warning.value.has(tag) and opt_warn.value == 0 then return
-               if is_warning_blacklisted(l, tag) then return
-               messages.add(new Message(l, tag, text))
+               if opt_warning.value.has("no-{tag}") then return null
+               if not opt_warning.value.has(tag) and opt_warn.value == 0 then return null
+               if is_warning_blacklisted(l, tag) then return null
+               var m = new Message(l, tag, text)
+               if messages.has(m) then return null
+               if l != null then l.add_message m
+               messages.add m
                warning_count = warning_count + 1
                if opt_stop_on_first_error.value then check_errors
+               return m
        end
 
        # Display a second-level warning.
@@ -223,14 +272,20 @@ class ToolContext
        #
        # In order to prevent warning inflation Ã  la Java, second-level warnings are not displayed by
        # default and require an additional option `-W`.
-       fun advice(l: nullable Location, tag: String, text: String)
+       #
+       # Return the message (to add information) or null if the warning is disabled
+       fun advice(l: nullable Location, tag: String, text: String): nullable Message
        do
-               if opt_warning.value.has("no-{tag}") then return
-               if not opt_warning.value.has(tag) and opt_warn.value <= 1 then return
-               if is_warning_blacklisted(l, tag) then return
-               messages.add(new Message(l, tag, text))
+               if opt_warning.value.has("no-{tag}") then return null
+               if not opt_warning.value.has(tag) and opt_warn.value <= 1 then return null
+               if is_warning_blacklisted(l, tag) then return null
+               var m = new Message(l, tag, text)
+               if messages.has(m) then return null
+               if l != null then l.add_message m
+               messages.add m
                warning_count = warning_count + 1
                if opt_stop_on_first_error.value then check_errors
+               return m
        end
 
        # Display an info
@@ -310,6 +365,9 @@ class ToolContext
        # Option --stop-on-first-error
        var opt_stop_on_first_error = new OptionBool("Stop on first error", "--stop-on-first-error")
 
+       # Option --keep-going
+       var opt_keep_going = new OptionBool("Continue after errors, whatever the consequences", "--keep-going")
+
        # Option --no-color
        var opt_no_color = new OptionBool("Do not use color to display errors and warnings", "--no-color")
 
@@ -324,7 +382,7 @@ class ToolContext
 
        init
        do
-               option_context.add_option(opt_warn, opt_warning, opt_quiet, opt_stop_on_first_error, opt_no_color, opt_log, opt_log_dir, opt_nit_dir, opt_help, opt_version, opt_set_dummy_tool, opt_verbose, opt_bash_completion, opt_stub_man)
+               option_context.add_option(opt_warn, opt_warning, opt_quiet, opt_stop_on_first_error, opt_keep_going, opt_no_color, opt_log, opt_log_dir, opt_nit_dir, opt_help, opt_version, opt_set_dummy_tool, opt_verbose, opt_bash_completion, opt_stub_man)
 
                # Hide some internal options
                opt_stub_man.hidden = true
@@ -430,6 +488,8 @@ The Nit language documentation and the source code of its tools and libraries ma
                # Set verbose level
                verbose_level = opt_verbose.value
 
+               if opt_keep_going.value then keep_going = true
+
                if self.opt_quiet.value then self.opt_warn.value = 0
 
                if opt_log_dir.value != null then log_directory = opt_log_dir.value.as(not null)
@@ -467,7 +527,7 @@ The Nit language documentation and the source code of its tools and libraries ma
                var res = opt_nit_dir.value
                if res != null then
                        if not check_nit_dir(res) then
-                               fatal_error(null, "Fatal Error: the value of --nit-dir does not seem to be a valid base Nit directory: {res}")
+                               fatal_error(null, "Fatal Error: the value of --nit-dir does not seem to be a valid base Nit directory: {res}.")
                        end
                        return res
                end
@@ -476,7 +536,7 @@ The Nit language documentation and the source code of its tools and libraries ma
                res = "NIT_DIR".environ
                if not res.is_empty then
                        if not check_nit_dir(res) then
-                               fatal_error(null, "Fatal Error: the value of NIT_DIR does not seem to be a valid base Nit directory: {res}")
+                               fatal_error(null, "Fatal Error: the value of NIT_DIR does not seem to be a valid base Nit directory: {res}.")
                        end
                        return res
                end
@@ -500,7 +560,7 @@ The Nit language documentation and the source code of its tools and libraries ma
                        if check_nit_dir(res) then return res.simplify_path
                end
 
-               fatal_error(null, "Fatal Error: Cannot locate a valid base nit directory. It is quite unexpected. Try to set the environment variable `NIT_DIR` or to use the `--nit-dir` option.")
+               fatal_error(null, "Fatal Error: cannot locate a valid base Nit directory. It is quite unexpected. Try to set the environment variable `NIT_DIR` or to use the `--nit-dir` option.")
                abort
        end
 
index 8ae2c28..4fa28c0 100644 (file)
@@ -20,6 +20,7 @@ import astbuilder
 import astvalidation
 import semantize
 intrude import semantize::scope
+intrude import semantize::typing
 
 redef class ToolContext
        var transform_phase: Phase = new TransformPhase(self, [typing_phase, auto_super_init_phase])
@@ -73,12 +74,6 @@ private class TransformVisitor
                node.full_transform_visitor(self)
        end
 
-       # Get a primitive class or display a fatal error on `location`.
-       fun get_class(location: AExpr, name: String): MClass
-       do
-               return mmodule.get_primitive_class(name)
-       end
-
        # Get a primitive method or display a fatal error on `location`.
        fun get_method(location: AExpr, name: String, recv: MClass): MMethod
        do
@@ -111,6 +106,14 @@ redef class AExpr
                end
                super
        end
+
+       redef fun replace_with(other)
+       do
+               super
+               if other isa AExpr then
+                       if other.implicit_cast_to == null then other.implicit_cast_to = implicit_cast_to
+               end
+       end
 end
 
 redef class AVardeclExpr
@@ -291,6 +294,57 @@ redef class AForExpr
        end
 end
 
+redef class AWithExpr
+       # is replaced with a do/end and injected calls to `start` and `finish`
+       #
+       # Basically, the following
+       #
+       # ~~~nitish
+       # with expr do
+       #   block
+       # end label l
+       # ~~~
+       #
+       # is transformed into
+       #
+       # ~~~nitish
+       # var x = expr
+       # do
+       #   x.start
+       #   block
+       # end label l
+       # x.finish
+       # ~~~
+       #
+       # The point is that `finish` is called even if the block is escaped.
+       redef fun accept_transform_visitor(v)
+       do
+               var escapemark = self.break_mark
+               assert escapemark != null
+
+               var nblock = v.builder.make_block
+
+               var nexpr = n_expr
+
+               nblock.add nexpr
+
+               var ndo = v.builder.make_do
+               ndo.break_mark = escapemark
+
+               var start = v.builder.make_call(nexpr.make_var_read, method_start.as(not null), null)
+
+               ndo.add start
+
+               ndo.add self.n_block.as(not null)
+
+               nblock.add ndo
+
+               nblock.add v.builder.make_call(nexpr.make_var_read, method_finish.as(not null), null)
+
+               replace_with(nblock)
+       end
+end
+
 redef class AArrayExpr
        # `[x,y]` is replaced with
        #
diff --git a/src/vm/variables_numbering.nit b/src/vm/variables_numbering.nit
new file mode 100644 (file)
index 0000000..4de0eb4
--- /dev/null
@@ -0,0 +1,274 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Julien Pagès <julien.pages@lirmm.fr>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Handle all numbering operations related to local variables in the Nit virtual machine
+module variables_numbering
+
+import virtual_machine
+
+redef class VirtualMachine
+
+       # The frames of the VirtualMachine are specialized
+       redef type FRAME: VmFrame
+
+       # Number the variables in `n`.
+       # Do nothing if `n` is null
+       fun numbering(n: nullable AExpr, position: Int): Int
+       do
+               if n == null then return position
+
+               var pos = n.numbering(self, position)
+               return pos
+       end
+
+       # Redef to add the numbering of variables and arguments
+       redef fun new_frame(node, mpropdef, args)
+       do
+               var f = new VmFrame(node, mpropdef, args)
+
+               # If this Frame is for a method then number variables into the body of the method
+               if node isa AMethPropdef then
+                       # Number the variables
+                       if not node.is_numbering then node.numbering_variables(self, mpropdef.as(MMethodDef))
+
+                       # Create an empty environment
+                       f.variables = new Array[Instance].filled_with(initialization_value, node.environment_size)
+               end
+
+               # If this Frame is for an attribute with a block then number the block
+               if node isa AAttrPropdef then
+                       # Number the variables
+                       if not node.is_numbering then node.numbering_variables(self)
+
+                       # Create an empty environment
+                       f.variables = new Array[Instance].filled_with(initialization_value, node.environment_size)
+               end
+
+               # Putting self at the beginning of the environment
+               f.variables[0] = args[0]
+               return f
+       end
+
+       # Read a `Variable` from a frame by using its position
+       redef fun read_variable(v: Variable): Instance
+       do
+               return frame.variables[v.position]
+       end
+
+       # Assign the value of the `Variable` in an environment
+       redef fun write_variable(v: Variable, value: Instance)
+       do
+               frame.variables[v.position] = value
+       end
+end
+
+redef class Variable
+       # The position in the environment
+       var position: Int
+end
+
+# Implementation of a Frame with numbered variables
+class VmFrame
+       super Frame
+
+       # Contains the value of Variables (which are numbered)
+       var variables: Array[Instance] = new Array[Instance]
+end
+
+redef class AExpr
+       # Give a position to each variable declared in the node.
+       # NOTE: Do not call this method directly, but use `v.numbering`
+       # This method is here to be implemented by subclasses.
+       # *`v` The current instance of the virtual machine
+       # *`position` The first available position in the environment a variable can have
+       # Return the next available position a variable can have
+       public fun numbering(v: VirtualMachine, position: Int): Int
+       do
+               return position
+       end
+end
+
+redef class APropdef
+       # Indicate if the variables numbering has been done
+       private var is_numbering: Bool = false
+
+       # The size of the environment to create to call this method
+       private var environment_size: Int = 0
+end
+
+redef class AMethPropdef
+       # Assign a position in the environment to each local variable of `mpropdef`
+       # *`v` The current VirtualMachine
+       # *`mpropdef` The method to number
+       private fun numbering_variables(v: VirtualMachine, mpropdef: MMethodDef)
+       do
+               # The position in the environment
+               var position = 0
+
+               # The `self` variable has the first position
+               if self.selfvariable != null then
+                       self.selfvariable.position = position
+                       position += 1
+               end
+
+               # Number the parameters
+               for i in [0..mpropdef.msignature.arity[ do
+                       var variable = self.n_signature.n_params[i].variable
+                       variable.as(not null).position = position
+                       position += 1
+               end
+
+               # Recursively go into the AST nodes to number all local variables
+               if n_block != null then
+                       position = v.numbering(self.n_block, position)
+               end
+
+               is_numbering = true
+
+               # The size of the environment to create to execute a call to this method
+               environment_size = position
+       end
+end
+
+redef class AAttrPropdef
+       # Assign a position in the environment to each local variable of `mpropdef`
+       # *`v` The current VirtualMachine
+       private fun numbering_variables(v: VirtualMachine)
+       do
+               # The position in the environment
+               var position = 0
+
+               # The `self` variable has the first position
+               if self.selfvariable != null then
+                       self.selfvariable.position = position
+                       position += 1
+               end
+
+               # Recursively go into the AST nodes to number all local variables
+               if n_block != null then
+                       position = v.numbering(self.n_block, position)
+               end
+
+               is_numbering = true
+
+               # The size of the environment to create to execute a call to this method
+               environment_size = position
+       end
+end
+
+redef class AVardeclExpr
+       redef fun numbering(v, position)
+       do
+               # Attribute a position to this variable
+               self.variable.as(not null).position = position
+               position += 1
+
+               # Recursively continue to numbering the variables
+               position = v.numbering(self.n_expr, position)
+
+               # `position` is the next available position in the environment
+               return position
+       end
+end
+
+redef class ABlockExpr
+       redef fun numbering(v, position)
+       do
+               for e in self.n_expr do
+                       position = v.numbering(e, position)
+               end
+               return position
+       end
+end
+
+redef class AIfExpr
+       redef fun numbering(v, position)
+       do
+               # Attribute numbers separetely for the two branches
+               var pos = v.numbering(self.n_then, position)
+               var pos1 = v.numbering(self.n_else, position)
+
+               if pos > pos1 then
+                       return pos
+               else
+                       return pos1
+               end
+       end
+end
+
+redef class AIfexprExpr
+       redef fun numbering(v, position)
+       do
+               # Attribute numbers separetely for the two branches
+               var pos = v.numbering(self.n_then, position)
+               var pos1 = v.numbering(self.n_else, position)
+
+               if pos > pos1 then
+                       return pos
+               else
+                       return pos1
+               end
+       end
+end
+
+redef class ADoExpr
+       redef fun numbering(v, position)
+       do
+               return v.numbering(self.n_block, position)
+       end
+end
+
+redef class AWhileExpr
+       redef fun numbering(v, position)
+       do
+               return v.numbering(self.n_block, position)
+       end
+end
+
+redef class ALoopExpr
+       redef fun numbering(v, position)
+       do
+               return v.numbering(self.n_block, position)
+       end
+end
+
+redef class AForExpr
+       redef fun numbering(v, position)
+       do
+               # Give a position to each variable declared in the header of the for
+               if self.variables.length == 1 then
+                       self.variables.first.position = position
+                       self.variables[0].position = position
+                       position += 1
+               else if self.variables.length == 2 then
+                       self.variables[0].position = position
+                       position += 1
+                       self.variables[1].position = position
+                       position += 1
+               end
+               return v.numbering(self.n_block, position)
+       end
+end
+
+redef class AArrayExpr
+       redef fun numbering(v, position)
+       do
+               for nexpr in self.n_exprs do
+                       position = v.numbering(nexpr, position)
+               end
+               return position
+       end
+end
similarity index 98%
rename from src/vm.nit
rename to src/vm/virtual_machine.nit
index b253533..9c3d516 100644 (file)
@@ -15,7 +15,7 @@
 # limitations under the License.
 
 # Implementation of the Nit virtual machine
-module vm
+module virtual_machine
 
 import interpreter::naive_interpreter
 import perfect_hashing
@@ -61,10 +61,10 @@ class VirtualMachine super NaiveInterpreter
                var anchor = self.frame.arguments.first.mtype.as(MClassType)
 
                # `sub` or `sup` are formal or virtual types, resolve them to concrete types
-               if sub isa MParameterType or sub isa MVirtualType then
+               if sub isa MFormalType then
                        sub = sub.resolve_for(anchor.mclass.mclass_type, anchor, mainmodule, false)
                end
-               if sup isa MParameterType or sup isa MVirtualType then
+               if sup isa MFormalType then
                        sup = sup.resolve_for(anchor.mclass.mclass_type, anchor, mainmodule, false)
                end
 
@@ -87,7 +87,7 @@ class VirtualMachine super NaiveInterpreter
                end
                # Now the case of direct null and nullable is over
 
-               if sub isa MParameterType or sub isa MVirtualType then
+               if sub isa MFormalType then
                        sub = sub.anchor_to(mainmodule, anchor)
                        # Manage the second layer of null/nullable
                        if sub isa MNullableType then
@@ -177,16 +177,6 @@ class VirtualMachine super NaiveInterpreter
                recv.vtable = recv.mtype.as(MClassType).mclass.vtable
        end
 
-       # Create a virtual table for this `MClass` if not already done
-       redef fun get_primitive_class(name: String): MClass
-       do
-               var mclass = super
-
-               if not mclass.loaded then create_class(mclass)
-
-               return mclass
-       end
-
        # Initialize the internal representation of an object (its attribute values)
        # `init_instance` is the initial value of attributes
        private fun init_internal_attributes(init_instance: Instance, size: Int): Pointer
diff --git a/src/vm/vm.nit b/src/vm/vm.nit
new file mode 100644 (file)
index 0000000..4027a15
--- /dev/null
@@ -0,0 +1,22 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Julien Pagès <julien.pages@lirmm.fr>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Entry point of all vm components
+module vm
+
+import virtual_machine
+import vm_optimizations
+import variables_numbering
similarity index 99%
rename from src/vm_optimizations.nit
rename to src/vm/vm_optimizations.nit
index f657786..6f3c201 100644 (file)
@@ -17,7 +17,7 @@
 # Optimization of the nitvm
 module vm_optimizations
 
-import vm
+import virtual_machine
 
 redef class VirtualMachine
 
index 609105e..8a90f1d 100644 (file)
@@ -1,3 +1,5 @@
 cocoa_extern_types
 cocoa_message_box
 hello_cocoa
+hello_ios
+test_platform_ios
diff --git a/tests/base_adaptive_loop.nit b/tests/base_adaptive_loop.nit
new file mode 100644 (file)
index 0000000..d31598e
--- /dev/null
@@ -0,0 +1,33 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+fun foo(i: Int): nullable Int do return i
+fun bar(i: Int) do i.output
+
+var i = 0
+var c = 0
+while i < 10 do
+       i += 1
+
+       var b = foo(i)
+       if b == null then
+               continue#alt1#
+       end
+
+       bar(b)
+       c = b
+end
+bar(c)
diff --git a/tests/base_adaptive_loop2.nit b/tests/base_adaptive_loop2.nit
new file mode 100644 (file)
index 0000000..bade6da
--- /dev/null
@@ -0,0 +1,38 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+class A
+       fun foo do 1.output
+end
+
+class B
+       super A
+       fun bar do 2.output
+end
+
+var x: A #alt3# var x
+x = new B
+
+var i = 0
+while i < 3 do
+       i += 1
+       x.bar
+       x = new A
+       x.foo
+       break#alt1#
+end
+x.foo
+#alt2#x.bar
diff --git a/tests/base_adaptive_loop3.nit b/tests/base_adaptive_loop3.nit
new file mode 100644 (file)
index 0000000..33f4c8d
--- /dev/null
@@ -0,0 +1,30 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+redef class Int
+       fun next: nullable Int do if self < 20 then return self + 1 else return null
+end
+
+var t2: nullable Int = 10
+t2.output
+while t2 != null do
+       t2 = t2.next #alt1# t2 = null
+       while t2 != null do
+               t2.output
+               t2 = t2.next #alt2# t2 = null
+       end
+       #alt3#t2 = t2.next
+end
diff --git a/tests/base_adaptive_loop_array.nit b/tests/base_adaptive_loop_array.nit
new file mode 100644 (file)
index 0000000..868c0cc
--- /dev/null
@@ -0,0 +1,28 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::collection::array
+
+var a #1alt1#var a: Array[Object]
+a = [1]#1alt2#
+#1alt2#a = 1
+var i = 0
+while i < 3 do
+       i += 1
+
+       a = [a]
+       a.length.output
+       #alt1#a.first.length.output
+end
+#alt1#a.length.output
diff --git a/tests/base_adaptive_loop_call.nit b/tests/base_adaptive_loop_call.nit
new file mode 100644 (file)
index 0000000..2a99ba7
--- /dev/null
@@ -0,0 +1,59 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+class O
+       fun foo: O do
+               0.output
+               return new B
+       end
+end
+
+class A
+       super O
+       redef fun foo: B do
+               1.output
+               return new B
+       end
+       fun bar: B do
+               10.output
+               return new B
+       end
+end
+
+class B
+       super O
+       redef fun foo: C do
+               2.output
+               return new C
+       end
+       fun bar: C do
+               20.output
+               return new C
+       end
+end
+
+class C
+       super O
+end
+
+var a: O #alt1# var a
+
+a = new A
+var i = 0
+while i < 4 do
+       a = a.foo #alt2# a = a.bar
+       i += 1
+end
diff --git a/tests/base_adaptive_loop_null.nit b/tests/base_adaptive_loop_null.nit
new file mode 100644 (file)
index 0000000..cfbb80f
--- /dev/null
@@ -0,0 +1,53 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+fun foo(i: Int): nullable Int do return i
+fun bar(i: Int) do i.output
+fun baz: nullable Int do return null
+
+bar(0)
+var i = null
+while i == null do
+       i = foo(1) #alt1# exit(1)
+end
+bar(i)
+
+i = foo(2)
+while i != null do
+       bar(i)
+       i = baz
+end
+#alt2#bar(i)
+
+i = null
+loop
+       i = foo(3)
+       if i == null then continue #alt3#
+       bar(i)
+       break
+end
+bar(i)
+
+i = 4
+loop
+       bar(i)
+       i = baz
+       if i != null then
+               bar(i)
+       else
+               break #alt4#
+       end
+end
diff --git a/tests/base_arg_default.nit b/tests/base_arg_default.nit
new file mode 100644 (file)
index 0000000..2d1af37
--- /dev/null
@@ -0,0 +1,110 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+class A
+       fun foo(a, b: nullable Int, c, d: Int, e,f: nullable Int)
+       do
+               if a == null then '\n'.output else a.output
+               if b == null then '\n'.output else b.output
+               c.output
+               d.output
+               if e == null then '\n'.output else e.output
+               if f == null then '\n'.output else f.output
+               '-'.output
+               '\n'.output
+
+       end
+
+       fun bar(a,b,c: nullable Int)
+       do
+               if a == null then '\n'.output else a.output
+               if b == null then '\n'.output else b.output
+               if c == null then '\n'.output else c.output
+               '-'.output
+               '\n'.output
+       end
+
+       fun bar=(a,b,c: nullable Int)
+       do
+               if a == null then '\n'.output else a.output
+               if b == null then '\n'.output else b.output
+               if c == null then '\n'.output else c.output
+               '-'.output
+               '\n'.output
+       end
+
+       fun [](a,b,c: nullable Int): Int
+       do
+               if a == null then '\n'.output else a.output
+               if b == null then '\n'.output else b.output
+               if c == null then '\n'.output else c.output
+               '-'.output
+               '\n'.output
+               return 0
+       end
+
+       fun []=(a,b,c: nullable Int): Int
+       do
+               if a == null then '\n'.output else a.output
+               if b == null then '\n'.output else b.output
+               if c == null then '\n'.output else c.output
+               '-'.output
+               '\n'.output
+               return 0
+       end
+
+       fun +(a: nullable Int): Int
+       do
+               if a == null then '\n'.output else a.output
+               '-'.output
+               '\n'.output
+               return 0
+       end
+end
+
+var a = new A
+var x
+
+#alt1#a.foo
+#alt1#a.foo(2)
+a.foo(1,2)
+a.foo(1,2,3)
+a.foo(1,2,3,4)
+a.foo(1,2,3,4,5)
+a.foo(1,2,3,4,5,6)
+#alt1#a.foo(1,2,3,4,5,6,7)
+
+a.bar
+a.bar(1)
+a.bar(1,2)
+a.bar(1,2,3)
+#alt1#a.bar(1,2,3,4)
+
+a.bar= 10
+a.bar(1) = 20
+a.bar(1,2) = 30
+#alt1#a.bar(1,2,3) = 40
+
+#alt2# x = a[]
+x = a[1]
+x = a[1,2]
+x = a[1,2,3]
+#alt2#x = a[1,2,3,4]
+
+#alt2#a[] = 10
+a[1] = 20
+a[1,2] = 30
+#alt1#a[1,2,3] = 40
diff --git a/tests/base_arg_default2.nit b/tests/base_arg_default2.nit
new file mode 100644 (file)
index 0000000..228f5ac
--- /dev/null
@@ -0,0 +1,104 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+class A
+       fun foo(a: nullable Int, bs: Int..., c: nullable Int)
+       do
+               if a == null then '\n'.output else a.output
+               for b in bs do
+                       ' '.output
+                       b.output
+               end
+               if c == null then '\n'.output else c.output
+               '-'.output
+               '\n'.output
+
+       end
+
+       fun bar(a: nullable Int, bs: Int...)
+       do
+               if a == null then '\n'.output else a.output
+               for b in bs do
+                       ' '.output
+                       b.output
+               end
+               '-'.output
+               '\n'.output
+       end
+
+       fun bar=(a:nullable Int, bs: Int..., c: nullable Int)
+       do
+               if a == null then '\n'.output else a.output
+               for b in bs do
+                       ' '.output
+                       b.output
+               end
+               if c == null then '\n'.output else c.output
+               '-'.output
+               '\n'.output
+       end
+
+       fun [](a: nullable Int, bs: Int...): Int
+       do
+               if a == null then '\n'.output else a.output
+               for b in bs do
+                       ' '.output
+                       b.output
+               end
+               '-'.output
+               '\n'.output
+               return 0
+       end
+
+       fun []=(a: nullable Int, bs: Int..., c: nullable Int): Int
+       do
+               if a == null then '\n'.output else a.output
+               for b in bs do
+                       ' '.output
+                       b.output
+               end
+               if c == null then '\n'.output else c.output
+               '-'.output
+               '\n'.output
+               return 0
+       end
+end
+
+var a = new A
+var x
+
+#alt1#a.foo
+#alt1#a.foo(2)
+#alt1#a.foo(1,2)
+a.foo(1,2,3)
+a.foo(1,2,3,4)
+
+#alt1#a.bar
+#alt1#a.bar(1)
+a.bar(1,2)
+a.bar(1,2,3)
+
+#alt1#a.bar = 10
+#alt1#a.bar(1) = 20
+a.bar(1,2) = 30
+a.bar(1,2,3) = 40
+
+#alt1#x = a[1]
+x = a[1,2]
+x = a[1,2,3]
+
+#alt1#a[1] = 20
+a[1,2] = 30
+a[1,2,3] = 40
+a[1,2,3,4] = 50
diff --git a/tests/base_arg_default_autoinit.nit b/tests/base_arg_default_autoinit.nit
new file mode 100644 (file)
index 0000000..6ea74cf
--- /dev/null
@@ -0,0 +1,96 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+class A
+       var mandatory: Int
+       var optional: nullable Int
+
+       fun foo
+       do
+               '-'.output
+               '\n'.output
+               mandatory.output
+               if optional == null then
+                       ' '.output
+                       '\n'.output
+               else
+                       optional.output
+               end
+       end
+end
+
+class B
+       super A
+       var optional_b: nullable Int
+       var mandatory_b: Int
+       redef fun foo
+       do
+               super
+               if optional_b == null then
+                       ' '.output
+                       '\n'.output
+               else
+                       optional_b.output
+               end
+               mandatory_b.output
+       end
+end
+
+class C
+       super B
+       autoinit optional_b, mandatory_b, mandatory
+end
+
+var a
+
+#alt1#a = new A
+#alt1#a.foo
+
+a = new A(1)
+a.foo
+
+a = new A(1,2)
+a.foo
+
+#alt1#a = new A(1,2,3)
+#alt1#a.foo
+
+#alt1#a = new B(1)
+#alt1#a.foo
+
+a = new B(1,4)
+a.foo
+
+a = new B(1,2,4)
+a.foo
+
+a = new B(1,2,3,4)
+a.foo
+
+#alt1#a = new B(1,2,3,4,5)
+#alt1#a.foo
+
+#alt1#a = new C(1)
+#alt1#a.foo
+
+a = new C(4,1)
+a.foo
+
+a = new C(3,4,1)
+a.foo
+
+#alt1#a = new C(1,2,3,4)
+#alt1#a.foo
index a21188b..4fef2d7 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
 end
 
 class Int
diff --git a/tests/base_attr_abstract.nit b/tests/base_attr_abstract.nit
new file mode 100644 (file)
index 0000000..34c1e4c
--- /dev/null
@@ -0,0 +1,50 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+interface Foo
+       var a: Object is abstract
+       #alt1#var b = 1 is abstract
+       #alt2#var b is abstract, noautoinit
+end
+
+class Bar
+       super Foo
+       redef var a
+end
+
+class Baz
+       super Foo
+       redef fun a do return 100
+       redef fun a=(x) do (101).output
+end
+
+class FooBar
+       super Foo
+end
+
+var f: Foo = new Bar(1)
+f.a.output
+f.a = 2
+f.a.output
+
+f = new Baz
+f.a.output
+f.a = 3
+f.a.output
+
+f = new FooBar
+#alt3#f.a.output
+#alt4#f.a = 4
index 4b1d21e..ecab175 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
 end
 
 class Int
index cbddbb7..14a7ba1 100644 (file)
@@ -15,7 +15,7 @@
 # limitations under the License.
 
 import end
-class Object
+interface Object
 end
 class Int
 end
diff --git a/tests/base_autocast_array.nit b/tests/base_autocast_array.nit
new file mode 100644 (file)
index 0000000..9beb291
--- /dev/null
@@ -0,0 +1,45 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::collection::array
+
+class A
+       type V: nullable Object
+       var v: V
+
+       fun test_array: Array[V]
+       do
+               #alt3#v = 10
+               return [v] #alt1-2#
+               #alt1#return [10:V]
+               #alt2#return [10]
+       end
+end
+
+class B
+       super A
+       redef type V: Bool
+end
+
+var a = new A(1)
+
+a.test_array.first.output
+
+var ab = new A(true)
+
+ab.test_array.first.output
+
+var b = new B(true)
+
+b.test_array.first.output
index 12e1481..942c8ca 100644 (file)
@@ -20,3 +20,15 @@ var i = 1#alt1#
 #alt1#var i: Object = 1
 i += 2
 i.output
+i -= 1
+i.output
+i *= 3
+i.output
+i /= 2
+i.output
+i %= 5
+i.output
+i <<= 3
+i.output
+i >>= 2
+i.output
index 7b30e04..32562b7 100644 (file)
@@ -15,5 +15,5 @@
 # limitations under the License.
 
 import end
-class Object
+interface Object
 end
index f6d7424..b59ffa0 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
        fun ==(o: nullable Object): Bool do return self.is_same_instance(o)
        fun !=(o: nullable Object): Bool do return not (self == o)
        fun is_same_instance(other: nullable Object): Bool is intern
index 2fb2485..b94a007 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
        fun i_to_s(i: Int)
        do
                i.output
index 263d706..12636be 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
        fun output is abstract
 end
 
index 4a16599..1a75c8f 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
        fun i_to_s(i: Int)
        do
                i.output
diff --git a/tests/base_init_raf2.nit b/tests/base_init_raf2.nit
new file mode 100644 (file)
index 0000000..fd4ee5b
--- /dev/null
@@ -0,0 +1,36 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import base_init
+
+redef class A
+       init
+       do
+               'a'.output
+       end
+end
+
+redef class B
+       init
+       do
+               'b'.output
+       end
+end
+
+redef class C
+       init
+       do
+               'c'.output
+       end
+end
diff --git a/tests/base_new_intern.nit b/tests/base_new_intern.nit
new file mode 100644 (file)
index 0000000..76819f0
--- /dev/null
@@ -0,0 +1,30 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+       var i: Int
+       new do
+               var res = new A.intern
+               res.i = 1
+               return res
+       end
+       init do
+               0.output # not called
+       end
+end
+
+var a = new A
+a.i.output
diff --git a/tests/base_notnull.nit b/tests/base_notnull.nit
new file mode 100644 (file)
index 0000000..133aef1
--- /dev/null
@@ -0,0 +1,43 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+class A[E] #alt2# class A[E: Object]
+       type V: nullable Object #alt2# type V: Object
+
+       fun foo(e: E, v: E) do #1alt1# fun foo(e: nullable E, v: nullable E) do
+               assert e != null#alt1# #alt3# assert e == null #alt4# if false then e = null
+               assert v != null#alt1# #alt3# assert v == null #alt4# if false then e = null
+               bar(e)
+               bar(v)
+               if e != null then
+                       bar(e)
+               else bar(e)
+               if v != null then
+                       bar(v)
+               else bar(v)
+               bar(e.as(not null))
+               bar(v.as(not null))
+               bar(e or else 0)
+               bar(v or else 0)
+               bar(e or else v)
+               bar(v or else e)
+       end
+
+       fun bar(o: Object) do o.output
+end
+
+var a = new A[Object]
+a.foo (1, 2)
diff --git a/tests/base_notnull_lit.nit b/tests/base_notnull_lit.nit
new file mode 100644 (file)
index 0000000..dae4e46
--- /dev/null
@@ -0,0 +1,40 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+class A[E: nullable Discrete]
+       fun array(e, f: E): Object
+       do
+               assert e != null
+               assert f != null #alt1# #alt2# assert f == null
+               return [e, f]
+       end
+
+       fun range(e, f: E): Object
+       do
+               assert e != null
+               assert f != null #alt1#
+               return [e..f]
+       end
+end
+
+var a = new A[nullable Int]
+
+var ar = a.array(1, 5)
+ar.output_class_name
+ar.as(Array[Int]).add 6
+print ar
+
+var ra = a.range(1, 5)
+ra.output_class_name
+print ra
index 76d0dd9..524b24e 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
 end
 
 class Int
index 4d352d1..1f84c4d 100644 (file)
@@ -14,7 +14,7 @@
 
 import end
 
-class Object
+interface Object
 end
 
 class Int
index 005b436..328396a 100644 (file)
@@ -14,7 +14,7 @@
 
 import end
 
-class Object
+interface Object
 end
 
 class Int
index 717376e..3169e0d 100644 (file)
@@ -14,7 +14,7 @@
 
 import end
 
-class Object
+interface Object
 end
 
 class A[E: Object]
index 23cd598..11fc8f7 100644 (file)
@@ -14,7 +14,7 @@
 
 import end
 
-class Object
+interface Object
        fun ==(o: nullable Object): Bool do return self.is_same_instance(o)
        fun !=(o: nullable Object): Bool do return not self.is_same_instance(o)
        fun is_same_instance(other: nullable Object): Bool is intern
index 71ca47a..bd24e7c 100644 (file)
@@ -14,7 +14,7 @@
 
 import end
 
-class Object
+interface Object
        fun ==(o: nullable Object): Bool do return self.is_same_instance(o)
        fun !=(o: nullable Object): Bool do return not self.is_same_instance(o)
        fun is_same_instance(other: nullable Object): Bool is intern
index a8766fe..b0f26a4 100644 (file)
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 import end
-class Object
+interface Object
        fun ==(o: nullable Object): Bool do return self.is_same_instance(o)
        fun !=(o: nullable Object): Bool do return not self == o
        fun is_same_instance(o: nullable Object): Bool is intern
diff --git a/tests/base_with.nit b/tests/base_with.nit
new file mode 100644 (file)
index 0000000..ad685a9
--- /dev/null
@@ -0,0 +1,47 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import kernel
+
+class A
+       fun start do 1.output
+       fun work do 2.output
+       fun finish do 3.output
+end
+
+fun escape do
+       with a = new A do
+               a.work
+               if true then return
+               a.work
+       end
+end
+
+with new A do
+       2.output
+       2.output
+end
+
+with a = new A do
+       a.work
+       a.work
+end
+
+with a = new A do
+       a.work
+       if true then break
+       a.work
+end
+
+#alt1#escape
index b87347c..a868768 100644 (file)
@@ -29,7 +29,7 @@ do
        return steps
 end
 
-var n = 10
+var n = 456
 if not args.is_empty then
        n = args.first.to_i
 end
index 733ac9b..0c9bc5e 100644 (file)
 
 # Performance test for Array::add_all
 
-import standard::collection
+var n = 10
+if args.not_empty then n = args.first.to_i
+
+var nn = 1.lshift(n)
 
 var a = new Array[Numeric]
 var b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-for i in 10000.times do
+for i in nn.times do
        a.add_all b
 end
 
 var c = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
-for i in 10000.times do
+for i in nn.times do
        a.add_all c
 end
 
index 2eef2cb..5d96859 100644 (file)
@@ -26,6 +26,7 @@ class A
        redef fun val1: Int do return _a
 
        init(i: Int) do _a = i
+       redef fun to_s do return "Aa{a}"
 end
 
 class Elt2
@@ -39,6 +40,7 @@ end
 class B
        super Elt2
        init(i: Int) do initelt2(i)
+       redef fun to_s do return "Bb{b}"
 end
 
 class C
@@ -52,6 +54,7 @@ class C
                _c = i
                _d = j
        end
+       redef fun to_s do return "Cc{c}d{d}"
 end
 
 class D
@@ -64,6 +67,7 @@ class D
                init(i)
                initelt2(j)
        end
+       redef fun to_s do return "Da{a}b{b}"
 end
 
 class E
@@ -71,6 +75,7 @@ class E
        redef fun val1: Int do return 5 end
 
        init(i: Int) do initelt2(i)
+       redef fun to_s do return "Eb{b}"
 end
 
 class EltComparator
@@ -111,7 +116,8 @@ do
        end
 end
 
-var n = 100
+srand_from(0)
+var n = 20
 
 if not args.is_empty then
        n = args.first.to_i
@@ -122,9 +128,12 @@ for i in [0..n[ do
        array.push(generator)
 end
 
+print array.join(", ")
+
 var comparator = new EltComparator
 for i in [0..n[ do
        comparator.sort(array)
        comparator.toggle
 end
 
+print array.join(", ")
index 69dc371..8c7d4da 100644 (file)
@@ -30,7 +30,7 @@ redef class Int
        end
 end
 
-var n = 10
+var n = 20
 if not args.is_empty then
        n = args.first.to_i
 end
index 17f24d2..3d906f0 100644 (file)
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-var nb = 5
+var nb = 25
 if not args.is_empty then nb = args.first.to_i
 
 var cpt = 0
index f784635..0e13e59 100644 (file)
@@ -267,11 +267,11 @@ e1.attach(a1)
 b1.start
 b2.start
 
-var nb = 100000
+var nb = 10
 if not args.is_empty then
        nb = args.first.to_i
 end
 
-s.run_for(nb)
+s.run_for(1.lshift(nb))
 print(c1.count)
 
index 36da71a..634e3cb 100644 (file)
@@ -38,11 +38,11 @@ end
 
 fun test(n: Int)
 do
-       var m = 10000.lshift(n)
+       var m = 1000.lshift(n)
        print("Primes up to {m} {nsieve(m)}")
 end
 
-var n = 2
+var n = 3
 if args.length == 1 then
        n = args.first.to_i
 end
index 03218dc..d3c1b7c 100644 (file)
@@ -44,8 +44,11 @@ class A
        end
        fun baz
        do
+               i += 1
        end
 
+       var i = 0
+
        init
        do
        end
@@ -97,7 +100,16 @@ b.val = 1
 c.val = 2
 d.val = 3
 var i = 0
-while i < 100000 do
+
+var n = 10
+if args.not_empty then n = args.first.to_i
+
+while i < 1.lshift(n) do
        a.hop(b, c, d)
        i = i + 1
 end
+
+print a.i
+print b.i
+print c.i
+print d.i
index e296465..a4f53ad 100644 (file)
@@ -18,8 +18,9 @@ redef class Object
        fun foo do end
 end
 class A
-       redef fun foo do end
+       redef fun foo do i += 1 end
        init do end
+       var i = 0
 end
 class B
        super A
@@ -53,6 +54,9 @@ class F
 
 end
 
+var n = 10
+if args.not_empty then n = args.first.to_i
+
 var nb = 60
 var a = new Array[Object].with_capacity(nb)
 for i in [0..(nb/6)[ do
@@ -63,9 +67,12 @@ for i in [0..(nb/6)[ do
        a[i*6+4] = new E
        a[i*6+5] = new F
 end
-for i in [0..1000000[ do
+for i in [0..1.lshift(n)[ do
        for j in [0..nb[ do
                a[j].foo
        end
 end
 
+for j in [0..nb[ do
+       print a[j].as(A).i
+end
diff --git a/tests/bench_strfib.nit b/tests/bench_strfib.nit
new file mode 100644 (file)
index 0000000..f65d436
--- /dev/null
@@ -0,0 +1,43 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Function that recursively allocate and concatenate strings.
+#
+# It is related to the Fibonacci sequence since:
+#
+# * `strfib(0).length == 0`
+# * `strfib(1).length == 2`
+# * `strfib(n).length = strfib(n-1).length + strfib(n-2).length + 2`
+fun strfib(i: Int): String
+do
+       if i == 0 then return ""
+       if i == 1 then return "()"
+       return "({strfib(i-2)}{strfib(i-1)})"
+end
+
+var quiet = false
+if args.has("-q") then
+       quiet = true
+       args.remove("-q")
+end
+
+var n = 15
+if args.length > 0 then n = args.first.to_i
+var res = strfib(n)
+
+if quiet then
+       print res.length
+else
+       print res
+end
index c99dc83..df00536 100644 (file)
@@ -17,7 +17,7 @@
 #alt1 import standard
 #alt1 import standard::ropes
 
-var n = 7
+var n = 4
 if not args.is_empty then
        n = args.first.to_i
 end
index ad27304..c78f448 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+var n = 10
+if args.not_empty then n = args.first.to_i
+
 var s = "*"
-var i = 0
-while i < 8 do
+var i = 1
+while i < n do
        s = "Je dis Â«{s}» et redis Â«{s}» et trois fois de plus : Â«{s}{s}{s}».\n"
        i = i + 1
 end
index 1d59691..dbc8ac9 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+var n = 10
+if args.not_empty then n = args.first.to_i
+
 var s = "*"
 var i = 0
-while i < 8 do
+while i < n do
        s = ["Je dis Â«", s, "» et redis Â«", s, "» et trois fois de plus : Â«", s, s, s, "».\n"].to_s
        i = i + 1
 end
index d5be5e8..ac128d3 100644 (file)
@@ -27,4 +27,7 @@ do
        end
 end
 
-print(tak(37,12,6))
+var n = 17
+if args.not_empty then n = args.first.to_i
+
+print(tak(n,12,6))
index 30782b4..5c4da98 100644 (file)
@@ -15,5 +15,5 @@
 # limitations under the License.
 
 import kernel
-class Object[E: Object]
+interface Object[E: Object]
 end
index d4fc31c..21a6f39 100644 (file)
@@ -1,7 +1,7 @@
 
 import end#alt7#
 #alt7#import kernel
-class Object#alt7#
+interface Object#alt7#
 end#alt7#
 
 #alt6#class A
diff --git a/tests/error_operators.nit b/tests/error_operators.nit
new file mode 100644 (file)
index 0000000..db94029
--- /dev/null
@@ -0,0 +1,91 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# no return
+class A
+       fun + do abort
+       fun +(a: A) do abort
+       fun - do abort
+       fun -(a: A) do abort
+       fun *(a: A) do abort
+       fun /(a: A) do abort
+       fun %(a: A) do abort
+       fun <(a: A) do abort
+       fun >(a: A) do abort
+       fun <=(a: A) do abort
+       fun >=(a: A) do abort
+       fun <=>(a: A) do abort
+       fun <<(a: A) do abort
+       fun >>(a: A) do abort
+       fun foo=(a: A) do abort # should be fine
+       fun [](a: A) do abort
+       fun []=(a, b: A) do abort # should be fine
+end
+
+# not enough parameters
+class B
+       fun +: A do abort # should be fine
+       fun -: A do abort # should be fine
+       fun *: A do abort
+       fun /: A do abort
+       fun %: A do abort
+       fun <: A do abort
+       fun >: A do abort
+       fun <=: A do abort
+       fun >=: A do abort
+       fun <=>: A do abort
+       fun <<: A do abort
+       fun >>: A do abort
+       fun foo= do abort
+       fun []: A do abort
+       fun []=(a: A) do abort
+end
+
+# too much parameters
+class C
+       fun +(a,b,c:A): A do abort
+       fun -(a,b,c:A): A do abort
+       fun *(a,b,c:A): A do abort
+       fun /(a,b,c:A): A do abort
+       fun %(a,b,c:A): A do abort
+       fun <(a,b,c:A): A do abort
+       fun >(a,b,c:A): A do abort
+       fun <=(a,b,c:A): A do abort
+       fun >=(a,b,c:A): A do abort
+       fun <=>(a,b,c:A): A do abort
+       fun <<(a,b,c:A): A do abort
+       fun >>(a,b,c:A): A do abort
+       fun foo=(a,b,c:A) do abort # should be fine
+       fun [](a,b,c:A): A do abort # should be fine
+       fun []=(a,b,c:A) do abort # should be fine
+end
+
+# bad vararg
+class D
+       fun +(a:A...): A do abort
+       fun -(a:A...): A do abort
+       fun *(a:A...): A do abort
+       fun /(a:A...): A do abort
+       fun %(a:A...): A do abort
+       fun <(a:A...): A do abort
+       fun >(a:A...): A do abort
+       fun <=(a:A...): A do abort
+       fun >=(a:A...): A do abort
+       fun <=>(a:A...): A do abort
+       fun <<(a:A...): A do abort
+       fun >>(a:A...): A do abort
+       fun foo=(a,b,c:A, d:A...) do abort
+       fun [](a,b,c:A, d:A...): A do abort # should be fine
+       fun []=(a,b,c:A, d:A...) do abort
+end
index e6b29d2..a96a09a 100644 (file)
@@ -16,7 +16,7 @@
 
 import end
 
-class Object
+interface Object
 end
 
 class A
index c33bcb0..797261c 100644 (file)
@@ -45,5 +45,9 @@ do
        o.output
 end
 
+redef class Sys
+       redef fun output do 'S'.output
+end
+
 0.foo1
 foo2
diff --git a/tests/error_virtual_type.nit b/tests/error_virtual_type.nit
new file mode 100644 (file)
index 0000000..dd7243b
--- /dev/null
@@ -0,0 +1,35 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+class G[E: Object]
+end
+
+class A
+       fun foo(t: T): Comparable do return t
+       type T: Comparable #alt1-5#
+       #alt1#type T: T
+       #alt2#type T: nullable T
+       #alt3#type T: G[T]
+       #alt4#type T: U
+       #alt4#type U: FAIL
+       #alt5#type T: U
+       #alt5#type U: T
+       fun bar(t: T): Comparable do return t
+end
+
+var a = new A
+a.foo(1)
+a.bar('1')
diff --git a/tests/error_virtual_type2.nit b/tests/error_virtual_type2.nit
new file mode 100644 (file)
index 0000000..274bb77
--- /dev/null
@@ -0,0 +1,52 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+class G[E]
+end
+
+class A
+       fun foo(t: T): Comparable do return t
+       #fun foog: nullable G[T] do return barg
+       type T: Comparable #alt1-5#
+       type GT: G[T]
+       #alt1#type T: T
+       #alt2#type T: nullable T
+       #alt3#type T: G[T]
+       #alt4#type T: U
+       #alt4#type U: FAIL
+       #alt5#type T: U
+       #alt5#type U: T
+       fun bar(t: T): Comparable do return t
+       #fun barg: nullable G[T] do return foog
+end
+
+class B
+       super A
+       redef fun foo(t: T): T do return t
+       #redef fun foog: GT do return barg
+       redef type GT: G[Discrete]
+       #alt6#redef type GT: G[Bool]
+       redef fun bar(t: T): T do return t
+       #redef fun barg: GT do return foog
+end
+
+var a = new A
+a.foo(1)
+a.bar('1')
+
+var b = new B
+b.foo(2)
+b.bar('3')
index a78f621..61b016a 100644 (file)
@@ -1,6 +1,4 @@
-test_mem
 shoot_logic
-bench_
 nit_args1
 nit_args3
 nit_args4
@@ -20,6 +18,5 @@ nitunit_args
 nitpretty_args
 hamming_number
 hailstone
-test_map
-nitls
-nituml
+nitls_args
+nituml_args
index f93e9d7..b3ac901 100644 (file)
@@ -3,3 +3,5 @@ test_nitunit.nit --gen-suite --only-show
 test_nitunit.nit --gen-suite --only-show --private
 test_nitunit2.nit -o $WRITE
 test_doc2.nit --no-color -o $WRITE
+test_nitunit3 --no-color -o $WRITE
+test_nitunit_md.md --no-color -o $WRITE
index a78f621..61b016a 100644 (file)
@@ -1,6 +1,4 @@
-test_mem
 shoot_logic
-bench_
 nit_args1
 nit_args3
 nit_args4
@@ -20,6 +18,5 @@ nitunit_args
 nitpretty_args
 hamming_number
 hailstone
-test_map
-nitls
-nituml
+nitls_args
+nituml_args
index e625341..00085e8 100644 (file)
@@ -1 +1 @@
-alt/base_adaptive_alt1.nit:32,2--6: Error: Method 'bar' doesn't exists in A.
+alt/base_adaptive_alt1.nit:32,4--6: Error: method `bar` does not exists in `A`.
index c287295..498d100 100644 (file)
@@ -1 +1 @@
-alt/base_adaptive_alt2.nit:34,3--7: Error: Method 'bar' doesn't exists in A.
+alt/base_adaptive_alt2.nit:34,5--7: Error: method `bar` does not exists in `A`.
index 86f675a..08bc67d 100644 (file)
@@ -1 +1 @@
-alt/base_adaptive_alt3.nit:39,3--7: Error: Method 'bar' doesn't exists in A.
+alt/base_adaptive_alt3.nit:39,5--7: Error: method `bar` does not exists in `A`.
diff --git a/tests/sav/base_adaptive_loop.res b/tests/sav/base_adaptive_loop.res
new file mode 100644 (file)
index 0000000..958699b
--- /dev/null
@@ -0,0 +1,11 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+10
diff --git a/tests/sav/base_adaptive_loop2.res b/tests/sav/base_adaptive_loop2.res
new file mode 100644 (file)
index 0000000..afe234b
--- /dev/null
@@ -0,0 +1,3 @@
+2
+1
+1
diff --git a/tests/sav/base_adaptive_loop2_alt1.res b/tests/sav/base_adaptive_loop2_alt1.res
new file mode 100644 (file)
index 0000000..235d215
--- /dev/null
@@ -0,0 +1 @@
+alt/base_adaptive_loop2_alt1.nit:32,4--6: Error: method `bar` does not exists in `A`.
diff --git a/tests/sav/base_adaptive_loop2_alt2.res b/tests/sav/base_adaptive_loop2_alt2.res
new file mode 100644 (file)
index 0000000..a0cb281
--- /dev/null
@@ -0,0 +1 @@
+alt/base_adaptive_loop2_alt2.nit:38,3--5: Error: method `bar` does not exists in `A`.
diff --git a/tests/sav/base_adaptive_loop2_alt3.res b/tests/sav/base_adaptive_loop2_alt3.res
new file mode 100644 (file)
index 0000000..afe234b
--- /dev/null
@@ -0,0 +1,3 @@
+2
+1
+1
diff --git a/tests/sav/base_adaptive_loop3.res b/tests/sav/base_adaptive_loop3.res
new file mode 100644 (file)
index 0000000..e33f5e9
--- /dev/null
@@ -0,0 +1,11 @@
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
diff --git a/tests/sav/base_adaptive_loop3_alt1.res b/tests/sav/base_adaptive_loop3_alt1.res
new file mode 100644 (file)
index 0000000..f599e28
--- /dev/null
@@ -0,0 +1 @@
+10
diff --git a/tests/sav/base_adaptive_loop3_alt2.res b/tests/sav/base_adaptive_loop3_alt2.res
new file mode 100644 (file)
index 0000000..b5fa014
--- /dev/null
@@ -0,0 +1,2 @@
+10
+11
diff --git a/tests/sav/base_adaptive_loop3_alt3.res b/tests/sav/base_adaptive_loop3_alt3.res
new file mode 100644 (file)
index 0000000..23b0f98
--- /dev/null
@@ -0,0 +1 @@
+alt/base_adaptive_loop3_alt3.nit:29,10--13: Error: method `next` called on `null`.
diff --git a/tests/sav/base_adaptive_loop_alt1.res b/tests/sav/base_adaptive_loop_alt1.res
new file mode 100644 (file)
index 0000000..1752759
--- /dev/null
@@ -0,0 +1,2 @@
+alt/base_adaptive_loop_alt1.nit:30,6: Type Error: expected `Int`, got `nullable Int`.
+alt/base_adaptive_loop_alt1.nit:31,6: Type Error: expected `Int`, got `nullable Int`.
diff --git a/tests/sav/base_adaptive_loop_array.res b/tests/sav/base_adaptive_loop_array.res
new file mode 100644 (file)
index 0000000..e8183f0
--- /dev/null
@@ -0,0 +1,3 @@
+1
+1
+1
diff --git a/tests/sav/base_adaptive_loop_array_1alt1.res b/tests/sav/base_adaptive_loop_array_1alt1.res
new file mode 100644 (file)
index 0000000..e8183f0
--- /dev/null
@@ -0,0 +1,3 @@
+1
+1
+1
diff --git a/tests/sav/base_adaptive_loop_array_1alt1_alt1.res b/tests/sav/base_adaptive_loop_array_1alt1_alt1.res
new file mode 100644 (file)
index 0000000..fcb49fa
--- /dev/null
@@ -0,0 +1,7 @@
+1
+1
+1
+1
+1
+1
+1
diff --git a/tests/sav/base_adaptive_loop_array_1alt2.res b/tests/sav/base_adaptive_loop_array_1alt2.res
new file mode 100644 (file)
index 0000000..e8183f0
--- /dev/null
@@ -0,0 +1,3 @@
+1
+1
+1
diff --git a/tests/sav/base_adaptive_loop_array_1alt2_alt1.res b/tests/sav/base_adaptive_loop_array_1alt2_alt1.res
new file mode 100644 (file)
index 0000000..4c5dbc5
--- /dev/null
@@ -0,0 +1,3 @@
+alt/base_adaptive_loop_array_1alt2_alt1.nit:26,10--15: Error: method `length` does not exists in `Int`.
+alt/base_adaptive_loop_array_1alt2_alt1.nit:26,10--15: Error: method `length` does not exists in `nullable Object`.
+alt/base_adaptive_loop_array_1alt2_alt1.nit:28,3--8: Error: method `length` does not exists in `nullable Object`.
diff --git a/tests/sav/base_adaptive_loop_array_alt1.res b/tests/sav/base_adaptive_loop_array_alt1.res
new file mode 100644 (file)
index 0000000..58c7b04
--- /dev/null
@@ -0,0 +1,2 @@
+alt/base_adaptive_loop_array_alt1.nit:26,10--15: Error: method `length` does not exists in `nullable Object`.
+alt/base_adaptive_loop_array_alt1.nit:28,3--8: Error: method `length` does not exists in `nullable Object`.
diff --git a/tests/sav/base_adaptive_loop_call.res b/tests/sav/base_adaptive_loop_call.res
new file mode 100644 (file)
index 0000000..92c5e8d
--- /dev/null
@@ -0,0 +1,4 @@
+1
+2
+0
+2
diff --git a/tests/sav/base_adaptive_loop_call_alt1.res b/tests/sav/base_adaptive_loop_call_alt1.res
new file mode 100644 (file)
index 0000000..661cf83
--- /dev/null
@@ -0,0 +1 @@
+alt/base_adaptive_loop_call_alt1.nit:57,8--10: Error: method `foo` does not exists in `nullable Object`.
diff --git a/tests/sav/base_adaptive_loop_call_alt2.res b/tests/sav/base_adaptive_loop_call_alt2.res
new file mode 100644 (file)
index 0000000..d8cfce8
--- /dev/null
@@ -0,0 +1 @@
+alt/base_adaptive_loop_call_alt2.nit:57,8--10: Error: method `bar` does not exists in `O`.
diff --git a/tests/sav/base_adaptive_loop_null.res b/tests/sav/base_adaptive_loop_null.res
new file mode 100644 (file)
index 0000000..ccbe3cc
--- /dev/null
@@ -0,0 +1,6 @@
+0
+1
+2
+3
+3
+4
diff --git a/tests/sav/base_adaptive_loop_null_alt1.res b/tests/sav/base_adaptive_loop_null_alt1.res
new file mode 100644 (file)
index 0000000..573541a
--- /dev/null
@@ -0,0 +1 @@
+0
diff --git a/tests/sav/base_adaptive_loop_null_alt2.res b/tests/sav/base_adaptive_loop_null_alt2.res
new file mode 100644 (file)
index 0000000..aa39c52
--- /dev/null
@@ -0,0 +1 @@
+alt/base_adaptive_loop_null_alt2.nit:33,5: Type Error: expected `Int`, got `null`.
diff --git a/tests/sav/base_adaptive_loop_null_alt3.res b/tests/sav/base_adaptive_loop_null_alt3.res
new file mode 100644 (file)
index 0000000..a838dd3
--- /dev/null
@@ -0,0 +1,2 @@
+alt/base_adaptive_loop_null_alt3.nit:39,6: Type Error: expected `Int`, got `nullable Int`.
+alt/base_adaptive_loop_null_alt3.nit:42,5: Type Error: expected `Int`, got `nullable Int`.
diff --git a/tests/sav/base_adaptive_loop_null_alt4.res b/tests/sav/base_adaptive_loop_null_alt4.res
new file mode 100644 (file)
index 0000000..aee7f30
--- /dev/null
@@ -0,0 +1 @@
+alt/base_adaptive_loop_null_alt4.nit:46,6: Type Error: expected `Int`, got `nullable Int`.
diff --git a/tests/sav/base_arg_default.res b/tests/sav/base_arg_default.res
new file mode 100644 (file)
index 0000000..61ea614
--- /dev/null
@@ -0,0 +1,83 @@
+
+
+1
+2
+
+
+-
+1
+
+2
+3
+
+
+-
+1
+2
+3
+4
+
+
+-
+1
+2
+3
+4
+5
+
+-
+1
+2
+3
+4
+5
+6
+-
+
+
+
+-
+1
+
+
+-
+1
+2
+
+-
+1
+2
+3
+-
+
+
+10
+-
+1
+
+20
+-
+1
+2
+30
+-
+1
+
+
+-
+1
+2
+
+-
+1
+2
+3
+-
+1
+
+20
+-
+1
+2
+30
+-
diff --git a/tests/sav/base_arg_default2.res b/tests/sav/base_arg_default2.res
new file mode 100644 (file)
index 0000000..388e53a
--- /dev/null
@@ -0,0 +1,47 @@
+1
+ 2
+3
+-
+1
+ 2
+ 3
+4
+-
+1
+ 2
+-
+1
+ 2
+ 3
+-
+1
+ 2
+30
+-
+1
+ 2
+ 3
+40
+-
+1
+ 2
+-
+1
+ 2
+ 3
+-
+1
+ 2
+30
+-
+1
+ 2
+ 3
+40
+-
+1
+ 2
+ 3
+ 4
+50
+-
diff --git a/tests/sav/base_arg_default2_alt1.res b/tests/sav/base_arg_default2_alt1.res
new file mode 100644 (file)
index 0000000..2dc6089
--- /dev/null
@@ -0,0 +1,9 @@
+alt/base_arg_default2_alt1.nit:81,3--5: Error: expected at least 3 argument(s) for `foo(a: nullable Int, bs: Int..., c: nullable Int)`; got 0. See introduction at `base_arg_default2_alt1::A::foo`.
+alt/base_arg_default2_alt1.nit:82,3--5: Error: expected at least 3 argument(s) for `foo(a: nullable Int, bs: Int..., c: nullable Int)`; got 1. See introduction at `base_arg_default2_alt1::A::foo`.
+alt/base_arg_default2_alt1.nit:83,3--5: Error: expected at least 3 argument(s) for `foo(a: nullable Int, bs: Int..., c: nullable Int)`; got 2. See introduction at `base_arg_default2_alt1::A::foo`.
+alt/base_arg_default2_alt1.nit:87,3--5: Error: expected at least 2 argument(s) for `bar(a: nullable Int, bs: Int...)`; got 0. See introduction at `base_arg_default2_alt1::A::bar`.
+alt/base_arg_default2_alt1.nit:88,3--5: Error: expected at least 2 argument(s) for `bar(a: nullable Int, bs: Int...)`; got 1. See introduction at `base_arg_default2_alt1::A::bar`.
+alt/base_arg_default2_alt1.nit:92,3--5: Error: expected at least 3 argument(s) for `bar=(a: nullable Int, bs: Int..., c: nullable Int)`; got 1. See introduction at `base_arg_default2_alt1::A::bar=`.
+alt/base_arg_default2_alt1.nit:93,3--5: Error: expected at least 3 argument(s) for `bar=(a: nullable Int, bs: Int..., c: nullable Int)`; got 2. See introduction at `base_arg_default2_alt1::A::bar=`.
+alt/base_arg_default2_alt1.nit:97,5--8: Error: expected at least 2 argument(s) for `[](a: nullable Int, bs: Int...): Int`; got 1. See introduction at `base_arg_default2_alt1::A::[]`.
+alt/base_arg_default2_alt1.nit:101,1--9: Error: expected at least 3 argument(s) for `[]=(a: nullable Int, bs: Int..., c: nullable Int): Int`; got 2. See introduction at `base_arg_default2_alt1::A::[]=`.
diff --git a/tests/sav/base_arg_default_alt1.res b/tests/sav/base_arg_default_alt1.res
new file mode 100644 (file)
index 0000000..fba2f2b
--- /dev/null
@@ -0,0 +1,6 @@
+alt/base_arg_default_alt1.nit:81,3--5: Error: expected at least 2 argument(s) for `foo(a: nullable Int, b: nullable Int, c: Int, d: Int, e: nullable Int, f: nullable Int)`; got 0. See introduction at `base_arg_default_alt1::A::foo`.
+alt/base_arg_default_alt1.nit:82,3--5: Error: expected at least 2 argument(s) for `foo(a: nullable Int, b: nullable Int, c: Int, d: Int, e: nullable Int, f: nullable Int)`; got 1. See introduction at `base_arg_default_alt1::A::foo`.
+alt/base_arg_default_alt1.nit:88,3--5: Error: expected at most 6 argument(s) for `foo(a: nullable Int, b: nullable Int, c: Int, d: Int, e: nullable Int, f: nullable Int)`; got 7. See introduction at `base_arg_default_alt1::A::foo`.
+alt/base_arg_default_alt1.nit:94,3--5: Error: expected at most 3 argument(s) for `bar(a: nullable Int, b: nullable Int, c: nullable Int)`; got 4. See introduction at `base_arg_default_alt1::A::bar`.
+alt/base_arg_default_alt1.nit:99,3--5: Error: expected at most 3 argument(s) for `bar=(a: nullable Int, b: nullable Int, c: nullable Int)`; got 4. See introduction at `base_arg_default_alt1::A::bar=`.
+alt/base_arg_default_alt1.nit:110,1--13: Error: expected at most 3 argument(s) for `[]=(a: nullable Int, b: nullable Int, c: nullable Int): Int`; got 4. See introduction at `base_arg_default_alt1::A::[]=`.
diff --git a/tests/sav/base_arg_default_alt2.res b/tests/sav/base_arg_default_alt2.res
new file mode 100644 (file)
index 0000000..ca32b19
--- /dev/null
@@ -0,0 +1 @@
+alt/base_arg_default_alt2.nit:101,7: Syntax Error: unexpected ']'.
diff --git a/tests/sav/base_arg_default_autoinit.res b/tests/sav/base_arg_default_autoinit.res
new file mode 100644 (file)
index 0000000..437e8ee
--- /dev/null
@@ -0,0 +1,31 @@
+-
+1
+-
+1
+2
+-
+1
+4
+-
+1
+2
+4
+-
+1
+2
+3
+4
+-
+1
+4
+-
+1
+3
+4
diff --git a/tests/sav/base_arg_default_autoinit_alt1.res b/tests/sav/base_arg_default_autoinit_alt1.res
new file mode 100644 (file)
index 0000000..cdf6690
--- /dev/null
@@ -0,0 +1,6 @@
+alt/base_arg_default_autoinit_alt1.nit:59,5--7: Error: expected at least 1 argument(s) for `init(mandatory: Int, optional: nullable Int)`; got 0. See introduction at `standard::Object::init`.
+alt/base_arg_default_autoinit_alt1.nit:68,5--7: Error: expected at most 2 argument(s) for `init(mandatory: Int, optional: nullable Int)`; got 3. See introduction at `standard::Object::init`.
+alt/base_arg_default_autoinit_alt1.nit:71,5--7: Error: expected at least 2 argument(s) for `init(mandatory: Int, optional: nullable Int, optional_b: nullable Int, mandatory_b: Int)`; got 1. See introduction at `standard::Object::init`.
+alt/base_arg_default_autoinit_alt1.nit:83,5--7: Error: expected at most 4 argument(s) for `init(mandatory: Int, optional: nullable Int, optional_b: nullable Int, mandatory_b: Int)`; got 5. See introduction at `standard::Object::init`.
+alt/base_arg_default_autoinit_alt1.nit:86,5--7: Error: expected at least 2 argument(s) for `init(optional_b: nullable Int, mandatory_b: Int, mandatory: Int)`; got 1. See introduction at `standard::Object::init`.
+alt/base_arg_default_autoinit_alt1.nit:95,5--7: Error: expected at most 3 argument(s) for `init(optional_b: nullable Int, mandatory_b: Int, mandatory: Int)`; got 4. See introduction at `standard::Object::init`.
index 01a68e9..de746e6 100644 (file)
@@ -1 +1 @@
-alt/base_array_lit_typed_alt1.nit:26,14--18: Type error: expected Int, got Bool
+alt/base_array_lit_typed_alt1.nit:26,14--18: Type Error: expected `Int`, got `Bool`.
index c155147..6fa2609 100644 (file)
@@ -1 +1 @@
-alt/base_array_lit_typed_alt2.nit:28,12--15: Type error: class Fail not found in module base_array_lit_typed_alt2.
+alt/base_array_lit_typed_alt2.nit:28,12--15: Error: class `Fail` not found in module `base_array_lit_typed_alt2`.
index 38255cb..ec779ac 100644 (file)
@@ -1,5 +1,5 @@
-base_as_cast.nit:42,1--12: Warning: Expression is already a Object.
-base_as_cast.nit:52,1--12: Warning: Expression is already a Object.
+base_as_cast.nit:42,1--12: Warning: expression is already a `Object`.
+base_as_cast.nit:52,1--12: Warning: expression is already a `Object`.
 0
 0
 0
index 608a97e..16fd41a 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_cast_alt1.nit:42,1--12: Warning: Expression is already a Object.
-alt/base_as_cast_alt1.nit:52,1--12: Warning: Expression is already a Object.
+alt/base_as_cast_alt1.nit:42,1--12: Warning: expression is already a `Object`.
+alt/base_as_cast_alt1.nit:52,1--12: Warning: expression is already a `Object`.
 Runtime error: Cast failed. Expected `U`, got `A` (alt/base_as_cast_alt1.nit:45)
 0
 0
index 0a574f3..d801169 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_cast_alt2.nit:42,1--12: Warning: Expression is already a Object.
-alt/base_as_cast_alt2.nit:52,1--12: Warning: Expression is already a Object.
+alt/base_as_cast_alt2.nit:42,1--12: Warning: expression is already a `Object`.
+alt/base_as_cast_alt2.nit:52,1--12: Warning: expression is already a `Object`.
 Runtime error: Cast failed. Expected `B`, got `A` (alt/base_as_cast_alt2.nit:46)
 0
 0
index f469755..294bf1b 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_cast_alt3.nit:42,1--12: Warning: Expression is already a Object.
-alt/base_as_cast_alt3.nit:52,1--12: Warning: Expression is already a Object.
+alt/base_as_cast_alt3.nit:42,1--12: Warning: expression is already a `Object`.
+alt/base_as_cast_alt3.nit:52,1--12: Warning: expression is already a `Object`.
 Runtime error: Cast failed. Expected `Int`, got `A` (alt/base_as_cast_alt3.nit:47)
 0
 0
index 2f864de..37ce874 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_cast_alt4.nit:42,1--12: Warning: Expression is already a Object.
-alt/base_as_cast_alt4.nit:52,1--12: Warning: Expression is already a Object.
+alt/base_as_cast_alt4.nit:42,1--12: Warning: expression is already a `Object`.
+alt/base_as_cast_alt4.nit:52,1--12: Warning: expression is already a `Object`.
 Runtime error: Cast failed. Expected `Comparable`, got `A` (alt/base_as_cast_alt4.nit:48)
 0
 0
index c5e662d..157db9d 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_cast_alt5.nit:42,1--12: Warning: Expression is already a Object.
-alt/base_as_cast_alt5.nit:52,1--12: Warning: Expression is already a Object.
+alt/base_as_cast_alt5.nit:42,1--12: Warning: expression is already a `Object`.
+alt/base_as_cast_alt5.nit:52,1--12: Warning: expression is already a `Object`.
 Runtime error: Cast failed. Expected `Int`, got `B` (alt/base_as_cast_alt5.nit:57)
 0
 0
index 16abdb8..5cf329b 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_cast_alt6.nit:42,1--12: Warning: Expression is already a Object.
-alt/base_as_cast_alt6.nit:52,1--12: Warning: Expression is already a Object.
+alt/base_as_cast_alt6.nit:42,1--12: Warning: expression is already a `Object`.
+alt/base_as_cast_alt6.nit:52,1--12: Warning: expression is already a `Object`.
 Runtime error: Cast failed. Expected `Comparable`, got `B` (alt/base_as_cast_alt6.nit:58)
 0
 0
index 2380a43..2324342 100644 (file)
@@ -1,7 +1,7 @@
-base_as_notnull.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-base_as_notnull.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-base_as_notnull.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-base_as_notnull.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
+base_as_notnull.nit:41,6: Warning: expression is not null, since it is a `A`.
+base_as_notnull.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+base_as_notnull.nit:43,6: Warning: expression is not null, since it is a `B`.
+base_as_notnull.nit:52,6: Warning: expression is not null, since it is a `B`.
 1
 2
 3
index b0818df..1962743 100644 (file)
@@ -1,5 +1,5 @@
-base_as_notnull2.nit:30,12--25: Warning: expression is already not null, since it is a `Object`.
-base_as_notnull2.nit:50,12--25: Warning: expression is already not null, since it is a `F: Object`.
+base_as_notnull2.nit:30,12: Warning: expression is not null, since it is a `Object`.
+base_as_notnull2.nit:50,12: Warning: expression is not null, since it is a `F: Object`.
 1
 1
 2
index 01ee624..c3fe7f3 100644 (file)
@@ -1,3 +1,3 @@
-alt/base_as_notnull2_alt1.nit:30,12--25: Warning: expression is already not null, since it is a `Object`.
-alt/base_as_notnull2_alt1.nit:50,12--25: Warning: expression is already not null, since it is a `F: Object`.
-alt/base_as_notnull2_alt1.nit:58,7--10: Type error: expected Object, got null
+alt/base_as_notnull2_alt1.nit:30,12: Warning: expression is not null, since it is a `Object`.
+alt/base_as_notnull2_alt1.nit:50,12: Warning: expression is not null, since it is a `F: Object`.
+alt/base_as_notnull2_alt1.nit:58,7--10: Type Error: expected `Object`, got `null`.
index e6335c5..4ac9e4e 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_notnull2_alt2.nit:30,12--25: Warning: expression is already not null, since it is a `Object`.
-alt/base_as_notnull2_alt2.nit:50,12--25: Warning: expression is already not null, since it is a `F: Object`.
+alt/base_as_notnull2_alt2.nit:30,12: Warning: expression is not null, since it is a `Object`.
+alt/base_as_notnull2_alt2.nit:50,12: Warning: expression is not null, since it is a `F: Object`.
 Runtime error: Cast failed (alt/base_as_notnull2_alt2.nit:40)
 1
 1
index 4fb6e73..f057f6c 100644 (file)
@@ -1,3 +1,3 @@
-alt/base_as_notnull2_alt3.nit:30,12--25: Warning: expression is already not null, since it is a `Object`.
-alt/base_as_notnull2_alt3.nit:50,12--25: Warning: expression is already not null, since it is a `F: Object`.
-alt/base_as_notnull2_alt3.nit:64,7--10: Type error: expected Int, got null
+alt/base_as_notnull2_alt3.nit:30,12: Warning: expression is not null, since it is a `Object`.
+alt/base_as_notnull2_alt3.nit:50,12: Warning: expression is not null, since it is a `F: Object`.
+alt/base_as_notnull2_alt3.nit:64,7--10: Type Error: expected `Int`, got `null`.
index ad6b798..8a5c0eb 100644 (file)
@@ -1,6 +1,6 @@
-alt/base_as_notnull_alt1.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt1.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt1.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt1.nit:50,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt1.nit:50,6--19: Type error: expected B, got A
-alt/base_as_notnull_alt1.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
+alt/base_as_notnull_alt1.nit:41,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt1.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt1.nit:43,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt1.nit:50,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt1.nit:50,6--19: Type Error: expected `B`, got `A`.
+alt/base_as_notnull_alt1.nit:52,6: Warning: expression is not null, since it is a `B`.
index 0e0e68c..ea4e70d 100644 (file)
@@ -1,6 +1,6 @@
-alt/base_as_notnull_alt2.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt2.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt2.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt2.nit:51,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt2.nit:51,6--20: Type error: expected B, got A
-alt/base_as_notnull_alt2.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
+alt/base_as_notnull_alt2.nit:41,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt2.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt2.nit:43,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt2.nit:51,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt2.nit:51,6--20: Type Error: expected `B`, got `A`.
+alt/base_as_notnull_alt2.nit:52,6: Warning: expression is not null, since it is a `B`.
index bd83530..133010c 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_notnull_alt3.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt3.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt3.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt3.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt3.nit:53,6--20: Type error: expected B, got A
+alt/base_as_notnull_alt3.nit:41,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt3.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt3.nit:43,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt3.nit:52,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt3.nit:53,6--20: Type Error: expected `B`, got `A`.
index 0050108..92cecc7 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_notnull_alt4.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt4.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt4.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt4.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt4.nit:54,6--21: Type error: expected B, got A
+alt/base_as_notnull_alt4.nit:41,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt4.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt4.nit:43,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt4.nit:52,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt4.nit:54,6--21: Type Error: expected `B`, got `A`.
index d8136e9..b52a40b 100644 (file)
@@ -1,7 +1,7 @@
-alt/base_as_notnull_alt5.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt5.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt5.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt5.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
+alt/base_as_notnull_alt5.nit:41,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt5.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt5.nit:43,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt5.nit:52,6: Warning: expression is not null, since it is a `B`.
 Runtime error: Cast failed (alt/base_as_notnull_alt5.nit:59)
 1
 2
index 7083fa3..518f166 100644 (file)
@@ -1,7 +1,7 @@
-alt/base_as_notnull_alt6.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt6.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt6.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt6.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
+alt/base_as_notnull_alt6.nit:41,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt6.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt6.nit:43,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt6.nit:52,6: Warning: expression is not null, since it is a `B`.
 Runtime error: Cast failed (alt/base_as_notnull_alt6.nit:60)
 1
 2
index 38f0903..416f28e 100644 (file)
@@ -1,5 +1,5 @@
-alt/base_as_notnull_alt7.nit:41,6--19: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt7.nit:42,6--20: Warning: expression is already not null, since it is a `A`.
-alt/base_as_notnull_alt7.nit:43,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt7.nit:52,6--19: Warning: expression is already not null, since it is a `B`.
-alt/base_as_notnull_alt7.nit:61,1--17: Type error: as(not null) on null
+alt/base_as_notnull_alt7.nit:41,6: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt7.nit:42,6--7: Warning: expression is not null, since it is a `A`.
+alt/base_as_notnull_alt7.nit:43,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt7.nit:52,6: Warning: expression is not null, since it is a `B`.
+alt/base_as_notnull_alt7.nit:61,1--17: Type Error: `as(not null)` on `null`.
index 4635340..8b381a4 100644 (file)
@@ -1,5 +1,5 @@
-base_as_notnull_int.nit:18,1--14: Warning: expression is already not null, since it is a `Int`.
-base_as_notnull_int.nit:20,1--15: Warning: expression is already not null, since it is a `Object`.
+base_as_notnull_int.nit:18,1: Warning: expression is not null, since it is a `Int`.
+base_as_notnull_int.nit:20,1--2: Warning: expression is not null, since it is a `Object`.
 1
 1
 1
index 0a24eb8..e6bc7c0 100644 (file)
@@ -1 +1 @@
-alt/base_assert2_alt1.nit:33,3--7: Error: Method 'bar' doesn't exists in A.
+alt/base_assert2_alt1.nit:33,5--7: Error: method `bar` does not exists in `A`.
index 21150c4..080ddf2 100644 (file)
@@ -1 +1 @@
-alt/base_assert2_alt2.nit:50,2--6: Error: Method 'bar' doesn't exists in A.
+alt/base_assert2_alt2.nit:50,4--6: Error: method `bar` does not exists in `A`.
index ef7ac2b..72be4f4 100644 (file)
@@ -1 +1 @@
-alt/base_assert_alt2.nit:23,9: Type error: expected Bool, got Int
+alt/base_assert_alt2.nit:23,9: Type Error: expected `Bool`, got `Int`.
index e42c5e0..da7cd3c 100644 (file)
@@ -1,10 +1,10 @@
-alt/base_attr3_alt1.nit:22,3--8: Error: Method or variable 'a1=' unknown in B.
-alt/base_attr3_alt1.nit:24,3--8: Error: Method or variable 'a2=' unknown in B.
-alt/base_attr3_alt1.nit:25,3--4: Error: Method or variable 'a3' unknown in B.
-alt/base_attr3_alt1.nit:26,3--8: Error: Method or variable 'a3=' unknown in B.
-alt/base_attr3_alt1.nit:31,3--4: Error: Method or variable 'a6' unknown in B.
-alt/base_attr3_alt1.nit:37,3--4: Error: Method or variable 'a9' unknown in B.
-alt/base_attr3_alt1.nit:40,3--9: Error: Method or variable 'a10=' unknown in B.
-alt/base_attr3_alt1.nit:42,3--9: Error: Method or variable 'a11=' unknown in B.
-alt/base_attr3_alt1.nit:43,3--5: Error: Method or variable 'a12' unknown in B.
-alt/base_attr3_alt1.nit:44,3--9: Error: Method or variable 'a12=' unknown in B.
+alt/base_attr3_alt1.nit:22,3--4: Error: method or variable `a1=` unknown in `B`.
+alt/base_attr3_alt1.nit:24,3--4: Error: method or variable `a2=` unknown in `B`.
+alt/base_attr3_alt1.nit:25,3--4: Error: method or variable `a3` unknown in `B`.
+alt/base_attr3_alt1.nit:26,3--4: Error: method or variable `a3=` unknown in `B`.
+alt/base_attr3_alt1.nit:31,3--4: Error: method or variable `a6` unknown in `B`.
+alt/base_attr3_alt1.nit:37,3--4: Error: method or variable `a9` unknown in `B`.
+alt/base_attr3_alt1.nit:40,3--5: Error: method or variable `a10=` unknown in `B`.
+alt/base_attr3_alt1.nit:42,3--5: Error: method or variable `a11=` unknown in `B`.
+alt/base_attr3_alt1.nit:43,3--5: Error: method or variable `a12` unknown in `B`.
+alt/base_attr3_alt1.nit:44,3--5: Error: method or variable `a12=` unknown in `B`.
index d7b62f6..c857bcc 100644 (file)
@@ -1,17 +1,17 @@
-alt/base_attr3_alt2.nit:49,3--10: Error: Method 'a1=' doesn't exists in A.
-alt/base_attr3_alt2.nit:50,3--6: Error: Method 'a2' is protected and can only acceded by self.
-alt/base_attr3_alt2.nit:51,3--10: Error: Method 'a2=' doesn't exists in A.
-alt/base_attr3_alt2.nit:52,3--6: Error: Method 'a3' doesn't exists in A.
-alt/base_attr3_alt2.nit:53,3--10: Error: Method 'a3=' doesn't exists in A.
-alt/base_attr3_alt2.nit:56,3--6: Error: Method 'a5' is protected and can only acceded by self.
-alt/base_attr3_alt2.nit:58,3--6: Error: Method 'a6' doesn't exists in A.
-alt/base_attr3_alt2.nit:61,3--10: Error: Method 'a7=' is protected and can only acceded by self.
-alt/base_attr3_alt2.nit:62,3--6: Error: Method 'a8' is protected and can only acceded by self.
-alt/base_attr3_alt2.nit:63,3--10: Error: Method 'a8=' is protected and can only acceded by self.
-alt/base_attr3_alt2.nit:64,3--6: Error: Method 'a9' doesn't exists in A.
-alt/base_attr3_alt2.nit:65,3--10: Error: Method 'a9=' is protected and can only acceded by self.
-alt/base_attr3_alt2.nit:67,3--11: Error: Method 'a10=' doesn't exists in A.
-alt/base_attr3_alt2.nit:68,3--7: Error: Method 'a11' is protected and can only acceded by self.
-alt/base_attr3_alt2.nit:69,3--11: Error: Method 'a11=' doesn't exists in A.
-alt/base_attr3_alt2.nit:70,3--7: Error: Method 'a12' doesn't exists in A.
-alt/base_attr3_alt2.nit:71,3--11: Error: Method 'a12=' doesn't exists in A.
+alt/base_attr3_alt2.nit:49,5--6: Error: method `a1=` does not exists in `A`.
+alt/base_attr3_alt2.nit:50,5--6: Error: method `a2` is protected and can only accessed by `self`.
+alt/base_attr3_alt2.nit:51,5--6: Error: method `a2=` does not exists in `A`.
+alt/base_attr3_alt2.nit:52,5--6: Error: method `a3` does not exists in `A`.
+alt/base_attr3_alt2.nit:53,5--6: Error: method `a3=` does not exists in `A`.
+alt/base_attr3_alt2.nit:56,5--6: Error: method `a5` is protected and can only accessed by `self`.
+alt/base_attr3_alt2.nit:58,5--6: Error: method `a6` does not exists in `A`.
+alt/base_attr3_alt2.nit:61,5--6: Error: method `a7=` is protected and can only accessed by `self`.
+alt/base_attr3_alt2.nit:62,5--6: Error: method `a8` is protected and can only accessed by `self`.
+alt/base_attr3_alt2.nit:63,5--6: Error: method `a8=` is protected and can only accessed by `self`.
+alt/base_attr3_alt2.nit:64,5--6: Error: method `a9` does not exists in `A`.
+alt/base_attr3_alt2.nit:65,5--6: Error: method `a9=` is protected and can only accessed by `self`.
+alt/base_attr3_alt2.nit:67,5--7: Error: method `a10=` does not exists in `A`.
+alt/base_attr3_alt2.nit:68,5--7: Error: method `a11` is protected and can only accessed by `self`.
+alt/base_attr3_alt2.nit:69,5--7: Error: method `a11=` does not exists in `A`.
+alt/base_attr3_alt2.nit:70,5--7: Error: method `a12` does not exists in `A`.
+alt/base_attr3_alt2.nit:71,5--7: Error: method `a12=` does not exists in `A`.
index c762e5c..58d39b4 100644 (file)
@@ -1,17 +1,17 @@
-alt/base_attr3_alt3.nit:80,2--9: Error: Method 'a1=' doesn't exists in A.
-alt/base_attr3_alt3.nit:81,2--5: Error: Method 'a2' is protected and can only acceded by self.
-alt/base_attr3_alt3.nit:82,2--9: Error: Method 'a2=' doesn't exists in A.
-alt/base_attr3_alt3.nit:83,2--5: Error: Method 'a3' doesn't exists in A.
-alt/base_attr3_alt3.nit:84,2--9: Error: Method 'a3=' doesn't exists in A.
-alt/base_attr3_alt3.nit:87,2--5: Error: Method 'a5' is protected and can only acceded by self.
-alt/base_attr3_alt3.nit:89,2--5: Error: Method 'a6' doesn't exists in A.
-alt/base_attr3_alt3.nit:92,2--9: Error: Method 'a7=' is protected and can only acceded by self.
-alt/base_attr3_alt3.nit:93,2--5: Error: Method 'a8' is protected and can only acceded by self.
-alt/base_attr3_alt3.nit:94,2--9: Error: Method 'a8=' is protected and can only acceded by self.
-alt/base_attr3_alt3.nit:95,2--5: Error: Method 'a9' doesn't exists in A.
-alt/base_attr3_alt3.nit:96,2--9: Error: Method 'a9=' is protected and can only acceded by self.
-alt/base_attr3_alt3.nit:98,2--10: Error: Method 'a10=' doesn't exists in A.
-alt/base_attr3_alt3.nit:99,2--6: Error: Method 'a11' is protected and can only acceded by self.
-alt/base_attr3_alt3.nit:100,2--10: Error: Method 'a11=' doesn't exists in A.
-alt/base_attr3_alt3.nit:101,2--6: Error: Method 'a12' doesn't exists in A.
-alt/base_attr3_alt3.nit:102,2--10: Error: Method 'a12=' doesn't exists in A.
+alt/base_attr3_alt3.nit:80,4--5: Error: method `a1=` does not exists in `A`.
+alt/base_attr3_alt3.nit:81,4--5: Error: method `a2` is protected and can only accessed by `self`.
+alt/base_attr3_alt3.nit:82,4--5: Error: method `a2=` does not exists in `A`.
+alt/base_attr3_alt3.nit:83,4--5: Error: method `a3` does not exists in `A`.
+alt/base_attr3_alt3.nit:84,4--5: Error: method `a3=` does not exists in `A`.
+alt/base_attr3_alt3.nit:87,4--5: Error: method `a5` is protected and can only accessed by `self`.
+alt/base_attr3_alt3.nit:89,4--5: Error: method `a6` does not exists in `A`.
+alt/base_attr3_alt3.nit:92,4--5: Error: method `a7=` is protected and can only accessed by `self`.
+alt/base_attr3_alt3.nit:93,4--5: Error: method `a8` is protected and can only accessed by `self`.
+alt/base_attr3_alt3.nit:94,4--5: Error: method `a8=` is protected and can only accessed by `self`.
+alt/base_attr3_alt3.nit:95,4--5: Error: method `a9` does not exists in `A`.
+alt/base_attr3_alt3.nit:96,4--5: Error: method `a9=` is protected and can only accessed by `self`.
+alt/base_attr3_alt3.nit:98,4--6: Error: method `a10=` does not exists in `A`.
+alt/base_attr3_alt3.nit:99,4--6: Error: method `a11` is protected and can only accessed by `self`.
+alt/base_attr3_alt3.nit:100,4--6: Error: method `a11=` does not exists in `A`.
+alt/base_attr3_alt3.nit:101,4--6: Error: method `a12` does not exists in `A`.
+alt/base_attr3_alt3.nit:102,4--6: Error: method `a12=` does not exists in `A`.
index 4ccdc82..14de495 100644 (file)
@@ -1,17 +1,17 @@
-alt/base_attr3_alt4.nit:110,2--9: Error: Method 'a1=' doesn't exists in B.
-alt/base_attr3_alt4.nit:111,2--5: Error: Method 'a2' is protected and can only acceded by self.
-alt/base_attr3_alt4.nit:112,2--9: Error: Method 'a2=' doesn't exists in B.
-alt/base_attr3_alt4.nit:113,2--5: Error: Method 'a3' doesn't exists in B.
-alt/base_attr3_alt4.nit:114,2--9: Error: Method 'a3=' doesn't exists in B.
-alt/base_attr3_alt4.nit:117,2--5: Error: Method 'a5' is protected and can only acceded by self.
-alt/base_attr3_alt4.nit:119,2--5: Error: Method 'a6' doesn't exists in B.
-alt/base_attr3_alt4.nit:122,2--9: Error: Method 'a7=' is protected and can only acceded by self.
-alt/base_attr3_alt4.nit:123,2--5: Error: Method 'a8' is protected and can only acceded by self.
-alt/base_attr3_alt4.nit:124,2--9: Error: Method 'a8=' is protected and can only acceded by self.
-alt/base_attr3_alt4.nit:125,2--5: Error: Method 'a9' doesn't exists in B.
-alt/base_attr3_alt4.nit:126,2--9: Error: Method 'a9=' is protected and can only acceded by self.
-alt/base_attr3_alt4.nit:128,2--10: Error: Method 'a10=' doesn't exists in B.
-alt/base_attr3_alt4.nit:129,2--6: Error: Method 'a11' is protected and can only acceded by self.
-alt/base_attr3_alt4.nit:130,2--10: Error: Method 'a11=' doesn't exists in B.
-alt/base_attr3_alt4.nit:131,2--6: Error: Method 'a12' doesn't exists in B.
-alt/base_attr3_alt4.nit:132,2--10: Error: Method 'a12=' doesn't exists in B.
+alt/base_attr3_alt4.nit:110,4--5: Error: method `a1=` does not exists in `B`.
+alt/base_attr3_alt4.nit:111,4--5: Error: method `a2` is protected and can only accessed by `self`.
+alt/base_attr3_alt4.nit:112,4--5: Error: method `a2=` does not exists in `B`.
+alt/base_attr3_alt4.nit:113,4--5: Error: method `a3` does not exists in `B`.
+alt/base_attr3_alt4.nit:114,4--5: Error: method `a3=` does not exists in `B`.
+alt/base_attr3_alt4.nit:117,4--5: Error: method `a5` is protected and can only accessed by `self`.
+alt/base_attr3_alt4.nit:119,4--5: Error: method `a6` does not exists in `B`.
+alt/base_attr3_alt4.nit:122,4--5: Error: method `a7=` is protected and can only accessed by `self`.
+alt/base_attr3_alt4.nit:123,4--5: Error: method `a8` is protected and can only accessed by `self`.
+alt/base_attr3_alt4.nit:124,4--5: Error: method `a8=` is protected and can only accessed by `self`.
+alt/base_attr3_alt4.nit:125,4--5: Error: method `a9` does not exists in `B`.
+alt/base_attr3_alt4.nit:126,4--5: Error: method `a9=` is protected and can only accessed by `self`.
+alt/base_attr3_alt4.nit:128,4--6: Error: method `a10=` does not exists in `B`.
+alt/base_attr3_alt4.nit:129,4--6: Error: method `a11` is protected and can only accessed by `self`.
+alt/base_attr3_alt4.nit:130,4--6: Error: method `a11=` does not exists in `B`.
+alt/base_attr3_alt4.nit:131,4--6: Error: method `a12` does not exists in `B`.
+alt/base_attr3_alt4.nit:132,4--6: Error: method `a12=` does not exists in `B`.
index f936345..5d77e90 100644 (file)
@@ -1 +1 @@
-alt/base_attr4_alt1.nit:40,1--9: Error: Method 'foo=' doesn't exists in A.
+alt/base_attr4_alt1.nit:40,3--5: Error: method `foo=` does not exists in `A`.
index 56e09a6..30b0f43 100644 (file)
@@ -1 +1 @@
-alt/base_attr4_alt2.nit:43,1--5: Error: Method 'bar' doesn't exists in A.
+alt/base_attr4_alt2.nit:43,3--5: Error: method `bar` does not exists in `A`.
index d8a9533..c56ab5c 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt1.nit:34,6--8: Redef error: B::foo is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt1.nit:34,6--8: Redef Error: `B::foo` is an inherited property. To redefine it, add the `redef` keyword.
index c09dc40..c8cb87c 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt11.nit:41,6--8: Redef error: B::bar= is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt11.nit:41,6--8: Redef Error: `B::bar=` is an inherited property. To redefine it, add the `redef` keyword.
index 67219d9..f75ed88 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt12.nit:42,12--14: Error: No property B::bar is inherited. Remove the redef keyword to define a new property.
+alt/base_attr5_alt12.nit:42,12--14: Error: no property `B::bar` is inherited. Remove the `redef` keyword to define a new property.
index f94d858..bfa6e49 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt13.nit:43,6--8: Redef error: B::bar= is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt13.nit:43,6--8: Redef Error: `B::bar=` is an inherited property. To redefine it, add the `redef` keyword.
index 8b5f289..6072235 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt14.nit:44,12--14: Error: No property B::bar is inherited. Remove the redef keyword to define a new property.
+alt/base_attr5_alt14.nit:44,12--14: Error: no property `B::bar` is inherited. Remove the `redef` keyword to define a new property.
index f39c3d7..3ff3fb6 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt16.nit:46,12--14: Error: No property B::bar is inherited. Remove the redef keyword to define a new property.
+alt/base_attr5_alt16.nit:46,12--14: Error: no property `B::bar` is inherited. Remove the `redef` keyword to define a new property.
index 03ea677..5df3fc9 100644 (file)
@@ -1,2 +1 @@
-alt/base_attr5_alt17.nit:47,12--14: Error: No property B::bar is inherited. Remove the redef keyword to define a new property.
-alt/base_attr5_alt17.nit:47,12--14: Error: Untyped attribute base_attr5_alt17#B#_bar
+alt/base_attr5_alt17.nit:47,12--14: Error: no property `B::bar` is inherited. Remove the `redef` keyword to define a new property.
index 10a06cc..3905090 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt21.nit:48,6--8: Redef error: B::baz is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt21.nit:48,6--8: Redef Error: `B::baz` is an inherited property. To redefine it, add the `redef` keyword.
index 759d3cc..c70e257 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt23.nit:50,6--8: Redef error: B::baz is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt23.nit:50,6--8: Redef Error: `B::baz` is an inherited property. To redefine it, add the `redef` keyword.
index a51e259..142c2eb 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt25.nit:52,6--8: Redef error: B::baz is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt25.nit:52,6--8: Redef Error: `B::baz` is an inherited property. To redefine it, add the `redef` keyword.
index 2431981..96dedfa 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt3.nit:36,6--8: Redef error: B::foo is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt3.nit:36,6--8: Redef Error: `B::foo` is an inherited property. To redefine it, add the `redef` keyword.
index c000a46..5d0f9d7 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt5.nit:38,6--8: Redef error: B::foo is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr5_alt5.nit:38,6--8: Redef Error: `B::foo` is an inherited property. To redefine it, add the `redef` keyword.
index a8a0ff4..0452ebf 100644 (file)
@@ -1 +1 @@
-alt/base_attr5_alt6.nit:39,12--14: Error: No property B::foo= is inherited. Remove the redef keyword to define a new property.
+alt/base_attr5_alt6.nit:39,12--14: Error: no property `B::foo=` is inherited. Remove the `redef` keyword to define a new property.
index 9a48ee7..e088b73 100644 (file)
@@ -1 +1 @@
-alt/base_attr7_alt1.nit:34,17--20: Redef Error: Wrong return type. found Bool, expected Int.
+alt/base_attr7_alt1.nit:34,17--20: Redef Error: expected `Int` return type; got `Bool`.
index 4022b21..45ac4ba 100644 (file)
@@ -1 +1 @@
-alt/base_attr7_alt2.nit:35,11--14: Redef Error: Wrong type for parameter `bar'. found Bool, expected Int.
+alt/base_attr7_alt2.nit:35,11--14: Redef Error: expected `Int` type for parameter `bar'; got `Bool`.
index 201f71d..779acf1 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_attr7_alt3.nit:36,17--20: Redef Error: Wrong return type. found Bool, expected Int.
-alt/base_attr7_alt3.nit:36,17--20: Redef Error: Wrong type for parameter `baz'. found Bool, expected Int.
+alt/base_attr7_alt3.nit:36,17--20: Redef Error: expected `Int` return type; got `Bool`.
+alt/base_attr7_alt3.nit:36,17--20: Redef Error: expected `Int` type for parameter `baz'; got `Bool`.
diff --git a/tests/sav/base_attr_abstract.res b/tests/sav/base_attr_abstract.res
new file mode 100644 (file)
index 0000000..36f0f1a
--- /dev/null
@@ -0,0 +1,5 @@
+1
+2
+100
+101
+100
diff --git a/tests/sav/base_attr_abstract_alt1.res b/tests/sav/base_attr_abstract_alt1.res
new file mode 100644 (file)
index 0000000..4b97e69
--- /dev/null
@@ -0,0 +1 @@
+alt/base_attr_abstract_alt1.nit:19,15--22: Error: `abstract` attributes cannot have an initial value.
diff --git a/tests/sav/base_attr_abstract_alt2.res b/tests/sav/base_attr_abstract_alt2.res
new file mode 100644 (file)
index 0000000..af3a672
--- /dev/null
@@ -0,0 +1,2 @@
+alt/base_attr_abstract_alt2.nit:20,6: Error: untyped attribute `base_attr_abstract_alt2#Foo#b`.
+alt/base_attr_abstract_alt2.nit:20,21--30: Error: `noautoinit` attributes cannot be abstract.
diff --git a/tests/sav/base_attr_abstract_alt3.res b/tests/sav/base_attr_abstract_alt3.res
new file mode 100644 (file)
index 0000000..4052598
--- /dev/null
@@ -0,0 +1,6 @@
+Runtime error: Abstract method `a` called on `FooBar` (alt/base_attr_abstract_alt3.nit:18)
+1
+2
+100
+101
+100
diff --git a/tests/sav/base_attr_abstract_alt4.res b/tests/sav/base_attr_abstract_alt4.res
new file mode 100644 (file)
index 0000000..09d65f9
--- /dev/null
@@ -0,0 +1,6 @@
+Runtime error: Abstract method `a=` called on `FooBar` (alt/base_attr_abstract_alt4.nit:18)
+1
+2
+100
+101
+100
index e50539b..ec180bc 100644 (file)
@@ -1 +1 @@
-alt/base_attr_init_val_block_alt1.nit:27,3--8: Error: Return without value in a function.
+alt/base_attr_init_val_block_alt1.nit:27,3--8: Error: `return` without value in a function.
index 8545480..153a6ca 100644 (file)
@@ -1 +1 @@
-alt/base_attr_init_val_block_alt2.nit:23,6: Control error: Reached end of block (a 'return' with a value was expected).
+alt/base_attr_init_val_block_alt2.nit:23,6: Error: reached end of block; expected `return`.
index 9de31df..a4af8f0 100644 (file)
@@ -1 +1 @@
-alt/base_attr_isset_alt2.nit:80,4--12: Error: isset on a nullable attribute.
+alt/base_attr_isset_alt2.nit:80,10--12: Type Error: `isset` on a nullable attribute.
index d628b21..ed27d23 100644 (file)
@@ -1 +1 @@
-alt/base_attr_lazy_alt1.nit:28,20--23: Error: a lazy attribute needs a value
+alt/base_attr_lazy_alt1.nit:28,20--23: Error: `lazy` attributes need a value.
index 7c398a6..a0e77b1 100644 (file)
@@ -1 +1 @@
-alt/base_attr_lazy_alt2.nit:29,20--23: Syntax error: `lazy` must be used on attributes.
+alt/base_attr_lazy_alt2.nit:29,20--23: Syntax Error: `lazy` must be used on attributes.
index cf8d660..227d69c 100644 (file)
@@ -1 +1 @@
-alt/base_attr_named_setters_alt1.nit:52,1--10: Error: Method 'foo=' doesn't exists in B.
+alt/base_attr_named_setters_alt1.nit:52,3--5: Error: method `foo=` does not exists in `B`.
index ada80a6..2575aa2 100644 (file)
@@ -1 +1 @@
-alt/base_attr_named_setters_alt2.nit:30,6: Error: A property set_baz is already defined in class B at line 29.
+alt/base_attr_named_setters_alt2.nit:30,6: Error: a property `set_baz` is already defined in class `B` at line 29.
index ed64fb8..c6e4e8a 100644 (file)
@@ -1 +1 @@
-alt/base_attr_named_setters_alt3.nit:31,6: Redef error: B::zz is an inherited property. To redefine it, add the redef keyword.
+alt/base_attr_named_setters_alt3.nit:31,6: Redef Error: `B::zz` is an inherited property. To redefine it, add the `redef` keyword.
index 9409278..5ae86f1 100644 (file)
@@ -1 +1 @@
-alt/base_attr_named_setters_alt4.nit:32,9--11: Redef Error: 1 parameters found, 0 expected. Signature is base_attr_named_setters_alt4#B#zz
+alt/base_attr_named_setters_alt4.nit:32,9--11: Redef Error: expected 0 parameter(s) for `zz`; got 1. See introduction at `base_attr_named_setters_alt4::A::zz`.
index 7405b6f..c901e70 100644 (file)
@@ -1 +1 @@
-alt/base_attr_readonly_alt1.nit:21,3--8: Error: Method or variable 'a1=' unknown in Foo.
+alt/base_attr_readonly_alt1.nit:21,3--4: Error: method or variable `a1=` unknown in `Foo`.
index 5c34535..e257378 100644 (file)
@@ -1 +1 @@
-alt/base_attr_readonly_alt3.nit:25,17--24: Error: a readonly attribute needs a value
+alt/base_attr_readonly_alt3.nit:25,17--24: Error: `readonly` attributes need a value.
diff --git a/tests/sav/base_autocast_array.res b/tests/sav/base_autocast_array.res
new file mode 100644 (file)
index 0000000..9acd049
--- /dev/null
@@ -0,0 +1,3 @@
+1
+true
+true
diff --git a/tests/sav/base_autocast_array_alt1.res b/tests/sav/base_autocast_array_alt1.res
new file mode 100644 (file)
index 0000000..0c8e503
--- /dev/null
@@ -0,0 +1 @@
+alt/base_autocast_array_alt1.nit:25,11--12: Type Error: expected `V`, got `Int`.
diff --git a/tests/sav/base_autocast_array_alt2.res b/tests/sav/base_autocast_array_alt2.res
new file mode 100644 (file)
index 0000000..f8e020c
--- /dev/null
@@ -0,0 +1,3 @@
+Runtime error: Cast failed. Expected `Array[V]`, got `Array[Int]` (alt/base_autocast_array_alt2.nit:26)
+10
+10
diff --git a/tests/sav/base_autocast_array_alt3.res b/tests/sav/base_autocast_array_alt3.res
new file mode 100644 (file)
index 0000000..a93fcc4
--- /dev/null
@@ -0,0 +1,3 @@
+Runtime error: Cast failed. Expected `V`, got `Int` (alt/base_autocast_array_alt3.nit:23)
+10
+10
index 16ce8a4..2952126 100644 (file)
@@ -1,6 +1,6 @@
-base_classid.nit:47,2--8: Warning: Expression is already a A.
-base_classid.nit:48,2--9: Warning: Expression is already a A.
-base_classid.nit:49,2--8: Warning: Expression is already a A since it is a B.
+base_classid.nit:47,2--8: Warning: expression is already a `A`.
+base_classid.nit:48,2--9: Warning: expression is already a `A`.
+base_classid.nit:49,2--8: Warning: expression is already a `A` since it is a `B`.
 true
 true
 true
index 130e589..7283d9e 100644 (file)
@@ -1 +1 @@
-alt/base_combined_assignment_alt1.nit:21,1--6: Error: Method '+' doesn't exists in Object.
+alt/base_combined_assignment_alt1.nit:21,3--4: Error: method `+` does not exists in `Object`.
index 6334ab6..6da4533 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_control_flow_alt1.nit:26,5: Control error: Reached end of function (a 'return' with a value was expected).
-alt/base_control_flow_alt1.nit:34,5: Control error: Reached end of function (a 'return' with a value was expected).
+alt/base_control_flow_alt1.nit:26,5: Error: reached end of function; expected `return` with a value.
+alt/base_control_flow_alt1.nit:34,5: Error: reached end of function; expected `return` with a value.
index 160f623..3d13f0c 100644 (file)
@@ -1 +1 @@
-alt/base_covar_int2_alt2.nit:41,7--8: Type error: expected Int, got A
+alt/base_covar_int2_alt2.nit:41,7--8: Type Error: expected `Int`, got `A`.
index 16397e7..d574d51 100644 (file)
@@ -1 +1 @@
-alt/base_covar_int2_alt4.nit:44,7--8: Type error: expected Int, got A
+alt/base_covar_int2_alt4.nit:44,7--8: Type Error: expected `Int`, got `A`.
index 45d7c9b..e23006d 100644 (file)
@@ -1 +1 @@
-alt/base_covar_int_alt2.nit:36,7--8: Type error: expected Int, got Discrete
+alt/base_covar_int_alt2.nit:36,7--8: Type Error: expected `Int`, got `Discrete`.
index b127ae1..cec39bc 100644 (file)
@@ -1 +1 @@
-alt/base_covar_int_alt4.nit:39,7--8: Type error: expected Int, got Discrete
+alt/base_covar_int_alt4.nit:39,7--8: Type Error: expected `Int`, got `Discrete`.
index 9c0980e..cb41b7d 100644 (file)
@@ -1,2 +1,2 @@
-base_deprecated.nit:33,3--5: Deprecation Warning: Method 'foo' is deprecated: Documentation
-base_deprecated.nit:34,3--5: Deprecation Warning: Method 'bar' is deprecated.
+base_deprecated.nit:33,3--5: Deprecation Warning: method `foo` is deprecated: Documentation
+base_deprecated.nit:34,3--5: Deprecation Warning: method `bar` is deprecated.
index 737a96e..a751d34 100644 (file)
@@ -1 +1,5 @@
-base_div_by_zero.nit:17,16--20: Error: Definitely division by zero
+base_div_by_zero.nit:17,16--20: Warning: division by zero.
+0
+5
+inf
+0
index b4226bc..faf4840 100644 (file)
@@ -1,5 +1,5 @@
-base_eq_null_notnull.nit:36,6--14: Warning: expression is not null, since it is a `A`.
-base_eq_null_notnull.nit:43,2--10: Warning: expression is not null, since it is a `A`.
+base_eq_null_notnull.nit:36,6: Warning: expression is not null, since it is a `A`.
+base_eq_null_notnull.nit:43,2: Warning: expression is not null, since it is a `A`.
 true
 true
 true
index f85f0ae..afdebe3 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt1.nit:34,8--10: Error: interface SubI cannot specialize abstract class AC2
+alt/base_error_class_kind2_alt1.nit:34,8--10: Error: interface `SubI` cannot specialize abstract class `AC2`.
index c7976ee..063c8db 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt10.nit:59,8--10: Error: enum SubEn cannot specialize class CC2
+alt/base_error_class_kind2_alt10.nit:59,8--10: Error: enum `SubEn` cannot specialize class `CC2`.
index 4c172f1..e0f1e73 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt11.nit:60,8--11: Error: enum SubEn cannot specialize enum EnC2
+alt/base_error_class_kind2_alt11.nit:60,8--11: Error: enum `SubEn` cannot specialize enum `EnC2`.
index e2059d9..35a83ac 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt12.nit:61,8--11: Error: enum SubEn cannot specialize extern class ExC2
+alt/base_error_class_kind2_alt12.nit:61,8--11: Error: enum `SubEn` cannot specialize extern class `ExC2`.
index 419707b..de666ea 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt13.nit:66,8--10: Error: extern class SubEx cannot specialize abstract class AC2
+alt/base_error_class_kind2_alt13.nit:66,8--10: Error: extern class `SubEx` cannot specialize abstract class `AC2`.
index c37ee58..50fbed1 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt14.nit:67,8--10: Error: extern class SubEx cannot specialize class CC2
+alt/base_error_class_kind2_alt14.nit:67,8--10: Error: extern class `SubEx` cannot specialize class `CC2`.
index c03d2e8..5aa6030 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt15.nit:68,8--11: Error: extern class SubEx cannot specialize enum EnC2
+alt/base_error_class_kind2_alt15.nit:68,8--11: Error: extern class `SubEx` cannot specialize enum `EnC2`.
index 2fc6bb4..d67ccca 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt2.nit:35,8--10: Error: interface SubI cannot specialize class CC2
+alt/base_error_class_kind2_alt2.nit:35,8--10: Error: interface `SubI` cannot specialize class `CC2`.
index 26c0465..4c43652 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt3.nit:36,8--11: Error: interface SubI cannot specialize enum EnC2
+alt/base_error_class_kind2_alt3.nit:36,8--11: Error: interface `SubI` cannot specialize enum `EnC2`.
index 6e6a47e..87a2251 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt4.nit:37,8--11: Error: interface SubI cannot specialize extern class ExC2
+alt/base_error_class_kind2_alt4.nit:37,8--11: Error: interface `SubI` cannot specialize extern class `ExC2`.
index e3ebfd5..5a4fd27 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt5.nit:44,8--11: Error: abstract class SubA cannot specialize enum EnC2
+alt/base_error_class_kind2_alt5.nit:44,8--11: Error: abstract class `SubA` cannot specialize enum `EnC2`.
index 82ab271..6439782 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt6.nit:45,8--11: Error: abstract class SubA cannot specialize extern class ExC2
+alt/base_error_class_kind2_alt6.nit:45,8--11: Error: abstract class `SubA` cannot specialize extern class `ExC2`.
index 9118416..965fd59 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt7.nit:52,8--11: Error: class SubC cannot specialize enum EnC2
+alt/base_error_class_kind2_alt7.nit:52,8--11: Error: class `SubC` cannot specialize enum `EnC2`.
index 05af2db..80f05ea 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt8.nit:53,8--11: Error: class SubC cannot specialize extern class ExC2
+alt/base_error_class_kind2_alt8.nit:53,8--11: Error: class `SubC` cannot specialize extern class `ExC2`.
index c94438c..09a20d0 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind2_alt9.nit:58,8--10: Error: enum SubEn cannot specialize abstract class AC2
+alt/base_error_class_kind2_alt9.nit:58,8--10: Error: enum `SubEn` cannot specialize abstract class `AC2`.
index dd95996..40c42a5 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt1.nit:44,8--9: Error: interface SubI cannot specialize abstract class AC
+alt/base_error_class_kind_alt1.nit:44,8--9: Error: interface `SubI` cannot specialize abstract class `AC`.
index 50935d0..5792697 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt10.nit:69,8--9: Error: enum SubEn cannot specialize class CC
+alt/base_error_class_kind_alt10.nit:69,8--9: Error: enum `SubEn` cannot specialize class `CC`.
index 088edae..3600dd7 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt11.nit:70,8--10: Error: enum SubEn cannot specialize enum EnC
+alt/base_error_class_kind_alt11.nit:70,8--10: Error: enum `SubEn` cannot specialize enum `EnC`.
index 93fef73..95bb596 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt12.nit:71,8--10: Error: enum SubEn cannot specialize extern class ExC
+alt/base_error_class_kind_alt12.nit:71,8--10: Error: enum `SubEn` cannot specialize extern class `ExC`.
index 087a06d..d899ee6 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt13.nit:76,8--9: Error: extern class SubEx cannot specialize abstract class AC
+alt/base_error_class_kind_alt13.nit:76,8--9: Error: extern class `SubEx` cannot specialize abstract class `AC`.
index da0cddf..36c9e16 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt14.nit:77,8--9: Error: extern class SubEx cannot specialize class CC
+alt/base_error_class_kind_alt14.nit:77,8--9: Error: extern class `SubEx` cannot specialize class `CC`.
index 24729f3..b3adabf 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt15.nit:78,8--10: Error: extern class SubEx cannot specialize enum EnC
+alt/base_error_class_kind_alt15.nit:78,8--10: Error: extern class `SubEx` cannot specialize enum `EnC`.
index 64fd532..ec5c855 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt2.nit:45,8--9: Error: interface SubI cannot specialize class CC
+alt/base_error_class_kind_alt2.nit:45,8--9: Error: interface `SubI` cannot specialize class `CC`.
index 29deecf..3b1ce91 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt3.nit:46,8--10: Error: interface SubI cannot specialize enum EnC
+alt/base_error_class_kind_alt3.nit:46,8--10: Error: interface `SubI` cannot specialize enum `EnC`.
index fec7f38..174b125 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt4.nit:47,8--10: Error: interface SubI cannot specialize extern class ExC
+alt/base_error_class_kind_alt4.nit:47,8--10: Error: interface `SubI` cannot specialize extern class `ExC`.
index d168ec4..4acce40 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt5.nit:54,8--10: Error: abstract class SubA cannot specialize enum EnC
+alt/base_error_class_kind_alt5.nit:54,8--10: Error: abstract class `SubA` cannot specialize enum `EnC`.
index f97b92b..bc9d642 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt6.nit:55,8--10: Error: abstract class SubA cannot specialize extern class ExC
+alt/base_error_class_kind_alt6.nit:55,8--10: Error: abstract class `SubA` cannot specialize extern class `ExC`.
index 2b3c8b6..1c16267 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt7.nit:62,8--10: Error: class SubC cannot specialize enum EnC
+alt/base_error_class_kind_alt7.nit:62,8--10: Error: class `SubC` cannot specialize enum `EnC`.
index 63da325..e78399b 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt8.nit:63,8--10: Error: class SubC cannot specialize extern class ExC
+alt/base_error_class_kind_alt8.nit:63,8--10: Error: class `SubC` cannot specialize extern class `ExC`.
index e227a6e..95e969c 100644 (file)
@@ -1 +1 @@
-alt/base_error_class_kind_alt9.nit:68,8--9: Error: enum SubEn cannot specialize abstract class AC
+alt/base_error_class_kind_alt9.nit:68,8--9: Error: enum `SubEn` cannot specialize abstract class `AC`.
index fc1f645..e565088 100644 (file)
@@ -1 +1 @@
-base_error_doubledef.nit:26,12--14: Error: A property foo is already defined in class B at line 24.
+base_error_doubledef.nit:26,12--14: Error: a property `foo` is already defined in class `B` at line 24.
index a3c8000..bde0d09 100644 (file)
@@ -1 +1 @@
-base_error_new_abstract.nit:21,9--13: Type Error: Cannot instantiate abstract class A.
+base_error_new_abstract.nit:21,9--13: Type Error: cannot instantiate abstract class `A`.
index c0c2c1b..29bad81 100644 (file)
@@ -1 +1 @@
-base_error_new_interface.nit:21,9--13: Type Error: Cannot instantiate interface A.
+base_error_new_interface.nit:21,9--13: Type Error: cannot instantiate interface `A`.
index 30e9b42..0958991 100644 (file)
@@ -1 +1 @@
-alt/base_for_nullable_alt2.nit:21,1--25: Type error: 'for' cannot iterate over 'null'
+alt/base_for_nullable_alt2.nit:21,1--25: Type Error: `for` cannot iterate over `null`.
index 445a4fa..5ff1d37 100644 (file)
@@ -1,30 +1,30 @@
-base_formal_subtype.nit:48,10--21: Warning: Expression is already a Object.
-base_formal_subtype.nit:50,10--16: Warning: Expression is already a E.
-base_formal_subtype.nit:51,10--21: Warning: Expression is already a Object since it is a E.
-base_formal_subtype.nit:53,10--18: Warning: Expression is already a VE.
-base_formal_subtype.nit:54,10--17: Warning: Expression is already a E since it is a VE.
-base_formal_subtype.nit:55,10--22: Warning: Expression is already a Object since it is a VE.
-base_formal_subtype.nit:57,10--20: Warning: Expression is already a VVE.
-base_formal_subtype.nit:58,10--19: Warning: Expression is already a VE since it is a VVE.
-base_formal_subtype.nit:59,10--18: Warning: Expression is already a E since it is a VVE.
-base_formal_subtype.nit:60,10--23: Warning: Expression is already a Object since it is a VVE.
-base_formal_subtype.nit:62,10--20: Warning: Expression is already a VGE.
-base_formal_subtype.nit:63,10--20: Warning: Expression is already a G[E] since it is a VGE.
-base_formal_subtype.nit:64,10--25: Warning: Expression is already a G[Object] since it is a VGE.
-base_formal_subtype.nit:65,10--23: Warning: Expression is already a Object since it is a VGE.
-base_formal_subtype.nit:67,10--22: Warning: Expression is already a VVGE.
-base_formal_subtype.nit:68,10--21: Warning: Expression is already a VGE since it is a VVGE.
-base_formal_subtype.nit:69,10--21: Warning: Expression is already a G[E] since it is a VVGE.
-base_formal_subtype.nit:70,10--26: Warning: Expression is already a G[Object] since it is a VVGE.
-base_formal_subtype.nit:71,10--24: Warning: Expression is already a Object since it is a VVGE.
-base_formal_subtype.nit:73,10--22: Warning: Expression is already a VGVE.
-base_formal_subtype.nit:74,10--22: Warning: Expression is already a G[VE] since it is a VGVE.
-base_formal_subtype.nit:75,10--21: Warning: Expression is already a G[E] since it is a VGVE.
-base_formal_subtype.nit:76,10--26: Warning: Expression is already a G[Object] since it is a VGVE.
-base_formal_subtype.nit:77,10--24: Warning: Expression is already a Object since it is a VGVE.
-base_formal_subtype.nit:79,10--24: Warning: Expression is already a VGVVE.
-base_formal_subtype.nit:80,10--24: Warning: Expression is already a G[VVE] since it is a VGVVE.
-base_formal_subtype.nit:81,10--23: Warning: Expression is already a G[VE] since it is a VGVVE.
-base_formal_subtype.nit:82,10--22: Warning: Expression is already a G[E] since it is a VGVVE.
-base_formal_subtype.nit:83,10--27: Warning: Expression is already a G[Object] since it is a VGVVE.
-base_formal_subtype.nit:84,10--25: Warning: Expression is already a Object since it is a VGVVE.
+base_formal_subtype.nit:48,10--21: Warning: expression is already a `Object`.
+base_formal_subtype.nit:50,10--16: Warning: expression is already a `E`.
+base_formal_subtype.nit:51,10--21: Warning: expression is already a `Object` since it is a `E`.
+base_formal_subtype.nit:53,10--18: Warning: expression is already a `VE`.
+base_formal_subtype.nit:54,10--17: Warning: expression is already a `E` since it is a `VE`.
+base_formal_subtype.nit:55,10--22: Warning: expression is already a `Object` since it is a `VE`.
+base_formal_subtype.nit:57,10--20: Warning: expression is already a `VVE`.
+base_formal_subtype.nit:58,10--19: Warning: expression is already a `VE` since it is a `VVE`.
+base_formal_subtype.nit:59,10--18: Warning: expression is already a `E` since it is a `VVE`.
+base_formal_subtype.nit:60,10--23: Warning: expression is already a `Object` since it is a `VVE`.
+base_formal_subtype.nit:62,10--20: Warning: expression is already a `VGE`.
+base_formal_subtype.nit:63,10--20: Warning: expression is already a `G[E]` since it is a `VGE`.
+base_formal_subtype.nit:64,10--25: Warning: expression is already a `G[Object]` since it is a `VGE`.
+base_formal_subtype.nit:65,10--23: Warning: expression is already a `Object` since it is a `VGE`.
+base_formal_subtype.nit:67,10--22: Warning: expression is already a `VVGE`.
+base_formal_subtype.nit:68,10--21: Warning: expression is already a `VGE` since it is a `VVGE`.
+base_formal_subtype.nit:69,10--21: Warning: expression is already a `G[E]` since it is a `VVGE`.
+base_formal_subtype.nit:70,10--26: Warning: expression is already a `G[Object]` since it is a `VVGE`.
+base_formal_subtype.nit:71,10--24: Warning: expression is already a `Object` since it is a `VVGE`.
+base_formal_subtype.nit:73,10--22: Warning: expression is already a `VGVE`.
+base_formal_subtype.nit:74,10--22: Warning: expression is already a `G[VE]` since it is a `VGVE`.
+base_formal_subtype.nit:75,10--21: Warning: expression is already a `G[E]` since it is a `VGVE`.
+base_formal_subtype.nit:76,10--26: Warning: expression is already a `G[Object]` since it is a `VGVE`.
+base_formal_subtype.nit:77,10--24: Warning: expression is already a `Object` since it is a `VGVE`.
+base_formal_subtype.nit:79,10--24: Warning: expression is already a `VGVVE`.
+base_formal_subtype.nit:80,10--24: Warning: expression is already a `G[VVE]` since it is a `VGVVE`.
+base_formal_subtype.nit:81,10--23: Warning: expression is already a `G[VE]` since it is a `VGVVE`.
+base_formal_subtype.nit:82,10--22: Warning: expression is already a `G[E]` since it is a `VGVVE`.
+base_formal_subtype.nit:83,10--27: Warning: expression is already a `G[Object]` since it is a `VGVVE`.
+base_formal_subtype.nit:84,10--25: Warning: expression is already a `Object` since it is a `VGVVE`.
index 48b7374..ab2b981 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt1.nit:61,13--17: Type error: 'A' is not a generic class.
+alt/base_gen2_alt1.nit:61,13--17: Type Error: `A` is not a generic class.
index aa7e26f..b401dda 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt2.nit:62,13: Type error: 'B' is a generic class.
+alt/base_gen2_alt2.nit:62,13: Type Error: `B[E: nullable Object]` is a generic class.
index 3541afb..08000b1 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt3.nit:63,13--22: Type error: 'B' has 1 parameters (2 are provided).
+alt/base_gen2_alt3.nit:63,13--22: Type Error: expected 1 formal argument(s) for `B[E: nullable Object]`; got 2.
index 926cb78..f0c4080 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt4.nit:64,13: Type error: 'C' is a generic class.
+alt/base_gen2_alt4.nit:64,13: Type Error: `C[F: nullable Object, G: nullable Object]` is a generic class.
index 2ad0a23..77eb2ca 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt5.nit:65,13--17: Type error: 'C' has 2 parameters (1 are provided).
+alt/base_gen2_alt5.nit:65,13--17: Type Error: expected 2 formal argument(s) for `C[F: nullable Object, G: nullable Object]`; got 1.
index 47709e3..972be54 100644 (file)
@@ -1 +1 @@
-alt/base_gen_alt1.nit:62,11: Type error: expected B, got A
+alt/base_gen_alt1.nit:62,11: Type Error: expected `B`, got `A`.
index c7948e5..18dcd8c 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt1.nit:31,10: Type error: expected B, got F
+alt/base_gen_bound_alt1.nit:31,10: Type Error: expected `B`, got `F`.
index eec93b1..a009a51 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt2.nit:32,11: Type error: expected B, got F
+alt/base_gen_bound_alt2.nit:32,11: Type Error: expected `B`, got `F`.
index d713b99..3551670 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt3.nit:33,11: Type error: expected B, got F
+alt/base_gen_bound_alt3.nit:33,11: Type Error: expected `B`, got `F`.
index f79e28c..16c890b 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt4.nit:34,13: Type error: expected B, got F
+alt/base_gen_bound_alt4.nit:34,13: Type Error: expected `B`, got `F`.
index 2b07879..bd53db4 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt5.nit:39,11: Type error: expected B, got V
+alt/base_gen_bound_alt5.nit:39,11: Type Error: expected `B`, got `V`.
index 719aea7..bd677f6 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt6.nit:40,11: Type error: expected B, got V
+alt/base_gen_bound_alt6.nit:40,11: Type Error: expected `B`, got `V`.
index 071a71e..2e83e76 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt7.nit:41,13: Type error: expected B, got V
+alt/base_gen_bound_alt7.nit:41,13: Type Error: expected `B`, got `V`.
index f565456..a91ff71 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt8.nit:44,14: Type error: expected B, got A
+alt/base_gen_bound_alt8.nit:44,14: Type Error: expected `B`, got `A`.
index 6aca3a9..895df8e 100644 (file)
@@ -1 +1 @@
-alt/base_gen_bound_alt9.nit:49,16: Type error: expected B, got A
+alt/base_gen_bound_alt9.nit:49,16: Type Error: expected `B`, got `A`.
index b5c1f2d..a0d7579 100644 (file)
@@ -1 +1 @@
-base_gen_final_bound.nit:23,16--18: Warning: Useless formal parameter type since `Int` cannnot have subclasses.
+base_gen_final_bound.nit:23,16--18: Warning: useless formal parameter type since `Int` cannot have subclasses.
index 93cf8fd..285435d 100644 (file)
@@ -1 +1 @@
-alt/base_gen_int_alt1.nit:56,11: Type error: expected Int, got A
+alt/base_gen_int_alt1.nit:56,11: Type Error: expected `Int`, got `A`.
index 5c6088c..3fb3201 100644 (file)
@@ -1 +1 @@
-alt/base_gen_reassign_alt3.nit:46,11--12: Type error: expected Float, got Int
+alt/base_gen_reassign_alt3.nit:46,11--12: Type Error: expected `Float`, got `Int`.
index 09c27f7..05d5218 100644 (file)
@@ -1 +1 @@
-alt/base_gen_redef_alt2.nit:17,15: Error: Formal parameter type #0 `X` must be named `E' as in the original definition in module `base_gen2`.
+alt/base_gen_redef_alt2.nit:17,15: Error: formal parameter type #0 `X` must be named `E` as in the original definition in module `base_gen2`.
index cc76588..e3724df 100644 (file)
@@ -1 +1 @@
-alt/base_gen_redef_alt3.nit:17,13: Redef error: Formal parameter arity missmatch; got 2, expected 1.
+alt/base_gen_redef_alt3.nit:17,13: Redef Error: expected 1 formal parameter(s) for B[E: nullable Object]; got 2.
index 6ab7af2..2198655 100644 (file)
@@ -1 +1 @@
-alt/base_if_expr_alt1.nit:39,10--34: Type Error: ambiguous type A vs Int
+alt/base_if_expr_alt1.nit:39,10--34: Type Error: ambiguous type `A` vs `Int`.
index 91e89cf..4fcab0a 100644 (file)
@@ -1 +1 @@
-alt/base_import_alt3.nit:1,8--21: Error: cannot find module fail from project1. tried ., ../lib/standard, ../lib/standard/collection, alt, ../lib
+alt/base_import_alt3.nit:1,8--21: Error: cannot find module `fail` from `project1`. Tried: ., ../lib/standard, ../lib/standard/collection, alt, ../lib.
index 25528d8..09f43d3 100644 (file)
@@ -1 +1 @@
-alt/base_init_autoinit2_alt1.nit:20,30--39: Error: `noautoinit` attributes cannot have an initial value
+alt/base_init_autoinit2_alt1.nit:20,30--39: Error: `noautoinit` attributes cannot have an initial value.
index 3c28719..91e3496 100644 (file)
@@ -1 +1 @@
-alt/base_init_autoinit2_alt2.nit:23,40--43: Error: lazy incompatible with autoinit
+alt/base_init_autoinit2_alt2.nit:23,40--43: Error: `lazy` incompatible with `autoinit`.
index e95f861..e3b658d 100644 (file)
@@ -1 +1 @@
-alt/base_init_autoinit3_alt6.nit:40,2--41,9: Syntax error: `autoinit` expects method identifiers, use `noautoinit` to clear all autoinits.
+alt/base_init_autoinit3_alt6.nit:40,2--41,9: Syntax Error: `autoinit` expects method identifiers, use `noautoinit` to clear all autoinits.
index 9fb22d1..4d66c00 100644 (file)
@@ -1,2 +1,2 @@
 alt/base_init_autoinit3_alt7.nit:41,2--9: Error: `autoinit` and `noautoinit` are incompatible.
-alt/base_init_autoinit3_alt7.nit:41,2--9: Syntax error: `autoinit` expects method identifiers, use `noautoinit` to clear all autoinits.
+alt/base_init_autoinit3_alt7.nit:41,2--9: Syntax Error: `autoinit` expects method identifiers, use `noautoinit` to clear all autoinits.
index af10e70..7c97b15 100644 (file)
@@ -1 +1 @@
-alt/base_init_autoinit_alt1.nit:53,20--27: Error: `autoinit` cannot be set on redefinitions
+alt/base_init_autoinit_alt1.nit:53,20--27: Error: `autoinit` cannot be set on redefinitions.
index 2a26047..3f0cb06 100644 (file)
@@ -1 +1 @@
-base_init_inherit3.nit:85,12--14: Error: No property Q::foo is inherited. Remove the redef keyword to define a new property.
+base_init_inherit3.nit:85,12--14: Error: no property `Q::foo` is inherited. Remove the `redef` keyword to define a new property.
index 7b79d27..480238b 100644 (file)
@@ -1 +1 @@
-base_init_inherit4.nit:84,2--9: Error: Method 'cb' doesn't exists in Q.
+base_init_inherit4.nit:84,8--9: Error: method `cb` does not exists in `Q`.
index fc63fc7..75e4d4c 100644 (file)
@@ -1 +1 @@
-alt/base_init_linext2_alt1.nit:100,1--5: Error: No super method to call for initd.
+alt/base_init_linext2_alt1.nit:100,1--5: Error: no super method to call for `initd`.
index 0e9d1ef..1235c2b 100644 (file)
@@ -1 +1 @@
-alt/base_init_noinit_alt4.nit:30,3--10: Error: Incorrect number of parameters. Got 1, expected 0. Signature is 
+alt/base_init_noinit_alt4.nit:30,3--5: Error: expected 0 argument(s) for `init`; got 1. See introduction at `standard::Object::init`.
index 1f0479d..33d5bad 100644 (file)
@@ -1 +1 @@
-alt/base_init_noinit_alt5.nit:26,23--28: Error: `noautoinit` attributes cannot have an initial value
+alt/base_init_noinit_alt5.nit:26,23--28: Error: `noautoinit` attributes cannot have an initial value.
index bc300cc..18e6158 100644 (file)
@@ -1 +1 @@
-alt/base_init_nosuper_alt2.nit:27,13--19: Error: nosuper only in `init`
+alt/base_init_nosuper_alt2.nit:27,13--19: Error: `nosuper` only allowed in `init`.
index 80861af..98e1164 100644 (file)
@@ -1 +1 @@
-alt/base_init_nosuper_alt3.nit:24,3--7: Error: method is annotated nosuper but a constructor call is present
+alt/base_init_nosuper_alt3.nit:24,3--7: Error: method is annotated `nosuper` but a super-constructor call is present.
diff --git a/tests/sav/base_init_raf2.res b/tests/sav/base_init_raf2.res
new file mode 100644 (file)
index 0000000..b64a053
--- /dev/null
@@ -0,0 +1,3 @@
+Aa
+AaBb
+Aac
index 4b258f9..66176c7 100644 (file)
@@ -1 +1 @@
-alt/base_init_simple_alt1.nit:15,13--17: Error: No property B::init3 is inherited. Remove the redef keyword to define a new property.
+alt/base_init_simple_alt1.nit:15,13--17: Error: no property `B::init3` is inherited. Remove the `redef` keyword to define a new property.
index 38219a0..d22a40b 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call2_alt1.nit:23,28--32: Error: Not enough implicit arguments to pass. Got 0, expected at least 1. Signature is (i: Int)
+alt/base_init_super_call2_alt1.nit:23,28--32: Error: not enough implicit arguments to pass. Got `0`, expected at least `1`. Signature is `(i: Int)`.
index 9a5cbe0..145abe6 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call2_alt2.nit:33,34--37: Type error: expected Int, got Bool
+alt/base_init_super_call2_alt2.nit:33,34--37: Type Error: expected `Int`, got `Bool`.
index 6c513f8..8cdfe03 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call2_alt3.nit:38,2--5: Error: Cannot do an implicit constructor call to base_init_super_call2_alt3#A#init(i: Int). Expected at least 1 arguments, got 0.
+alt/base_init_super_call2_alt3.nit:38,2--5: Error: cannot do an implicit constructor call to `base_init_super_call2_alt3#A#init(i: Int)`. Expected at least `1` arguments, got `0`.
index 6a5c1cf..823de40 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call2_alt4.nit:60,3--7: Type error: expected argument #0 of type Int, got implicit argument j of type Bool. Signature is (i: Int)
+alt/base_init_super_call2_alt4.nit:60,3--7: Type Error: expected argument #0 of type `Int`, got implicit argument `j` of type `Bool`. Signature is (i: Int)
index 2e15e41..b6e45c9 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call2_alt5.nit:84,9: Type error: expected Int, got Bool
+alt/base_init_super_call2_alt5.nit:84,9: Type Error: expected `Int`, got `Bool`.
index 0650fe9..a03aff9 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call2_alt6.nit:105,2--5: Error: Cannot do an implicit constructor call to base_init_super_call2_alt6#A#init(i: Int). Expected argument #0 of type Int, got implicit argument j of type Bool.
+alt/base_init_super_call2_alt6.nit:105,2--5: Error: cannot do an implicit constructor call to `base_init_super_call2_alt6#A#init(i: Int)`. Expected argument #0 of type `Int`, got implicit argument `j` of type `Bool`.
index 3231e7e..27c451c 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call_alt1.nit:23,28--32: Error: Not enough implicit arguments to pass. Got 0, expected at least 1. Signature is (i: Int)
+alt/base_init_super_call_alt1.nit:23,28--32: Error: not enough implicit arguments to pass. Got `0`, expected at least `1`. Signature is `(i: Int)`.
index 64f3f2f..08bfdab 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call_alt2.nit:33,34--37: Type error: expected Int, got Bool
+alt/base_init_super_call_alt2.nit:33,34--37: Type Error: expected `Int`, got `Bool`.
index ca3da80..921fd8f 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call_alt3.nit:38,2--5: Error: Cannot do an implicit constructor call to base_init_super_call_alt3#A#init(i: Int). Expected at least 1 arguments, got 0.
+alt/base_init_super_call_alt3.nit:38,2--5: Error: cannot do an implicit constructor call to `base_init_super_call_alt3#A#init(i: Int)`. Expected at least `1` arguments, got `0`.
index cc3d485..f4318fa 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call_alt4.nit:60,3--7: Type error: expected argument #0 of type Int, got implicit argument j of type Bool. Signature is (i: Int)
+alt/base_init_super_call_alt4.nit:60,3--7: Type Error: expected argument #0 of type `Int`, got implicit argument `j` of type `Bool`. Signature is (i: Int)
index 481ff08..ca3b1ff 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call_alt5.nit:84,9: Type error: expected Int, got Bool
+alt/base_init_super_call_alt5.nit:84,9: Type Error: expected `Int`, got `Bool`.
index 3352bce..724de84 100644 (file)
@@ -1 +1 @@
-alt/base_init_super_call_alt6.nit:105,2--5: Error: Cannot do an implicit constructor call to base_init_super_call_alt6#A#init(i: Int). Expected argument #0 of type Int, got implicit argument j of type Bool.
+alt/base_init_super_call_alt6.nit:105,2--5: Error: cannot do an implicit constructor call to `base_init_super_call_alt6#A#init(i: Int)`. Expected argument #0 of type `Int`, got implicit argument `j` of type `Bool`.
index 3f96e5d..69db498 100644 (file)
@@ -1 +1 @@
-alt/base_inline_statement_alt1.nit:24,23--25: Syntax error: unexpected keyword 'end'.
+alt/base_inline_statement_alt1.nit:24,23--25: Syntax Error: unexpected keyword 'end'.
index bae5cc5..f874448 100644 (file)
@@ -1 +1 @@
-alt/base_inline_statement_alt2.nit:56,59--62: Syntax error: unexpected keyword 'else'.
+alt/base_inline_statement_alt2.nit:56,59--62: Syntax Error: unexpected keyword 'else'.
index d44336d..8eee411 100644 (file)
@@ -1 +1 @@
-alt/base_inline_statement_alt3.nit:60,1--4: Syntax error: unexpected keyword 'else'.
+alt/base_inline_statement_alt3.nit:60,1--4: Syntax Error: unexpected keyword 'else'.
index 57d3ecb..fd24aa1 100644 (file)
@@ -1,5 +1,5 @@
-base_isa.nit:39,2--13: Warning: Expression is already a Object.
-base_isa.nit:49,2--13: Warning: Expression is already a Object.
+base_isa.nit:39,2--13: Warning: expression is already a `Object`.
+base_isa.nit:49,2--13: Warning: expression is already a `Object`.
 true
 true
 true
index ba69aa1..53b30ca 100644 (file)
@@ -1,3 +1,3 @@
-base_isa1.nit:56,9--15: Warning: Expression is already a A since it is a G.
-base_isa1.nit:58,9--15: Warning: Expression is already a B since it is a D.
+base_isa1.nit:56,9--15: Warning: expression is already a `A` since it is a `G`.
+base_isa1.nit:58,9--15: Warning: expression is already a `B` since it is a `D`.
 true
index eb33097..bd10b16 100644 (file)
@@ -1,2 +1,2 @@
-base_isa2.nit:21,10--19: Warning: Expression is already a A.
+base_isa2.nit:21,10--19: Warning: expression is already a `A`.
 true
index fb8cf07..0c4b877 100644 (file)
@@ -1,12 +1,12 @@
-base_isa3.nit:59,8--14: Warning: Expression is already a A since it is a B.
-base_isa3.nit:64,8--14: Warning: Expression is already a A since it is a C.
-base_isa3.nit:69,8--14: Warning: Expression is already a A since it is a D.
-base_isa3.nit:73,8--14: Warning: Expression is already a E since it is a D.
-base_isa3.nit:74,8--14: Warning: Expression is already a E.
-base_isa3.nit:75,8--14: Warning: Expression is already a E.
-base_isa3.nit:76,8--14: Warning: Expression is already a E.
-base_isa3.nit:79,8--14: Warning: Expression is already a A since it is a E.
-base_isa3.nit:84,8--14: Warning: Expression is already a A since it is a F.
-base_isa3.nit:87,8--14: Warning: Expression is already a G since it is a F.
-base_isa3.nit:91,8--14: Warning: Expression is already a A since it is a G.
+base_isa3.nit:59,8--14: Warning: expression is already a `A` since it is a `B`.
+base_isa3.nit:64,8--14: Warning: expression is already a `A` since it is a `C`.
+base_isa3.nit:69,8--14: Warning: expression is already a `A` since it is a `D`.
+base_isa3.nit:73,8--14: Warning: expression is already a `E` since it is a `D`.
+base_isa3.nit:74,8--14: Warning: expression is already a `E`.
+base_isa3.nit:75,8--14: Warning: expression is already a `E`.
+base_isa3.nit:76,8--14: Warning: expression is already a `E`.
+base_isa3.nit:79,8--14: Warning: expression is already a `A` since it is a `E`.
+base_isa3.nit:84,8--14: Warning: expression is already a `A` since it is a `F`.
+base_isa3.nit:87,8--14: Warning: expression is already a `G` since it is a `F`.
+base_isa3.nit:91,8--14: Warning: expression is already a `A` since it is a `G`.
 true
index a982734..7506bd3 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast2_alt1.nit:35,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast2_alt1.nit:35,4--6: Error: method `foo` does not exists in `A`.
index e4ae9a8..719fe47 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast2_alt2.nit:37,1--9: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast2_alt2.nit:37,3--5: Error: method `foo` does not exists in `A`.
index 4230d82..551113c 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast2_alt3.nit:39,1--9: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast2_alt3.nit:39,3--5: Error: method `foo` does not exists in `A`.
index 6d59377..4762ab2 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast2_alt4.nit:42,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast2_alt4.nit:42,4--6: Error: method `foo` does not exists in `A`.
index 02ec11f..16c2fde 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast2_alt5.nit:52,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast2_alt5.nit:52,4--6: Error: method `foo` does not exists in `A`.
index 4e56b3b..f8d84e1 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast2_alt6.nit:54,1--9: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast2_alt6.nit:54,3--5: Error: method `foo` does not exists in `A`.
index 8b543e8..63e3759 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast2_alt7.nit:57,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast2_alt7.nit:57,4--6: Error: method `foo` does not exists in `A`.
index 6043983..05c7ee3 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt1.nit:34,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt1.nit:34,4--6: Error: method `foo` does not exists in `A`.
index 90d9501..2bf1516 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt2.nit:36,1--9: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt2.nit:36,3--5: Error: method `foo` does not exists in `A`.
index 6dd921f..a69f825 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt3.nit:39,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt3.nit:39,4--6: Error: method `foo` does not exists in `A`.
index ce132de..9a94d52 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt4.nit:43,1--9: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt4.nit:43,3--5: Error: method `foo` does not exists in `A`.
index 72b28de..5117a38 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt5.nit:48,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt5.nit:48,4--6: Error: method `foo` does not exists in `A`.
index 9662e6a..67ad391 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt6.nit:50,1--9: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt6.nit:50,3--5: Error: method `foo` does not exists in `A`.
index 7f0add5..5fbe9b9 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt7.nit:53,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt7.nit:53,4--6: Error: method `foo` does not exists in `A`.
index 8670269..b1d650a 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt8.nit:57,1--9: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt8.nit:57,3--5: Error: method `foo` does not exists in `A`.
index b42841b..618b660 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast3_alt9.nit:64,2--10: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast3_alt9.nit:64,4--6: Error: method `foo` does not exists in `A`.
index 27da19b..7c59b1d 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast4_alt1.nit:40,1--8: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast4_alt1.nit:40,3--5: Error: method `foo` does not exists in `A`.
index 9d1c0dd..53ee73b 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast4_alt2.nit:49,1--8: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast4_alt2.nit:49,3--5: Error: method `foo` does not exists in `A`.
index afc672b..e0b6a6c 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast4_alt3.nit:58,1--8: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast4_alt3.nit:58,3--5: Error: method `foo` does not exists in `A`.
index 6cad704..86c016f 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast4_alt4.nit:74,1--8: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast4_alt4.nit:74,3--5: Error: method `foo` does not exists in `A`.
index 99a6efa..b184f87 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_alt1.nit:43,1--5: Error: Method 'bar' doesn't exists in B.
+alt/base_isa_cast_alt1.nit:43,3--5: Error: method `bar` does not exists in `B`.
index 4760a79..d174731 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_alt2.nit:46,1--5: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast_alt2.nit:46,3--5: Error: method `foo` does not exists in `A`.
index becbea3..8f68a9f 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_alt3.nit:48,1--5: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast_alt3.nit:48,3--5: Error: method `foo` does not exists in `A`.
index 94ee2fc..f1ce231 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_alt4.nit:55,1--5: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast_alt4.nit:55,3--5: Error: method `foo` does not exists in `A`.
index 555169f..4ce4399 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_alt7.nit:63,1--5: Error: Method 'foo' doesn't exists in A.
+alt/base_isa_cast_alt7.nit:63,3--5: Error: method `foo` does not exists in `A`.
index e282838..b32d347 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_self_alt1.nit:29,1--3: Error: Method or variable 'bar' unknown in B.
+alt/base_isa_cast_self_alt1.nit:29,1--3: Error: method or variable `bar` unknown in `B`.
index a4aefb5..a5b1539 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_self_alt2.nit:32,1--3: Error: Method or variable 'foo' unknown in A.
+alt/base_isa_cast_self_alt2.nit:32,1--3: Error: method or variable `foo` unknown in `A`.
index bd85b63..4dbbbfa 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_self_alt3.nit:34,1--3: Error: Method or variable 'foo' unknown in A.
+alt/base_isa_cast_self_alt3.nit:34,1--3: Error: method or variable `foo` unknown in `A`.
index c8c80d7..502e15c 100644 (file)
@@ -1 +1 @@
-alt/base_isa_cast_self_alt4.nit:41,1--3: Error: Method or variable 'foo' unknown in A.
+alt/base_isa_cast_self_alt4.nit:41,1--3: Error: method or variable `foo` unknown in `A`.
index c75a7bf..e8ade92 100644 (file)
@@ -1,4 +1,4 @@
-base_isa_gen1.nit:62,8--14: Warning: Expression is already a A since it is a F.
-base_isa_gen1.nit:65,8--29: Warning: Expression is already a D[Object, Object] since it is a G[Object].
-base_isa_gen1.nit:66,8--29: Warning: Expression is already a D[Object, Object] since it is a E[F].
+base_isa_gen1.nit:62,8--14: Warning: expression is already a `A` since it is a `F`.
+base_isa_gen1.nit:65,8--29: Warning: expression is already a `D[Object, Object]` since it is a `G[Object]`.
+base_isa_gen1.nit:66,8--29: Warning: expression is already a `D[Object, Object]` since it is a `E[F]`.
 true
index 642140a..1994474 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_gen2.nit:39,8--21: Warning: Expression is already a A[Object].
-base_isa_gen2.nit:41,8--21: Warning: Expression is already a A[Object] since it is a B[Object].
-base_isa_gen2.nit:44,8--21: Warning: Expression is already a A[Object] since it is a C[Object].
-base_isa_gen2.nit:48,8--21: Warning: Expression is already a A[Object] since it is a D[Object, Object].
+base_isa_gen2.nit:39,8--21: Warning: expression is already a `A[Object]`.
+base_isa_gen2.nit:41,8--21: Warning: expression is already a `A[Object]` since it is a `B[Object]`.
+base_isa_gen2.nit:44,8--21: Warning: expression is already a `A[Object]` since it is a `C[Object]`.
+base_isa_gen2.nit:48,8--21: Warning: expression is already a `A[Object]` since it is a `D[Object, Object]`.
 true
index f2f9925..a44ef54 100644 (file)
@@ -1,2 +1,2 @@
-base_isa_gen3.nit:20,37--48: Warning: Expression is already a Object.
+base_isa_gen3.nit:20,37--48: Warning: expression is already a `Object`.
 true
index 9b5e39d..427c827 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_gen4.nit:34,8--15: Warning: Expression is already a A since it is a B[Canard].
-base_isa_gen4.nit:36,8--22: Warning: Expression is already a B[Animal] since it is a B[Canard].
-base_isa_gen4.nit:40,8--24: Warning: Expression is already a B[B[Canard]].
-base_isa_gen4.nit:42,8--24: Warning: Expression is already a B[B[Animal]] since it is a B[B[Canard]].
+base_isa_gen4.nit:34,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
+base_isa_gen4.nit:36,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen4.nit:40,8--24: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen4.nit:42,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 true
index 7d6532f..6e347f5 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_gen5.nit:39,8--15: Warning: Expression is already a A since it is a B[Canard].
-base_isa_gen5.nit:41,8--22: Warning: Expression is already a B[Animal] since it is a B[Canard].
-base_isa_gen5.nit:46,8--24: Warning: Expression is already a B[B[Canard]].
-base_isa_gen5.nit:48,8--24: Warning: Expression is already a B[B[Animal]] since it is a B[B[Canard]].
+base_isa_gen5.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
+base_isa_gen5.nit:41,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen5.nit:46,8--24: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen5.nit:48,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 true
index e7cc1c6..1569432 100644 (file)
@@ -1,10 +1,10 @@
-base_isa_gen8.nit:49,8--17: Warning: Expression is already a A[X].
-base_isa_gen8.nit:50,8--17: Warning: Expression is already a A[Y].
-base_isa_gen8.nit:51,8--17: Warning: Expression is already a A[Z].
-base_isa_gen8.nit:53,8--21: Warning: Expression is already a B[Object] since it is a B[X].
-base_isa_gen8.nit:55,8--21: Warning: Expression is already a C[X, X].
-base_isa_gen8.nit:56,8--21: Warning: Expression is already a C[X, Y].
-base_isa_gen8.nit:57,8--21: Warning: Expression is already a C[X, Z].
-base_isa_gen8.nit:59,8--22: Warning: Expression is already a D[X, Y, Z].
-base_isa_gen8.nit:60,8--28: Warning: Expression is already a E[X, Y, Z, Bool].
+base_isa_gen8.nit:49,8--17: Warning: expression is already a `A[X]`.
+base_isa_gen8.nit:50,8--17: Warning: expression is already a `A[Y]`.
+base_isa_gen8.nit:51,8--17: Warning: expression is already a `A[Z]`.
+base_isa_gen8.nit:53,8--21: Warning: expression is already a `B[Object]` since it is a `B[X]`.
+base_isa_gen8.nit:55,8--21: Warning: expression is already a `C[X, X]`.
+base_isa_gen8.nit:56,8--21: Warning: expression is already a `C[X, Y]`.
+base_isa_gen8.nit:57,8--21: Warning: expression is already a `C[X, Z]`.
+base_isa_gen8.nit:59,8--22: Warning: expression is already a `D[X, Y, Z]`.
+base_isa_gen8.nit:60,8--28: Warning: expression is already a `E[X, Y, Z, Bool]`.
 true
index 7ed4ba5..fe426c4 100644 (file)
@@ -1,6 +1,6 @@
-base_isa_nil.nit:33,2--13: Warning: Expression is already a Object.
-base_isa_nil.nit:36,2--22: Warning: Expression is already a nullable Object.
-base_isa_nil.nit:43,2--22: Warning: Expression is already a nullable Object.
+base_isa_nil.nit:33,2--13: Warning: expression is already a `Object`.
+base_isa_nil.nit:36,2--22: Warning: expression is already a `nullable Object`.
+base_isa_nil.nit:43,2--22: Warning: expression is already a `nullable Object`.
 true
 true
 true
index 16f5b04..ae76751 100644 (file)
@@ -1,6 +1,6 @@
-base_isa_nullable1.nit:39,8--15: Warning: Expression is already a A since it is a B[Integer].
-base_isa_nullable1.nit:41,8--24: Warning: Expression is already a B[Discrete] since it is a B[Integer].
-base_isa_nullable1.nit:46,8--25: Warning: Expression is already a B[B[Integer]].
-base_isa_nullable1.nit:48,8--26: Warning: Expression is already a B[B[Discrete]] since it is a B[B[Integer]].
-base_isa_nullable1.nit:50,8--33: Warning: Expression is already a B[nullable Discrete] since it is a B[Discrete].
+base_isa_nullable1.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Integer]`.
+base_isa_nullable1.nit:41,8--24: Warning: expression is already a `B[Discrete]` since it is a `B[Integer]`.
+base_isa_nullable1.nit:46,8--25: Warning: expression is already a `B[B[Integer]]`.
+base_isa_nullable1.nit:48,8--26: Warning: expression is already a `B[B[Discrete]]` since it is a `B[B[Integer]]`.
+base_isa_nullable1.nit:50,8--33: Warning: expression is already a `B[nullable Discrete]` since it is a `B[Discrete]`.
 true
index 3f41608..b4b3d25 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_nullable2.nit:27,8--23: Warning: Expression is already a nullable A since it is a A.
-base_isa_nullable2.nit:29,8--30: Warning: Expression is already a nullable B[Object] since it is a B[Object].
-base_isa_nullable2.nit:30,8--39: Warning: Expression is already a nullable B[nullable Object] since it is a nullable B[Object].
-base_isa_nullable2.nit:33,8--30: Warning: Expression is already a C[nullable Object].
+base_isa_nullable2.nit:27,8--23: Warning: expression is already a `nullable A` since it is a `A`.
+base_isa_nullable2.nit:29,8--30: Warning: expression is already a `nullable B[Object]` since it is a `B[Object]`.
+base_isa_nullable2.nit:30,8--39: Warning: expression is already a `nullable B[nullable Object]` since it is a `nullable B[Object]`.
+base_isa_nullable2.nit:33,8--30: Warning: expression is already a `C[nullable Object]`.
 true
index f80c36c..3ba9f50 100644 (file)
@@ -1,6 +1,6 @@
-base_isa_vt_gen1.nit:30,10--34: Warning: Expression is already a Triple[T, U, V].
-base_isa_vt_gen1.nit:54,8--52: Warning: Expression is already a Triple[String, Int, nullable Object].
-base_isa_vt_gen1.nit:57,8--46: Warning: Expression is already a Triple[String, String, String].
-base_isa_vt_gen1.nit:60,8--48: Warning: Expression is already a Triple[String, String, B[String]].
-base_isa_vt_gen1.nit:63,8--46: Warning: Expression is already a Triple[String, String, String].
+base_isa_vt_gen1.nit:30,10--34: Warning: expression is already a `Triple[T, U, V]`.
+base_isa_vt_gen1.nit:54,8--52: Warning: expression is already a `Triple[String, Int, nullable Object]`.
+base_isa_vt_gen1.nit:57,8--46: Warning: expression is already a `Triple[String, String, String]`.
+base_isa_vt_gen1.nit:60,8--48: Warning: expression is already a `Triple[String, String, B[String]]`.
+base_isa_vt_gen1.nit:63,8--46: Warning: expression is already a `Triple[String, String, String]`.
 true
index 8163c32..018aa9f 100644 (file)
@@ -1,6 +1,6 @@
-base_iterator3.nit:35,1--25: Type Error: 'for' expects method 'iterator' to return an 'Iterator' or 'MapIterator' type'.
-base_iterator3.nit:39,1--25: Type Error: 'for' expects method 'iterator' to return an 'Iterator' or 'MapIterator' type'.
-base_iterator3.nit:43,1--25: Error: Method 'iterator' doesn't exists in Test3.
-base_iterator3.nit:43,1--25: Type Error: 'for' expects a type providing 'iterator' method, got 'Test3'.
-base_iterator3.nit:46,1--48: Type Error: 'for' expects only one variable when using 'Iterator'.
-base_iterator3.nit:47,1--47: Type Error: 'for' expects two variables when using 'MapIterator'.
+base_iterator3.nit:35,1--25: Type Error: `for` expects the method `iterator` to return an `Iterator` or `MapIterator` type.
+base_iterator3.nit:39,1--25: Type Error: `for` expects the method `iterator` to return an `Iterator` or `MapIterator` type.
+base_iterator3.nit:43,1--25: Error: method `iterator` does not exists in `Test3`.
+base_iterator3.nit:43,1--25: Type Error: `for` expects a type providing an `iterator` method, got `Test3`.
+base_iterator3.nit:46,1--48: Type Error: `for` expects only one variable when using `Iterator`.
+base_iterator3.nit:47,1--47: Type Error: `for` expects two variables when using `MapIterator`.
index 4d99931..0449fd7 100644 (file)
@@ -1 +1 @@
-alt/base_label_do_alt2.nit:29,9--16: Syntax error: invalid label l3.
+alt/base_label_do_alt2.nit:29,9--16: Syntax Error: invalid label `l3`.
index 204520e..31fd348 100644 (file)
@@ -1 +1 @@
-alt/base_label_do_alt3.nit:30,9--16: Syntax error: invalid label l4.
+alt/base_label_do_alt3.nit:30,9--16: Syntax Error: invalid label `l4`.
index e571486..e6f6471 100644 (file)
@@ -1 +1 @@
-alt/base_label_do_alt6.nit:37,6--13: Syntax error: label l1 already defined.
+alt/base_label_do_alt6.nit:37,6--13: Syntax Error: label `l1` already defined.
index 45fc0ef..43c642c 100644 (file)
@@ -1 +1 @@
-alt/base_label_for_alt2.nit:30,9--16: Syntax error: invalid label l3.
+alt/base_label_for_alt2.nit:30,9--16: Syntax Error: invalid label `l3`.
index 187689e..c01668f 100644 (file)
@@ -1 +1 @@
-alt/base_label_for_alt3.nit:31,9--16: Syntax error: invalid label l4.
+alt/base_label_for_alt3.nit:31,9--16: Syntax Error: invalid label `l4`.
index 48a8ce6..5cb58bf 100644 (file)
@@ -1 +1 @@
-alt/base_label_for_alt6.nit:38,6--13: Syntax error: label l1 already defined.
+alt/base_label_for_alt6.nit:38,6--13: Syntax Error: label `l1` already defined.
index 484f2d9..8c9fe75 100644 (file)
@@ -1 +1 @@
-alt/base_label_loop_alt2.nit:34,9--16: Syntax error: invalid label l3.
+alt/base_label_loop_alt2.nit:34,9--16: Syntax Error: invalid label `l3`.
index 6a45e76..89238b5 100644 (file)
@@ -1 +1 @@
-alt/base_label_loop_alt3.nit:35,9--16: Syntax error: invalid label l4.
+alt/base_label_loop_alt3.nit:35,9--16: Syntax Error: invalid label `l4`.
index 473c238..90459d2 100644 (file)
@@ -1 +1 @@
-alt/base_label_loop_alt6.nit:43,6--13: Syntax error: label l1 already defined.
+alt/base_label_loop_alt6.nit:43,6--13: Syntax Error: label `l1` already defined.
index 48cf58d..cb4a3ad 100644 (file)
@@ -1 +1 @@
-alt/base_label_while2_alt6.nit:35,6--10: Syntax error: anonymous label already defined.
+alt/base_label_while2_alt6.nit:35,6--10: Syntax Error: anonymous label already defined.
index eb284b5..b8309c4 100644 (file)
@@ -1 +1 @@
-alt/base_label_while2_alt7.nit:33,23--27: Syntax error: invalid anonymous label.
+alt/base_label_while2_alt7.nit:33,23--27: Syntax Error: invalid anonymous label.
index 0057fe8..904791e 100644 (file)
@@ -1 +1 @@
-alt/base_label_while_alt2.nit:32,9--16: Syntax error: invalid label l3.
+alt/base_label_while_alt2.nit:32,9--16: Syntax Error: invalid label `l3`.
index 1b91617..d437fef 100644 (file)
@@ -1 +1 @@
-alt/base_label_while_alt3.nit:33,9--16: Syntax error: invalid label l4.
+alt/base_label_while_alt3.nit:33,9--16: Syntax Error: invalid label `l4`.
index b539bfb..66f24da 100644 (file)
@@ -1 +1 @@
-alt/base_label_while_alt6.nit:40,6--13: Syntax error: label l1 already defined.
+alt/base_label_while_alt6.nit:40,6--13: Syntax Error: label `l1` already defined.
index 299f30f..5b14b4e 100644 (file)
@@ -1 +1 @@
-alt/base_meth_call_alt1.nit:36,1--6: Type error: expected expression.
+alt/base_meth_call_alt1.nit:36,1--6: Error: expected an expression.
index a70f417..334812f 100644 (file)
@@ -1 +1 @@
-alt/base_meth_call_alt2.nit:37,9--14: Type error: expected expression.
+alt/base_meth_call_alt2.nit:37,9--14: Error: expected an expression.
index 302f4f7..d50561e 100644 (file)
@@ -1 +1 @@
-alt/base_meth_call_alt3.nit:39,5--10: Type error: expected expression.
+alt/base_meth_call_alt3.nit:39,5--10: Error: expected an expression.
index 4c84f3d..7ce7c64 100644 (file)
@@ -1 +1 @@
-alt/base_meth_call_alt4.nit:41,5--11: Type error: expected expression.
+alt/base_meth_call_alt4.nit:41,5--11: Error: expected an expression.
index e0424d3..72c463d 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt1.nit:23,18: Type error: expected A, got Int
+alt/base_new_alt1.nit:23,18: Type Error: expected `A`, got `Int`.
index 0e7983c..6206ab9 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt2.nit:24,6: Control error: Reached end of function (a 'return' with a value was expected).
+alt/base_new_alt2.nit:24,6: Error: reached end of function; expected `return` with a value.
index bc5d6cd..ed605f5 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt3.nit:25,18--21: Error: self cannot be used in top-level method.
+alt/base_new_alt3.nit:25,18--21: Error: `self` cannot be used in top-level method.
index d89b91e..7f0a226 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt4.nit:26,23--31: Error: 'object_id' is not a top-level method, thus need a receiver.
+alt/base_new_alt4.nit:26,23--31: Error: `object_id` is not a top-level method, thus need a receiver.
index e9c98c9..01fa73e 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt5.nit:63,1--9: Error: Method 'i' doesn't exists in A.
+alt/base_new_alt5.nit:63,9: Error: method `i` does not exists in `A`.
index 3ac7e2a..357fa5a 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt6.nit:65,1--12: Error: Method 'i' doesn't exists in A.
+alt/base_new_alt6.nit:65,12: Error: method `i` does not exists in `A`.
index 99ce3e1..59eb262 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt7.nit:83,2--9: Error: Method 'n2' doesn't exists in C.
+alt/base_new_alt7.nit:83,8--9: Error: method `n2` does not exists in `C`.
index 51ee855..880abb6 100644 (file)
@@ -1 +1 @@
-alt/base_new_alt8.nit:91,2--8: Type Error: Cannot instantiate enum Int.
+alt/base_new_alt8.nit:91,2--8: Type Error: cannot instantiate enum `Int`.
diff --git a/tests/sav/base_new_intern.res b/tests/sav/base_new_intern.res
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
index 508b97a..0bca682 100644 (file)
@@ -1 +1 @@
-base_no_object.nit:11,9--13: Error: Method 'init' doesn't exists in A.
+base_no_object.nit:11,9--11: Error: method `init` does not exists in `A`.
index e262c78..acd777e 100644 (file)
@@ -1,3 +1,2 @@
-alt/base_no_object_alt1.nit:11,9--13: Error: Method 'init' doesn't exists in A.
-alt/base_no_object_alt1.nit:13,4--12: Type Error: missing primitive class `Bool'.
+alt/base_no_object_alt1.nit:11,9--11: Error: method `init` does not exists in `A`.
 alt/base_no_object_alt1.nit:13,4--12: Type Error: missing primitive class `Bool'.
diff --git a/tests/sav/base_notnull.res b/tests/sav/base_notnull.res
new file mode 100644 (file)
index 0000000..1b755df
--- /dev/null
@@ -0,0 +1,18 @@
+base_notnull.nit:25,6: Warning: expression is not null, since it is a `not null E`.
+base_notnull.nit:28,6: Warning: expression is not null, since it is a `not null E`.
+base_notnull.nit:31,7: Warning: expression is not null, since it is a `not null E`.
+base_notnull.nit:32,7: Warning: expression is not null, since it is a `not null E`.
+base_notnull.nit:33,7: Warning: expression is not null, since it is a `not null E`.
+base_notnull.nit:34,7: Warning: expression is not null, since it is a `not null E`.
+base_notnull.nit:35,7: Warning: expression is not null, since it is a `not null E`.
+base_notnull.nit:36,7: Warning: expression is not null, since it is a `not null E`.
+1
+2
+1
+2
+1
+2
+1
+2
+1
+2
diff --git a/tests/sav/base_notnull_1alt1.res b/tests/sav/base_notnull_1alt1.res
new file mode 100644 (file)
index 0000000..925e389
--- /dev/null
@@ -0,0 +1,18 @@
+alt/base_notnull_1alt1.nit:25,6: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1.nit:28,6: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1.nit:31,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1.nit:32,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1.nit:33,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1.nit:34,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1.nit:35,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1.nit:36,7: Warning: expression is not null, since it is a `not null E`.
+1
+2
+1
+2
+1
+2
+1
+2
+1
+2
diff --git a/tests/sav/base_notnull_1alt1_alt1.res b/tests/sav/base_notnull_1alt1_alt1.res
new file mode 100644 (file)
index 0000000..75b7651
--- /dev/null
@@ -0,0 +1,6 @@
+alt/base_notnull_1alt1_alt1.nit:23,7: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_1alt1_alt1.nit:24,7: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_1alt1_alt1.nit:27,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt1.nit:30,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt1.nit:35,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_1alt1_alt1.nit:36,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
diff --git a/tests/sav/base_notnull_1alt1_alt2.res b/tests/sav/base_notnull_1alt1_alt2.res
new file mode 100644 (file)
index 0000000..a316b82
--- /dev/null
@@ -0,0 +1,18 @@
+alt/base_notnull_1alt1_alt2.nit:25,6: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1_alt2.nit:28,6: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1_alt2.nit:31,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1_alt2.nit:32,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1_alt2.nit:33,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1_alt2.nit:34,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1_alt2.nit:35,7: Warning: expression is not null, since it is a `not null E`.
+alt/base_notnull_1alt1_alt2.nit:36,7: Warning: expression is not null, since it is a `not null E`.
+1
+2
+1
+2
+1
+2
+1
+2
+1
+2
diff --git a/tests/sav/base_notnull_1alt1_alt3.res b/tests/sav/base_notnull_1alt1_alt3.res
new file mode 100644 (file)
index 0000000..3d05a54
--- /dev/null
@@ -0,0 +1,14 @@
+alt/base_notnull_1alt1_alt3.nit:23,7: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt3.nit:24,7: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt3.nit:27,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt3.nit:30,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt3.nit:31,7--20: Type Error: `as(not null)` on `null`.
+alt/base_notnull_1alt1_alt3.nit:32,7--20: Type Error: `as(not null)` on `null`.
+alt/base_notnull_1alt1_alt3.nit:33,7: Type Error: `or else` on `null`.
+alt/base_notnull_1alt1_alt3.nit:33,7--17: Type Error: expected `Object`, got `nullable Int`.
+alt/base_notnull_1alt1_alt3.nit:34,7: Type Error: `or else` on `null`.
+alt/base_notnull_1alt1_alt3.nit:34,7--17: Type Error: expected `Object`, got `nullable Int`.
+alt/base_notnull_1alt1_alt3.nit:35,7: Type Error: `or else` on `null`.
+alt/base_notnull_1alt1_alt3.nit:35,7--17: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt3.nit:36,7: Type Error: `or else` on `null`.
+alt/base_notnull_1alt1_alt3.nit:36,7--17: Type Error: expected `Object`, got `null`.
diff --git a/tests/sav/base_notnull_1alt1_alt4.res b/tests/sav/base_notnull_1alt1_alt4.res
new file mode 100644 (file)
index 0000000..0669cc0
--- /dev/null
@@ -0,0 +1,6 @@
+alt/base_notnull_1alt1_alt4.nit:23,7: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_1alt1_alt4.nit:24,7: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_1alt1_alt4.nit:27,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt4.nit:30,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_1alt1_alt4.nit:35,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_1alt1_alt4.nit:36,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
diff --git a/tests/sav/base_notnull_alt1.res b/tests/sav/base_notnull_alt1.res
new file mode 100644 (file)
index 0000000..70d320e
--- /dev/null
@@ -0,0 +1,6 @@
+alt/base_notnull_alt1.nit:23,7: Type Error: expected `Object`, got `E: nullable Object`.
+alt/base_notnull_alt1.nit:24,7: Type Error: expected `Object`, got `E: nullable Object`.
+alt/base_notnull_alt1.nit:27,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt1.nit:30,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt1.nit:35,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_alt1.nit:36,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
diff --git a/tests/sav/base_notnull_alt2.res b/tests/sav/base_notnull_alt2.res
new file mode 100644 (file)
index 0000000..9450e83
--- /dev/null
@@ -0,0 +1,20 @@
+alt/base_notnull_alt2.nit:21,10: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:22,10: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:25,6: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:28,6: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:31,7: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:32,7: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:33,7: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:34,7: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:35,7: Warning: expression is not null, since it is a `E: Object`.
+alt/base_notnull_alt2.nit:36,7: Warning: expression is not null, since it is a `E: Object`.
+1
+2
+1
+2
+1
+2
+1
+2
+1
+2
diff --git a/tests/sav/base_notnull_alt3.res b/tests/sav/base_notnull_alt3.res
new file mode 100644 (file)
index 0000000..5ce5c18
--- /dev/null
@@ -0,0 +1,14 @@
+alt/base_notnull_alt3.nit:23,7: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt3.nit:24,7: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt3.nit:27,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt3.nit:30,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt3.nit:31,7--20: Type Error: `as(not null)` on `null`.
+alt/base_notnull_alt3.nit:32,7--20: Type Error: `as(not null)` on `null`.
+alt/base_notnull_alt3.nit:33,7: Type Error: `or else` on `null`.
+alt/base_notnull_alt3.nit:33,7--17: Type Error: expected `Object`, got `nullable Int`.
+alt/base_notnull_alt3.nit:34,7: Type Error: `or else` on `null`.
+alt/base_notnull_alt3.nit:34,7--17: Type Error: expected `Object`, got `nullable Int`.
+alt/base_notnull_alt3.nit:35,7: Type Error: `or else` on `null`.
+alt/base_notnull_alt3.nit:35,7--17: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt3.nit:36,7: Type Error: `or else` on `null`.
+alt/base_notnull_alt3.nit:36,7--17: Type Error: expected `Object`, got `null`.
diff --git a/tests/sav/base_notnull_alt4.res b/tests/sav/base_notnull_alt4.res
new file mode 100644 (file)
index 0000000..356b367
--- /dev/null
@@ -0,0 +1,6 @@
+alt/base_notnull_alt4.nit:23,7: Type Error: expected `Object`, got `E: nullable Object`.
+alt/base_notnull_alt4.nit:24,7: Type Error: expected `Object`, got `E: nullable Object`.
+alt/base_notnull_alt4.nit:27,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt4.nit:30,12: Type Error: expected `Object`, got `null`.
+alt/base_notnull_alt4.nit:35,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
+alt/base_notnull_alt4.nit:36,7--17: Type Error: expected `Object`, got `nullable E: nullable Object`.
diff --git a/tests/sav/base_notnull_lit.res b/tests/sav/base_notnull_lit.res
new file mode 100644 (file)
index 0000000..dc19389
--- /dev/null
@@ -0,0 +1,4 @@
+Array[Int]
+156
+Range[Int]
+12345
diff --git a/tests/sav/base_notnull_lit_alt1.res b/tests/sav/base_notnull_lit_alt1.res
new file mode 100644 (file)
index 0000000..da364b6
--- /dev/null
@@ -0,0 +1 @@
+alt/base_notnull_lit_alt1.nit:27,14: Type Error: expected `Discrete`, got `E: nullable Discrete`.
diff --git a/tests/sav/base_notnull_lit_alt2.res b/tests/sav/base_notnull_lit_alt2.res
new file mode 100644 (file)
index 0000000..522489c
--- /dev/null
@@ -0,0 +1 @@
+Runtime error: Assert failed (alt/base_notnull_lit_alt2.nit:19)
index 80acf2a..814a7ef 100644 (file)
@@ -1,5 +1,3 @@
-base_null.nit:28,2--13: Warning: expression is not null, since it is a `null`.
-base_null.nit:42,2--13: Warning: expression is not null, since it is a `null`.
 false
 false
 true
index 8b219cf..5963318 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt1.nit:36,13--14: Type error: expected A, got nullable A
+alt/base_nullable_alt1.nit:36,13--14: Type Error: expected `A`, got `nullable A`.
index db447d6..d8ad2f0 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt10.nit:55,18--21: Type error: expected Object, got null
+alt/base_nullable_alt10.nit:55,18--21: Type Error: expected `Object`, got `null`.
index 65c0daa..48861f5 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt2.nit:37,13: Type error: expected A, got Object
+alt/base_nullable_alt2.nit:37,13: Type Error: expected `A`, got `Object`.
index aa339a1..0f16cb5 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt3.nit:38,13--14: Type error: expected A, got nullable Object
+alt/base_nullable_alt3.nit:38,13--14: Type Error: expected `A`, got `nullable Object`.
index d6ebe3e..ae251cc 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt4.nit:41,23: Type error: expected nullable A, got Object
+alt/base_nullable_alt4.nit:41,23: Type Error: expected `nullable A`, got `Object`.
index 50b3d9f..e18b5f4 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt5.nit:42,23--24: Type error: expected nullable A, got nullable Object
+alt/base_nullable_alt5.nit:42,23--24: Type Error: expected `nullable A`, got `nullable Object`.
index 38398ad..1e2ffe5 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt6.nit:44,18--19: Type error: expected Object, got nullable A
+alt/base_nullable_alt6.nit:44,18--19: Type Error: expected `Object`, got `nullable A`.
index 0668b65..b149d10 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt7.nit:46,18--19: Type error: expected Object, got nullable Object
+alt/base_nullable_alt7.nit:46,18--19: Type Error: expected `Object`, got `nullable Object`.
index 5df0f11..04d4b6d 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt8.nit:51,23--39: Type error: cannot instantiate the nullable type nullable A.
+alt/base_nullable_alt8.nit:51,23--39: Type Error: cannot instantiate the nullable type `nullable A`.
index 149f63f..531e142 100644 (file)
@@ -1 +1 @@
-alt/base_nullable_alt9.nit:53,13--16: Type error: expected A, got null
+alt/base_nullable_alt9.nit:53,13--16: Type Error: expected `A`, got `null`.
index cfc290e..e47bf24 100644 (file)
@@ -1 +1 @@
-alt/base_orelse_alt1.nit:41,7: Type error: expected A, got nullable A
+alt/base_orelse_alt1.nit:41,7: Type Error: expected `A`, got `nullable A`.
index 1e496a8..724be84 100644 (file)
@@ -1 +1 @@
-alt/base_orelse_alt2.nit:47,7: Type error: expected A, got nullable A
+alt/base_orelse_alt2.nit:47,7: Type Error: expected `A`, got `nullable A`.
index c18edb9..b31e620 100644 (file)
@@ -1 +1 @@
-alt/base_prot2_alt1.nit:22,12--14: Error: No property B::pri is inherited. Remove the redef keyword to define a new property.
+alt/base_prot2_alt1.nit:22,12--14: Error: no property `B::pri` is inherited. Remove the `redef` keyword to define a new property.
index f861feb..57c2436 100644 (file)
@@ -1 +1 @@
-alt/base_prot2_alt2.nit:26,3--5: Error: Method or variable 'pri' unknown in B.
+alt/base_prot2_alt2.nit:26,3--5: Error: method or variable `pri` unknown in `B`.
index f597f61..d4016fc 100644 (file)
@@ -1 +1 @@
-alt/base_prot2_alt3.nit:35,3--7: Error: Method 'pro' is protected and can only acceded by self.
+alt/base_prot2_alt3.nit:35,5--7: Error: method `pro` is protected and can only accessed by `self`.
index 221e070..5fee89c 100644 (file)
@@ -1 +1 @@
-alt/base_prot2_alt4.nit:36,3--7: Error: Method 'pri' doesn't exists in B.
+alt/base_prot2_alt4.nit:36,5--7: Error: method `pri` does not exists in `B`.
index 5ecf371..2e830dd 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt1.nit:22,12--14: Error: No property C::pri is inherited. Remove the redef keyword to define a new property.
+alt/base_prot3_alt1.nit:22,12--14: Error: no property `C::pri` is inherited. Remove the `redef` keyword to define a new property.
index 956aacd..c95109e 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt2.nit:26,3--5: Error: Method or variable 'pri' unknown in C.
+alt/base_prot3_alt2.nit:26,3--5: Error: method or variable `pri` unknown in `C`.
index a384502..9be28ab 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt3.nit:35,3--7: Error: Method 'pro' doesn't exists in C.
+alt/base_prot3_alt3.nit:35,5--7: Error: method `pro` does not exists in `C`.
index d7f2b51..6b73f65 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt4.nit:36,3--7: Error: Method 'pri' doesn't exists in C.
+alt/base_prot3_alt4.nit:36,5--7: Error: method `pri` does not exists in `C`.
index d375312..cf4fef1 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt5.nit:20,12--14: Error: No property C::pub is inherited. Remove the redef keyword to define a new property.
+alt/base_prot3_alt5.nit:20,12--14: Error: no property `C::pub` is inherited. Remove the `redef` keyword to define a new property.
index da112d3..2cf71ee 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt6.nit:21,12--14: Error: No property C::pro is inherited. Remove the redef keyword to define a new property.
+alt/base_prot3_alt6.nit:21,12--14: Error: no property `C::pro` is inherited. Remove the `redef` keyword to define a new property.
index 06cbec1..bfaa409 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt7.nit:24,3--5: Error: Method or variable 'pub' unknown in C.
+alt/base_prot3_alt7.nit:24,3--5: Error: method or variable `pub` unknown in `C`.
index 168d1c8..7a147e2 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt8.nit:25,3--5: Error: Method or variable 'pro' unknown in C.
+alt/base_prot3_alt8.nit:25,3--5: Error: method or variable `pro` unknown in `C`.
index a708c8f..d55126c 100644 (file)
@@ -1 +1 @@
-alt/base_prot3_alt9.nit:34,3--7: Error: Method 'pub' doesn't exists in C.
+alt/base_prot3_alt9.nit:34,5--7: Error: method `pub` does not exists in `C`.
index 7d47251..aa090db 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig2_alt1.nit:19,14: Error: The public property `pubA` cannot contain the type `A` from the private module `base_prot_sig`
+alt/base_prot_sig2_alt1.nit:19,14: Error: the public property `pubA` cannot contain the type `A` from the private module `base_prot_sig`.
index 3acc272..a2a2b8f 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig2_alt2.nit:20,24: Error: The protected property `proA` cannot contain the type `A` from the private module `base_prot_sig`
+alt/base_prot_sig2_alt2.nit:20,24: Error: the protected property `proA` cannot contain the type `A` from the private module `base_prot_sig`.
index 67a0517..ac26acb 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig2_alt3.nit:23,13--22: Error: The public property `vpubA` cannot contain the type `A` from the private module `base_prot_sig`
-alt/base_prot_sig2_alt3.nit:23,13--22: Error: The public property `vpubA=` cannot contain the type `A` from the private module `base_prot_sig`
+alt/base_prot_sig2_alt3.nit:23,13--22: Error: the public property `vpubA` cannot contain the type `A` from the private module `base_prot_sig`.
+alt/base_prot_sig2_alt3.nit:23,13--22: Error: the public property `vpubA=` cannot contain the type `A` from the private module `base_prot_sig`.
index ee8649f..22866a2 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig2_alt4.nit:24,23--32: Error: The protected property `vproA` cannot contain the type `A` from the private module `base_prot_sig`
-alt/base_prot_sig2_alt4.nit:24,23--32: Error: The protected property `vproA=` cannot contain the type `A` from the private module `base_prot_sig`
+alt/base_prot_sig2_alt4.nit:24,23--32: Error: the protected property `vproA` cannot contain the type `A` from the private module `base_prot_sig`.
+alt/base_prot_sig2_alt4.nit:24,23--32: Error: the protected property `vproA=` cannot contain the type `A` from the private module `base_prot_sig`.
index 132b6f4..a2cd0c4 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig2_alt5.nit:27,6--11: Error: The public property `vpubA2` cannot contain the type `A` from the private module `base_prot_sig`
-alt/base_prot_sig2_alt5.nit:27,6--11: Error: The public property `vpubA2=` cannot contain the type `A` from the private module `base_prot_sig`
+alt/base_prot_sig2_alt5.nit:27,6--11: Error: the public property `vpubA2` cannot contain the type `A` from the private module `base_prot_sig`.
+alt/base_prot_sig2_alt5.nit:27,6--11: Error: the public property `vpubA2=` cannot contain the type `A` from the private module `base_prot_sig`.
index 0359d64..25f43e1 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig2_alt6.nit:28,16--21: Error: The protected property `vproA2` cannot contain the type `A` from the private module `base_prot_sig`
-alt/base_prot_sig2_alt6.nit:28,16--21: Error: The protected property `vproA2=` cannot contain the type `A` from the private module `base_prot_sig`
+alt/base_prot_sig2_alt6.nit:28,16--21: Error: the protected property `vproA2` cannot contain the type `A` from the private module `base_prot_sig`.
+alt/base_prot_sig2_alt6.nit:28,16--21: Error: the protected property `vproA2=` cannot contain the type `A` from the private module `base_prot_sig`.
index 0629d9d..6d747f4 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_alt1.nit:29,14: Error: The public property `pubB` cannot contain the private type `B`
+alt/base_prot_sig_alt1.nit:29,14: Error: the public property `pubB` cannot contain the private type `B`.
index a63120a..e28956b 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_alt2.nit:30,24: Error: The protected property `proB` cannot contain the private type `B`
+alt/base_prot_sig_alt2.nit:30,24: Error: the protected property `proB` cannot contain the private type `B`.
index f306920..6c32a28 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig_alt3.nit:33,13--22: Error: The public property `vpubB` cannot contain the private type `B`
-alt/base_prot_sig_alt3.nit:33,13--22: Error: The public property `vpubB=` cannot contain the private type `B`
+alt/base_prot_sig_alt3.nit:33,13--22: Error: the public property `vpubB` cannot contain the private type `B`.
+alt/base_prot_sig_alt3.nit:33,13--22: Error: the public property `vpubB=` cannot contain the private type `B`.
index c801f57..7a646cb 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig_alt4.nit:34,23--32: Error: The protected property `vproB` cannot contain the private type `B`
-alt/base_prot_sig_alt4.nit:34,23--32: Error: The protected property `vproB=` cannot contain the private type `B`
+alt/base_prot_sig_alt4.nit:34,23--32: Error: the protected property `vproB` cannot contain the private type `B`.
+alt/base_prot_sig_alt4.nit:34,23--32: Error: the protected property `vproB=` cannot contain the private type `B`.
index 5896213..01696e4 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig_alt5.nit:37,6--11: Error: The public property `vpubB2` cannot contain the private type `B`
-alt/base_prot_sig_alt5.nit:37,6--11: Error: The public property `vpubB2=` cannot contain the private type `B`
+alt/base_prot_sig_alt5.nit:37,6--11: Error: the public property `vpubB2` cannot contain the private type `B`.
+alt/base_prot_sig_alt5.nit:37,6--11: Error: the public property `vpubB2=` cannot contain the private type `B`.
index 8543455..f129fb5 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig_alt6.nit:38,16--21: Error: The protected property `vproB2` cannot contain the private type `B`
-alt/base_prot_sig_alt6.nit:38,16--21: Error: The protected property `vproB2=` cannot contain the private type `B`
+alt/base_prot_sig_alt6.nit:38,16--21: Error: the protected property `vproB2` cannot contain the private type `B`.
+alt/base_prot_sig_alt6.nit:38,16--21: Error: the protected property `vproB2=` cannot contain the private type `B`.
index a5c0088..1451e5f 100644 (file)
@@ -1,10 +1,10 @@
-alt/base_prot_sig_alt7.nit:46,2--10: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:50,2--10: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:50,37--45: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:54,2--10: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:54,34--42: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:58,2--10: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:62,2--10: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:62,37--45: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:66,2--10: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_alt7.nit:66,34--42: Error: The only legal visibility for properties in a private class is private.
+alt/base_prot_sig_alt7.nit:46,2--10: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:50,2--10: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:50,37--45: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:54,2--10: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:54,34--42: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:58,2--10: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:62,2--10: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:62,37--45: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:66,2--10: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_alt7.nit:66,34--42: Error: `private` is the only legal visibility for properties in a private class.
index fefdd66..37dc803 100644 (file)
@@ -1,4 +1,4 @@
-alt/base_prot_sig_vt_alt1.nit:22,13: Error: The public property `PUBB` cannot contain the private type `B`
-alt/base_prot_sig_vt_alt1.nit:42,17--20: Type error: class PROB not found in module base_prot_sig_vt_alt1.
-alt/base_prot_sig_vt_alt1.nit:43,27--30: Type error: class PROB not found in module base_prot_sig_vt_alt1.
-alt/base_prot_sig_vt_alt1.nit:44,25--28: Type error: class PROB not found in module base_prot_sig_vt_alt1.
+alt/base_prot_sig_vt_alt1.nit:22,13: Error: the public property `PUBB` cannot contain the private type `B`.
+alt/base_prot_sig_vt_alt1.nit:42,17--20: Error: class `PROB` not found in module `base_prot_sig_vt_alt1`.
+alt/base_prot_sig_vt_alt1.nit:43,27--30: Error: class `PROB` not found in module `base_prot_sig_vt_alt1`.
+alt/base_prot_sig_vt_alt1.nit:44,25--28: Error: class `PROB` not found in module `base_prot_sig_vt_alt1`.
index b297a48..a6ffc63 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_vt_alt2.nit:23,23: Error: The protected property `PROB` cannot contain the private type `B`
+alt/base_prot_sig_vt_alt2.nit:23,23: Error: the protected property `PROB` cannot contain the private type `B`.
index d9d7b5d..fc4294f 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_vt_alt3.nit:30,17--20: Error: The public property `pubPROA` cannot contain the protected type `PROA`
+alt/base_prot_sig_vt_alt3.nit:30,17--20: Error: the public property `pubPROA` cannot contain the protected type `PROA`.
index e078f7e..e6f7181 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_vt_alt4.nit:34,17--20: Error: The public property `pubPRIA` cannot contain the private type `PRIA`
+alt/base_prot_sig_vt_alt4.nit:34,17--20: Error: the public property `pubPRIA` cannot contain the private type `PRIA`.
index 192f5b6..895dd01 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_vt_alt5.nit:35,27--30: Error: The protected property `proPRIA` cannot contain the private type `PRIA`
+alt/base_prot_sig_vt_alt5.nit:35,27--30: Error: the protected property `proPRIA` cannot contain the private type `PRIA`.
index 60b81ba..d2e64a6 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_vt_alt6.nit:46,17--20: Error: The public property `pubPRIB` cannot contain the private type `PRIB`
+alt/base_prot_sig_vt_alt6.nit:46,17--20: Error: the public property `pubPRIB` cannot contain the private type `PRIB`.
index 9852d90..9091734 100644 (file)
@@ -1 +1 @@
-alt/base_prot_sig_vt_alt7.nit:47,27--30: Error: The protected property `proPRIB` cannot contain the private type `PRIB`
+alt/base_prot_sig_vt_alt7.nit:47,27--30: Error: the protected property `proPRIB` cannot contain the private type `PRIB`.
index 92aed50..1b740eb 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_prot_sig_vt_alt8.nit:53,2--10: Error: The only legal visibility for properties in a private class is private.
-alt/base_prot_sig_vt_alt8.nit:57,2--10: Error: The only legal visibility for properties in a private class is private.
+alt/base_prot_sig_vt_alt8.nit:53,2--10: Error: `private` is the only legal visibility for properties in a private class.
+alt/base_prot_sig_vt_alt8.nit:57,2--10: Error: `private` is the only legal visibility for properties in a private class.
index b003b18..81b5fd3 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_range_alt1.nit:26,10--14: Type error: expected Discrete, got A
-alt/base_range_alt1.nit:26,17--21: Type error: expected Discrete, got A
+alt/base_range_alt1.nit:26,10--14: Type Error: expected `Discrete`, got `A`.
+alt/base_range_alt1.nit:26,17--21: Type Error: expected `Discrete`, got `A`.
index dd25626..3f73c7f 100644 (file)
@@ -1 +1 @@
-alt/base_range_alt2.nit:28,9--16: Type Error: Cannot create range: Int vs Char
+alt/base_range_alt2.nit:28,9--16: Type Error: cannot create range: `Int` vs `Char`.
index 467d315..4c48617 100644 (file)
@@ -1 +1 @@
-alt/base_self_type_alt1.nit:25,25--29: Type error: expected SELF, got X
+alt/base_self_type_alt1.nit:25,25--29: Type Error: expected `SELF`, got `X`.
index 78888be..e3450e5 100644 (file)
@@ -1 +1 @@
-alt/base_self_type_alt3.nit:50,7: Type error: expected Y, got X
+alt/base_self_type_alt3.nit:50,7: Type Error: expected `Y`, got `X`.
index 81d5dd2..1e7a115 100644 (file)
@@ -1 +1 @@
-alt/base_sig_inh_alt1.nit:42,24--30: Error: Method 'first' doesn't exists in Int.
+alt/base_sig_inh_alt1.nit:42,26--30: Error: method `first` does not exists in `Int`.
index d23d609..a65e559 100644 (file)
@@ -1 +1 @@
-base_upcast2.nit:26,10: Type error: class T not found in module base_upcast2.
+base_upcast2.nit:26,10: Error: class `T` not found in module `base_upcast2`.
index 99abb44..81d54fb 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt1_alt10.nit:36,21: Type error: expected C, got T
+alt/base_upcast2_1alt1_alt10.nit:36,21: Type Error: expected `C`, got `T: A[Int]`.
index c5765b7..60805b9 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt1_alt2.nit:28,21--22: Type error: expected T, got A[Bool]
+alt/base_upcast2_1alt1_alt2.nit:28,21--22: Type Error: expected `T`, got `A[Bool]`.
index 29fe46d..a324947 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt1_alt7.nit:33,22: Type error: expected A[Bool], got T
+alt/base_upcast2_1alt1_alt7.nit:33,22: Type Error: expected `A[Bool]`, got `T: A[Int]`.
index 4f33a48..7807f1b 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt1_alt8.nit:34,22: Type error: expected B[Int], got T
+alt/base_upcast2_1alt1_alt8.nit:34,22: Type Error: expected `B[Int]`, got `T: A[Int]`.
index 3191dca..d4fca42 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt1_alt9.nit:35,22: Type error: expected B[Bool], got T
+alt/base_upcast2_1alt1_alt9.nit:35,22: Type Error: expected `B[Bool]`, got `T: A[Int]`.
index 63071d3..406c7ce 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt1.nit:27,21--22: Type error: expected T, got A[Int]
+alt/base_upcast2_1alt2_alt1.nit:27,21--22: Type Error: expected `T`, got `A[Int]`.
index 8d013a7..560777d 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt10.nit:36,21: Type error: expected C, got T
+alt/base_upcast2_1alt2_alt10.nit:36,21: Type Error: expected `C`, got `T: A[Bool]`.
index 693f2b2..bdc8355 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt3.nit:29,21--22: Type error: expected T, got B[Int]
+alt/base_upcast2_1alt2_alt3.nit:29,21--22: Type Error: expected `T`, got `B[Int]`.
index c8dcf37..1634e75 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt4.nit:30,21--22: Type error: expected T, got B[Bool]
+alt/base_upcast2_1alt2_alt4.nit:30,21--22: Type Error: expected `T`, got `B[Bool]`.
index f314d20..ee48227 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt5.nit:31,21: Type error: expected T, got C
+alt/base_upcast2_1alt2_alt5.nit:31,21: Type Error: expected `T`, got `C`.
index afb8ffe..8fbf6c4 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt6.nit:32,22: Type error: expected A[Int], got T
+alt/base_upcast2_1alt2_alt6.nit:32,22: Type Error: expected `A[Int]`, got `T: A[Bool]`.
index ab7c7d3..175f8a7 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt8.nit:34,22: Type error: expected B[Int], got T
+alt/base_upcast2_1alt2_alt8.nit:34,22: Type Error: expected `B[Int]`, got `T: A[Bool]`.
index c687866..468a280 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt2_alt9.nit:35,22: Type error: expected B[Bool], got T
+alt/base_upcast2_1alt2_alt9.nit:35,22: Type Error: expected `B[Bool]`, got `T: A[Bool]`.
index 665bd2b..7a63a42 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt3_alt1.nit:27,21--22: Type error: expected T, got A[Int]
+alt/base_upcast2_1alt3_alt1.nit:27,21--22: Type Error: expected `T`, got `A[Int]`.
index b64929b..4fa7404 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt3_alt10.nit:36,21: Type error: expected C, got T
+alt/base_upcast2_1alt3_alt10.nit:36,21: Type Error: expected `C`, got `T: B[Int]`.
index bd148da..84fe059 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt3_alt2.nit:28,21--22: Type error: expected T, got A[Bool]
+alt/base_upcast2_1alt3_alt2.nit:28,21--22: Type Error: expected `T`, got `A[Bool]`.
index 9ffa5b1..a8c0b9a 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt3_alt4.nit:30,21--22: Type error: expected T, got B[Bool]
+alt/base_upcast2_1alt3_alt4.nit:30,21--22: Type Error: expected `T`, got `B[Bool]`.
index 7c1ab2b..58ae026 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt3_alt5.nit:31,21: Type error: expected T, got C
+alt/base_upcast2_1alt3_alt5.nit:31,21: Type Error: expected `T`, got `C`.
index b2aeba1..1895206 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt3_alt7.nit:33,22: Type error: expected A[Bool], got T
+alt/base_upcast2_1alt3_alt7.nit:33,22: Type Error: expected `A[Bool]`, got `T: B[Int]`.
index f6151ca..7ad8c0c 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt3_alt9.nit:35,22: Type error: expected B[Bool], got T
+alt/base_upcast2_1alt3_alt9.nit:35,22: Type Error: expected `B[Bool]`, got `T: B[Int]`.
index b01c65b..1b8dc9f 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt4_alt1.nit:27,21--22: Type error: expected T, got A[Int]
+alt/base_upcast2_1alt4_alt1.nit:27,21--22: Type Error: expected `T`, got `A[Int]`.
index 7943796..bc6fb89 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt4_alt10.nit:36,21: Type error: expected C, got T
+alt/base_upcast2_1alt4_alt10.nit:36,21: Type Error: expected `C`, got `T: B[Bool]`.
index b3e05c4..cbd7cc8 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt4_alt2.nit:28,21--22: Type error: expected T, got A[Bool]
+alt/base_upcast2_1alt4_alt2.nit:28,21--22: Type Error: expected `T`, got `A[Bool]`.
index 4b97161..516a02f 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt4_alt3.nit:29,21--22: Type error: expected T, got B[Int]
+alt/base_upcast2_1alt4_alt3.nit:29,21--22: Type Error: expected `T`, got `B[Int]`.
index 1ce4304..8e84855 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt4_alt7.nit:33,22: Type error: expected A[Bool], got T
+alt/base_upcast2_1alt4_alt7.nit:33,22: Type Error: expected `A[Bool]`, got `T: B[Bool]`.
index a636739..c704d62 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt4_alt8.nit:34,22: Type error: expected B[Int], got T
+alt/base_upcast2_1alt4_alt8.nit:34,22: Type Error: expected `B[Int]`, got `T: B[Bool]`.
index f831dac..2dcb687 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt5_alt1.nit:27,21--22: Type error: expected T, got A[Int]
+alt/base_upcast2_1alt5_alt1.nit:27,21--22: Type Error: expected `T`, got `A[Int]`.
index d640cb1..b75003b 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt5_alt2.nit:28,21--22: Type error: expected T, got A[Bool]
+alt/base_upcast2_1alt5_alt2.nit:28,21--22: Type Error: expected `T`, got `A[Bool]`.
index 3bbdd6e..a9ef7a5 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt5_alt3.nit:29,21--22: Type error: expected T, got B[Int]
+alt/base_upcast2_1alt5_alt3.nit:29,21--22: Type Error: expected `T`, got `B[Int]`.
index b5701dd..3f3961d 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt5_alt4.nit:30,21--22: Type error: expected T, got B[Bool]
+alt/base_upcast2_1alt5_alt4.nit:30,21--22: Type Error: expected `T`, got `B[Bool]`.
index a670740..916a26b 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt5_alt7.nit:33,22: Type error: expected A[Bool], got T
+alt/base_upcast2_1alt5_alt7.nit:33,22: Type Error: expected `A[Bool]`, got `T: C`.
index ce4fd54..2f97f08 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_1alt5_alt8.nit:34,22: Type error: expected B[Int], got T
+alt/base_upcast2_1alt5_alt8.nit:34,22: Type Error: expected `B[Int]`, got `T: C`.
index e1c9c86..25d108e 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt1.nit:26,10: Type error: class T not found in module base_upcast2_alt1.
+alt/base_upcast2_alt1.nit:26,10: Error: class `T` not found in module `base_upcast2_alt1`.
index 57c35a8..2794534 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt10.nit:26,10: Type error: class T not found in module base_upcast2_alt10.
+alt/base_upcast2_alt10.nit:26,10: Error: class `T` not found in module `base_upcast2_alt10`.
index 740bc4f..edeb86c 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt2.nit:26,10: Type error: class T not found in module base_upcast2_alt2.
+alt/base_upcast2_alt2.nit:26,10: Error: class `T` not found in module `base_upcast2_alt2`.
index 25e7cc6..840d8d6 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt3.nit:26,10: Type error: class T not found in module base_upcast2_alt3.
+alt/base_upcast2_alt3.nit:26,10: Error: class `T` not found in module `base_upcast2_alt3`.
index cc35a5a..42ab2e2 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt4.nit:26,10: Type error: class T not found in module base_upcast2_alt4.
+alt/base_upcast2_alt4.nit:26,10: Error: class `T` not found in module `base_upcast2_alt4`.
index b86d34f..3ebcdaa 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt5.nit:26,10: Type error: class T not found in module base_upcast2_alt5.
+alt/base_upcast2_alt5.nit:26,10: Error: class `T` not found in module `base_upcast2_alt5`.
index ca0d0e1..60451b6 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt6.nit:26,10: Type error: class T not found in module base_upcast2_alt6.
+alt/base_upcast2_alt6.nit:26,10: Error: class `T` not found in module `base_upcast2_alt6`.
index b9ab2f7..dab8c00 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt7.nit:26,10: Type error: class T not found in module base_upcast2_alt7.
+alt/base_upcast2_alt7.nit:26,10: Error: class `T` not found in module `base_upcast2_alt7`.
index 54e7580..5cfee90 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt8.nit:26,10: Type error: class T not found in module base_upcast2_alt8.
+alt/base_upcast2_alt8.nit:26,10: Error: class `T` not found in module `base_upcast2_alt8`.
index 9648189..248577e 100644 (file)
@@ -1 +1 @@
-alt/base_upcast2_alt9.nit:26,10: Type error: class T not found in module base_upcast2_alt9.
+alt/base_upcast2_alt9.nit:26,10: Error: class `T` not found in module `base_upcast2_alt9`.
index 7a13355..cda5d84 100644 (file)
@@ -1,33 +1,33 @@
-alt/base_upcast_alt1.nit:26,20--21: Type error: expected A[Int], got A[Bool]
-alt/base_upcast_alt1.nit:28,20--21: Type error: expected A[Int], got B[Bool]
-alt/base_upcast_alt1.nit:33,20--21: Type error: expected A[Bool], got A[Int]
-alt/base_upcast_alt1.nit:35,20--21: Type error: expected A[Bool], got B[Int]
-alt/base_upcast_alt1.nit:37,20--21: Type error: expected A[Bool], got C[Int]
-alt/base_upcast_alt1.nit:38,20--21: Type error: expected A[Bool], got C[Bool]
-alt/base_upcast_alt1.nit:39,20: Type error: expected A[Bool], got D
-alt/base_upcast_alt1.nit:41,20--21: Type error: expected B[Int], got A[Int]
-alt/base_upcast_alt1.nit:42,20--21: Type error: expected B[Int], got A[Bool]
-alt/base_upcast_alt1.nit:44,20--21: Type error: expected B[Int], got B[Bool]
-alt/base_upcast_alt1.nit:49,20--21: Type error: expected B[Bool], got A[Int]
-alt/base_upcast_alt1.nit:50,20--21: Type error: expected B[Bool], got A[Bool]
-alt/base_upcast_alt1.nit:51,20--21: Type error: expected B[Bool], got B[Int]
-alt/base_upcast_alt1.nit:53,20--21: Type error: expected B[Bool], got C[Int]
-alt/base_upcast_alt1.nit:54,20--21: Type error: expected B[Bool], got C[Bool]
-alt/base_upcast_alt1.nit:55,20: Type error: expected B[Bool], got D
-alt/base_upcast_alt1.nit:57,20--21: Type error: expected C[Bool], got A[Int]
-alt/base_upcast_alt1.nit:58,20--21: Type error: expected C[Int], got A[Bool]
-alt/base_upcast_alt1.nit:59,20--21: Type error: expected C[Int], got B[Int]
-alt/base_upcast_alt1.nit:60,20--21: Type error: expected C[Int], got B[Bool]
-alt/base_upcast_alt1.nit:62,20--21: Type error: expected C[Int], got C[Bool]
-alt/base_upcast_alt1.nit:63,20: Type error: expected C[Int], got D
-alt/base_upcast_alt1.nit:65,20--21: Type error: expected C[Bool], got A[Int]
-alt/base_upcast_alt1.nit:66,20--21: Type error: expected C[Bool], got A[Bool]
-alt/base_upcast_alt1.nit:67,20--21: Type error: expected C[Bool], got B[Int]
-alt/base_upcast_alt1.nit:68,20--21: Type error: expected C[Bool], got B[Bool]
-alt/base_upcast_alt1.nit:69,20--21: Type error: expected C[Bool], got C[Int]
-alt/base_upcast_alt1.nit:73,19--20: Type error: expected D, got A[Int]
-alt/base_upcast_alt1.nit:74,19--20: Type error: expected D, got A[Bool]
-alt/base_upcast_alt1.nit:75,19--20: Type error: expected D, got B[Int]
-alt/base_upcast_alt1.nit:76,19--20: Type error: expected D, got B[Bool]
-alt/base_upcast_alt1.nit:77,19--20: Type error: expected D, got C[Int]
-alt/base_upcast_alt1.nit:78,19--20: Type error: expected D, got C[Bool]
+alt/base_upcast_alt1.nit:26,20--21: Type Error: expected `A[Int]`, got `A[Bool]`.
+alt/base_upcast_alt1.nit:28,20--21: Type Error: expected `A[Int]`, got `B[Bool]`.
+alt/base_upcast_alt1.nit:33,20--21: Type Error: expected `A[Bool]`, got `A[Int]`.
+alt/base_upcast_alt1.nit:35,20--21: Type Error: expected `A[Bool]`, got `B[Int]`.
+alt/base_upcast_alt1.nit:37,20--21: Type Error: expected `A[Bool]`, got `C[Int]`.
+alt/base_upcast_alt1.nit:38,20--21: Type Error: expected `A[Bool]`, got `C[Bool]`.
+alt/base_upcast_alt1.nit:39,20: Type Error: expected `A[Bool]`, got `D`.
+alt/base_upcast_alt1.nit:41,20--21: Type Error: expected `B[Int]`, got `A[Int]`.
+alt/base_upcast_alt1.nit:42,20--21: Type Error: expected `B[Int]`, got `A[Bool]`.
+alt/base_upcast_alt1.nit:44,20--21: Type Error: expected `B[Int]`, got `B[Bool]`.
+alt/base_upcast_alt1.nit:49,20--21: Type Error: expected `B[Bool]`, got `A[Int]`.
+alt/base_upcast_alt1.nit:50,20--21: Type Error: expected `B[Bool]`, got `A[Bool]`.
+alt/base_upcast_alt1.nit:51,20--21: Type Error: expected `B[Bool]`, got `B[Int]`.
+alt/base_upcast_alt1.nit:53,20--21: Type Error: expected `B[Bool]`, got `C[Int]`.
+alt/base_upcast_alt1.nit:54,20--21: Type Error: expected `B[Bool]`, got `C[Bool]`.
+alt/base_upcast_alt1.nit:55,20: Type Error: expected `B[Bool]`, got `D`.
+alt/base_upcast_alt1.nit:57,20--21: Type Error: expected `C[Bool]`, got `A[Int]`.
+alt/base_upcast_alt1.nit:58,20--21: Type Error: expected `C[Int]`, got `A[Bool]`.
+alt/base_upcast_alt1.nit:59,20--21: Type Error: expected `C[Int]`, got `B[Int]`.
+alt/base_upcast_alt1.nit:60,20--21: Type Error: expected `C[Int]`, got `B[Bool]`.
+alt/base_upcast_alt1.nit:62,20--21: Type Error: expected `C[Int]`, got `C[Bool]`.
+alt/base_upcast_alt1.nit:63,20: Type Error: expected `C[Int]`, got `D`.
+alt/base_upcast_alt1.nit:65,20--21: Type Error: expected `C[Bool]`, got `A[Int]`.
+alt/base_upcast_alt1.nit:66,20--21: Type Error: expected `C[Bool]`, got `A[Bool]`.
+alt/base_upcast_alt1.nit:67,20--21: Type Error: expected `C[Bool]`, got `B[Int]`.
+alt/base_upcast_alt1.nit:68,20--21: Type Error: expected `C[Bool]`, got `B[Bool]`.
+alt/base_upcast_alt1.nit:69,20--21: Type Error: expected `C[Bool]`, got `C[Int]`.
+alt/base_upcast_alt1.nit:73,19--20: Type Error: expected `D`, got `A[Int]`.
+alt/base_upcast_alt1.nit:74,19--20: Type Error: expected `D`, got `A[Bool]`.
+alt/base_upcast_alt1.nit:75,19--20: Type Error: expected `D`, got `B[Int]`.
+alt/base_upcast_alt1.nit:76,19--20: Type Error: expected `D`, got `B[Bool]`.
+alt/base_upcast_alt1.nit:77,19--20: Type Error: expected `D`, got `C[Int]`.
+alt/base_upcast_alt1.nit:78,19--20: Type Error: expected `D`, got `C[Bool]`.
index 227f329..df085c9 100644 (file)
@@ -1 +1 @@
-base_user_annotation3.nit:15,33--35: Warning: unknown annotation `foo`
+base_user_annotation3.nit:15,33--35: Warning: unknown annotation `foo`.
index e591aca..face0c1 100644 (file)
@@ -1 +1 @@
-base_user_annotation4.nit:16,2--19: Warning: an annotation `foo` is already declared in module `base_user_annotation`
+base_user_annotation4.nit:16,2--19: Warning: an annotation `foo` is already declared in module `base_user_annotation`.
index b2968e6..046960a 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt1.nit:22,6--7: Error: A variable named `p1' already exists
+alt/base_var2_alt1.nit:22,6--7: Error: a variable named `p1` already exists.
index 4f41ab5..88864e0 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt2.nit:33,6--7: Error: A variable named `a1' already exists
+alt/base_var2_alt2.nit:33,6--7: Error: a variable named `a1` already exists.
index a8f6596..2e504e5 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt3.nit:37,5--6: Error: A variable named `a1' already exists
+alt/base_var2_alt3.nit:37,5--6: Error: a variable named `a1` already exists.
index 0c00258..3ef3bcf 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt4.nit:41,6--7: Error: A variable named `a1' already exists
+alt/base_var2_alt4.nit:41,6--7: Error: a variable named `a1` already exists.
index 2b27a70..8a8f41e 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt5.nit:42,6--7: Error: A variable named `a3' already exists
+alt/base_var2_alt5.nit:42,6--7: Error: a variable named `a3` already exists.
index e133439..f6cda15 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt6.nit:46,6--7: Error: A variable named `a2' already exists
+alt/base_var2_alt6.nit:46,6--7: Error: a variable named `a2` already exists.
index 740d76a..2344e0f 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt7.nit:51,1--2: Error: Method or variable 'a3' unknown in Sys.
+alt/base_var2_alt7.nit:51,1--2: Error: method or variable `a3` unknown in `Sys`.
index 1d6e83d..bca8a56 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt8.nit:52,1--2: Error: Method or variable 'p1' unknown in Sys.
+alt/base_var2_alt8.nit:52,1--2: Error: method or variable `p1` unknown in `Sys`.
index 238778a..3406ef9 100644 (file)
@@ -1 +1 @@
-alt/base_var2_alt9.nit:27,18--19: Error: A variable named `p1' already exists
+alt/base_var2_alt9.nit:27,18--19: Error: a variable named `p1` already exists.
index 92da362..b47149c 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt1.nit:26,6--7: Type error: expected Int, got Float
+alt/base_var_alt1.nit:26,6--7: Type Error: expected `Int`, got `Float`.
index 37c7307..f8d53d4 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt2.nit:27,6--7: Type error: expected Float, got Int
+alt/base_var_alt2.nit:27,6--7: Type Error: expected `Float`, got `Int`.
index 31e92a5..a956ea4 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt3.nit:35,6--7: Type error: expected Int, got Float
+alt/base_var_alt3.nit:35,6--7: Type Error: expected `Int`, got `Float`.
index 7b8241d..5015054 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt4.nit:36,6--7: Type error: expected Float, got Int
+alt/base_var_alt4.nit:36,6--7: Type Error: expected `Float`, got `Int`.
index b0547c3..3f848ce 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt5.nit:44,6--7: Type error: expected Int, got Float
+alt/base_var_alt5.nit:44,6--7: Type Error: expected `Int`, got `Float`.
index dd946bd..d5b94df 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt6.nit:45,6--7: Type error: expected Float, got Int
+alt/base_var_alt6.nit:45,6--7: Type Error: expected `Float`, got `Int`.
index 6a6758e..8e370a1 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt7.nit:53,15--17: Type error: expected expression.
+alt/base_var_alt7.nit:53,15--17: Error: expected an expression.
index ab09b51..0497a38 100644 (file)
@@ -1 +1 @@
-alt/base_var_alt8.nit:54,10--12: Type error: expected expression.
+alt/base_var_alt8.nit:54,10--12: Error: expected an expression.
index e8b202f..73efc23 100644 (file)
@@ -1 +1 @@
-alt/base_var_assignment_flow_alt1.nit:34,1: Error: variable 'a' is possibly unset.
+alt/base_var_assignment_flow_alt1.nit:34,1: Error: possibly unset variable `a`.
index f282d6a..8dc2069 100644 (file)
@@ -1 +1 @@
-alt/base_var_assignment_flow_alt2.nit:47,1: Error: variable 'c' is possibly unset.
+alt/base_var_assignment_flow_alt2.nit:47,1: Error: possibly unset variable `c`.
index ffa801d..4930a08 100644 (file)
@@ -1 +1 @@
-alt/base_var_assignment_flow_alt3.nit:47,1: Error: variable 'c' is possibly unset.
+alt/base_var_assignment_flow_alt3.nit:47,1: Error: possibly unset variable `c`.
index 447012a..363310f 100644 (file)
@@ -1 +1 @@
-alt/base_var_assignment_flow_alt4.nit:47,1: Error: variable 'c' is possibly unset.
+alt/base_var_assignment_flow_alt4.nit:47,1: Error: possibly unset variable `c`.
index 5193452..dd0c9ea 100644 (file)
@@ -1 +1 @@
-alt/base_var_assignment_flow_alt5.nit:54,1: Error: variable 'd' is possibly unset.
+alt/base_var_assignment_flow_alt5.nit:54,1: Error: possibly unset variable `d`.
index 903db2a..62390e3 100644 (file)
@@ -1 +1 @@
-alt/base_var_assignment_flow_alt6.nit:68,1: Error: variable 'f' is possibly unset.
+alt/base_var_assignment_flow_alt6.nit:68,1: Error: possibly unset variable `f`.
index 6e229fb..a8abea5 100644 (file)
@@ -1 +1 @@
-alt/base_var_null2_1alt3_alt1.nit:22,21--23: Type error: expected nullable Int, got Char
+alt/base_var_null2_1alt3_alt1.nit:22,21--23: Type Error: expected `nullable Int`, got `Char`.
index c8c8406..5c15c37 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt1.nit:28,1--8: Error: Method 'output' call on 'null'.
+alt/base_var_null_alt1.nit:28,3--8: Error: method `output` called on `null`.
index f869cca..134e68c 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt10.nit:43,1--6: Error: Attribute '_foo' access on 'null'.
+alt/base_var_null_alt10.nit:43,3--6: Error: attribute `_foo` access on `null`.
index 2389f6f..721b131 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt11.nit:44,1--10: Error: Attribute '_foo' access on 'null'.
+alt/base_var_null_alt11.nit:44,3--6: Error: attribute `_foo` access on `null`.
index 95c81ea..ba1fd0e 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt12.nit:45,1--6: Error: Method '+' call on 'null'.
+alt/base_var_null_alt12.nit:45,3--4: Error: method `+` called on `null`.
index 0823d6c..f1133fc 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt2.nit:29,1--6: Error: Attribute '_foo' access on 'null'.
+alt/base_var_null_alt2.nit:29,3--6: Error: attribute `_foo` access on `null`.
index 2ec4755..da691bd 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt3.nit:30,1--10: Error: Attribute '_foo' access on 'null'.
+alt/base_var_null_alt3.nit:30,3--6: Error: attribute `_foo` access on `null`.
index 938ba6c..551e7aa 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt4.nit:31,1--6: Error: Method '+' call on 'null'.
+alt/base_var_null_alt4.nit:31,3--4: Error: method `+` called on `null`.
index 9d77dc0..6fefe40 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt5.nit:35,1--8: Error: Method 'output' call on 'null'.
+alt/base_var_null_alt5.nit:35,3--8: Error: method `output` called on `null`.
index cdb337a..6ee9b10 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt6.nit:36,1--6: Error: Attribute '_foo' access on 'null'.
+alt/base_var_null_alt6.nit:36,3--6: Error: attribute `_foo` access on `null`.
index 9cdfcb8..e05a8b8 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt7.nit:37,1--10: Error: Attribute '_foo' access on 'null'.
+alt/base_var_null_alt7.nit:37,3--6: Error: attribute `_foo` access on `null`.
index df4597f..ad947f4 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt8.nit:38,1--6: Error: Method '+' call on 'null'.
+alt/base_var_null_alt8.nit:38,3--4: Error: method `+` called on `null`.
index ca613ca..6c539d3 100644 (file)
@@ -1 +1 @@
-alt/base_var_null_alt9.nit:42,1--8: Error: Method 'output' call on 'null'.
+alt/base_var_null_alt9.nit:42,3--8: Error: method `output` called on `null`.
index f8f0bc8..4a9a764 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_alt1.nit:40,1--3: Error: Method 'b' doesn't exists in A.
+alt/base_var_type_evolution_alt1.nit:40,3: Error: method `b` does not exists in `A`.
index 9c711bb..ef73924 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_alt2.nit:50,1--3: Error: Method 'b' doesn't exists in A.
+alt/base_var_type_evolution_alt2.nit:50,3: Error: method `b` does not exists in `A`.
index 68c434b..e482a90 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_alt3.nit:50,1--3: Error: Method 'b' doesn't exists in A.
+alt/base_var_type_evolution_alt3.nit:50,3: Error: method `b` does not exists in `A`.
index b71b085..d565db2 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_alt4.nit:62,1--3: Error: Method 'b' doesn't exists in A.
+alt/base_var_type_evolution_alt4.nit:62,3: Error: method `b` does not exists in `A`.
index b33dce3..f3f1b65 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_alt5.nit:62,1--3: Error: Method 'b' doesn't exists in A.
+alt/base_var_type_evolution_alt5.nit:62,3: Error: method `b` does not exists in `A`.
index e978bf0..0ac46ca 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_alt6.nit:73,1--3: Error: Method 'b' doesn't exists in A.
+alt/base_var_type_evolution_alt6.nit:73,3: Error: method `b` does not exists in `A`.
index 98cc679..e00de97 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_alt7.nit:74,1--3: Error: Method 'c' doesn't exists in B.
+alt/base_var_type_evolution_alt7.nit:74,3: Error: method `c` does not exists in `B`.
index 41b285c..34e737d 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null2_alt1.nit:35,8: Type error: expected A, got null
+alt/base_var_type_evolution_null2_alt1.nit:35,8: Type Error: expected `A`, got `null`.
index c6378a2..a794502 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null2_alt2.nit:40,7: Type error: expected A, got nullable A
+alt/base_var_type_evolution_null2_alt2.nit:40,7: Type Error: expected `A`, got `nullable A`.
index 46069e8..0025f05 100644 (file)
@@ -1,4 +1,4 @@
-base_var_type_evolution_null3.nit:52,5--13: Warning: expression is not null, since it is a `Object`.
+base_var_type_evolution_null3.nit:52,5: Warning: expression is not null, since it is a `Object`.
 1
 1
 5
index a10a5e3..5bc9b2d 100644 (file)
@@ -1,4 +1,4 @@
-alt/base_var_type_evolution_null3_alt1.nit:52,5--13: Warning: expression is not null, since it is a `Object`.
+alt/base_var_type_evolution_null3_alt1.nit:52,5: Warning: expression is not null, since it is a `Object`.
 1
 1
 5
index 54705a8..c8137f4 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null4_alt1.nit:33,8: Type error: expected A, got null
+alt/base_var_type_evolution_null4_alt1.nit:33,8: Type Error: expected `A`, got `null`.
index bb74a9c..a061ba1 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null4_alt2.nit:38,7: Type error: expected A, got nullable A
+alt/base_var_type_evolution_null4_alt2.nit:38,7: Type Error: expected `A`, got `nullable A`.
index da50622..792de94 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null4_alt3.nit:52,7: Type error: expected A, got nullable A
+alt/base_var_type_evolution_null4_alt3.nit:52,7: Type Error: expected `A`, got `nullable A`.
index 8a6db68..80bcda6 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null4_alt4.nit:64,7: Type error: expected A, got nullable A
+alt/base_var_type_evolution_null4_alt4.nit:64,7: Type Error: expected `A`, got `nullable A`.
index 2f46251..f89d1c8 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null_alt2.nit:42,8: Type error: expected nullable B, got A
+alt/base_var_type_evolution_null_alt2.nit:42,8: Type Error: expected `nullable B`, got `A`.
index db67a84..ef714d2 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null_alt4.nit:45,7: Type error: expected B, got nullable B
+alt/base_var_type_evolution_null_alt4.nit:45,7: Type Error: expected `B`, got `nullable B`.
index bd4b700..1617d85 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null_alt5.nit:53,7: Type error: expected A, got nullable A
+alt/base_var_type_evolution_null_alt5.nit:53,7: Type Error: expected `A`, got `nullable A`.
index f759dfe..c378112 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null_alt6.nit:54,8: Type error: expected nullable B, got nullable A
+alt/base_var_type_evolution_null_alt6.nit:54,8: Type Error: expected `nullable B`, got `nullable A`.
index 1867feb..ed39737 100644 (file)
@@ -1 +1 @@
-alt/base_var_type_evolution_null_alt7.nit:64,7: Type error: expected B, got A
+alt/base_var_type_evolution_null_alt7.nit:64,7: Type Error: expected `B`, got `A`.
index 6ec044f..e8ad601 100644 (file)
@@ -1 +1 @@
-alt/base_var_untyped_alt1.nit:22,1: Error: variable 'a' is possibly unset.
+alt/base_var_untyped_alt1.nit:22,1: Error: possibly unset variable `a`.
index dc1fe07..9ddc6d5 100644 (file)
@@ -1 +1 @@
-alt/base_var_untyped_alt3.nit:43,1--2: Error: variable 'b3' is possibly unset.
+alt/base_var_untyped_alt3.nit:43,1--2: Error: possibly unset variable `b3`.
index c5a455f..cc41e02 100644 (file)
@@ -1 +1 @@
-alt/base_var_untyped_alt4.nit:44,1--7: Error: Method '+' doesn't exists in nullable Object.
+alt/base_var_untyped_alt4.nit:44,4--5: Error: method `+` does not exists in `nullable Object`.
index 2072129..e644c3d 100644 (file)
@@ -1 +1 @@
-alt/base_var_untyped_alt5.nit:51,3--6: Error: Method '*' doesn't exists in nullable Object.
+alt/base_var_untyped_alt5.nit:51,4: Error: method `*` does not exists in `nullable Object`.
index 798387e..86e679a 100644 (file)
@@ -1 +1 @@
-alt/base_var_untyped_alt6.nit:50,6--7: Error: variable 'b3' is possibly unset.
+alt/base_var_untyped_alt6.nit:50,6--7: Error: possibly unset variable `b3`.
index d5c703d..38892e5 100644 (file)
@@ -1 +1 @@
-alt/base_var_untyped_alt7.nit:54,1: Error: variable 'c' is possibly unset.
+alt/base_var_untyped_alt7.nit:54,1: Error: possibly unset variable `c`.
index 1eeaef7..8ac50be 100644 (file)
@@ -1 +1 @@
-alt/base_var_untyped_alt8.nit:57,5--8: Error: Method or variable 'fail' unknown in Sys.
+alt/base_var_untyped_alt8.nit:57,5--8: Error: method or variable `fail` unknown in `Sys`.
index 1e24ee6..e7cb189 100644 (file)
@@ -1 +1 @@
-alt/base_vararg3_alt1.nit:41,7--13: Type error: expected Int, got Array[Int]
+alt/base_vararg3_alt1.nit:41,7--13: Type Error: expected `Int`, got `Array[Int]`.
index 52bce29..4116c76 100644 (file)
@@ -1 +1 @@
-alt/base_vararg3_alt2.nit:42,7: Type error: expected Array[Int], got Int
+alt/base_vararg3_alt2.nit:42,7: Type Error: expected `Array[Int]`, got `Int`.
index e7e44bc..4ca932b 100644 (file)
@@ -1 +1 @@
-alt/base_vararg3_alt3.nit:33,9: Type error: expected Int, got Array[Int]
+alt/base_vararg3_alt3.nit:33,9: Type Error: expected `Int`, got `Array[Int]`.
index caca43b..411b6bf 100644 (file)
@@ -1 +1 @@
-alt/base_vararg3_alt4.nit:34,9: Type error: expected Array[Int], got Int
+alt/base_vararg3_alt4.nit:34,9: Type Error: expected `Array[Int]`, got `Int`.
index 975d772..05e617f 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt1.nit:51,1--3: Error: arity mismatch; prototype is 'foo(a: Char...)'
+alt/base_vararg_alt1.nit:51,1--3: Error: expected at least 1 argument(s) for `foo(a: Char...)`; got 0. See introduction at `base_vararg_alt1::Sys::foo`.
index fe60fbc..d953dc6 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt2.nit:54,1--3: Error: arity mismatch; prototype is 'bar(b: Char, a: Char...)'
+alt/base_vararg_alt2.nit:54,1--3: Error: expected at least 2 argument(s) for `bar(b: Char, a: Char...)`; got 0. See introduction at `base_vararg_alt2::Sys::bar`.
index cee47c7..7f5e21c 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt3.nit:55,1--8: Error: arity mismatch; prototype is 'bar(b: Char, a: Char...)'
+alt/base_vararg_alt3.nit:55,1--3: Error: expected at least 2 argument(s) for `bar(b: Char, a: Char...)`; got 1. See introduction at `base_vararg_alt3::Sys::bar`.
index 6a1d47b..bcd893b 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt4.nit:58,1--3: Error: arity mismatch; prototype is 'baz(a: Char..., b: Char)'
+alt/base_vararg_alt4.nit:58,1--3: Error: expected at least 2 argument(s) for `baz(a: Char..., b: Char)`; got 0. See introduction at `base_vararg_alt4::Sys::baz`.
index bbe3c01..011c15e 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt5.nit:59,1--8: Error: arity mismatch; prototype is 'baz(a: Char..., b: Char)'
+alt/base_vararg_alt5.nit:59,1--3: Error: expected at least 2 argument(s) for `baz(a: Char..., b: Char)`; got 1. See introduction at `base_vararg_alt5::Sys::baz`.
index 4574b40..cbe6263 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt6.nit:62,1--6: Error: arity mismatch; prototype is 'foobar(b: Char, a: Char..., c: Char)'
+alt/base_vararg_alt6.nit:62,1--6: Error: expected at least 3 argument(s) for `foobar(b: Char, a: Char..., c: Char)`; got 0. See introduction at `base_vararg_alt6::Sys::foobar`.
index 5399b75..da46a05 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt7.nit:63,1--11: Error: arity mismatch; prototype is 'foobar(b: Char, a: Char..., c: Char)'
+alt/base_vararg_alt7.nit:63,1--6: Error: expected at least 3 argument(s) for `foobar(b: Char, a: Char..., c: Char)`; got 1. See introduction at `base_vararg_alt7::Sys::foobar`.
index 95d4e7e..d6e8a87 100644 (file)
@@ -1 +1 @@
-alt/base_vararg_alt8.nit:64,1--15: Error: arity mismatch; prototype is 'foobar(b: Char, a: Char..., c: Char)'
+alt/base_vararg_alt8.nit:64,1--6: Error: expected at least 3 argument(s) for `foobar(b: Char, a: Char..., c: Char)`; got 2. See introduction at `base_vararg_alt8::Sys::foobar`.
index fba7b1d..a7e5e41 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_int2_alt1.nit:37,8: Type error: expected Int, got A
+alt/base_virtual_int2_alt1.nit:37,8: Type Error: expected `Int`, got `A`.
index e0ff799..dc105ee 100644 (file)
@@ -1,4 +1,4 @@
-alt/base_virtual_int2_alt3.nit:40,2--8: Warning: Expression is already a A since it is a Int.
+alt/base_virtual_int2_alt3.nit:40,2--8: Warning: expression is already a `A` since it is a `Int`.
 4
 4
 5
index ab79f16..e3355a7 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type2_alt1.nit:46,5--7: Type error: expected nullable U, got nullable T
+alt/base_virtual_type2_alt1.nit:46,5--7: Type Error: expected `nullable U`, got `nullable T`.
index 57642b4..bfa2e58 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type3_alt1.nit:32,5--15: Type error: expected Int, got T
+alt/base_virtual_type3_alt1.nit:32,5--15: Type Error: expected `Int`, got `T`.
index 39bff1c..cae0e93 100644 (file)
@@ -1,2 +1,2 @@
 alt/base_virtual_type4_alt1.nit:20,16: Redef Error: a virtual type cannot be refined.
-alt/base_virtual_type4_alt1.nit:24,7--11: Type error: expected nullable U, got T
+alt/base_virtual_type4_alt1.nit:24,7--11: Type Error: expected `nullable U`, got `T`.
index 99beb9a..861a5db 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type5_alt1.nit:26,7: Type error: expected nullable U, got Int
+alt/base_virtual_type5_alt1.nit:26,7: Type Error: expected `nullable U`, got `Int`.
index 56130b2..1743fb4 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type5_alt2.nit:27,7--11: Type error: expected nullable U, got T
+alt/base_virtual_type5_alt2.nit:27,7--11: Type Error: expected `nullable U`, got `T`.
index 0fc0245..0e4cfe9 100644 (file)
@@ -1,2 +1 @@
-base_virtual_type7.nit:20,2--10: Error: circularity of virtual type definition: E -> F -> E
-base_virtual_type7.nit:21,2--10: Error: circularity of virtual type definition: F -> E -> F
+base_virtual_type7.nit:20,2--10: Error: circularity of virtual type definition: E <-> F.
index fe7f2e8..7b095b2 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_alt1.nit:39,5--7: Type error: expected Int, got nullable T
+alt/base_virtual_type_alt1.nit:39,5--7: Type Error: expected `Int`, got `nullable T`.
index 12534ca..354ceda 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_alt2.nit:40,7: Type error: expected nullable T, got Int
+alt/base_virtual_type_alt2.nit:40,7: Type Error: expected `nullable T`, got `Int`.
index e2f44c8..1cdc0cf 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_alt3.nit:43,7: Type error: expected nullable T, got B
+alt/base_virtual_type_alt3.nit:43,7: Type Error: expected `nullable T`, got `B`.
index 819b665..058230f 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt1.nit:65,10--14: Type error: expected K, got J
+alt/base_virtual_type_check_alt1.nit:65,10--14: Type Error: expected `K`, got `J`.
index 242e277..54240a9 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt2.nit:68,10--14: Type error: expected K, got J
+alt/base_virtual_type_check_alt2.nit:68,10--14: Type Error: expected `K`, got `J`.
index 7706749..2c567d8 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt3.nit:75,10--14: Type error: expected L, got J
+alt/base_virtual_type_check_alt3.nit:75,10--14: Type Error: expected `L`, got `J`.
index 468367c..d517336 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt4.nit:76,10--14: Type error: expected L, got K
+alt/base_virtual_type_check_alt4.nit:76,10--14: Type Error: expected `L`, got `K`.
index 1b6e33e..c80eb83 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt5.nit:78,10--14: Type error: expected L, got J
+alt/base_virtual_type_check_alt5.nit:78,10--14: Type Error: expected `L`, got `J`.
index 580dda0..92bda5c 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt6.nit:79,10--14: Type error: expected L, got K
+alt/base_virtual_type_check_alt6.nit:79,10--14: Type Error: expected `L`, got `K`.
index 017e247..e05109a 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt7.nit:85,11--15: Type error: expected K, got J
+alt/base_virtual_type_check_alt7.nit:85,11--15: Type Error: expected `K`, got `J`.
index ac24c00..e63300d 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_check_alt9.nit:88,11--15: Type error: expected K, got J
+alt/base_virtual_type_check_alt9.nit:88,11--15: Type Error: expected `K`, got `J`.
index e1f51ca..a3ce5dc 100644 (file)
@@ -1,2 +1,2 @@
-alt/base_virtual_type_fixed_alt1.nit:32,15--25: Redef Error: Wrong type for parameter `v'. found Discrete, expected V1 as in base_virtual_type_fixed_alt1#A#v1.
-alt/base_virtual_type_fixed_alt1.nit:32,29--36: Redef Error: Wrong return type. found Discrete, expected V1 as in base_virtual_type_fixed_alt1#A#v1.
+alt/base_virtual_type_fixed_alt1.nit:32,15--25: Redef Error: expected `V1` for parameter `v'; got `Discrete`.
+alt/base_virtual_type_fixed_alt1.nit:32,29--36: Redef Error: expected `V1` for return type; got `Discrete`.
index f6fa7dd..c1536d2 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_redef_alt1.nit:26,20--25: Redef Error: Wrong bound type. Found Number, expected a subtype of Int, as in base_virtual_type_redef_alt1#Number#OTHE2.
+alt/base_virtual_type_redef_alt1.nit:26,20--25: Redef Error: expected `Int` bound type; got `Number`.
index cf677e6..1733a2e 100644 (file)
@@ -1 +1 @@
-alt/base_virtual_type_redef_alt2.nit:26,2--27,22: Redef Error: Virtual type OTHE3 is fixed in super-class Number
+alt/base_virtual_type_redef_alt2.nit:26,2--27,22: Redef Error: virtual type `OTHE3` is fixed in super-class `Number`.
index 4a05cc9..6fd32bd 100644 (file)
@@ -1,4 +1,4 @@
-base_virtual_type_self.nit:44,3: Error: Method or variable 'a' unknown in B.
-base_virtual_type_self.nit:45,7: Error: Method or variable 'a' unknown in B.
-base_virtual_type_self.nit:46,3: Error: Method or variable 'a' unknown in B.
-base_virtual_type_self.nit:47,7: Error: Method or variable 'a' unknown in B.
+base_virtual_type_self.nit:44,3: Error: method or variable `a` unknown in `B`.
+base_virtual_type_self.nit:45,7: Error: method or variable `a` unknown in `B`.
+base_virtual_type_self.nit:46,3: Error: method or variable `a` unknown in `B`.
+base_virtual_type_self.nit:47,7: Error: method or variable `a` unknown in `B`.
index 6fa5f42..442a63d 100644 (file)
@@ -1,3 +1,3 @@
-alt/base_virtual_type_self_alt1.nit:44,9: Type error: expected Int, got Float
-alt/base_virtual_type_self_alt1.nit:45,7--12: Type error: expected Float, got Int
-alt/base_virtual_type_self_alt1.nit:47,7--12: Type error: expected Float, got A[Int]
+alt/base_virtual_type_self_alt1.nit:44,9: Type Error: expected `Int`, got `Float`.
+alt/base_virtual_type_self_alt1.nit:45,7--12: Type Error: expected `Float`, got `Int`.
+alt/base_virtual_type_self_alt1.nit:47,7--12: Type Error: expected `Float`, got `A[Int]`.
index 31e5abc..3eeff31 100644 (file)
@@ -1,3 +1,3 @@
-alt/base_virtual_type_self_alt2.nit:44,9: Type error: expected Int, got Float
-alt/base_virtual_type_self_alt2.nit:45,7--12: Type error: expected Float, got Int
-alt/base_virtual_type_self_alt2.nit:47,7--12: Type error: expected Float, got A[Int]
+alt/base_virtual_type_self_alt2.nit:44,9: Type Error: expected `Int`, got `Float`.
+alt/base_virtual_type_self_alt2.nit:45,7--12: Type Error: expected `Float`, got `Int`.
+alt/base_virtual_type_self_alt2.nit:47,7--12: Type Error: expected `Float`, got `A[Int]`.
index 834e6a6..68a1f1b 100644 (file)
@@ -1,3 +1,3 @@
-alt/base_virtual_type_self_alt3.nit:44,9: Type error: expected Int, got Float
-alt/base_virtual_type_self_alt3.nit:45,7--12: Type error: expected Float, got Int
-alt/base_virtual_type_self_alt3.nit:47,7--12: Type error: expected Float, got A[Int]
+alt/base_virtual_type_self_alt3.nit:44,9: Type Error: expected `Int`, got `Float`.
+alt/base_virtual_type_self_alt3.nit:45,7--12: Type Error: expected `Float`, got `Int`.
+alt/base_virtual_type_self_alt3.nit:47,7--12: Type Error: expected `Float`, got `A[Int]`.
index 23c8530..724f7fa 100644 (file)
@@ -1,3 +1,3 @@
-alt/base_virtual_type_self_alt4.nit:44,9: Type error: expected A[Int], got Float
-alt/base_virtual_type_self_alt4.nit:45,7--12: Type error: expected Float, got A[Int]
-alt/base_virtual_type_self_alt4.nit:47,7--12: Type error: expected Float, got A[A[Int]]
+alt/base_virtual_type_self_alt4.nit:44,9: Type Error: expected `A[Int]`, got `Float`.
+alt/base_virtual_type_self_alt4.nit:45,7--12: Type Error: expected `Float`, got `A[Int]`.
+alt/base_virtual_type_self_alt4.nit:47,7--12: Type Error: expected `Float`, got `A[A[Int]]`.
index 397a44a..b291110 100644 (file)
@@ -1,3 +1,3 @@
-alt/base_virtual_type_self_alt5.nit:44,9: Type error: expected A[U], got Float
-alt/base_virtual_type_self_alt5.nit:45,7--12: Type error: expected Float, got A[U]
-alt/base_virtual_type_self_alt5.nit:47,7--12: Type error: expected Float, got A[A[U]]
+alt/base_virtual_type_self_alt5.nit:44,9: Type Error: expected `A[U]`, got `Float`.
+alt/base_virtual_type_self_alt5.nit:45,7--12: Type Error: expected `Float`, got `A[U]: A[Int]`.
+alt/base_virtual_type_self_alt5.nit:47,7--12: Type Error: expected `Float`, got `A[A[U]]: A[A[Int]]`.
diff --git a/tests/sav/base_with.res b/tests/sav/base_with.res
new file mode 100644 (file)
index 0000000..8cada11
--- /dev/null
@@ -0,0 +1,11 @@
+1
+2
+2
+3
+1
+2
+2
+3
+1
+2
+3
diff --git a/tests/sav/base_with_alt1.res b/tests/sav/base_with_alt1.res
new file mode 100644 (file)
index 0000000..943aa13
--- /dev/null
@@ -0,0 +1,14 @@
+1
+2
+2
+3
+1
+2
+2
+3
+1
+2
+3
+1
+2
+3
index 5079bf7..4e2232f 100644 (file)
@@ -1 +1 @@
-9: 19
+327: 143
diff --git a/tests/sav/bench_complex_sort.res b/tests/sav/bench_complex_sort.res
new file mode 100644 (file)
index 0000000..3f09c96
--- /dev/null
@@ -0,0 +1,2 @@
+Eb3, Da7b9, Aa3, Da2b5, Cc6d3, Cc9d9, Da7b1, Da0b2, Aa8, Aa4, Aa1, Eb2, Cc8d6, Bb6, Cc4d9, Bb7, Cc7d4, Eb2, Bb8, Eb0
+Da0b2, Aa1, Da2b5, Bb6, Aa3, Bb7, Bb8, Aa4, Cc4d9, Eb3, Eb2, Eb2, Eb0, Cc6d3, Cc7d4, Da7b1, Da7b9, Cc8d6, Aa8, Cc9d9
index d9e91fa..134debf 100644 (file)
@@ -1,3 +1,3 @@
-Primes up to 40000 4203
-Primes up to 20000 2262
-Primes up to 10000 1229
+Primes up to 8000 1007
+Primes up to 4000 550
+Primes up to 2000 303
diff --git a/tests/sav/bench_send.res b/tests/sav/bench_send.res
new file mode 100644 (file)
index 0000000..cb4ed12
--- /dev/null
@@ -0,0 +1,4 @@
+8192
+14336
+22528
+33792
diff --git a/tests/sav/bench_send2.res b/tests/sav/bench_send2.res
new file mode 100644 (file)
index 0000000..44053db
--- /dev/null
@@ -0,0 +1,60 @@
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
+1024
+0
+1024
+0
+0
+0
diff --git a/tests/sav/bench_strfib.res b/tests/sav/bench_strfib.res
new file mode 100644 (file)
index 0000000..aa267d1
--- /dev/null
@@ -0,0 +1 @@
+(((((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))(((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))))((((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))))(((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))(((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))))))(((((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))))(((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))(((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))))))((((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))(((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))))((((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))))(((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))(((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(())))))))((((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))((((())(()(())))((()(()))((())(()(())))))(((()(()))((())(()(()))))(((())(()(())))((()(()))((())(()(()))))))))))))))
index 23b9437..19191d1 100644 (file)
@@ -1 +1 @@
-alt/error_annot_c_compiler_alt1.nit:17,39--44: Syntax error: "cflags" expects at least one argument.
+alt/error_annot_c_compiler_alt1.nit:17,39--44: Syntax Error: `cflags` expects at least one argument.
index 2459cd4..1c7aca1 100644 (file)
@@ -1 +1 @@
-alt/error_annot_c_compiler_alt2.nit:18,39--64: Syntax error: "cflags" accepts only calls to `exec` with the command as arguments.
+alt/error_annot_c_compiler_alt2.nit:18,39--64: Syntax Error: `cflags` accepts only calls to `exec` with the command as arguments.
index a584f16..78c19ca 100644 (file)
@@ -1 +1 @@
-alt/error_annot_c_compiler_alt3.nit:19,39--75: Syntax error: "cflags" accepts only calls to `exec` with the command as arguments.
+alt/error_annot_c_compiler_alt3.nit:19,39--75: Syntax Error: `cflags` accepts only calls to `exec` with the command as arguments.
index f34ea44..3207575 100644 (file)
@@ -1 +1 @@
-alt/error_annot_c_compiler_alt4.nit:20,39--45: Syntax error: "ldflags" expects at least one argument.
+alt/error_annot_c_compiler_alt4.nit:20,39--45: Syntax Error: `ldflags` expects at least one argument.
index 133d200..8b7abf4 100644 (file)
@@ -1 +1 @@
-alt/error_annot_c_compiler_alt5.nit:21,46--68: Annotation error: Something went wrong executing the argument of annotation "cflags", make sure the command is valid.
+alt/error_annot_c_compiler_alt5.nit:21,46--68: Error: something went wrong when executing the argument of `cflags`, make sure the command is valid.
index cc29f8a..2e6d245 100644 (file)
@@ -1 +1 @@
-alt/error_annot_c_compiler_alt6.nit:22,39--50: Syntax error: "cflags" accepts only calls to `exec` with the command as arguments.
+alt/error_annot_c_compiler_alt6.nit:22,39--50: Syntax Error: `cflags` accepts only calls to `exec` with the command as arguments.
index cba1d8e..6d7dfcc 100644 (file)
@@ -1 +1 @@
-alt/error_annot_pkgconfig_alt0.nit:17,48: Syntax error: unexpected ')'.
+alt/error_annot_pkgconfig_alt0.nit:17,48: Syntax Error: unexpected ')'.
index 1b0f126..7a31d23 100644 (file)
@@ -1 +1 @@
-alt/error_annot_pkgconfig_alt1.nit:18,38--61: Error: package "missing-lib" unknown by pkg-config, make sure the development package is be installed.
+alt/error_annot_pkgconfig_alt1.nit:18,38--61: Error: package `missing-lib` unknown by `pkg-config`, make sure the development package is be installed.
index 1e63dc5..1c4c22a 100644 (file)
@@ -1 +1 @@
-alt/error_annot_pkgconfig_alt2.nit:19,38--68: Syntax error: "pkgconfig" expects its arguments to be the name of the package as String literals.
+alt/error_annot_pkgconfig_alt2.nit:19,38--68: Syntax Error: `pkgconfig` expects its arguments to be the name of the package as String literals.
index 4d7fe8d..62ad9d4 100644 (file)
@@ -1 +1 @@
-alt/error_annot_pkgconfig_alt3.nit:20,38--52: Syntax error: "pkgconfig" expects its arguments to be the name of the package as String literals.
+alt/error_annot_pkgconfig_alt3.nit:20,38--52: Syntax Error: `pkgconfig` expects its arguments to be the name of the package as String literals.
index 5cb4cca..8561cdf 100644 (file)
@@ -1 +1 @@
-error_attr_2def.nit:19,6--9: Error: A property toto is already defined in class A at line 18.
+error_attr_2def.nit:19,6--9: Error: a property `toto` is already defined in class `A` at line 18.
index 7a56da2..b78e050 100644 (file)
@@ -1 +1 @@
-error_attr_assign.nit:21,11--13: Type error: expected Int, got Char
+error_attr_assign.nit:21,11--13: Type Error: expected `Int`, got `Char`.
index 6c81e05..b844acb 100644 (file)
@@ -1 +1 @@
-error_attr_unk.nit:17,8--12: Error: Attribute _toto doesn't exists in Sys.
+error_attr_unk.nit:17,8--12: Error: attribute `_toto` does not exist in `Sys`.
index 61e4598..6a99965 100644 (file)
@@ -1 +1 @@
-error_class_generic.nit:23,1--3: Syntax error: unexpected keyword 'end'.
+error_class_generic.nit:23,1--3: Syntax Error: unexpected keyword 'end'.
index 24a450f..6061b79 100644 (file)
@@ -1 +1 @@
-alt/error_class_generic_alt1.nit:25,8--12: Type error: 'Array' is a generic class.
+alt/error_class_generic_alt1.nit:25,8--12: Type Error: `Array[E: nullable Object]` is a generic class.
index 3a4e70f..31fe7ed 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_class_generic_alt2.nit:18,22--26: Warning: Useless formal parameter type since `Float` cannnot have subclasses.
-alt/error_class_generic_alt2.nit:25,8--12: Type error: 'Array' is a generic class.
+alt/error_class_generic_alt2.nit:18,22--26: Warning: useless formal parameter type since `Float` cannot have subclasses.
+alt/error_class_generic_alt2.nit:25,8--12: Type Error: `Array[E: nullable Object]` is a generic class.
index aa8128f..fd89cdd 100644 (file)
@@ -1 +1 @@
-alt/error_class_generic_alt3.nit:19,29--34: Error: A formal parameter type `E' already exists
+alt/error_class_generic_alt3.nit:19,29--34: Error: a formal parameter type `E` already exists.
index 393c1d3..f67051c 100644 (file)
@@ -1 +1 @@
-alt/error_class_generic_alt4.nit:20,7--11: Redef error: Array is an imported class. Add the redef keyword to refine it.
+alt/error_class_generic_alt4.nit:20,7--11: Redef Error: `Array` is an imported class. Add the `redef` keyword to refine it.
index c5d9def..2d92f39 100644 (file)
@@ -1 +1 @@
-alt/error_class_generic_alt5.nit:21,7--11: Redef error: Array is an imported class. Add the redef keyword to refine it.
+alt/error_class_generic_alt5.nit:21,7--11: Redef Error: `Array` is an imported class. Add the `redef` keyword to refine it.
index f1fcb86..aba4e09 100644 (file)
@@ -1 +1 @@
-alt/error_class_generic_alt6.nit:22,23--28: Error: A formal parameter type `E' already exists
+alt/error_class_generic_alt6.nit:22,23--28: Error: a formal parameter type `E` already exists.
index 2a02c5e..38a9af9 100644 (file)
@@ -1 +1 @@
-../lib/standard/kernel.nit:101,1--117,3: Error: kernel#Sys does not specialize module_0#Object. Possible duplication of the root class `Object`?
+../lib/standard/kernel.nit:97,1--111,3: Error: `kernel#Sys` does not specialize `module_0#Object`. Possible duplication of the root class `Object`?
index 1ec53ad..8d9f623 100644 (file)
@@ -1 +1 @@
-error_cons_arity.nit:19,7: Error: A class C is already defined at line 17.
+error_cons_arity.nit:19,7: Error: a class `C` is already defined at line 17.
index f8e6232..d22d83d 100644 (file)
@@ -1 +1 @@
-error_cons_arity2.nit:20,7: Error: A class A is already defined at line 17.
+error_cons_arity2.nit:20,7: Error: a class `A` is already defined at line 17.
index 65e80d9..d45aef1 100644 (file)
@@ -1 +1 @@
-error_constraint.nit:20,7: Error: A class A is already defined at line 18.
+error_constraint.nit:20,7: Error: a class `A` is already defined at line 18.
index a8d8158..8e2f54b 100644 (file)
@@ -1 +1 @@
-error_decl_type_var.nit:17,14--16: Type error: expected Int, got Char
+error_decl_type_var.nit:17,14--16: Type Error: expected `Int`, got `Char`.
index c79fb13..00c3748 100644 (file)
@@ -1 +1,3 @@
-alt/error_defs2_alt1.nit:20,11--13: Error: bar is not a top level method.
+4
+40
+124
index 8b01fd5..3c02f93 100644 (file)
@@ -1 +1 @@
-alt/error_defs2_alt2.nit:21,11--13: Error: No property Object::foo is inherited. Remove the redef keyword to define a new property.
+alt/error_defs2_alt2.nit:21,11--13: Error: no property `Sys::foo` is inherited. Remove the `redef` keyword to define a new property.
index 51c7c1a..27126c9 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt1.nit:19,7--12: Redef error: Object is an imported class. Add the redef keyword to refine it.
+alt/error_defs_alt1.nit:19,7--12: Redef Error: `Object` is an imported class. Add the `redef` keyword to refine it.
index 2059476..ba66a50 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt2.nit:26,5--7: Error: A property foo is already defined in class A at line 25.
+alt/error_defs_alt2.nit:26,5--7: Error: a property `foo` is already defined in class `A` at line 25.
index 90ed8c8..8ced2d3 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt3.nit:28,5--7: Redef error: A::bar is an inherited property. To redefine it, add the redef keyword.
+alt/error_defs_alt3.nit:28,5--7: Redef Error: `A::bar` is an inherited property. To redefine it, add the `redef` keyword.
index 80e2677..9994b6e 100644 (file)
@@ -1 +1,2 @@
-alt/error_defs_alt4.nit:29,5--7: Error: baz is a top level method.
+alt/error_defs_alt4.nit:27,36--38: Error: expected 1 argument(s) for `baz(c: Char)`; got 0. See introduction at `error_defs_alt4::A::baz`.
+alt/error_defs_alt4.nit:27,36--38: Error: expected an expression.
index fec299a..0b04cd3 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt5.nit:30,11--13: Error: baz is a top level method.
+alt/error_defs_alt5.nit:30,11--13: Error: no property `A::baz` is inherited. Remove the `redef` keyword to define a new property.
index 5f14bc0..6529721 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt6.nit:35,7: Error: A class A is already defined at line 24.
+alt/error_defs_alt6.nit:35,7: Error: a class `A` is already defined at line 24.
index cd3b438..47caead 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt7.nit:38,13: Error: A class A is already defined at line 24.
+alt/error_defs_alt7.nit:38,13: Error: a class `A` is already defined at line 24.
index 34f438c..c33bec5 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt8.nit:41,13: Error: A class A is already defined at line 24.
+alt/error_defs_alt8.nit:41,13: Error: a class `A` is already defined at line 24.
index 8c547a1..5be25b8 100644 (file)
@@ -1 +1 @@
-alt/error_defs_alt9.nit:46,5--7: Error: A property baz is already defined in class Object at line 45.
+alt/error_defs_alt9.nit:46,5--7: Error: a property `baz` is already defined in class `Sys` at line 45.
index fc4db99..c2460ba 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt1_alt1.nit:26,2--5: Error: A property init is already defined in class A at line 18.
+alt/error_defs_init_1alt1_alt1.nit:26,2--5: Error: a property `init` is already defined in class `A` at line 18.
index d8121d9..85a7e8e 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt1_alt2.nit:27,2--5: Error: A property init is already defined in class A at line 18.
+alt/error_defs_init_1alt1_alt2.nit:27,2--5: Error: a property `init` is already defined in class `A` at line 18.
index 428ec4f..d0f5aa7 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt2_alt1.nit:26,2--5: Error: A property init is already defined in class A at line 18.
+alt/error_defs_init_1alt2_alt1.nit:26,2--5: Error: a property `init` is already defined in class `A` at line 18.
index f3971f5..c9e3a71 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt2_alt2.nit:27,2--5: Error: A property init is already defined in class A at line 18.
+alt/error_defs_init_1alt2_alt2.nit:27,2--5: Error: a property `init` is already defined in class `A` at line 18.
index 497d5c5..00422a8 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt3_alt3.nit:28,2--4: Error: A property new is already defined in class A at line 18.
+alt/error_defs_init_1alt3_alt3.nit:28,2--4: Error: a property `new` is already defined in class `A` at line 18.
index bf6b758..a1afaae 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt3_alt4.nit:29,2--4: Error: A property new is already defined in class A at line 18.
+alt/error_defs_init_1alt3_alt4.nit:29,2--4: Error: a property `new` is already defined in class `A` at line 18.
index 42194cf..7e47c13 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt4_alt3.nit:28,2--4: Error: A property new is already defined in class A at line 18.
+alt/error_defs_init_1alt4_alt3.nit:28,2--4: Error: a property `new` is already defined in class `A` at line 18.
index 56af643..8febea7 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt4_alt4.nit:29,2--4: Error: A property new is already defined in class A at line 18.
+alt/error_defs_init_1alt4_alt4.nit:29,2--4: Error: a property `new` is already defined in class `A` at line 18.
index 4db55bb..54e02e6 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt5_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt5_alt5.nit:30,7--9: Error: a property `foo` is already defined in class `A` at line 18.
index c0863fd..a81e5b7 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt5_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt5_alt6.nit:31,6--8: Error: a property `foo` is already defined in class `A` at line 18.
index 23f59bb..cff2279 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt5_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt5_alt7.nit:32,6--8: Error: a property `foo` is already defined in class `A` at line 18.
index 0f733f8..a22d30b 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt6_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt6_alt5.nit:30,7--9: Error: a property `foo` is already defined in class `A` at line 18.
index 842b525..4ffd3d8 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt6_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt6_alt6.nit:31,6--8: Error: a property `foo` is already defined in class `A` at line 18.
index 21fb680..a9a3199 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt6_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt6_alt7.nit:32,6--8: Error: a property `foo` is already defined in class `A` at line 18.
index 446f89e..b646365 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt7_alt5.nit:30,7--9: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt7_alt5.nit:30,7--9: Error: a property `foo` is already defined in class `A` at line 18.
index c3761f1..e7d2b27 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt7_alt6.nit:31,6--8: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt7_alt6.nit:31,6--8: Error: a property `foo` is already defined in class `A` at line 18.
index f834897..fd99255 100644 (file)
@@ -1 +1 @@
-alt/error_defs_init_1alt7_alt7.nit:32,6--8: Error: A property foo is already defined in class A at line 18.
+alt/error_defs_init_1alt7_alt7.nit:32,6--8: Error: a property `foo` is already defined in class `A` at line 18.
index 0f97e5d..5a1d0b4 100644 (file)
-error_expr_not_ok.nit:19,18--21: Error: Method or variable 'fail' unknown in A.
-error_expr_not_ok.nit:21,11--14: Error: Method or variable 'fail' unknown in A.
-error_expr_not_ok.nit:22,26--29: Error: Method or variable 'fail' unknown in A.
-error_expr_not_ok.nit:24,8--11: Error: Method or variable 'fail' unknown in A.
-error_expr_not_ok.nit:25,9--12: Error: Method or variable 'fail' unknown in A.
-error_expr_not_ok.nit:40,1--7: Error: Method 'fail' doesn't exists in Int.
-error_expr_not_ok.nit:41,16--19: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:42,7--9: Type error: expected A, got Int
-error_expr_not_ok.nit:43,1--8: Error: Method 'fail' doesn't exists in Int.
-error_expr_not_ok.nit:44,12--15: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:48,1--4: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:49,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:50,1--4: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:51,1--9: Error: Method or variable 'fail=' unknown in Sys.
-error_expr_not_ok.nit:52,6--9: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:53,1--9: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:55,1--12: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:58,2--5: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:60,4--7: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:60,20: Type error: expected A, got Int
-error_expr_not_ok.nit:61,14--17: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:61,24--27: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:62,10--13: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:62,7--27: Type error: expected A, got Int
-error_expr_not_ok.nit:63,27--30: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:64,20--23: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:64,30--33: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:66,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:66,21: Type error: expected A, got Int
-error_expr_not_ok.nit:67,15--18: Error: Method or variable 'fail' unknown in Sys.
+error_expr_not_ok.nit:19,18--21: Error: method or variable `fail` unknown in `A`.
+error_expr_not_ok.nit:21,11--14: Error: method or variable `fail` unknown in `A`.
+error_expr_not_ok.nit:22,26--29: Error: method or variable `fail` unknown in `A`.
+error_expr_not_ok.nit:24,8--11: Error: method or variable `fail` unknown in `A`.
+error_expr_not_ok.nit:25,9--12: Error: method or variable `fail` unknown in `A`.
+error_expr_not_ok.nit:40,4--7: Error: method `fail` does not exists in `Int`.
+error_expr_not_ok.nit:41,16--19: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:42,7--9: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:43,5--8: Error: method `fail` does not exists in `Int`.
+error_expr_not_ok.nit:44,12--15: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:48,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:49,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:50,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:51,1--4: Error: method or variable `fail=` unknown in `Sys`.
+error_expr_not_ok.nit:52,6--9: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:53,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:55,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:58,2--5: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:60,4--7: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:60,20: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:61,14--17: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:61,24--27: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:62,10--13: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:62,7--27: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:63,27--30: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:64,20--23: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:64,30--33: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:66,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:66,21: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:67,15--18: Error: method or variable `fail` unknown in `Sys`.
 error_expr_not_ok.nit:67,1--18: Warning: use `loop` instead of `while true do`.
-error_expr_not_ok.nit:69,10--13: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:70,20--23: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:71,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:72,12--15: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:73,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:73,7--18: Type error: expected A, got Bool
-error_expr_not_ok.nit:74,15--18: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:74,7--18: Type error: expected A, got Bool
-error_expr_not_ok.nit:75,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:75,15--18: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:75,7--18: Type error: expected A, got Bool
-error_expr_not_ok.nit:76,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:76,7--19: Type error: expected A, got Bool
-error_expr_not_ok.nit:77,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:77,16--19: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:77,7--19: Type error: expected A, got Bool
-error_expr_not_ok.nit:78,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:78,16--19: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:78,7--19: Type error: expected A, got Bool
-error_expr_not_ok.nit:79,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:79,7--14: Type error: expected A, got Bool
-error_expr_not_ok.nit:80,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:81,12--15: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:81,7--15: Type error: expected A, got Bool
-error_expr_not_ok.nit:82,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:83,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:84,12--15: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:84,7--15: Type error: expected A, got Bool
-error_expr_not_ok.nit:85,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:86,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:87,26--29: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:87,7--30: Type error: expected A, got Bool
-error_expr_not_ok.nit:88,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:89,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:90,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:90,7--14: Type error: expected A, got Bool
-error_expr_not_ok.nit:91,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:92,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:93,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:93,7--14: Type error: expected A, got Bool
-error_expr_not_ok.nit:94,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:95,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:96,12--15: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:96,7--15: Type error: expected A, got Bool
-error_expr_not_ok.nit:97,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:98,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:99,12--15: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:99,7--15: Type error: expected A, got Bool
-error_expr_not_ok.nit:100,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:101,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:102,13--16: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:102,7--16: Type error: expected A, got Int
-error_expr_not_ok.nit:103,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:104,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:105,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:105,7--14: Type error: expected A, got Int
-error_expr_not_ok.nit:106,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:107,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:108,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:108,7--14: Type error: expected A, got Int
-error_expr_not_ok.nit:109,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:110,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:111,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:111,7--14: Type error: expected A, got Int
-error_expr_not_ok.nit:112,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:113,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:114,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:114,7--14: Type error: expected A, got Int
-error_expr_not_ok.nit:115,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:116,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:117,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:117,7--14: Type error: expected A, got Int
-error_expr_not_ok.nit:118,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:119,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:122,7--15: Error: Attribute _fail doesn't exists in String.
-error_expr_not_ok.nit:123,1--13: Error: Attribute _fail doesn't exists in String.
-error_expr_not_ok.nit:124,1--14: Error: Attribute _fail doesn't exists in String.
-error_expr_not_ok.nit:126,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:127,1--4: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:128,1--4: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:131,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:131,7--15: Type error: expected A, got Int
-error_expr_not_ok.nit:132,10--13: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:133,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:134,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:135,1--4: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:136,1--4: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:137,1--4: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:139,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:140,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:141,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:141,14--17: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:142,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:143,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:144,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:144,14--17: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:145,11--14: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:146,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:147,8--11: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:149,14--17: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:149,7--24: Type error: expected A, got String
-error_expr_not_ok.nit:150,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:151,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:152,7--10: Error: Method or variable 'fail' unknown in Sys.
-error_expr_not_ok.nit:152,7--18: Type error: expected A, got Bool
+error_expr_not_ok.nit:69,10--13: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:70,20--23: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:71,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:72,12--15: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:73,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:73,7--18: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:74,15--18: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:74,7--18: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:75,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:75,15--18: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:75,7--18: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:76,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:76,7--19: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:77,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:77,16--19: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:77,7--19: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:78,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:78,16--19: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:78,7--19: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:79,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:79,7--14: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:80,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:81,12--15: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:81,7--15: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:82,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:83,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:84,12--15: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:84,7--15: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:85,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:86,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:87,26--29: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:87,7--30: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:88,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:89,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:90,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:90,7--14: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:91,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:92,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:93,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:93,7--14: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:94,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:95,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:96,12--15: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:96,7--15: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:97,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:98,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:99,12--15: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:99,7--15: Type Error: expected `A`, got `Bool`.
+error_expr_not_ok.nit:100,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:101,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:102,13--16: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:102,7--16: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:103,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:104,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:105,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:105,7--14: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:106,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:107,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:108,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:108,7--14: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:109,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:110,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:111,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:111,7--14: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:112,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:113,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:114,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:114,7--14: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:115,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:116,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:117,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:117,7--14: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:118,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:119,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:122,11--15: Error: attribute `_fail` does not exist in `String`.
+error_expr_not_ok.nit:123,5--9: Error: attribute `_fail` does not exist in `String`.
+error_expr_not_ok.nit:124,5--9: Error: attribute `_fail` does not exist in `String`.
+error_expr_not_ok.nit:126,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:127,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:128,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:131,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:131,7--15: Type Error: expected `A`, got `Int`.
+error_expr_not_ok.nit:132,10--13: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:133,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:134,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:135,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:136,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:137,1--4: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:139,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:140,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:141,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:141,14--17: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:142,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:143,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:144,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:144,14--17: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:145,11--14: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:146,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:147,8--11: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:149,14--17: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:149,7--24: Type Error: expected `A`, got `String`.
+error_expr_not_ok.nit:150,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:151,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:152,7--10: Error: method or variable `fail` unknown in `Sys`.
+error_expr_not_ok.nit:152,7--18: Type Error: expected `A`, got `Bool`.
index 2c04b73..f3a6892 100644 (file)
@@ -1 +1 @@
-alt/error_expr_not_ok_alt1.nit:32,11--14: Type error: class Fail not found in module error_expr_not_ok_alt1.
+alt/error_expr_not_ok_alt1.nit:32,11--14: Error: class `Fail` not found in module `error_expr_not_ok_alt1`.
index 0c99ab8..61eb11d 100644 (file)
@@ -1,39 +1,39 @@
-alt/error_expr_not_ok_alt2.nit:19,18--21: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt2.nit:21,11--14: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt2.nit:22,26--29: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt2.nit:24,8--11: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt2.nit:25,9--12: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt2.nit:33,11--14: Type error: class Fail not found in module error_expr_not_ok_alt2.
-alt/error_expr_not_ok_alt2.nit:40,1--7: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt2.nit:42,7--9: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:43,1--8: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt2.nit:60,20: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:62,7--27: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:66,21: Type error: expected A, got Int
+alt/error_expr_not_ok_alt2.nit:19,18--21: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt2.nit:21,11--14: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt2.nit:22,26--29: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt2.nit:24,8--11: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt2.nit:25,9--12: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt2.nit:33,11--14: Error: class `Fail` not found in module `error_expr_not_ok_alt2`.
+alt/error_expr_not_ok_alt2.nit:40,4--7: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt2.nit:42,7--9: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:43,5--8: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt2.nit:60,20: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:62,7--27: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:66,21: Type Error: expected `A`, got `Int`.
 alt/error_expr_not_ok_alt2.nit:67,1--18: Warning: use `loop` instead of `while true do`.
-alt/error_expr_not_ok_alt2.nit:73,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:74,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:75,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:76,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:77,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:78,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:79,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:81,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:84,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:87,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:90,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:93,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:96,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:99,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt2.nit:102,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:105,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:108,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:111,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:114,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:117,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:122,7--15: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt2.nit:123,1--13: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt2.nit:124,1--14: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt2.nit:131,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt2.nit:149,7--24: Type error: expected A, got String
-alt/error_expr_not_ok_alt2.nit:152,7--18: Type error: expected A, got Bool
+alt/error_expr_not_ok_alt2.nit:73,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:74,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:75,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:76,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:77,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:78,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:79,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:81,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:84,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:87,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:90,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:93,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:96,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:99,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt2.nit:102,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:105,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:108,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:111,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:114,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:117,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:122,11--15: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt2.nit:123,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt2.nit:124,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt2.nit:131,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt2.nit:149,7--24: Type Error: expected `A`, got `String`.
+alt/error_expr_not_ok_alt2.nit:152,7--18: Type Error: expected `A`, got `Bool`.
index e1a8294..c5ab3c8 100644 (file)
@@ -1,39 +1,39 @@
-alt/error_expr_not_ok_alt3.nit:19,18--21: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt3.nit:21,11--14: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt3.nit:22,26--29: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt3.nit:24,8--11: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt3.nit:25,9--12: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt3.nit:34,12--18: Error: Method or variable 'fail' unknown in Sys.
-alt/error_expr_not_ok_alt3.nit:40,1--7: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt3.nit:42,7--9: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:43,1--8: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt3.nit:60,20: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:62,7--27: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:66,21: Type error: expected A, got Int
+alt/error_expr_not_ok_alt3.nit:19,18--21: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt3.nit:21,11--14: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt3.nit:22,26--29: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt3.nit:24,8--11: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt3.nit:25,9--12: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt3.nit:34,12--15: Error: method or variable `fail` unknown in `Sys`.
+alt/error_expr_not_ok_alt3.nit:40,4--7: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt3.nit:42,7--9: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:43,5--8: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt3.nit:60,20: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:62,7--27: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:66,21: Type Error: expected `A`, got `Int`.
 alt/error_expr_not_ok_alt3.nit:67,1--18: Warning: use `loop` instead of `while true do`.
-alt/error_expr_not_ok_alt3.nit:73,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:74,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:75,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:76,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:77,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:78,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:79,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:81,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:84,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:87,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:90,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:93,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:96,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:99,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt3.nit:102,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:105,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:108,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:111,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:114,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:117,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:122,7--15: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt3.nit:123,1--13: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt3.nit:124,1--14: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt3.nit:131,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt3.nit:149,7--24: Type error: expected A, got String
-alt/error_expr_not_ok_alt3.nit:152,7--18: Type error: expected A, got Bool
+alt/error_expr_not_ok_alt3.nit:73,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:74,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:75,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:76,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:77,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:78,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:79,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:81,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:84,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:87,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:90,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:93,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:96,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:99,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt3.nit:102,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:105,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:108,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:111,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:114,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:117,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:122,11--15: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt3.nit:123,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt3.nit:124,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt3.nit:131,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt3.nit:149,7--24: Type Error: expected `A`, got `String`.
+alt/error_expr_not_ok_alt3.nit:152,7--18: Type Error: expected `A`, got `Bool`.
index 01f96ed..dbfac07 100644 (file)
-alt/error_expr_not_ok_alt4.nit:19,18--21: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt4.nit:21,11--14: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt4.nit:22,26--29: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt4.nit:24,8--11: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt4.nit:25,9--12: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt4.nit:40,1--7: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:41,16--19: Type error: expected Int, got Object
-alt/error_expr_not_ok_alt4.nit:42,7--9: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:43,1--8: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:45,7--10: Type error: expected A, got Object
-alt/error_expr_not_ok_alt4.nit:46,1--9: Error: Method 'fail' doesn't exists in Object.
-alt/error_expr_not_ok_alt4.nit:49,7--10: Type error: expected A, got Object
-alt/error_expr_not_ok_alt4.nit:50,1--10: Error: cannot call 'trash', a top-level method, with a receiver.
-alt/error_expr_not_ok_alt4.nit:50,1--10: Error: Incorrect number of parameters. Got 0, expected 1. Signature is (x: A)
-alt/error_expr_not_ok_alt4.nit:60,4--7: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:60,20: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:62,10--13: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:62,7--27: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:63,7--30: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:64,7--33: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:66,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:66,21: Type error: expected A, got Int
+alt/error_expr_not_ok_alt4.nit:19,18--21: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt4.nit:21,11--14: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt4.nit:22,26--29: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt4.nit:24,8--11: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt4.nit:25,9--12: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt4.nit:40,4--7: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt4.nit:41,16--19: Type Error: expected `Int`, got `Object`.
+alt/error_expr_not_ok_alt4.nit:42,7--9: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:43,5--8: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt4.nit:45,7--10: Type Error: expected `A`, got `Object`.
+alt/error_expr_not_ok_alt4.nit:46,6--9: Error: method `fail` does not exists in `Object`.
+alt/error_expr_not_ok_alt4.nit:49,7--10: Type Error: expected `A`, got `Object`.
+alt/error_expr_not_ok_alt4.nit:50,6--10: Error: method `trash` does not exists in `Object`.
+alt/error_expr_not_ok_alt4.nit:60,4--7: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:60,20: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:62,10--13: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:62,7--27: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:63,7--30: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:64,7--33: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:66,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:66,21: Type Error: expected `A`, got `Int`.
 alt/error_expr_not_ok_alt4.nit:67,1--18: Warning: use `loop` instead of `while true do`.
-alt/error_expr_not_ok_alt4.nit:69,24: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:69,1--25: Type Error: 'for' expects a type providing 'iterator' method, got 'Int'.
-alt/error_expr_not_ok_alt4.nit:69,1--25: Error: Method 'iterator' doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:71,8--11: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:72,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:73,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:73,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:74,15--18: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:74,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:75,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:75,15--18: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:75,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:76,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:76,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:77,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:77,16--19: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:77,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:78,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:78,16--19: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:78,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:79,11--14: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt4.nit:79,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:80,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:81,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:82,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:83,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:84,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:85,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:86,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:87,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:88,7--33: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:89,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:90,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:91,7--17: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:92,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:93,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:94,7--17: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:95,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:96,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:97,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:98,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:99,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:100,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt4.nit:101,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:102,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:103,7--19: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:104,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:105,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:106,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:107,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:108,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:109,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:110,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:111,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:112,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:113,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:114,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:115,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:116,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:117,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:118,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:119,7--11: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:122,7--15: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt4.nit:123,1--13: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt4.nit:124,1--14: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt4.nit:126,7--13: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:127,1--11: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:128,1--12: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:131,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:134,7--13: Error: Method '[]' doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:135,1--11: Error: Method '[]=' doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:136,1--12: Error: Method '[]' doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:137,1--17: Error: Method '[]=' doesn't exists in Int.
-alt/error_expr_not_ok_alt4.nit:139,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt4.nit:140,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt4.nit:141,7--18: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt4.nit:142,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt4.nit:143,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt4.nit:144,7--18: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt4.nit:145,7--15: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt4.nit:146,7--15: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt4.nit:147,7--18: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt4.nit:149,7--24: Type error: expected A, got String
-alt/error_expr_not_ok_alt4.nit:150,7--18: Warning: Expression is already a Int.
-alt/error_expr_not_ok_alt4.nit:150,7--18: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:151,7--23: Warning: expression is already not null, since it is a `Int`.
-alt/error_expr_not_ok_alt4.nit:151,7--23: Type error: expected A, got Int
-alt/error_expr_not_ok_alt4.nit:152,7--18: Warning: Expression is already a Int.
-alt/error_expr_not_ok_alt4.nit:152,7--18: Type error: expected A, got Bool
+alt/error_expr_not_ok_alt4.nit:69,24: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:69,1--25: Type Error: `for` expects a type providing an `iterator` method, got `Int`.
+alt/error_expr_not_ok_alt4.nit:69,1--25: Error: method `iterator` does not exists in `Int`.
+alt/error_expr_not_ok_alt4.nit:71,8--11: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:72,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:73,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:73,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:74,15--18: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:74,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:75,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:75,15--18: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:75,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:76,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:76,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:77,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:77,16--19: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:77,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:78,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:78,16--19: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:78,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:79,11--14: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:79,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:80,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:81,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:82,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:83,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:84,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:85,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:86,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:87,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:88,7--33: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:89,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:90,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:91,7--17: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:92,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:93,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:94,7--17: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:95,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:96,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:97,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:98,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:99,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:100,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt4.nit:101,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:102,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:103,7--19: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:104,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:105,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:106,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:107,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:108,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:109,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:110,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:111,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:112,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:113,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:114,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:115,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:116,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:117,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:118,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:119,7--11: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:122,11--15: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt4.nit:123,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt4.nit:124,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt4.nit:126,12--13: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt4.nit:127,6--7: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt4.nit:128,6--7: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt4.nit:131,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:134,7--13: Error: method `[]` does not exists in `Int`.
+alt/error_expr_not_ok_alt4.nit:135,1--11: Error: method `[]=` does not exists in `Int`.
+alt/error_expr_not_ok_alt4.nit:136,1--12: Error: method `[]` does not exists in `Int`.
+alt/error_expr_not_ok_alt4.nit:137,1--17: Error: method `[]=` does not exists in `Int`.
+alt/error_expr_not_ok_alt4.nit:139,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt4.nit:140,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt4.nit:141,7--18: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt4.nit:142,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt4.nit:143,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt4.nit:144,7--18: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt4.nit:145,7--15: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt4.nit:146,7--15: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt4.nit:147,7--18: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt4.nit:149,7--24: Type Error: expected `A`, got `String`.
+alt/error_expr_not_ok_alt4.nit:150,7--18: Warning: expression is already a `Int`.
+alt/error_expr_not_ok_alt4.nit:150,7--18: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:151,7--10: Warning: expression is not null, since it is a `Int`.
+alt/error_expr_not_ok_alt4.nit:151,7--23: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt4.nit:152,7--18: Warning: expression is already a `Int`.
+alt/error_expr_not_ok_alt4.nit:152,7--18: Type Error: expected `A`, got `Bool`.
index 98e1d46..a585085 100644 (file)
-alt/error_expr_not_ok_alt5.nit:19,18--21: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt5.nit:21,11--14: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt5.nit:22,26--29: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt5.nit:24,8--11: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt5.nit:25,9--12: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt5.nit:37,8--15: Error: Method or variable 'fail2' unknown in Sys.
-alt/error_expr_not_ok_alt5.nit:40,1--7: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:42,7--9: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:43,1--8: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:60,4--7: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:60,20: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:62,10--13: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:62,7--27: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:63,7--30: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:64,7--33: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:66,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:66,21: Type error: expected A, got Int
+alt/error_expr_not_ok_alt5.nit:19,18--21: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt5.nit:21,11--14: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt5.nit:22,26--29: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt5.nit:24,8--11: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt5.nit:25,9--12: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt5.nit:37,8--12: Error: method or variable `fail2` unknown in `Sys`.
+alt/error_expr_not_ok_alt5.nit:40,4--7: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt5.nit:42,7--9: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:43,5--8: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt5.nit:60,4--7: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:60,20: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:62,10--13: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:62,7--27: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:63,7--30: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:64,7--33: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:66,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:66,21: Type Error: expected `A`, got `Int`.
 alt/error_expr_not_ok_alt5.nit:67,1--18: Warning: use `loop` instead of `while true do`.
-alt/error_expr_not_ok_alt5.nit:69,24: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:69,1--25: Type Error: 'for' expects a type providing 'iterator' method, got 'Int'.
-alt/error_expr_not_ok_alt5.nit:69,1--25: Error: Method 'iterator' doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:71,8--11: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:72,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:73,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:73,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:74,15--18: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:74,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:75,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:75,15--18: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:75,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:76,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:76,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:77,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:77,16--19: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:77,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:78,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:78,16--19: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:78,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:79,11--14: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt5.nit:79,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:80,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:81,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:82,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:83,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:84,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:85,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:86,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:87,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:88,7--33: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:89,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:90,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:91,7--17: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:92,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:93,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:94,7--17: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:95,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:96,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:97,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:98,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:99,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:100,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt5.nit:101,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:102,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:103,7--19: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:104,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:105,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:106,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:107,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:108,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:109,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:110,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:111,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:112,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:113,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:114,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:115,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:116,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:117,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:118,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:119,7--11: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:122,7--15: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt5.nit:123,1--13: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt5.nit:124,1--14: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt5.nit:126,7--13: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:127,1--11: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:128,1--12: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:131,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:134,7--13: Error: Method '[]' doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:135,1--11: Error: Method '[]=' doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:136,1--12: Error: Method '[]' doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:137,1--17: Error: Method '[]=' doesn't exists in Int.
-alt/error_expr_not_ok_alt5.nit:139,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt5.nit:140,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt5.nit:141,7--18: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt5.nit:142,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt5.nit:143,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt5.nit:144,7--18: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt5.nit:145,7--15: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt5.nit:146,7--15: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt5.nit:147,7--18: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt5.nit:149,7--24: Type error: expected A, got String
-alt/error_expr_not_ok_alt5.nit:150,7--18: Warning: Expression is already a Int.
-alt/error_expr_not_ok_alt5.nit:150,7--18: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:151,7--23: Warning: expression is already not null, since it is a `Int`.
-alt/error_expr_not_ok_alt5.nit:151,7--23: Type error: expected A, got Int
-alt/error_expr_not_ok_alt5.nit:152,7--18: Warning: Expression is already a Int.
-alt/error_expr_not_ok_alt5.nit:152,7--18: Type error: expected A, got Bool
+alt/error_expr_not_ok_alt5.nit:69,24: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:69,1--25: Type Error: `for` expects a type providing an `iterator` method, got `Int`.
+alt/error_expr_not_ok_alt5.nit:69,1--25: Error: method `iterator` does not exists in `Int`.
+alt/error_expr_not_ok_alt5.nit:71,8--11: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:72,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:73,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:73,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:74,15--18: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:74,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:75,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:75,15--18: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:75,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:76,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:76,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:77,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:77,16--19: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:77,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:78,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:78,16--19: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:78,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:79,11--14: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:79,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:80,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:81,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:82,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:83,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:84,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:85,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:86,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:87,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:88,7--33: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:89,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:90,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:91,7--17: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:92,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:93,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:94,7--17: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:95,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:96,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:97,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:98,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:99,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:100,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt5.nit:101,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:102,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:103,7--19: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:104,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:105,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:106,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:107,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:108,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:109,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:110,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:111,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:112,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:113,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:114,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:115,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:116,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:117,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:118,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:119,7--11: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:122,11--15: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt5.nit:123,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt5.nit:124,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt5.nit:126,12--13: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt5.nit:127,6--7: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt5.nit:128,6--7: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt5.nit:131,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:134,7--13: Error: method `[]` does not exists in `Int`.
+alt/error_expr_not_ok_alt5.nit:135,1--11: Error: method `[]=` does not exists in `Int`.
+alt/error_expr_not_ok_alt5.nit:136,1--12: Error: method `[]` does not exists in `Int`.
+alt/error_expr_not_ok_alt5.nit:137,1--17: Error: method `[]=` does not exists in `Int`.
+alt/error_expr_not_ok_alt5.nit:139,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt5.nit:140,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt5.nit:141,7--18: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt5.nit:142,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt5.nit:143,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt5.nit:144,7--18: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt5.nit:145,7--15: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt5.nit:146,7--15: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt5.nit:147,7--18: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt5.nit:149,7--24: Type Error: expected `A`, got `String`.
+alt/error_expr_not_ok_alt5.nit:150,7--18: Warning: expression is already a `Int`.
+alt/error_expr_not_ok_alt5.nit:150,7--18: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:151,7--10: Warning: expression is not null, since it is a `Int`.
+alt/error_expr_not_ok_alt5.nit:151,7--23: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt5.nit:152,7--18: Warning: expression is already a `Int`.
+alt/error_expr_not_ok_alt5.nit:152,7--18: Type Error: expected `A`, got `Bool`.
index efeddc2..0e499b0 100644 (file)
-alt/error_expr_not_ok_alt6.nit:19,18--21: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt6.nit:21,11--14: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt6.nit:22,26--29: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt6.nit:24,8--11: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt6.nit:25,9--12: Error: Method or variable 'fail' unknown in A.
-alt/error_expr_not_ok_alt6.nit:40,1--7: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:41,16--19: Type error: expected Int, got null
-alt/error_expr_not_ok_alt6.nit:42,7--9: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:43,1--8: Error: Method 'fail' doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:45,7--10: Type error: expected A, got null
-alt/error_expr_not_ok_alt6.nit:46,1--9: Error: Method 'fail' call on 'null'.
-alt/error_expr_not_ok_alt6.nit:49,7--10: Type error: expected A, got null
-alt/error_expr_not_ok_alt6.nit:50,1--10: Error: Method 'trash' call on 'null'.
-alt/error_expr_not_ok_alt6.nit:60,4--7: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:60,20: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:62,10--13: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:62,7--27: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:63,7--30: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:64,7--33: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:66,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:66,21: Type error: expected A, got Int
+alt/error_expr_not_ok_alt6.nit:19,18--21: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt6.nit:21,11--14: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt6.nit:22,26--29: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt6.nit:24,8--11: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt6.nit:25,9--12: Error: method or variable `fail` unknown in `A`.
+alt/error_expr_not_ok_alt6.nit:40,4--7: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt6.nit:41,16--19: Type Error: expected `Int`, got `null`.
+alt/error_expr_not_ok_alt6.nit:42,7--9: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:43,5--8: Error: method `fail` does not exists in `Int`.
+alt/error_expr_not_ok_alt6.nit:45,7--10: Type Error: expected `A`, got `null`.
+alt/error_expr_not_ok_alt6.nit:46,6--9: Error: method `fail` called on `null`.
+alt/error_expr_not_ok_alt6.nit:49,7--10: Type Error: expected `A`, got `null`.
+alt/error_expr_not_ok_alt6.nit:50,6--10: Error: method `trash` called on `null`.
+alt/error_expr_not_ok_alt6.nit:60,4--7: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:60,20: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:62,10--13: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:62,7--27: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:63,7--30: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:64,7--33: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:66,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:66,21: Type Error: expected `A`, got `Int`.
 alt/error_expr_not_ok_alt6.nit:67,1--18: Warning: use `loop` instead of `while true do`.
-alt/error_expr_not_ok_alt6.nit:69,24: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:69,1--25: Type Error: 'for' expects a type providing 'iterator' method, got 'Int'.
-alt/error_expr_not_ok_alt6.nit:69,1--25: Error: Method 'iterator' doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:71,8--11: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:72,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:73,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:73,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:74,15--18: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:74,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:75,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:75,15--18: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:75,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:76,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:76,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:77,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:77,16--19: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:77,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:78,7--10: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:78,16--19: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:78,7--19: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:79,11--14: Type error: expected Bool, got Int
-alt/error_expr_not_ok_alt6.nit:79,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:80,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:81,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:82,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:83,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:84,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:85,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:86,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:87,7--30: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:88,7--33: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:89,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:90,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:91,7--17: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:92,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:93,7--14: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:94,7--17: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:95,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:96,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:97,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:98,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:99,7--15: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:100,7--18: Type error: expected A, got Bool
-alt/error_expr_not_ok_alt6.nit:101,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:102,7--16: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:103,7--19: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:104,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:105,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:106,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:107,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:108,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:109,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:110,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:111,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:112,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:113,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:114,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:115,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:116,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:117,7--14: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:118,7--17: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:119,7--11: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:122,7--15: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt6.nit:123,1--13: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt6.nit:124,1--14: Error: Attribute _fail doesn't exists in String.
-alt/error_expr_not_ok_alt6.nit:126,7--13: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:127,1--11: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:128,1--12: Error: Attribute _x doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:131,7--15: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:134,7--13: Error: Method '[]' doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:135,1--11: Error: Method '[]=' doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:136,1--12: Error: Method '[]' doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:137,1--17: Error: Method '[]=' doesn't exists in Int.
-alt/error_expr_not_ok_alt6.nit:139,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt6.nit:140,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt6.nit:141,7--18: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt6.nit:142,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt6.nit:143,7--15: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt6.nit:144,7--18: Type error: expected A, got Range[Int]
-alt/error_expr_not_ok_alt6.nit:145,7--15: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt6.nit:146,7--15: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt6.nit:147,7--18: Type error: expected A, got Array[Int]
-alt/error_expr_not_ok_alt6.nit:149,7--24: Type error: expected A, got String
-alt/error_expr_not_ok_alt6.nit:150,7--18: Warning: Expression is already a Int.
-alt/error_expr_not_ok_alt6.nit:150,7--18: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:151,7--23: Warning: expression is already not null, since it is a `Int`.
-alt/error_expr_not_ok_alt6.nit:151,7--23: Type error: expected A, got Int
-alt/error_expr_not_ok_alt6.nit:152,7--18: Warning: Expression is already a Int.
-alt/error_expr_not_ok_alt6.nit:152,7--18: Type error: expected A, got Bool
+alt/error_expr_not_ok_alt6.nit:69,24: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:69,1--25: Type Error: `for` expects a type providing an `iterator` method, got `Int`.
+alt/error_expr_not_ok_alt6.nit:69,1--25: Error: method `iterator` does not exists in `Int`.
+alt/error_expr_not_ok_alt6.nit:71,8--11: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:72,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:73,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:73,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:74,15--18: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:74,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:75,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:75,15--18: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:75,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:76,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:76,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:77,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:77,16--19: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:77,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:78,7--10: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:78,16--19: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:78,7--19: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:79,11--14: Type Error: expected `Bool`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:79,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:80,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:81,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:82,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:83,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:84,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:85,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:86,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:87,7--30: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:88,7--33: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:89,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:90,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:91,7--17: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:92,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:93,7--14: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:94,7--17: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:95,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:96,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:97,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:98,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:99,7--15: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:100,7--18: Type Error: expected `A`, got `Bool`.
+alt/error_expr_not_ok_alt6.nit:101,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:102,7--16: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:103,7--19: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:104,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:105,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:106,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:107,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:108,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:109,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:110,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:111,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:112,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:113,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:114,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:115,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:116,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:117,7--14: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:118,7--17: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:119,7--11: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:122,11--15: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt6.nit:123,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt6.nit:124,5--9: Error: attribute `_fail` does not exist in `String`.
+alt/error_expr_not_ok_alt6.nit:126,12--13: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt6.nit:127,6--7: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt6.nit:128,6--7: Error: attribute `_x` does not exist in `Int`.
+alt/error_expr_not_ok_alt6.nit:131,7--15: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:134,7--13: Error: method `[]` does not exists in `Int`.
+alt/error_expr_not_ok_alt6.nit:135,1--11: Error: method `[]=` does not exists in `Int`.
+alt/error_expr_not_ok_alt6.nit:136,1--12: Error: method `[]` does not exists in `Int`.
+alt/error_expr_not_ok_alt6.nit:137,1--17: Error: method `[]=` does not exists in `Int`.
+alt/error_expr_not_ok_alt6.nit:139,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt6.nit:140,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt6.nit:141,7--18: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt6.nit:142,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt6.nit:143,7--15: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt6.nit:144,7--18: Type Error: expected `A`, got `Range[Int]`.
+alt/error_expr_not_ok_alt6.nit:145,7--15: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt6.nit:146,7--15: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt6.nit:147,7--18: Type Error: expected `A`, got `Array[Int]`.
+alt/error_expr_not_ok_alt6.nit:149,7--24: Type Error: expected `A`, got `String`.
+alt/error_expr_not_ok_alt6.nit:150,7--18: Warning: expression is already a `Int`.
+alt/error_expr_not_ok_alt6.nit:150,7--18: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:151,7--10: Warning: expression is not null, since it is a `Int`.
+alt/error_expr_not_ok_alt6.nit:151,7--23: Type Error: expected `A`, got `Int`.
+alt/error_expr_not_ok_alt6.nit:152,7--18: Warning: expression is already a `Int`.
+alt/error_expr_not_ok_alt6.nit:152,7--18: Type Error: expected `A`, got `Bool`.
index 4aa3dcd..0cebf2e 100644 (file)
@@ -1,2 +1,2 @@
-error_for_coll.nit:17,1--18,3: Error: Method 'iterator' doesn't exists in Int.
-error_for_coll.nit:17,1--18,3: Type Error: 'for' expects a type providing 'iterator' method, got 'Int'.
+error_for_coll.nit:17,1--18,3: Error: method `iterator` does not exists in `Int`.
+error_for_coll.nit:17,1--18,3: Type Error: `for` expects a type providing an `iterator` method, got `Int`.
index 91cbe5e..319de47 100644 (file)
@@ -1 +1 @@
-error_formal.nit:18,9--13: Type error: formal type T cannot have formal parameters.
+error_formal.nit:18,9--13: Type Error: formal type `T` cannot have formal parameters.
index 6337d8c..f743502 100644 (file)
@@ -1,2 +1,2 @@
-error_formal_name.nit:17,9--11: Warning: lowercase in the formal parameter type Foo
-error_formal_name.nit:18,7--9: Warning: lowercase in the virtual type Bar
+error_formal_name.nit:17,9--11: Warning: lowercase in the formal parameter type `Foo`.
+error_formal_name.nit:18,7--9: Warning: lowercase in the virtual type `Bar`.
index aeffdf9..095c8e7 100644 (file)
@@ -1 +1 @@
-error_fun_ret.nit:17,5--8: Control error: Reached end of function (a 'return' with a value was expected).
+error_fun_ret.nit:17,5--8: Error: reached end of function; expected `return` with a value.
index 47af040..d1c24f7 100644 (file)
@@ -1 +1 @@
-error_fun_ret2.nit:17,5--8: Control error: Reached end of function (a 'return' with a value was expected).
+error_fun_ret2.nit:17,5--8: Error: reached end of function; expected `return` with a value.
index 62ab5c2..695a8ba 100644 (file)
@@ -1 +1 @@
-error_fun_ret3.nit:17,5--8: Control error: Reached end of function (a 'return' with a value was expected).
+error_fun_ret3.nit:17,5--8: Error: reached end of function; expected `return` with a value.
index 1c9f8a5..82eb284 100644 (file)
@@ -1,2 +1,2 @@
-error_fun_ret4.nit:17,5--8: Control error: Reached end of function (a 'return' with a value was expected).
+error_fun_ret4.nit:17,5--8: Error: reached end of function; expected `return` with a value.
 error_fun_ret4.nit:19,2--22,4: Warning: use `loop` instead of `while true do`.
index 09184c7..adbf9d4 100644 (file)
@@ -1 +1 @@
-error_fun_ret5.nit:17,5--8: Control error: Reached end of function (a 'return' with a value was expected).
+error_fun_ret5.nit:17,5--8: Error: reached end of function; expected `return` with a value.
index 07b0762..bf0d1f3 100644 (file)
@@ -1 +1 @@
-base_gen_f.nit:19,14: Type error: class E not found in module base_gen_f.
+base_gen_f.nit:19,14: Error: class `E` not found in module `base_gen_f`.
index 403a598..1c34fe6 100644 (file)
@@ -1 +1 @@
-error_if_bool.nit:17,4: Type error: expected Bool, got Int
+error_if_bool.nit:17,4: Type Error: expected `Bool`, got `Int`.
index ab8fbea..f32ba33 100644 (file)
@@ -1 +1 @@
-error_inh_clash.nit:17,7: Error: Incompatibles ancestors for A: Array[Int], Array[Char]
+error_inh_clash.nit:17,7: Error: incompatible ancestors for `A`; conflict: `Array[Int]` and `Array[Char]`
index d8b254e..2222174 100644 (file)
@@ -1 +1 @@
-error_inh_clash2.nit:23,7: Error: Incompatibles ancestors for C: Array[Char], Array[Int]
+error_inh_clash2.nit:23,7: Error: incompatible ancestors for `C`; conflict: `Array[Char]` and `Array[Int]`
index 542859b..560f207 100644 (file)
@@ -1,2 +1,2 @@
-error_inh_clash3.nit:23,7: Error: Incompatibles ancestors for C: Sequence[Char], Sequence[Int]
-error_inh_clash3.nit:23,7: Error: Incompatibles ancestors for C: SequenceRead[Char], SequenceRead[Int]
+error_inh_clash3.nit:23,7: Error: incompatible ancestors for `C`; conflict: `Sequence[Char]` and `Sequence[Int]`
+error_inh_clash3.nit:23,7: Error: incompatible ancestors for `C`; conflict: `SequenceRead[Char]` and `SequenceRead[Int]`
index 2f4865c..bf3cbb6 100644 (file)
@@ -1,2 +1,2 @@
-error_inh_clash4.nit:15,7: Error: Incompatibles ancestors for A: Sequence[F], Sequence[E]
-error_inh_clash4.nit:15,7: Error: Incompatibles ancestors for A: SequenceRead[F], SequenceRead[E]
+error_inh_clash4.nit:15,7: Error: incompatible ancestors for `A`; conflict: `Sequence[F]` and `Sequence[E]`
+error_inh_clash4.nit:15,7: Error: incompatible ancestors for `A`; conflict: `SequenceRead[F]` and `SequenceRead[E]`
index c204aa0..4479834 100644 (file)
@@ -1,3 +1,3 @@
-error_inh_loop.nit:19,7: Error: Inheritance loop for class A with type B
-error_inh_loop.nit:23,7: Error: Inheritance loop for class B with type C
-error_inh_loop.nit:27,7: Error: Inheritance loop for class C with type A
+error_inh_loop.nit:19,7: Error: inheritance loop for class `A` with type `B`.
+error_inh_loop.nit:23,7: Error: inheritance loop for class `B` with type `C`.
+error_inh_loop.nit:27,7: Error: inheritance loop for class `C` with type `A`.
index 4e20a73..dc98934 100644 (file)
@@ -1,4 +1,4 @@
-error_init_auto.nit:34,5--9: Error: Incorrect number of parameters. Got 0, expected 1. Signature is (x: Int)
-error_init_auto.nit:36,5--15: Error: Incorrect number of parameters. Got 2, expected 1. Signature is (x: Int)
-error_init_auto.nit:37,5--18: Error: Incorrect number of parameters. Got 3, expected 1. Signature is (x: Int)
-error_init_auto.nit:38,5--16: Error: Method 'foo' doesn't exists in A.
+error_init_auto.nit:34,5--7: Error: expected 1 argument(s) for `init(x: Int)`; got 0. See introduction at `standard::Object::init`.
+error_init_auto.nit:36,5--7: Error: expected 1 argument(s) for `init(x: Int)`; got 2. See introduction at `standard::Object::init`.
+error_init_auto.nit:37,5--7: Error: expected 1 argument(s) for `init(x: Int)`; got 3. See introduction at `standard::Object::init`.
+error_init_auto.nit:38,11--13: Error: method `foo` does not exists in `A`.
index eea733e..a13c50a 100644 (file)
@@ -1,4 +1,4 @@
-alt/error_init_auto_alt1.nit:35,5--12: Error: Incorrect number of parameters. Got 1, expected 0. Signature is 
-alt/error_init_auto_alt1.nit:36,5--15: Error: Incorrect number of parameters. Got 2, expected 0. Signature is 
-alt/error_init_auto_alt1.nit:37,5--18: Error: Incorrect number of parameters. Got 3, expected 0. Signature is 
-alt/error_init_auto_alt1.nit:38,5--16: Error: Method 'foo' doesn't exists in A.
+alt/error_init_auto_alt1.nit:35,5--7: Error: expected 0 argument(s) for `init`; got 1. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt1.nit:36,5--7: Error: expected 0 argument(s) for `init`; got 2. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt1.nit:37,5--7: Error: expected 0 argument(s) for `init`; got 3. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt1.nit:38,11--13: Error: method `foo` does not exists in `A`.
index 9fb521b..d4a95b7 100644 (file)
@@ -1,4 +1,4 @@
-alt/error_init_auto_alt2.nit:34,5--9: Error: Incorrect number of parameters. Got 0, expected 2. Signature is (x: Int, y: Int)
-alt/error_init_auto_alt2.nit:35,5--12: Error: Incorrect number of parameters. Got 1, expected 2. Signature is (x: Int, y: Int)
-alt/error_init_auto_alt2.nit:37,5--18: Error: Incorrect number of parameters. Got 3, expected 2. Signature is (x: Int, y: Int)
-alt/error_init_auto_alt2.nit:38,5--16: Error: Method 'foo' doesn't exists in A.
+alt/error_init_auto_alt2.nit:34,5--7: Error: expected 2 argument(s) for `init(x: Int, y: Int)`; got 0. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt2.nit:35,5--7: Error: expected 2 argument(s) for `init(x: Int, y: Int)`; got 1. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt2.nit:37,5--7: Error: expected 2 argument(s) for `init(x: Int, y: Int)`; got 3. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt2.nit:38,11--13: Error: method `foo` does not exists in `A`.
index fe729e3..61e44f6 100644 (file)
@@ -1,4 +1,4 @@
-alt/error_init_auto_alt3.nit:34,5--9: Error: Incorrect number of parameters. Got 0, expected 1. Signature is (xx: Int)
-alt/error_init_auto_alt3.nit:36,5--15: Error: Incorrect number of parameters. Got 2, expected 1. Signature is (xx: Int)
-alt/error_init_auto_alt3.nit:37,5--18: Error: Incorrect number of parameters. Got 3, expected 1. Signature is (xx: Int)
-alt/error_init_auto_alt3.nit:38,5--16: Error: Method 'foo' doesn't exists in A.
+alt/error_init_auto_alt3.nit:34,5--7: Error: expected 1 argument(s) for `init(xx: Int)`; got 0. See introduction at `error_init_auto_alt3::A::init`.
+alt/error_init_auto_alt3.nit:36,5--7: Error: expected 1 argument(s) for `init(xx: Int)`; got 2. See introduction at `error_init_auto_alt3::A::init`.
+alt/error_init_auto_alt3.nit:37,5--7: Error: expected 1 argument(s) for `init(xx: Int)`; got 3. See introduction at `error_init_auto_alt3::A::init`.
+alt/error_init_auto_alt3.nit:38,11--13: Error: method `foo` does not exists in `A`.
index 65c6fb1..e1b5e3f 100644 (file)
@@ -1,3 +1,3 @@
-alt/error_init_auto_alt4.nit:34,5--9: Error: Incorrect number of parameters. Got 0, expected 1. Signature is (x: Int)
-alt/error_init_auto_alt4.nit:36,5--15: Error: Incorrect number of parameters. Got 2, expected 1. Signature is (x: Int)
-alt/error_init_auto_alt4.nit:37,5--18: Error: Incorrect number of parameters. Got 3, expected 1. Signature is (x: Int)
+alt/error_init_auto_alt4.nit:34,5--7: Error: expected 1 argument(s) for `init(x: Int)`; got 0. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt4.nit:36,5--7: Error: expected 1 argument(s) for `init(x: Int)`; got 2. See introduction at `standard::Object::init`.
+alt/error_init_auto_alt4.nit:37,5--7: Error: expected 1 argument(s) for `init(x: Int)`; got 3. See introduction at `standard::Object::init`.
index c2015c8..19cfc74 100644 (file)
@@ -1 +1 @@
-error_intern.nit:20,2--8: Fatal error: unknown intern method error_intern::A::foo.
+Runtime error: uncompiled method `foo` called on `A`. NOT YET IMPLEMENTED (error_intern.nit:20)
index 5c7b1a6..7438c97 100644 (file)
@@ -1 +1 @@
-error_kern_attr_any.nit:18,6--9: Error: Attempt to define attribute toto in the interface Object.
+error_kern_attr_any.nit:18,6--9: Error: attempt to define attribute `toto` in the interface `Object`.
index f870a60..aeed518 100644 (file)
@@ -1 +1 @@
-error_kern_attr_int.nit:18,6--9: Error: Attempt to define attribute toto in the interface Int.
+error_kern_attr_int.nit:18,6--9: Error: attempt to define attribute `toto` in the enum `Int`.
index 349dd26..dfa125e 100644 (file)
@@ -1 +1 @@
-error_left_bool.nit:17,4: Type error: expected Bool, got Int
+error_left_bool.nit:17,4: Type Error: expected `Bool`, got `Int`.
index d8f1598..85fbd2c 100644 (file)
@@ -1 +1 @@
-error_loop_bool_while.nit:17,7: Type error: expected Bool, got Int
+error_loop_bool_while.nit:17,7: Type Error: expected `Bool`, got `Int`.
index 8a5607c..6d87df6 100644 (file)
@@ -1 +1 @@
-error_meth_2def.nit:19,6--9: Error: A property toto is already defined in class A at line 18.
+error_meth_2def.nit:19,6--9: Error: a property `toto` is already defined in class `A` at line 18.
index 6bac25c..c189440 100644 (file)
@@ -1 +1 @@
-error_meth_2def2.nit:19,6--9: Error: A property toto is already defined in class A at line 18.
+error_meth_2def2.nit:19,6--9: Error: a property `toto` is already defined in class `A` at line 18.
index 883e07a..6b9eb7c 100644 (file)
@@ -1 +1 @@
-error_meth_create.nit:20,9--17: Error: foo is not a constructor.
+error_meth_create.nit:20,9--17: Error: `foo` is not a constructor.
index dbe8007..c4a672c 100644 (file)
@@ -1 +1 @@
-error_meth_unk1.nit:17,1--4: Error: Method or variable 'blub' unknown in Sys.
+error_meth_unk1.nit:17,1--4: Error: method or variable `blub` unknown in `Sys`.
index c6a2fb6..e82f5a4 100644 (file)
@@ -1 +1 @@
-error_meth_unk2.nit:17,1--9: Error: Method or variable 'tabul=' unknown in Sys.
+error_meth_unk2.nit:17,1--5: Error: method or variable `tabul=` unknown in `Sys`.
index b2da22d..20bc8ca 100644 (file)
@@ -1 +1 @@
-error_mod_unk.nit:17,8--11: Error: cannot find module dfgd from error_mod_unk. tried ., ../lib/standard, ../lib/standard/collection, alt, ../lib
+error_mod_unk.nit:17,8--11: Error: cannot find module `dfgd` from `error_mod_unk`. Tried: ., ../lib/standard, ../lib/standard/collection, alt, ../lib.
index c3555bf..7ce9c37 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_needed_method_alt1.nit:46,9--14: Error: Method 'with_capacity' doesn't exists in Array[Int].
-alt/error_needed_method_alt1.nit:46,9--14: Error: Method 'push' doesn't exists in Array[Int].
+alt/error_needed_method_alt1.nit:46,9--14: Error: method `with_capacity` does not exists in `Array[Int]`.
+alt/error_needed_method_alt1.nit:46,9--14: Error: method `push` does not exists in `Array[Int]`.
index 14ced87..623beb3 100644 (file)
@@ -1 +1 @@
-alt/error_needed_method_alt2.nit:47,10--27: Type Error: Cannot instantiate interface Collection[Int].
+alt/error_needed_method_alt2.nit:47,10--27: Type Error: cannot instantiate interface `Collection[Int]`.
index d28ba4e..f7f479a 100644 (file)
@@ -1 +1 @@
-alt/error_needed_method_alt3.nit:48,9--13: Fatal Error: NativeString must have a property named to_s_with_length.
+alt/error_needed_method_alt3.nit:48,9--13: Fatal Error: `NativeString` must have a property named `to_s_with_length`.
index 6f7a1f9..f80abe8 100644 (file)
@@ -1 +1 @@
-Fatal Error: no primitive class NativeArray
+Fatal Error: no primitive class NativeArray in error_needed_method_alt4
index 0d5f77b..f72f337 100644 (file)
@@ -1 +1 @@
-alt/error_needed_method_alt6.nit:51,9--15: Error: Method 'without_last' doesn't exists in Range[Int].
+alt/error_needed_method_alt6.nit:51,9--15: Error: method `without_last` does not exists in `Range[Int]`.
index 6f7a1f9..2a7c903 100644 (file)
@@ -1 +1 @@
-Fatal Error: no primitive class NativeArray
+Fatal Error: no primitive class NativeArray in error_needed_method_alt7
index f8c5a4f..c6f77cf 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_needed_types_alt8.nit:21,1--22,3: Error: Method 'iterator' doesn't exists in L.
-alt/error_needed_types_alt8.nit:21,1--22,3: Type Error: 'for' expects a type providing 'iterator' method, got 'L'.
+alt/error_needed_types_alt8.nit:21,1--22,3: Error: method `iterator` does not exists in `L`.
+alt/error_needed_types_alt8.nit:21,1--22,3: Type Error: `for` expects a type providing an `iterator` method, got `L`.
diff --git a/tests/sav/error_operators.res b/tests/sav/error_operators.res
new file mode 100644 (file)
index 0000000..1949e18
--- /dev/null
@@ -0,0 +1,54 @@
+error_operators.nit:17,6: Error: mandatory return type for `unary +`.
+error_operators.nit:18,6: Error: mandatory return type for `+`.
+error_operators.nit:19,6: Error: mandatory return type for `unary -`.
+error_operators.nit:20,6: Error: mandatory return type for `-`.
+error_operators.nit:21,6: Error: mandatory return type for `*`.
+error_operators.nit:22,6: Error: mandatory return type for `/`.
+error_operators.nit:23,6: Error: mandatory return type for `%`.
+error_operators.nit:24,6: Error: mandatory return type for `<`.
+error_operators.nit:25,6: Error: mandatory return type for `>`.
+error_operators.nit:26,6--7: Error: mandatory return type for `<=`.
+error_operators.nit:27,6--7: Error: mandatory return type for `>=`.
+error_operators.nit:28,6--8: Error: mandatory return type for `<=>`.
+error_operators.nit:29,6--7: Error: mandatory return type for `<<`.
+error_operators.nit:30,6--7: Error: mandatory return type for `>>`.
+error_operators.nit:32,6--7: Error: mandatory return type for `[]`.
+error_operators.nit:40,9: Syntax Error: binary operator `*` requires exactly one parameter; got 0.
+error_operators.nit:41,9: Syntax Error: binary operator `/` requires exactly one parameter; got 0.
+error_operators.nit:42,9: Syntax Error: binary operator `%` requires exactly one parameter; got 0.
+error_operators.nit:43,9: Syntax Error: binary operator `<` requires exactly one parameter; got 0.
+error_operators.nit:44,9: Syntax Error: binary operator `>` requires exactly one parameter; got 0.
+error_operators.nit:45,10: Syntax Error: binary operator `<=` requires exactly one parameter; got 0.
+error_operators.nit:46,10: Syntax Error: binary operator `>=` requires exactly one parameter; got 0.
+error_operators.nit:47,11: Syntax Error: binary operator `<=>` requires exactly one parameter; got 0.
+error_operators.nit:48,10: Syntax Error: binary operator `<<` requires exactly one parameter; got 0.
+error_operators.nit:49,10: Syntax Error: binary operator `>>` requires exactly one parameter; got 0.
+error_operators.nit:50,14: Syntax Error: `foo=` requires at least 1 parameter(s); got 0.
+error_operators.nit:51,10: Syntax Error: `[]` requires at least 1 parameter(s); got 0.
+error_operators.nit:52,9--14: Syntax Error: `[]=` requires at least 2 parameter(s); got 1.
+error_operators.nit:57,7--18: Syntax Error: binary operator `+` requires exactly one parameter; got 3.
+error_operators.nit:58,7--18: Syntax Error: binary operator `-` requires exactly one parameter; got 3.
+error_operators.nit:59,7--18: Syntax Error: binary operator `*` requires exactly one parameter; got 3.
+error_operators.nit:60,7--18: Syntax Error: binary operator `/` requires exactly one parameter; got 3.
+error_operators.nit:61,7--18: Syntax Error: binary operator `%` requires exactly one parameter; got 3.
+error_operators.nit:62,7--18: Syntax Error: binary operator `<` requires exactly one parameter; got 3.
+error_operators.nit:63,7--18: Syntax Error: binary operator `>` requires exactly one parameter; got 3.
+error_operators.nit:64,8--19: Syntax Error: binary operator `<=` requires exactly one parameter; got 3.
+error_operators.nit:65,8--19: Syntax Error: binary operator `>=` requires exactly one parameter; got 3.
+error_operators.nit:66,9--20: Syntax Error: binary operator `<=>` requires exactly one parameter; got 3.
+error_operators.nit:67,8--19: Syntax Error: binary operator `<<` requires exactly one parameter; got 3.
+error_operators.nit:68,8--19: Syntax Error: binary operator `>>` requires exactly one parameter; got 3.
+error_operators.nit:76,8--13: Error: illegal variadic parameter `a: A...` for `+`.
+error_operators.nit:77,8--13: Error: illegal variadic parameter `a: A...` for `-`.
+error_operators.nit:78,8--13: Error: illegal variadic parameter `a: A...` for `*`.
+error_operators.nit:79,8--13: Error: illegal variadic parameter `a: A...` for `/`.
+error_operators.nit:80,8--13: Error: illegal variadic parameter `a: A...` for `%`.
+error_operators.nit:81,8--13: Error: illegal variadic parameter `a: A...` for `<`.
+error_operators.nit:82,8--13: Error: illegal variadic parameter `a: A...` for `>`.
+error_operators.nit:83,9--14: Error: illegal variadic parameter `a: A...` for `<=`.
+error_operators.nit:84,9--14: Error: illegal variadic parameter `a: A...` for `>=`.
+error_operators.nit:85,10--15: Error: illegal variadic parameter `a: A...` for `<=>`.
+error_operators.nit:86,9--14: Error: illegal variadic parameter `a: A...` for `<<`.
+error_operators.nit:87,9--14: Error: illegal variadic parameter `a: A...` for `>>`.
+error_operators.nit:88,20--25: Error: illegal variadic parameter `d: A...` for `foo=`.
+error_operators.nit:90,19--24: Error: illegal variadic parameter `d: A...` for `[]=`.
index 84b2911..deab78d 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_bad_char.nit:1,1--2: Syntax error: unexpected malformed character 'h.
+error_parser_oneline_bad_char.nit:1,1--2: Syntax Error: unexpected malformed character 'h.
index 38abd92..e9d4a03 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_bad_char_empty.nit:1,1--2: Syntax error: unexpected malformed character ''.
+error_parser_oneline_bad_char_empty.nit:1,1--2: Syntax Error: unexpected malformed character ''.
index 679ce09..c323153 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_bad_char_full.nit:1,1--2: Syntax error: unexpected malformed character 'h.
+error_parser_oneline_bad_char_full.nit:1,1--2: Syntax Error: unexpected malformed character 'h.
index a16842a..b2923c9 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_bad_char_noeol.nit:1,1--2: Syntax error: unexpected malformed character 'h.
+error_parser_oneline_bad_char_noeol.nit:1,1--2: Syntax Error: unexpected malformed character 'h.
index 8de8389..009a6ad 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_bad_string.nit:1,1--6: Syntax error: unexpected malformed string "hello.
+error_parser_oneline_bad_string.nit:1,1--6: Syntax Error: unexpected malformed string "hello.
index e1e448e..9dcdb2e 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_bad_string_noeol.nit:1,1--6: Syntax error: unexpected malformed string "hello.
+error_parser_oneline_bad_string_noeol.nit:1,1--6: Syntax Error: unexpected malformed string "hello.
index 1f6e60c..bb243dd 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_char.nit:1,4--2,0: Syntax error: unexpected end of line.
+error_parser_oneline_char.nit:1,4--2,0: Syntax Error: unexpected end of line.
index 93f6b4a..3dc71c6 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_char_noeol.nit:1,4: Syntax error: unexpected end of file.
+error_parser_oneline_char_noeol.nit:1,4: Syntax Error: unexpected end of file.
index f1e4625..de7db9c 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_string.nit:1,8--2,0: Syntax error: unexpected end of line.
+error_parser_oneline_string.nit:1,8--2,0: Syntax Error: unexpected end of line.
index 46e6826..68de002 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_string_noeol.nit:1,8: Syntax error: unexpected end of file.
+error_parser_oneline_string_noeol.nit:1,8: Syntax Error: unexpected end of file.
index 621e75c..baaf69f 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_string_start.nit:2,1: Syntax error: unexpected end of file.
+error_parser_oneline_string_start.nit:2,1: Syntax Error: unexpected end of file.
index 5689b02..27455f1 100644 (file)
@@ -1 +1 @@
-error_parser_oneline_string_start_noeol.nit:1,8: Syntax error: unexpected end of file.
+error_parser_oneline_string_start_noeol.nit:1,8: Syntax Error: unexpected end of file.
index ca9822e..e07af9a 100644 (file)
@@ -1,4 +1,4 @@
-alt/error_prop_loc_alt1.nit:38,1--12: Warning: conflicting property definitions for property toto in D: error_prop_loc_alt1#B#toto error_prop_loc_alt1#C#toto
+alt/error_prop_loc_alt1.nit:38,9--12: Warning: conflicting property definitions for property `toto` in `D`: error_prop_loc_alt1#B#toto error_prop_loc_alt1#C#toto
 1
 2
 3
index f7f0ccf..6155d13 100644 (file)
@@ -1 +1 @@
-alt/error_prop_name_alt1.nit:34,1--5: Ambigous property name 'foo' for A; conflict between error_prop_name_m1::A::foo and error_prop_name_m2::B::foo
+alt/error_prop_name_alt1.nit:34,3--5: Error: ambiguous property name `foo` for `A`; conflict between error_prop_name_m1::A::foo and error_prop_name_m2::B::foo.
index 80410f3..d5a8dbb 100644 (file)
@@ -1 +1 @@
-alt/error_prop_name_alt2.nit:37,1--5: Ambigous property name 'bar' for A; conflict between error_prop_name_m1::A::bar and error_prop_name_alt2::C::bar
+alt/error_prop_name_alt2.nit:37,3--5: Error: ambiguous property name `bar` for `A`; conflict between error_prop_name_m1::A::bar and error_prop_name_alt2::C::bar.
index b21c3cb..2fce73c 100644 (file)
@@ -1 +1 @@
-alt/error_prop_name_alt3.nit:27,12--14: Ambigous property name 'foo' for A; conflict between error_prop_name_m1::A::foo and error_prop_name_m2::B::foo
+alt/error_prop_name_alt3.nit:27,12--14: Error: ambiguous property name `foo` for `A`; conflict between error_prop_name_m1::A::foo and error_prop_name_m2::B::foo.
index 1f9c04f..2e638fe 100644 (file)
@@ -1 +1 @@
-alt/error_prop_name_alt4.nit:28,12--14: Ambigous property name 'bar' for A; conflict between error_prop_name_m1::A::bar and error_prop_name_alt4::C::bar
+alt/error_prop_name_alt4.nit:28,12--14: Error: ambiguous property name `bar` for `A`; conflict between error_prop_name_m1::A::bar and error_prop_name_alt4::C::bar.
index ea3360c..883589d 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt1.nit:26,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt1.nit:26,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index e1277dc..7e8564c 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt2.nit:27,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt2.nit:27,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 5b5936d..9f96ace 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt3.nit:28,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt3.nit:28,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 4da3993..371524e 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt4.nit:29,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt4.nit:29,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 9e54eb0..f4bf251 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt5.nit:30,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt5.nit:30,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 9babde1..405f783 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt6.nit:31,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt6.nit:31,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 3c1d84a..b068404 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt7.nit:32,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt7.nit:32,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index df3e30f..2b6b311 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt8.nit:33,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt8.nit:33,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index ab4e364..355dd5f 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt1_alt9.nit:34,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt1_alt9.nit:34,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 03ee097..2adb4e8 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt1.nit:26,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt1.nit:26,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index e0730fd..1ad57dc 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt2.nit:27,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt2.nit:27,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index b74242e..4070192 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt3.nit:28,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt3.nit:28,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index f4129a2..f39dafa 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt4.nit:29,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt4.nit:29,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 39804df..a0f6069 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt5.nit:30,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt5.nit:30,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 8e7e43b..8fad03a 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt6.nit:31,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt6.nit:31,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 383a842..b764bc4 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt7.nit:32,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt7.nit:32,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 21f9e03..b784e00 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt8.nit:33,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt8.nit:33,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 8cc4f1f..01bfe0c 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt2_alt9.nit:34,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt2_alt9.nit:34,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index dd6782e..a418d9e 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt1.nit:26,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt1.nit:26,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index a4f042f..f4d6c84 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt2.nit:27,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt2.nit:27,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index b3bf863..31e8023 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt3.nit:28,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt3.nit:28,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 8ba1a15..bbd89dd 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt4.nit:29,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt4.nit:29,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index d77c465..dd7ac1d 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt5.nit:30,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt5.nit:30,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index d6f25ab..7b9b658 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt6.nit:31,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt6.nit:31,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 76ecfe4..d664e18 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt7.nit:32,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt7.nit:32,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 703266e..8f58197 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt8.nit:33,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt8.nit:33,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index b3f77a1..937499b 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt3_alt9.nit:34,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt3_alt9.nit:34,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 674efee..3d2aa3c 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt1.nit:26,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt1.nit:26,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 7636815..1102eab 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt2.nit:27,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt2.nit:27,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index bc8757b..6e1dc17 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt3.nit:28,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt3.nit:28,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index efdaf6a..3b228a4 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt4.nit:29,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt4.nit:29,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index e0d8a6e..98afec7 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt5.nit:30,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt5.nit:30,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 99f9c86..9fc6b4b 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt6.nit:31,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt6.nit:31,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index e02052d..53ad804 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt7.nit:32,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt7.nit:32,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index 6121521..ab486e0 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt8.nit:33,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt8.nit:33,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index f19670e..22ca8ae 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_1alt4_alt9.nit:34,6--7: Redef error: B::f1 is an inherited property. To redefine it, add the redef keyword.
+alt/error_redef2_1alt4_alt9.nit:34,6--7: Redef Error: `B::f1` is an inherited property. To redefine it, add the `redef` keyword.
index ac7d536..d8da323 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_alt3.nit:28,9: Error: Untyped parameter `i'.
+alt/error_redef2_alt3.nit:28,9: Error: untyped parameter `i'.
index 961dfd9..ca8750b 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_alt4.nit:29,12--19: Error: Return with value in a procedure.
+alt/error_redef2_alt4.nit:29,19: Error: `return` with value in a procedure.
index e641df4..4ceb833 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_alt5.nit:30,20--31: Error: Return with value in a procedure.
+alt/error_redef2_alt5.nit:30,27--31: Error: `return` with value in a procedure.
index c7bdeea..5c6dcc5 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_alt6.nit:31,9: Error: Untyped parameter `i'.
+alt/error_redef2_alt6.nit:31,9: Error: untyped parameter `i'.
index aeb0036..7d7640d 100644 (file)
@@ -1 +1 @@
-alt/error_redef2_alt9.nit:34,9: Error: Untyped parameter `i'.
+alt/error_redef2_alt9.nit:34,9: Error: untyped parameter `i'.
index 9a726e6..9b526d1 100644 (file)
@@ -1 +1 @@
-error_redef3.nit:16,7: Error: A class A is already defined at line 15.
+error_redef3.nit:16,7: Error: a class `A` is already defined at line 15.
index 944e2cf..15b6934 100644 (file)
@@ -1 +1 @@
-error_redef4.nit:18,13: Error: A class A is already defined at line 17.
+error_redef4.nit:18,13: Error: a class `A` is already defined at line 17.
index 4551dfc..d78f0d3 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt2.nit:27,14--21: Redef error: error_redef_1alt1_alt2#B#f1 redefines error_redef_1alt1_alt2#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt1_alt2#B#f1
+alt/error_redef_1alt1_alt2.nit:27,14--21: Redef Error: expected 0 parameter(s) for `f1`; got 1. See introduction at `error_redef_1alt1_alt2::A::f1`.
index 40ca707..8bf4ed4 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt3.nit:28,14--16: Redef error: error_redef_1alt1_alt3#B#f1 redefines error_redef_1alt1_alt3#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt1_alt3#B#f1
+alt/error_redef_1alt1_alt3.nit:28,14--16: Redef Error: expected 0 parameter(s) for `f1`; got 1. See introduction at `error_redef_1alt1_alt3::A::f1`.
index f0a8269..f6194fc 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt4.nit:29,18--25: Error: Return with value in a procedure.
+alt/error_redef_1alt1_alt4.nit:29,25: Error: `return` with value in a procedure.
index d0cffb7..0f83f5c 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt5.nit:30,14--21: Redef error: error_redef_1alt1_alt5#B#f1 redefines error_redef_1alt1_alt5#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt1_alt5#B#f1
+alt/error_redef_1alt1_alt5.nit:30,14--21: Redef Error: expected 0 parameter(s) for `f1`; got 1. See introduction at `error_redef_1alt1_alt5::A::f1`.
index 8333661..212bb8e 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt6.nit:31,14--16: Redef error: error_redef_1alt1_alt6#B#f1 redefines error_redef_1alt1_alt6#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt1_alt6#B#f1
+alt/error_redef_1alt1_alt6.nit:31,14--16: Redef Error: expected 0 parameter(s) for `f1`; got 1. See introduction at `error_redef_1alt1_alt6::A::f1`.
index 5607478..27be0ec 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt7.nit:32,16--18: Redef Error: f1 is a procedure, not a function.
+alt/error_redef_1alt1_alt7.nit:32,16--18: Redef Error: `f1` is a procedure, not a function.
index 73fccb1..814f477 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt8.nit:33,14--26: Redef error: error_redef_1alt1_alt8#B#f1 redefines error_redef_1alt1_alt8#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt1_alt8#B#f1
+alt/error_redef_1alt1_alt8.nit:33,14--26: Redef Error: expected 0 parameter(s) for `f1`; got 1. See introduction at `error_redef_1alt1_alt8::A::f1`.
index 0485267..96fb3de 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt1_alt9.nit:34,14--21: Redef error: error_redef_1alt1_alt9#B#f1 redefines error_redef_1alt1_alt9#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt1_alt9#B#f1
+alt/error_redef_1alt1_alt9.nit:34,14--21: Redef Error: expected 0 parameter(s) for `f1`; got 1. See introduction at `error_redef_1alt1_alt9::A::f1`.
index 05a568b..e00f31a 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt1.nit:26,18: Redef error: error_redef_1alt2_alt1#B#f1 redefines error_redef_1alt2_alt1#A#f1 with 0 parameter(s), 1 expected. Signature is error_redef_1alt2_alt1#B#f1(i: Int)
+alt/error_redef_1alt2_alt1.nit:26,18: Redef Error: expected 1 parameter(s) for `f1(i: Int)`; got 0. See introduction at `error_redef_1alt2_alt1::A::f1`.
index 860f886..618b516 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt4.nit:29,18: Redef error: error_redef_1alt2_alt4#B#f1 redefines error_redef_1alt2_alt4#A#f1 with 0 parameter(s), 1 expected. Signature is error_redef_1alt2_alt4#B#f1(i: Int)
+alt/error_redef_1alt2_alt4.nit:29,18: Redef Error: expected 1 parameter(s) for `f1(i: Int)`; got 0. See introduction at `error_redef_1alt2_alt4::A::f1`.
index 3098d61..791f8ff 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt5.nit:30,26--37: Error: Return with value in a procedure.
+alt/error_redef_1alt2_alt5.nit:30,33--37: Error: `return` with value in a procedure.
index a0c6500..e5c3771 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt6.nit:31,21--32: Error: Return with value in a procedure.
+alt/error_redef_1alt2_alt6.nit:31,28--32: Error: `return` with value in a procedure.
index 6f23019..09d3db5 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt7.nit:32,16--18: Redef error: error_redef_1alt2_alt7#B#f1 redefines error_redef_1alt2_alt7#A#f1 with 0 parameter(s), 1 expected. Signature is error_redef_1alt2_alt7#B#f1(i: Int)
+alt/error_redef_1alt2_alt7.nit:32,16--18: Redef Error: expected 1 parameter(s) for `f1(i: Int)`; got 0. See introduction at `error_redef_1alt2_alt7::A::f1`.
index 5e3f4a7..75fa9d6 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt8.nit:33,24--26: Redef Error: f1 is a procedure, not a function.
+alt/error_redef_1alt2_alt8.nit:33,24--26: Redef Error: `f1` is a procedure, not a function.
index 37019f0..3cc6691 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt9.nit:34,19--21: Redef Error: f1 is a procedure, not a function.
+alt/error_redef_1alt2_alt9.nit:34,19--21: Redef Error: `f1` is a procedure, not a function.
index 6116592..69e84dd 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt3_alt1.nit:26,12--13: Control error: Reached end of function (a 'return' with a value was expected).
+alt/error_redef_1alt3_alt1.nit:26,12--13: Error: reached end of function; expected `return` with a value.
index 7952248..4dff1aa 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt3_alt2.nit:27,14--21: Redef error: error_redef_1alt3_alt2#B#f1 redefines error_redef_1alt3_alt2#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt3_alt2#B#f1: Int
+alt/error_redef_1alt3_alt2.nit:27,14--21: Redef Error: expected 0 parameter(s) for `f1: Int`; got 1. See introduction at `error_redef_1alt3_alt2::A::f1`.
index 5cd9810..c1ea0ed 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt3_alt3.nit:28,14--16: Redef error: error_redef_1alt3_alt3#B#f1 redefines error_redef_1alt3_alt3#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt3_alt3#B#f1: Int
+alt/error_redef_1alt3_alt3.nit:28,14--16: Redef Error: expected 0 parameter(s) for `f1: Int`; got 1. See introduction at `error_redef_1alt3_alt3::A::f1`.
index 39c9602..b722243 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt3_alt5.nit:30,14--21: Redef error: error_redef_1alt3_alt5#B#f1 redefines error_redef_1alt3_alt5#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt3_alt5#B#f1: Int
+alt/error_redef_1alt3_alt5.nit:30,14--21: Redef Error: expected 0 parameter(s) for `f1: Int`; got 1. See introduction at `error_redef_1alt3_alt5::A::f1`.
index b024988..394b411 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt3_alt6.nit:31,14--16: Redef error: error_redef_1alt3_alt6#B#f1 redefines error_redef_1alt3_alt6#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt3_alt6#B#f1: Int
+alt/error_redef_1alt3_alt6.nit:31,14--16: Redef Error: expected 0 parameter(s) for `f1: Int`; got 1. See introduction at `error_redef_1alt3_alt6::A::f1`.
index 2db1b28..347e131 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt3_alt8.nit:33,14--26: Redef error: error_redef_1alt3_alt8#B#f1 redefines error_redef_1alt3_alt8#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt3_alt8#B#f1: Int
+alt/error_redef_1alt3_alt8.nit:33,14--26: Redef Error: expected 0 parameter(s) for `f1: Int`; got 1. See introduction at `error_redef_1alt3_alt8::A::f1`.
index 4ed0d9c..ea69056 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt3_alt9.nit:34,14--21: Redef error: error_redef_1alt3_alt9#B#f1 redefines error_redef_1alt3_alt9#A#f1 with 1 parameter(s), 0 expected. Signature is error_redef_1alt3_alt9#B#f1: Int
+alt/error_redef_1alt3_alt9.nit:34,14--21: Redef Error: expected 0 parameter(s) for `f1: Int`; got 1. See introduction at `error_redef_1alt3_alt9::A::f1`.
index a37f84a..b835f2c 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt4_alt1.nit:26,18: Redef error: error_redef_1alt4_alt1#B#f1 redefines error_redef_1alt4_alt1#A#f1 with 0 parameter(s), 1 expected. Signature is error_redef_1alt4_alt1#B#f1(i: Int): Int
+alt/error_redef_1alt4_alt1.nit:26,18: Redef Error: expected 1 parameter(s) for `f1(i: Int): Int`; got 0. See introduction at `error_redef_1alt4_alt1::A::f1`.
index e493684..d10794c 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt4_alt2.nit:27,12--13: Control error: Reached end of function (a 'return' with a value was expected).
+alt/error_redef_1alt4_alt2.nit:27,12--13: Error: reached end of function; expected `return` with a value.
index e10d510..8dd3e7a 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt4_alt3.nit:28,12--13: Control error: Reached end of function (a 'return' with a value was expected).
+alt/error_redef_1alt4_alt3.nit:28,12--13: Error: reached end of function; expected `return` with a value.
index 300b750..f957017 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt4_alt4.nit:29,18: Redef error: error_redef_1alt4_alt4#B#f1 redefines error_redef_1alt4_alt4#A#f1 with 0 parameter(s), 1 expected. Signature is error_redef_1alt4_alt4#B#f1(i: Int): Int
+alt/error_redef_1alt4_alt4.nit:29,18: Redef Error: expected 1 parameter(s) for `f1(i: Int): Int`; got 0. See introduction at `error_redef_1alt4_alt4::A::f1`.
index b72032a..f2df651 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt4_alt7.nit:32,16--18: Redef error: error_redef_1alt4_alt7#B#f1 redefines error_redef_1alt4_alt7#A#f1 with 0 parameter(s), 1 expected. Signature is error_redef_1alt4_alt7#B#f1(i: Int): Int
+alt/error_redef_1alt4_alt7.nit:32,16--18: Redef Error: expected 1 parameter(s) for `f1(i: Int): Int`; got 0. See introduction at `error_redef_1alt4_alt7::A::f1`.
index 4ec858f..062e50f 100644 (file)
@@ -1 +1 @@
-alt/error_redef_alt1.nit:26,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
+alt/error_redef_alt1.nit:26,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
index 0d14b2b..4954ff4 100644 (file)
@@ -1 +1 @@
-alt/error_redef_alt2.nit:27,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
+alt/error_redef_alt2.nit:27,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
index 6c61f9f..4628526 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_redef_alt3.nit:28,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
-alt/error_redef_alt3.nit:28,15: Error: Untyped parameter `i'.
+alt/error_redef_alt3.nit:28,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
+alt/error_redef_alt3.nit:28,15: Error: untyped parameter `i'.
index 2898003..f95f83b 100644 (file)
@@ -1 +1 @@
-alt/error_redef_alt4.nit:29,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
+alt/error_redef_alt4.nit:29,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
index 4c0f8ab..55d9d32 100644 (file)
@@ -1 +1 @@
-alt/error_redef_alt5.nit:30,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
+alt/error_redef_alt5.nit:30,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
index e509e47..e9a8b09 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_redef_alt6.nit:31,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
-alt/error_redef_alt6.nit:31,15: Error: Untyped parameter `i'.
+alt/error_redef_alt6.nit:31,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
+alt/error_redef_alt6.nit:31,15: Error: untyped parameter `i'.
index aa0068b..d6fc457 100644 (file)
@@ -1 +1 @@
-alt/error_redef_alt7.nit:32,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
+alt/error_redef_alt7.nit:32,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
index 5780748..668203b 100644 (file)
@@ -1 +1 @@
-alt/error_redef_alt8.nit:33,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
+alt/error_redef_alt8.nit:33,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
index ebb4401..b40a335 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_redef_alt9.nit:34,12--13: Error: No property B::f1 is inherited. Remove the redef keyword to define a new property.
-alt/error_redef_alt9.nit:34,15: Error: Untyped parameter `i'.
+alt/error_redef_alt9.nit:34,12--13: Error: no property `B::f1` is inherited. Remove the `redef` keyword to define a new property.
+alt/error_redef_alt9.nit:34,15: Error: untyped parameter `i'.
index 92458a1..fdd119e 100644 (file)
@@ -1 +1 @@
-error_redef_class.nit:17,13--16: Redef error: No imported class Fail to refine.
+error_redef_class.nit:17,13--16: Redef Error: no imported class `Fail` to refine.
index 3ff4b7d..b5db745 100644 (file)
@@ -1 +1 @@
-error_ref_attr.nit:20,15--17: Redef Error: Wrong return type. found Int, expected B.
+error_ref_attr.nit:20,15--17: Redef Error: expected `B` return type; got `Int`.
index 9335fd0..2fd98fe 100644 (file)
@@ -1 +1 @@
-error_ref_fun.nit:20,12: Control error: Reached end of function (a 'return' with a value was expected).
+error_ref_fun.nit:20,12: Error: reached end of function; expected `return` with a value.
index 44d3647..4f52b26 100644 (file)
@@ -1 +1 @@
-error_ref_param.nit:20,14--17: Redef Error: Wrong type for parameter `x'. found C, expected B as in module_simple#C#r.
+error_ref_param.nit:20,14--17: Redef Error: expected `B` for parameter `x'; got `C`.
index b4170f8..9ec47f3 100644 (file)
@@ -1 +1 @@
-error_ref_proc.nit:20,21: Redef Error: r is a procedure, not a function.
+error_ref_proc.nit:20,21: Redef Error: `r` is a procedure, not a function.
index afb9bdb..ebe0ef3 100644 (file)
@@ -1 +1 @@
-error_ref_ret.nit:20,15--17: Redef Error: Wrong return type. found Int, expected B as in module_simple#C#s.
+error_ref_ret.nit:20,15--17: Redef Error: expected `B` for return type; got `Int`.
index fbbc404..8271a7e 100644 (file)
@@ -1 +1 @@
-error_req_loop0.nit:15,8--22: Error: Dependency loop in module error_req_loop0.
+error_req_loop0.nit:15,8--22: Error: dependency loop in module error_req_loop0.
index 7cdaea1..818f570 100644 (file)
@@ -1 +1 @@
-error_req_loop1.nit:17,8--22: Error: Dependency loop between modules error_req_loop1 and error_req_loop2.
+error_req_loop1.nit:17,8--22: Error: dependency loop between modules error_req_loop1 and error_req_loop2.
index da37cf7..59ab79a 100644 (file)
@@ -1 +1 @@
-error_req_loop2.nit:17,8--22: Error: Dependency loop between modules error_req_loop2 and error_req_loop1.
+error_req_loop2.nit:17,8--22: Error: dependency loop between modules error_req_loop2 and error_req_loop1.
index 4d7bf00..4fcac88 100644 (file)
@@ -1 +1 @@
-error_ret_fun.nit:19,2--7: Error: Return without value in a function.
+error_ret_fun.nit:19,2--7: Error: `return` without value in a function.
index afc61c9..95cabff 100644 (file)
@@ -1 +1 @@
-error_ret_proc.nit:19,2--9: Error: Return with value in a procedure.
+error_ret_proc.nit:19,9: Error: `return` with value in a procedure.
index bfa6329..e43264c 100644 (file)
@@ -1 +1 @@
-error_ret_type.nit:19,9--11: Type error: expected Int, got Char
+error_ret_type.nit:19,9--11: Type Error: expected `Int`, got `Char`.
index 56392da..cbb84e9 100644 (file)
@@ -1 +1 @@
-error_right_bool.nit:17,12: Type error: expected Bool, got Int
+error_right_bool.nit:17,12: Type Error: expected `Bool`, got `Int`.
index e15a4bc..d655192 100644 (file)
@@ -1 +1 @@
-error_signature.nit:18,11--14: Type error: class Fail not found in module error_signature.
+error_signature.nit:18,11--14: Error: class `Fail` not found in module `error_signature`.
index 6f78128..c924c77 100644 (file)
@@ -1,2 +1,2 @@
-error_spe_attr.nit:22,15--20: Redef Error: Wrong return type. found Object, expected Int.
-error_spe_attr.nit:22,15--20: Redef Error: Wrong type for parameter `a'. found Object, expected Int.
+error_spe_attr.nit:22,15--20: Redef Error: expected `Int` return type; got `Object`.
+error_spe_attr.nit:22,15--20: Redef Error: expected `Int` type for parameter `a'; got `Object`.
index 09ff099..faa89c9 100644 (file)
@@ -1 +1 @@
-error_spe_fun.nit:23,11--14: Control error: Reached end of function (a 'return' with a value was expected).
+error_spe_fun.nit:23,11--14: Error: reached end of function; expected `return` with a value.
index c440f90..04f9c16 100644 (file)
@@ -1 +1 @@
-error_spe_param.nit:24,16--24: Redef Error: Wrong type for parameter `c'. found Object, expected Int as in error_spe_param#A#toto.
+error_spe_param.nit:24,16--24: Redef Error: expected `Int` for parameter `c'; got `Object`.
index 733cf4f..7501ad1 100644 (file)
@@ -1 +1 @@
-error_spe_param2.nit:24,16--22: Redef Error: Wrong type for parameter `c'. found Char, expected Int as in error_spe_param2#A#toto.
+error_spe_param2.nit:24,16--22: Redef Error: expected `Int` for parameter `c'; got `Char`.
index c582072..bd29a59 100644 (file)
@@ -1 +1 @@
-error_spe_proc.nit:23,17--19: Redef Error: toto is a procedure, not a function.
+error_spe_proc.nit:23,17--19: Redef Error: `toto` is a procedure, not a function.
index 7c1a5f8..416d878 100644 (file)
@@ -1 +1 @@
-error_spe_ret.nit:23,17--20: Redef Error: Wrong return type. found Char, expected Int as in error_spe_ret#A#toto.
+error_spe_ret.nit:23,17--20: Redef Error: expected `Int` for return type; got `Char`.
index 46805cb..a66fc22 100644 (file)
@@ -1 +1 @@
-error_star_type.nit:18,8--10: Type error: expected Int, got Char
+error_star_type.nit:18,8--10: Type Error: expected `Int`, got `Char`.
index cae4b44..dd87764 100644 (file)
@@ -1 +1 @@
-error_super_none.nit:21,3--7: Error: No super method to call for foo.
+error_super_none.nit:21,3--7: Error: no super method to call for `foo`.
index d710f0c..b9bd826 100644 (file)
@@ -1 +1 @@
-alt/error_superclass_superfluous_alt1.nit:22,8: Warning: superfluous super-class A in class D.
+alt/error_superclass_superfluous_alt1.nit:22,8: Warning: superfluous super-class `A` in class `D`.
index e9c68fa..5e21800 100644 (file)
@@ -1 +1 @@
-alt/error_superclass_superfluous_alt2.nit:23,8: Warning: duplicated super-class B in class D.
+alt/error_superclass_superfluous_alt2.nit:23,8: Warning: duplicated super-class `B` in class `D`.
index dce481e..4ae961c 100644 (file)
@@ -1 +1 @@
-alt/error_superclass_superfluous_alt3.nit:7,8--13: Warning: superfluous super-class Object in class X.
+alt/error_superclass_superfluous_alt3.nit:7,8--13: Warning: superfluous super-class `Object` in class `X`.
index 69f881a..1ebe77b 100644 (file)
@@ -1 +1 @@
-alt/error_superclass_superfluous_alt4.nit:24,8: Warning: superfluous super-class X in class D.
+alt/error_superclass_superfluous_alt4.nit:24,8: Warning: superfluous super-class `X` in class `D`.
index 4018e63..a2b6c74 100644 (file)
@@ -1 +1 @@
-alt/error_superclass_superfluous_alt5.nit:19,11: Error: Inheritance loop for class D with type D
+alt/error_superclass_superfluous_alt5.nit:19,11: Error: inheritance loop for class `D` with type `D`.
index cf73672..832c37c 100644 (file)
@@ -1 +1 @@
-error_syntax.nit:19,2: Syntax error: unknown token ?.
+error_syntax.nit:19,2: Syntax Error: unknown token `?`.
index 79a672b..790dae0 100644 (file)
@@ -1 +1 @@
-error_syntax2.nit:1,1: Syntax error: unknown token &.
+error_syntax2.nit:1,1: Syntax Error: unknown token `&`.
index 7299792..119c004 100644 (file)
@@ -1 +1 @@
-error_syntax3.nit:1,1--4: Syntax error: unexpected keyword 'else'.
+error_syntax3.nit:1,1--4: Syntax Error: unexpected keyword 'else'.
index 2f86d76..d52ef7e 100644 (file)
@@ -1 +1 @@
-alt/error_syntax_alt1.nit:18,2--5: Syntax error: unexpected keyword 'once'.
+alt/error_syntax_alt1.nit:18,2--5: Syntax Error: unexpected keyword 'once'.
index b18282f..9c6dc2b 100644 (file)
@@ -1 +1 @@
-alt/error_toplevel_alt1.nit:25,3--10: Error: cannot call 'bar', a top-level method, with a receiver.
+alt/error_toplevel_alt1.nit:25,5--7: Error: method `bar` does not exists in `Int`.
index 8b3cf76..e7a0d8b 100644 (file)
@@ -1 +1,7 @@
-alt/error_toplevel_alt2.nit:35,2--5: Error: self cannot be used in top-level method.
+1
+0
+5
+0
+10
+20
+50
index acfd7bf..d61c3b2 100644 (file)
@@ -1 +1,6 @@
-alt/error_toplevel_alt3.nit:36,6--9: Error: self cannot be used in top-level method.
+1
+0
+5
+0
+10
+S50
index c1a37ee..f37855d 100644 (file)
@@ -1 +1 @@
-alt/error_toplevel_alt4.nit:37,2--10: Error: cannot call 'bar', a top-level method, with a receiver.
+alt/error_toplevel_alt4.nit:37,4--6: Error: method `bar` does not exists in `Int`.
index dff56d2..4528c41 100644 (file)
@@ -1 +1,7 @@
-alt/error_toplevel_alt5.nit:40,2--4: Error: 'baz' is not a top-level method, thus need a receiver.
+1
+0
+5
+0
+10
+50
+S
\ No newline at end of file
index caa6610..b085971 100644 (file)
@@ -1 +1 @@
-error_type_not_ok.nit:21,8--11: Type error: class Fail not found in module error_type_not_ok.
+error_type_not_ok.nit:21,8--11: Error: class `Fail` not found in module `error_type_not_ok`.
index ae9f9d3..ad29690 100644 (file)
@@ -1 +1 @@
-error_type_not_ok2.nit:21,14--17: Type error: class Fail not found in module error_type_not_ok2.
+error_type_not_ok2.nit:21,14--17: Error: class `Fail` not found in module `error_type_not_ok2`.
index 94da281..a4b16bb 100644 (file)
@@ -1 +1 @@
-alt/error_type_not_ok2_alt1.nit:21,14--17: Type error: 'Fail' is a generic class.
+alt/error_type_not_ok2_alt1.nit:21,14--17: Type Error: `Fail[E: nullable Object]` is a generic class.
index 964d649..b79c54c 100644 (file)
@@ -1,2 +1,2 @@
-error_type_not_ok3.nit:20,12--15: Type error: class Fail not found in module error_type_not_ok3.
-error_type_not_ok3.nit:23,18--21: Type error: class Fail not found in module error_type_not_ok3.
+error_type_not_ok3.nit:20,12--15: Error: class `Fail` not found in module `error_type_not_ok3`.
+error_type_not_ok3.nit:23,18--21: Error: class `Fail` not found in module `error_type_not_ok3`.
index 0b71202..9dd0270 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_type_not_ok3_alt1.nit:20,12--15: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok3_alt1.nit:23,18--21: Type error: 'Fail' is a generic class.
+alt/error_type_not_ok3_alt1.nit:20,12--15: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok3_alt1.nit:23,18--21: Type Error: `Fail[E: nullable Object]` is a generic class.
index 0a3a56d..4a02a6e 100644 (file)
@@ -1,7 +1,7 @@
-error_type_not_ok4.nit:21,10--13: Type error: class Fail not found in module error_type_not_ok4.
-error_type_not_ok4.nit:25,16--19: Type error: class Fail not found in module error_type_not_ok4.
-error_type_not_ok4.nit:29,9--12: Type error: class Fail not found in module error_type_not_ok4.
-error_type_not_ok4.nit:30,12--15: Type error: class Fail not found in module error_type_not_ok4.
-error_type_not_ok4.nit:31,18--21: Type error: class Fail not found in module error_type_not_ok4.
-error_type_not_ok4.nit:32,10--13: Type error: class Fail not found in module error_type_not_ok4.
-error_type_not_ok4.nit:33,16--19: Type error: class Fail not found in module error_type_not_ok4.
+error_type_not_ok4.nit:21,10--13: Error: class `Fail` not found in module `error_type_not_ok4`.
+error_type_not_ok4.nit:25,16--19: Error: class `Fail` not found in module `error_type_not_ok4`.
+error_type_not_ok4.nit:29,9--12: Error: class `Fail` not found in module `error_type_not_ok4`.
+error_type_not_ok4.nit:30,12--15: Error: class `Fail` not found in module `error_type_not_ok4`.
+error_type_not_ok4.nit:31,18--21: Error: class `Fail` not found in module `error_type_not_ok4`.
+error_type_not_ok4.nit:32,10--13: Error: class `Fail` not found in module `error_type_not_ok4`.
+error_type_not_ok4.nit:33,16--19: Error: class `Fail` not found in module `error_type_not_ok4`.
index 0882871..2cc24ae 100644 (file)
@@ -1,7 +1,7 @@
-alt/error_type_not_ok4_alt1.nit:21,10--13: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok4_alt1.nit:25,16--19: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok4_alt1.nit:29,9--12: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok4_alt1.nit:30,12--15: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok4_alt1.nit:31,18--21: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok4_alt1.nit:32,10--13: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok4_alt1.nit:33,16--19: Type error: 'Fail' is a generic class.
+alt/error_type_not_ok4_alt1.nit:21,10--13: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok4_alt1.nit:25,16--19: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok4_alt1.nit:29,9--12: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok4_alt1.nit:30,12--15: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok4_alt1.nit:31,18--21: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok4_alt1.nit:32,10--13: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok4_alt1.nit:33,16--19: Type Error: `Fail[E: nullable Object]` is a generic class.
index fc6ffec..9794efd 100644 (file)
@@ -1,7 +1,7 @@
-error_type_not_ok5.nit:23,8--11: Type error: class Fail not found in module error_type_not_ok5.
-error_type_not_ok5.nit:25,9--21: Type error: class Fail not found in module error_type_not_ok5.
-error_type_not_ok5.nit:28,14--17: Type error: class Fail not found in module error_type_not_ok5.
-error_type_not_ok5.nit:28,7--17: Type error: expected Char, got Bool
-error_type_not_ok5.nit:29,11--14: Type error: class Fail not found in module error_type_not_ok5.
-error_type_not_ok5.nit:30,11--14: Type error: class Fail not found in module error_type_not_ok5.
-error_type_not_ok5.nit:31,13--16: Type error: class Fail not found in module error_type_not_ok5.
+error_type_not_ok5.nit:23,8--11: Error: class `Fail` not found in module `error_type_not_ok5`.
+error_type_not_ok5.nit:25,9--21: Error: class `Fail` not found in module `error_type_not_ok5`.
+error_type_not_ok5.nit:28,14--17: Error: class `Fail` not found in module `error_type_not_ok5`.
+error_type_not_ok5.nit:28,7--17: Type Error: expected `Char`, got `Bool`.
+error_type_not_ok5.nit:29,11--14: Error: class `Fail` not found in module `error_type_not_ok5`.
+error_type_not_ok5.nit:30,11--14: Error: class `Fail` not found in module `error_type_not_ok5`.
+error_type_not_ok5.nit:31,13--16: Error: class `Fail` not found in module `error_type_not_ok5`.
index aeb78b1..9ecd479 100644 (file)
@@ -1,7 +1,7 @@
-alt/error_type_not_ok5_alt1.nit:23,8--11: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok5_alt1.nit:25,9--21: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok5_alt1.nit:28,14--17: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok5_alt1.nit:28,7--17: Type error: expected Char, got Bool
-alt/error_type_not_ok5_alt1.nit:29,11--14: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok5_alt1.nit:30,11--14: Type error: 'Fail' is a generic class.
-alt/error_type_not_ok5_alt1.nit:31,13--16: Type error: 'Fail' is a generic class.
+alt/error_type_not_ok5_alt1.nit:23,8--11: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok5_alt1.nit:25,9--21: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok5_alt1.nit:28,14--17: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok5_alt1.nit:28,7--17: Type Error: expected `Char`, got `Bool`.
+alt/error_type_not_ok5_alt1.nit:29,11--14: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok5_alt1.nit:30,11--14: Type Error: `Fail[E: nullable Object]` is a generic class.
+alt/error_type_not_ok5_alt1.nit:31,13--16: Type Error: `Fail[E: nullable Object]` is a generic class.
index 7488aad..d8c9fcc 100644 (file)
@@ -1 +1 @@
-alt/error_type_not_ok_alt1.nit:21,8--11: Type error: 'Fail' is a generic class.
+alt/error_type_not_ok_alt1.nit:21,8--11: Type Error: `Fail[E: nullable Object]` is a generic class.
index 126c2b4..31aed66 100644 (file)
@@ -1,2 +1,2 @@
-error_type_unk.nit:22,17--20: Type error: class Fail not found in module error_type_unk.
-error_type_unk.nit:23,7--11: Error: Method '+' doesn't exists in Bool.
+error_type_unk.nit:22,17--20: Error: class `Fail` not found in module `error_type_unk`.
+error_type_unk.nit:23,9: Error: method `+` does not exists in `Bool`.
index ad8c11c..26f5b07 100644 (file)
@@ -1 +1 @@
-alt/error_type_unk_alt1.nit:6,12--15: Type error: class Fail not found in module error_type_unk_alt1.
+alt/error_type_unk_alt1.nit:6,12--15: Error: class `Fail` not found in module `error_type_unk_alt1`.
index a739ad4..d970d0e 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_type_unk_alt2.nit:9,8--11: Type error: class Fail not found in module error_type_unk_alt2.
-alt/error_type_unk_alt2.nit:11,8--13: Type error: class Fail not found in module error_type_unk_alt2.
+alt/error_type_unk_alt2.nit:9,8--11: Error: class `Fail` not found in module `error_type_unk_alt2`.
+alt/error_type_unk_alt2.nit:11,8--13: Error: class `Fail` not found in module `error_type_unk_alt2`.
index 2519222..38ad434 100644 (file)
@@ -1 +1 @@
-alt/error_type_unk_alt3.nit:10,10--13: Type error: class Fail not found in module error_type_unk_alt3.
+alt/error_type_unk_alt3.nit:10,10--13: Error: class `Fail` not found in module `error_type_unk_alt3`.
index 2be140c..33951a7 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_type_unk_alt4.nit:13,9--12: Type error: class Fail not found in module error_type_unk_alt4.
-alt/error_type_unk_alt4.nit:14,11--14: Type error: class Fail not found in module error_type_unk_alt4.
+alt/error_type_unk_alt4.nit:13,9--12: Error: class `Fail` not found in module `error_type_unk_alt4`.
+alt/error_type_unk_alt4.nit:14,11--14: Error: class `Fail` not found in module `error_type_unk_alt4`.
index 0c160fc..d75da82 100644 (file)
@@ -1,4 +1,4 @@
-alt/error_type_unk_alt5.nit:15,9--12: Type error: class Fail not found in module error_type_unk_alt5.
-alt/error_type_unk_alt5.nit:16,11--14: Type error: class Fail not found in module error_type_unk_alt5.
-alt/error_type_unk_alt5.nit:33,15--18: Type error: class Fail not found in module error_type_unk_alt5.
-alt/error_type_unk_alt5.nit:34,17--20: Type error: class Fail not found in module error_type_unk_alt5.
+alt/error_type_unk_alt5.nit:15,9--12: Error: class `Fail` not found in module `error_type_unk_alt5`.
+alt/error_type_unk_alt5.nit:16,11--14: Error: class `Fail` not found in module `error_type_unk_alt5`.
+alt/error_type_unk_alt5.nit:33,15--18: Error: class `Fail` not found in module `error_type_unk_alt5`.
+alt/error_type_unk_alt5.nit:34,17--20: Error: class `Fail` not found in module `error_type_unk_alt5`.
index bbd77f1..3fd4f66 100644 (file)
@@ -1,3 +1,3 @@
-alt/error_type_unk_alt6.nit:19,10--13: Type error: class Fail not found in module error_type_unk_alt6.
-alt/error_type_unk_alt6.nit:22,17--20: Type error: class Fail not found in module error_type_unk_alt6.
-alt/error_type_unk_alt6.nit:23,7--11: Error: Method '+' doesn't exists in Bool.
+alt/error_type_unk_alt6.nit:19,10--13: Error: class `Fail` not found in module `error_type_unk_alt6`.
+alt/error_type_unk_alt6.nit:22,17--20: Error: class `Fail` not found in module `error_type_unk_alt6`.
+alt/error_type_unk_alt6.nit:23,9: Error: method `+` does not exists in `Bool`.
index bacac68..bac52d6 100644 (file)
@@ -1,3 +1,3 @@
-alt/error_type_unk_alt7.nit:20,15--18: Type error: class Fail not found in module error_type_unk_alt7.
-alt/error_type_unk_alt7.nit:22,17--20: Type error: class Fail not found in module error_type_unk_alt7.
-alt/error_type_unk_alt7.nit:23,7--11: Error: Method '+' doesn't exists in Bool.
+alt/error_type_unk_alt7.nit:20,15--18: Error: class `Fail` not found in module `error_type_unk_alt7`.
+alt/error_type_unk_alt7.nit:22,17--20: Error: class `Fail` not found in module `error_type_unk_alt7`.
+alt/error_type_unk_alt7.nit:23,9: Error: method `+` does not exists in `Bool`.
index 8700d38..7ae3800 100644 (file)
@@ -1 +1 @@
-error_unk_class.nit:17,13--18: Type error: class Canard not found in module error_unk_class.
+error_unk_class.nit:17,13--18: Error: class `Canard` not found in module `error_unk_class`.
index b07eae7..43b6695 100644 (file)
@@ -1 +1 @@
-error_var_args.nit:18,1--4: Error: t is variable, not a function.
+error_var_args.nit:18,1--4: Error: `t` is a variable, not a method.
index e5a5cdc..763cf35 100644 (file)
@@ -1 +1 @@
-error_var_args2.nit:18,1--9: Error: t is variable, not a function.
+error_var_args2.nit:18,1--9: Error: `t` is a variable, not a method.
index 4c5bf5d..ddd7e4c 100644 (file)
@@ -1,2 +1,2 @@
 error_var_args3.nit:18,2--3: Warning: superfluous parentheses.
-error_var_args3.nit:18,1--3: Error: t is variable, not a function.
+error_var_args3.nit:18,1--3: Error: `t` is a variable, not a method.
index d109c88..6b2aad6 100644 (file)
@@ -1,2 +1,2 @@
 error_var_args4.nit:18,2--3: Warning: superfluous parentheses.
-error_var_args4.nit:18,1--8: Error: t is variable, not a function.
+error_var_args4.nit:18,1--8: Error: `t` is a variable, not a method.
index 776c7a8..3923b7d 100644 (file)
@@ -1 +1 @@
-error_var_assign.nit:18,5--7: Type error: expected Int, got Char
+error_var_assign.nit:18,5--7: Type Error: expected `Int`, got `Char`.
diff --git a/tests/sav/error_virtual_type2.res b/tests/sav/error_virtual_type2.res
new file mode 100644 (file)
index 0000000..ab1b279
--- /dev/null
@@ -0,0 +1 @@
+error_virtual_type2.nit:40,17--26: Redef Error: expected `G[T]` bound type; got `G[Discrete]`.
diff --git a/tests/sav/error_virtual_type2_alt1.res b/tests/sav/error_virtual_type2_alt1.res
new file mode 100644 (file)
index 0000000..cbecfd2
--- /dev/null
@@ -0,0 +1,5 @@
+alt/error_virtual_type2_alt1.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> T <-> T.
+alt/error_virtual_type2_alt1.nit:25,2--10: Error: circularity of virtual type definition: T <-> T.
+alt/error_virtual_type2_alt1.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
+alt/error_virtual_type2_alt1.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt1.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
diff --git a/tests/sav/error_virtual_type2_alt2.res b/tests/sav/error_virtual_type2_alt2.res
new file mode 100644 (file)
index 0000000..64d40fb
--- /dev/null
@@ -0,0 +1,5 @@
+alt/error_virtual_type2_alt2.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> T <-> nullable T.
+alt/error_virtual_type2_alt2.nit:25,2--26,19: Error: circularity of virtual type definition: T <-> nullable T.
+alt/error_virtual_type2_alt2.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
+alt/error_virtual_type2_alt2.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt2.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
diff --git a/tests/sav/error_virtual_type2_alt3.res b/tests/sav/error_virtual_type2_alt3.res
new file mode 100644 (file)
index 0000000..d0f163d
--- /dev/null
@@ -0,0 +1,5 @@
+alt/error_virtual_type2_alt3.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> G[T] <-> T.
+alt/error_virtual_type2_alt3.nit:25,2--27,12: Error: circularity of virtual type definition: T <-> G[T].
+alt/error_virtual_type2_alt3.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
+alt/error_virtual_type2_alt3.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt3.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
diff --git a/tests/sav/error_virtual_type2_alt4.res b/tests/sav/error_virtual_type2_alt4.res
new file mode 100644 (file)
index 0000000..521bd6a
--- /dev/null
@@ -0,0 +1,4 @@
+alt/error_virtual_type2_alt4.nit:29,10--13: Error: class `FAIL` not found in module `error_virtual_type2_alt4`.
+alt/error_virtual_type2_alt4.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
+alt/error_virtual_type2_alt4.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt4.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
diff --git a/tests/sav/error_virtual_type2_alt5.res b/tests/sav/error_virtual_type2_alt5.res
new file mode 100644 (file)
index 0000000..5d3086a
--- /dev/null
@@ -0,0 +1,5 @@
+alt/error_virtual_type2_alt5.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> T <-> U.
+alt/error_virtual_type2_alt5.nit:25,2--30,10: Error: circularity of virtual type definition: T <-> U.
+alt/error_virtual_type2_alt5.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
+alt/error_virtual_type2_alt5.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt5.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
diff --git a/tests/sav/error_virtual_type2_alt6.res b/tests/sav/error_virtual_type2_alt6.res
new file mode 100644 (file)
index 0000000..964af31
--- /dev/null
@@ -0,0 +1,2 @@
+alt/error_virtual_type2_alt6.nit:40,17--26: Redef Error: expected `G[T]` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt6.nit:41,2--22: Error: a property `GT` is already defined in class `B` at line 39.
diff --git a/tests/sav/error_virtual_type_alt1.res b/tests/sav/error_virtual_type_alt1.res
new file mode 100644 (file)
index 0000000..d6d78f0
--- /dev/null
@@ -0,0 +1 @@
+alt/error_virtual_type_alt1.nit:22,2--23,10: Error: circularity of virtual type definition: T <-> T.
diff --git a/tests/sav/error_virtual_type_alt2.res b/tests/sav/error_virtual_type_alt2.res
new file mode 100644 (file)
index 0000000..0dd05cc
--- /dev/null
@@ -0,0 +1 @@
+alt/error_virtual_type_alt2.nit:22,2--24,19: Error: circularity of virtual type definition: T <-> nullable T.
diff --git a/tests/sav/error_virtual_type_alt3.res b/tests/sav/error_virtual_type_alt3.res
new file mode 100644 (file)
index 0000000..359a845
--- /dev/null
@@ -0,0 +1,2 @@
+alt/error_virtual_type_alt3.nit:25,12: Type Error: expected `Object`, got `T`.
+alt/error_virtual_type_alt3.nit:22,2--25,12: Error: circularity of virtual type definition: T <-> G[T].
diff --git a/tests/sav/error_virtual_type_alt4.res b/tests/sav/error_virtual_type_alt4.res
new file mode 100644 (file)
index 0000000..adff14e
--- /dev/null
@@ -0,0 +1 @@
+alt/error_virtual_type_alt4.nit:27,10--13: Error: class `FAIL` not found in module `error_virtual_type_alt4`.
diff --git a/tests/sav/error_virtual_type_alt5.res b/tests/sav/error_virtual_type_alt5.res
new file mode 100644 (file)
index 0000000..c09482c
--- /dev/null
@@ -0,0 +1 @@
+alt/error_virtual_type_alt5.nit:22,2--28,10: Error: circularity of virtual type definition: T <-> U.
index 1b7fa04..6215189 100644 (file)
@@ -1 +1 @@
-alt/error_visibility_protected_alt9.nit:20,2--8: Error: intrude is not a legal visibility for properties.
+alt/error_visibility_protected_alt9.nit:20,2--8: Error: `intrude` is not a legal visibility for properties.
index 07b0762..bf0d1f3 100644 (file)
@@ -1 +1 @@
-base_gen_f.nit:19,14: Type error: class E not found in module base_gen_f.
+base_gen_f.nit:19,14: Error: class `E` not found in module `base_gen_f`.
index 55d9015..f5efd56 100644 (file)
@@ -1,12 +1 @@
-1
-2
-3
-4
-4
-5
-6
-6
-7
-7
-8
-8
+alt/base_isa_cast4_alt5.nit:89,3--5: Error: method `foo` does not exists in `A`.
index 323ddf9..e2f959a 100644 (file)
@@ -1,2 +1,2 @@
-test_paire.nit:45,7--10: Error: A class Pair is already defined at line 17.
-test_paire.nit:54,7--10: Error: A class Pair is already defined at line 17.
+test_paire.nit:45,7--10: Error: a class `Pair` is already defined at line 17.
+test_paire.nit:54,7--10: Error: a class `Pair` is already defined at line 17.
diff --git a/tests/sav/hello_ios.res b/tests/sav/hello_ios.res
new file mode 100644 (file)
index 0000000..90f398d
--- /dev/null
@@ -0,0 +1,4 @@
+out/hello_ios.bin
+out/hello_ios.bin/Info.plist
+out/hello_ios.bin/PkgInfo
+out/hello_ios.bin/hello_ios
diff --git a/tests/sav/nitg-common/fixme/base_with_alt1.res b/tests/sav/nitg-common/fixme/base_with_alt1.res
new file mode 100644 (file)
index 0000000..1d2c6c1
--- /dev/null
@@ -0,0 +1,13 @@
+1
+2
+2
+3
+1
+2
+2
+3
+1
+2
+3
+1
+2
diff --git a/tests/sav/nitg-e/base_autocast_array_alt2.res b/tests/sav/nitg-e/base_autocast_array_alt2.res
new file mode 100644 (file)
index 0000000..91b441c
--- /dev/null
@@ -0,0 +1,3 @@
+Runtime error: Cast failed (alt/base_autocast_array_alt2.nit:45)
+10
+10
index 879bc6b..b929fb0 100644 (file)
@@ -1,4 +1,4 @@
-base_isa_gen1.nit:62,8--14: Warning: Expression is already a A since it is a F.
-base_isa_gen1.nit:65,8--29: Warning: Expression is already a D[Object, Object] since it is a G[Object].
-base_isa_gen1.nit:66,8--29: Warning: Expression is already a D[Object, Object] since it is a E[F].
+base_isa_gen1.nit:62,8--14: Warning: expression is already a `A` since it is a `F`.
+base_isa_gen1.nit:65,8--29: Warning: expression is already a `D[Object, Object]` since it is a `G[Object]`.
+base_isa_gen1.nit:66,8--29: Warning: expression is already a `D[Object, Object]` since it is a `E[F]`.
 Runtime error: Assert failed (base_isa_gen1.nit:68)
index a157503..47f5a1a 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_gen4.nit:34,8--15: Warning: Expression is already a A since it is a B[Canard].
-base_isa_gen4.nit:36,8--22: Warning: Expression is already a B[Animal] since it is a B[Canard].
-base_isa_gen4.nit:40,8--24: Warning: Expression is already a B[B[Canard]].
-base_isa_gen4.nit:42,8--24: Warning: Expression is already a B[B[Animal]] since it is a B[B[Canard]].
+base_isa_gen4.nit:34,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
+base_isa_gen4.nit:36,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen4.nit:40,8--24: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen4.nit:42,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 Runtime error: Assert failed (base_isa_gen4.nit:37)
index ec59238..74ee1c6 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_gen5.nit:39,8--15: Warning: Expression is already a A since it is a B[Canard].
-base_isa_gen5.nit:41,8--22: Warning: Expression is already a B[Animal] since it is a B[Canard].
-base_isa_gen5.nit:46,8--24: Warning: Expression is already a B[B[Canard]].
-base_isa_gen5.nit:48,8--24: Warning: Expression is already a B[B[Animal]] since it is a B[B[Canard]].
+base_isa_gen5.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
+base_isa_gen5.nit:41,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen5.nit:46,8--24: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen5.nit:48,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 Runtime error: Assert failed (base_isa_gen5.nit:42)
index 4678874..1b28872 100644 (file)
@@ -1,6 +1,6 @@
-base_isa_nullable1.nit:39,8--15: Warning: Expression is already a A since it is a B[Integer].
-base_isa_nullable1.nit:41,8--24: Warning: Expression is already a B[Discrete] since it is a B[Integer].
-base_isa_nullable1.nit:46,8--25: Warning: Expression is already a B[B[Integer]].
-base_isa_nullable1.nit:48,8--26: Warning: Expression is already a B[B[Discrete]] since it is a B[B[Integer]].
-base_isa_nullable1.nit:50,8--33: Warning: Expression is already a B[nullable Discrete] since it is a B[Discrete].
+base_isa_nullable1.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Integer]`.
+base_isa_nullable1.nit:41,8--24: Warning: expression is already a `B[Discrete]` since it is a `B[Integer]`.
+base_isa_nullable1.nit:46,8--25: Warning: expression is already a `B[B[Integer]]`.
+base_isa_nullable1.nit:48,8--26: Warning: expression is already a `B[B[Discrete]]` since it is a `B[B[Integer]]`.
+base_isa_nullable1.nit:50,8--33: Warning: expression is already a `B[nullable Discrete]` since it is a `B[Discrete]`.
 Runtime error: Assert failed (base_isa_nullable1.nit:42)
index 09b831d..5255183 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_nullable2.nit:27,8--23: Warning: Expression is already a nullable A since it is a A.
-base_isa_nullable2.nit:29,8--30: Warning: Expression is already a nullable B[Object] since it is a B[Object].
-base_isa_nullable2.nit:30,8--39: Warning: Expression is already a nullable B[nullable Object] since it is a nullable B[Object].
-base_isa_nullable2.nit:33,8--30: Warning: Expression is already a C[nullable Object].
+base_isa_nullable2.nit:27,8--23: Warning: expression is already a `nullable A` since it is a `A`.
+base_isa_nullable2.nit:29,8--30: Warning: expression is already a `nullable B[Object]` since it is a `B[Object]`.
+base_isa_nullable2.nit:30,8--39: Warning: expression is already a `nullable B[nullable Object]` since it is a `nullable B[Object]`.
+base_isa_nullable2.nit:33,8--30: Warning: expression is already a `C[nullable Object]`.
 Runtime error: Assert failed (base_isa_nullable2.nit:32)
diff --git a/tests/sav/nitg-e/base_notnull_lit.res b/tests/sav/nitg-e/base_notnull_lit.res
new file mode 100644 (file)
index 0000000..59ec579
--- /dev/null
@@ -0,0 +1,4 @@
+Array
+156
+Range
+12345
diff --git a/tests/sav/nitg-e/error_needed_method_alt4.res b/tests/sav/nitg-e/error_needed_method_alt4.res
deleted file mode 100644 (file)
index d1e2d76..0000000
+++ /dev/null
@@ -1 +0,0 @@
-alt/error_needed_method_alt4.nit:49,10--14: Fatal Error: NativeString must have a property named to_s_with_length.
index 0856809..f1d9e06 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:413)
+Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:426)
 11
 21
 31
index 0856809..f1d9e06 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:413)
+Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:426)
 11
 21
 31
index 0856809..f1d9e06 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:413)
+Runtime error: Cast failed. Expected `OTHER`, got `Float` (../lib/standard/kernel.nit:426)
 11
 21
 31
index 650bdaa..90e0d60 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Aborted (../lib/serialization.nit:72)
+Runtime error: Aborted (../lib/serialization/serialization.nit:109)
 # Nit:
 <A: true a 0.123 1234 asdf false>
 
index 650bdaa..90e0d60 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Aborted (../lib/serialization.nit:72)
+Runtime error: Aborted (../lib/serialization/serialization.nit:109)
 # Nit:
 <A: true a 0.123 1234 asdf false>
 
diff --git a/tests/sav/nitg-e/test_meta.res b/tests/sav/nitg-e/test_meta.res
new file mode 100644 (file)
index 0000000..ad6cdbf
--- /dev/null
@@ -0,0 +1,14 @@
+FlatString
+FlatString
+Class
+Class
+
+XObject
+XObject
+XClass
+Class
+
+YObject
+YObject
+YClass
+YClass
index 4fff55f..09516c1 100644 (file)
@@ -1 +1 @@
-Fatal error: limitation in the rapidtype analysis engine: a type depth of 256 is too important, the problematic type is G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[Int]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]].
+Fatal Error: limitation in the rapidtype analysis engine: a type depth of 256 is too important, the problematic type is `G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[Int]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`.
index 4fff55f..09516c1 100644 (file)
@@ -1 +1 @@
-Fatal error: limitation in the rapidtype analysis engine: a type depth of 256 is too important, the problematic type is G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[Int]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]].
+Fatal Error: limitation in the rapidtype analysis engine: a type depth of 256 is too important, the problematic type is `G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[Int]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`.
diff --git a/tests/sav/nitg-s/fixme/test_meta.res b/tests/sav/nitg-s/fixme/test_meta.res
new file mode 100644 (file)
index 0000000..4ad3dc3
--- /dev/null
@@ -0,0 +1 @@
+UNDEFINED
index 4fff55f..09516c1 100644 (file)
@@ -1 +1 @@
-Fatal error: limitation in the rapidtype analysis engine: a type depth of 256 is too important, the problematic type is G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[Int]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]].
+Fatal Error: limitation in the rapidtype analysis engine: a type depth of 256 is too important, the problematic type is `G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[G[Int]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]`.
diff --git a/tests/sav/nitg-sg/fixme/test_meta.res b/tests/sav/nitg-sg/fixme/test_meta.res
new file mode 100644 (file)
index 0000000..4ad3dc3
--- /dev/null
@@ -0,0 +1 @@
+UNDEFINED
index d1e2d76..3626477 100644 (file)
@@ -1 +1 @@
-alt/error_needed_method_alt4.nit:49,10--14: Fatal Error: NativeString must have a property named to_s_with_length.
+alt/error_needed_method_alt4.nit:49,10--14: Fatal Error: `NativeString` must have a property named `to_s_with_length`.
index 547af57..570c986 100644 (file)
 </span></span><span class="line" id="L16">
 </span><span class="line" id="L17"><span class="nc_k">import</span> <span class="nc_k">end</span>
 </span><span class="line" id="L18">
-</span><span class="nc_cdef foldable" id="base_simple3#Object"><span class="line" id="L19"><span class="nc_k">interface</span> <span class="nc_def nc_t popupable" title="class Object" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Object&#34;&gt;class Object&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;Object&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;div class=&#34;dropdown&#34;&gt; &lt;a data-toggle=&#34;dropdown&#34; href=&#34;#&#34;&gt;&lt;b&gt;hier&lt;&#47;b&gt; sub-classes&lt;span class=&#34;caret&#34;&gt;&lt;&#47;span&gt;&lt;&#47;a&gt;&lt;ul class=&#34;dropdown-menu&#34; role=&#34;menu&#34; aria-labelledby=&#34;dLabel&#34;&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Bool&#34;&gt;Bool&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#A&#34;&gt;A&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#B&#34;&gt;B&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#C&#34;&gt;C&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Sys&#34;&gt;Sys&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;&#47;ul&gt;&lt;&#47;div&gt;&lt;&#47;div&gt;" data-toggle="popover">Object</span>
+</span><span class="nc_cdef foldable" id="base_simple3#Object"><span class="line" id="L19"><span class="nc_k">interface</span> <span class="nc_def nc_t">Object</span>
 </span><span class="line" id="L20"><span class="nc_k">end</span>
 </span></span><span class="line" id="L21">
-</span><span class="nc_cdef foldable" id="base_simple3#Bool"><span class="line" id="L22"><span class="nc_k">enum</span> <span class="nc_def nc_t popupable" title="class Bool" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Bool&#34;&gt;class Bool&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;Bool&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;div class=&#34;dropdown&#34;&gt; &lt;a data-toggle=&#34;dropdown&#34; href=&#34;#&#34;&gt;&lt;b&gt;hier&lt;&#47;b&gt; super-classes&lt;span class=&#34;caret&#34;&gt;&lt;&#47;span&gt;&lt;&#47;a&gt;&lt;ul class=&#34;dropdown-menu&#34; role=&#34;menu&#34; aria-labelledby=&#34;dLabel&#34;&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object&#34;&gt;Object&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;&#47;ul&gt;&lt;&#47;div&gt;&lt;&#47;div&gt;" data-toggle="popover">Bool</span>
+</span><span class="nc_cdef foldable" id="base_simple3#Bool"><span class="line" id="L22"><span class="nc_k">enum</span> <span class="nc_def nc_t">Bool</span>
 </span><span class="line" id="L23"><span class="nc_k">end</span>
 </span></span><span class="line" id="L24">
-</span><span class="nc_cdef foldable" id="base_simple3#Int"><span class="line" id="L25"><span class="nc_k">enum</span> <span class="nc_def nc_t popupable" title="class Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;class Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;Int&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;div class=&#34;dropdown&#34;&gt; &lt;a data-toggle=&#34;dropdown&#34; href=&#34;#&#34;&gt;&lt;b&gt;hier&lt;&#47;b&gt; super-classes&lt;span class=&#34;caret&#34;&gt;&lt;&#47;span&gt;&lt;&#47;a&gt;&lt;ul class=&#34;dropdown-menu&#34; role=&#34;menu&#34; aria-labelledby=&#34;dLabel&#34;&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object&#34;&gt;Object&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;&#47;ul&gt;&lt;&#47;div&gt;&lt;&#47;div&gt;" data-toggle="popover">Int</span>
+</span><span class="nc_cdef foldable" id="base_simple3#Int"><span class="line" id="L25"><span class="nc_k">enum</span> <span class="nc_def nc_t">Int</span>
 </span><span class="nc_pdef foldable" id="base_simple3#Int#output"><span class="line" id="L26">        <span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;output&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">output</span></span> <span class="nc_k">is</span> <span class="nc_i">intern</span>
 </span></span><span class="line" id="L27"><span class="nc_k">end</span>
 </span></span><span class="line" id="L28">
-</span><span class="nc_cdef foldable" id="base_simple3#A"><span class="line" id="L29"><span class="nc_k">class</span> <span class="nc_def nc_t popupable" title="class A" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#A&#34;&gt;class A&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;A&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;div class=&#34;dropdown&#34;&gt; &lt;a data-toggle=&#34;dropdown&#34; href=&#34;#&#34;&gt;&lt;b&gt;hier&lt;&#47;b&gt; super-classes&lt;span class=&#34;caret&#34;&gt;&lt;&#47;span&gt;&lt;&#47;a&gt;&lt;ul class=&#34;dropdown-menu&#34; role=&#34;menu&#34; aria-labelledby=&#34;dLabel&#34;&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object&#34;&gt;Object&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;&#47;ul&gt;&lt;&#47;div&gt;&lt;&#47;div&gt;" data-toggle="popover">A</span>
-</span><span class="nc_pdef foldable" id="base_simple3#A#init"><span class="line" id="L30">    <span class="nc_k">init</span> <span class="nc_k">do</span> <span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">5</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
-</span></span><span class="nc_pdef foldable" id="base_simple3#A#run"><span class="line" id="L31">      <span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#A#run" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#A#run&#34;&gt;base_simple3#A#run&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;run&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">run</span></span> <span class="nc_k">do</span> <span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">6</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
+</span><span class="nc_cdef foldable" id="base_simple3#A"><span class="line" id="L29"><span class="nc_k">class</span> <span class="nc_def nc_t">A</span>
+</span><span class="nc_pdef foldable" id="base_simple3#A#init"><span class="line" id="L30">    <span class="nc_k">init</span> <span class="nc_k">do</span> <span class="nc_l">5</span><span>.</span><span class="nc_i">output</span>
+</span></span><span class="nc_pdef foldable" id="base_simple3#A#run"><span class="line" id="L31">      <span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#A#run" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#A#run&#34;&gt;base_simple3#A#run&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;run&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">run</span></span> <span class="nc_k">do</span> <span class="nc_l">6</span><span>.</span><span class="nc_i">output</span>
 </span></span><span class="line" id="L32"><span class="nc_k">end</span>
 </span></span><span class="line" id="L33">
-</span><span class="nc_cdef foldable" id="base_simple3#B"><span class="line" id="L34"><span class="nc_k">class</span> <span class="nc_def nc_t popupable" title="class B" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B&#34;&gt;class B&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;B&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;div class=&#34;dropdown&#34;&gt; &lt;a data-toggle=&#34;dropdown&#34; href=&#34;#&#34;&gt;&lt;b&gt;hier&lt;&#47;b&gt; super-classes&lt;span class=&#34;caret&#34;&gt;&lt;&#47;span&gt;&lt;&#47;a&gt;&lt;ul class=&#34;dropdown-menu&#34; role=&#34;menu&#34; aria-labelledby=&#34;dLabel&#34;&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object&#34;&gt;Object&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;&#47;ul&gt;&lt;&#47;div&gt;&lt;&#47;div&gt;" data-toggle="popover">B</span>
-</span><span class="nc_pdef foldable" id="base_simple3#B#_val"><a id="base_simple3#B#val"></a><a id="base_simple3#B#val="></a><span class="line" id="L35">     <span class="nc_k">var</span> <span class="nc_def nc_i popupable" title="base_simple3#B#val" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B#val&#34;&gt;base_simple3#B#val&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;val&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">val</span><span>:</span> <span class="nc_t popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">Int</span>
-</span></span><span class="nc_pdef foldable" id="base_simple3#B#init"><span class="line" id="L36">     <span class="nc_k">init</span><span>(</span><span class="nc_v nc_i popupable" title="v: Int" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;v:&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">v</span><span>:</span> <span class="nc_t popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">Int</span><span>)</span>
+</span><span class="nc_cdef foldable" id="base_simple3#B"><span class="line" id="L34"><span class="nc_k">class</span> <span class="nc_def nc_t">B</span>
+</span><span class="nc_pdef foldable" id="base_simple3#B#_val"><a id="base_simple3#B#val"></a><a id="base_simple3#B#val="></a><span class="line" id="L35">     <span class="nc_k">var</span> <span class="nc_def nc_i">val</span><span>:</span> <span class="nc_t">Int</span>
+</span></span><span class="nc_pdef foldable" id="base_simple3#B#init"><span class="line" id="L36">     <span class="nc_k">init</span><span>(</span><span class="nc_v nc_i">v</span><span>:</span> <span class="nc_t">Int</span><span>)</span>
 </span><span class="line" id="L37">    <span class="nc_k">do</span>
-</span><span class="line" id="L38">            <span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">7</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
-</span><span class="line" id="L39">            <span class="nc_k">self</span><span>.</span><span class="nc_i popupable" title="call base_simple3#B#val=" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B#val=&#34;&gt;call base_simple3#B#val=&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#B#val=&#34;&gt;val=&lt;&#47;a&gt;&lt;span&gt;(val: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;)&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">val</span> <span>=</span> <span class="nc_v nc_i popupable" title="v: Int" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;v:&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">v</span>
+</span><span class="line" id="L38">            <span class="nc_l">7</span><span>.</span><span class="nc_i">output</span>
+</span><span class="line" id="L39">            <span class="nc_k">self</span><span>.</span><span class="nc_i">val</span> <span>=</span> <span class="nc_v nc_i">v</span>
 </span><span class="line" id="L40">    <span class="nc_k">end</span>
-</span></span><span class="nc_pdef foldable" id="base_simple3#B#run"><span class="line" id="L41">      <span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#B#run" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B#run&#34;&gt;base_simple3#B#run&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;run&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">run</span></span> <span class="nc_k">do</span> <span class="nc_i popupable" title="call base_simple3#B#val" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B#val&#34;&gt;call base_simple3#B#val&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#B#val&#34;&gt;val&lt;&#47;a&gt;&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">val</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
+</span></span><span class="nc_pdef foldable" id="base_simple3#B#run"><span class="line" id="L41">      <span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#B#run" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B#run&#34;&gt;base_simple3#B#run&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;run&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">run</span></span> <span class="nc_k">do</span> <span class="nc_i">val</span><span>.</span><span class="nc_i">output</span>
 </span></span><span class="line" id="L42"><span class="nc_k">end</span>
 </span></span><span class="line" id="L43">
-</span><span class="nc_cdef foldable" id="base_simple3#C"><span class="line" id="L44"><span class="nc_k">class</span> <span class="nc_def nc_t popupable" title="class C" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#C&#34;&gt;class C&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;C&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;div class=&#34;dropdown&#34;&gt; &lt;a data-toggle=&#34;dropdown&#34; href=&#34;#&#34;&gt;&lt;b&gt;hier&lt;&#47;b&gt; super-classes&lt;span class=&#34;caret&#34;&gt;&lt;&#47;span&gt;&lt;&#47;a&gt;&lt;ul class=&#34;dropdown-menu&#34; role=&#34;menu&#34; aria-labelledby=&#34;dLabel&#34;&gt;&lt;li&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object&#34;&gt;Object&lt;&#47;a&gt;&lt;&#47;li&gt;&lt;&#47;ul&gt;&lt;&#47;div&gt;&lt;&#47;div&gt;" data-toggle="popover">C</span>
-</span><span class="nc_pdef foldable" id="base_simple3#C#_val1"><a id="base_simple3#C#val1"></a><a id="base_simple3#C#val1="></a><span class="line" id="L45">  <span class="nc_k">var</span> <span class="nc_def nc_i popupable" title="base_simple3#C#val1" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#C#val1&#34;&gt;base_simple3#C#val1&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;val1&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">val1</span><span>:</span> <span class="nc_t popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">Int</span>
-</span></span><span class="nc_pdef foldable" id="base_simple3#C#_val2"><a id="base_simple3#C#val2"></a><a id="base_simple3#C#val2="></a><span class="line" id="L46">   <span class="nc_k">var</span> <span class="nc_def nc_i popupable" title="base_simple3#C#val2" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#C#val2&#34;&gt;base_simple3#C#val2&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;val2&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">val2</span><span>:</span> <span class="nc_t popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">Int</span> <span>=</span> <span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">10</span>
+</span><span class="nc_cdef foldable" id="base_simple3#C"><span class="line" id="L44"><span class="nc_k">class</span> <span class="nc_def nc_t">C</span>
+</span><span class="nc_pdef foldable" id="base_simple3#C#_val1"><a id="base_simple3#C#val1"></a><a id="base_simple3#C#val1="></a><span class="line" id="L45">  <span class="nc_k">var</span> <span class="nc_def nc_i">val1</span><span>:</span> <span class="nc_t">Int</span>
+</span></span><span class="nc_pdef foldable" id="base_simple3#C#_val2"><a id="base_simple3#C#val2"></a><a id="base_simple3#C#val2="></a><span class="line" id="L46">   <span class="nc_k">var</span> <span class="nc_def nc_i">val2</span><span>:</span> <span class="nc_t">Int</span> <span>=</span> <span class="nc_l">10</span>
 </span></span><span class="line" id="L47"><span class="nc_k">end</span>
 </span></span><span class="line" id="L48">
-</span><span class="nc_pdef foldable" id="base_simple3#Object#foo"><span class="line" id="L49"><span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Object#foo" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Object#foo&#34;&gt;base_simple3#Object#foo&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;foo&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">foo</span></span> <span class="nc_k">do</span> <span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">2</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
-</span></span><span class="nc_pdef foldable" id="base_simple3#Object#bar"><span class="line" id="L50"><span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Object#bar" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Object#bar&#34;&gt;base_simple3#Object#bar&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;bar&lt;span&gt;(i: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;)&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">bar</span></span><span>(</span><span class="nc_v nc_i popupable" title="i: Int" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;i:&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">i</span><span>:</span> <span class="nc_t popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">Int</span><span>)</span> <span class="nc_k">do</span> <span class="nc_v nc_i popupable" title="i: Int" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;i:&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">i</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
-</span></span><span class="nc_pdef foldable" id="base_simple3#Object#baz"><span class="line" id="L51"><span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Object#baz" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Object#baz&#34;&gt;base_simple3#Object#baz&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;baz&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">baz</span></span><span>:</span> <span class="nc_t popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">Int</span> <span class="nc_k">do</span> <span class="nc_k">return</span> <span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">4</span>
+</span><span class="nc_pdef foldable" id="base_simple3#Sys#foo"><span class="line" id="L49"><span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Sys#foo" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Sys#foo&#34;&gt;base_simple3#Sys#foo&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;foo&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">foo</span></span> <span class="nc_k">do</span> <span class="nc_l">2</span><span>.</span><span class="nc_i">output</span>
+</span></span><span class="nc_pdef foldable" id="base_simple3#Sys#bar"><span class="line" id="L50"><span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Sys#bar" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Sys#bar&#34;&gt;base_simple3#Sys#bar&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;bar&lt;span&gt;(i: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;)&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">bar</span></span><span>(</span><span class="nc_v nc_i">i</span><span>:</span> <span class="nc_t">Int</span><span>)</span> <span class="nc_k">do</span> <span class="nc_v nc_i">i</span><span>.</span><span class="nc_i">output</span>
+</span></span><span class="nc_pdef foldable" id="base_simple3#Sys#baz"><span class="line" id="L51"><span class="nc_k">fun</span> <span class="nc_def popupable" title="base_simple3#Sys#baz" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Sys#baz&#34;&gt;base_simple3#Sys#baz&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;fun&lt;&#47;b&gt; &lt;span&gt;baz&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover"><span class="nc_i">baz</span></span><span>:</span> <span class="nc_t">Int</span> <span class="nc_k">do</span> <span class="nc_k">return</span> <span class="nc_l">4</span>
 </span></span><span class="line" id="L52">
-</span><span class="nc_pdef foldable" id="base_simple3#Sys#main"><span class="line" id="L53"><span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">1</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
-</span><span class="line" id="L54"><span class="nc_i popupable" title="call base_simple3#Object#foo" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Object#foo&#34;&gt;call base_simple3#Object#foo&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object#foo&#34;&gt;foo&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">foo</span>
-</span><span class="line" id="L55"><span class="nc_i popupable" title="call base_simple3#Object#bar" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Object#bar&#34;&gt;call base_simple3#Object#bar&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object#bar&#34;&gt;bar&lt;&#47;a&gt;&lt;span&gt;(i: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;)&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">bar</span><span>(</span><span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">3</span><span>)</span>
-</span><span class="line" id="L56"><span class="nc_i popupable" title="call base_simple3#Object#baz" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Object#baz&#34;&gt;call base_simple3#Object#baz&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Object#baz&#34;&gt;baz&lt;&#47;a&gt;&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">baz</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
+</span><span class="nc_pdef foldable" id="base_simple3#Sys#main"><span class="line" id="L53"><span class="nc_l">1</span><span>.</span><span class="nc_i">output</span>
+</span><span class="line" id="L54"><span class="nc_i">foo</span>
+</span><span class="line" id="L55"><span class="nc_i">bar</span><span>(</span><span class="nc_l">3</span><span>)</span>
+</span><span class="line" id="L56"><span class="nc_i">baz</span><span>.</span><span class="nc_i">output</span>
 </span><span class="line" id="L57">
-</span><span class="line" id="L58"><span class="nc_k">var</span> <span class="nc_v nc_i popupable" title="a: A" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;a:&lt;a href=&#34;base_simple3.html#base_simple3#A&#34;&gt;A&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">a</span> <span>=</span> <span class="nc_k">new</span> <span class="nc_t popupable" title="A" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#A&#34;&gt;A&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#A&#34;&gt;A&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">A</span>
-</span><span class="line" id="L59"><span class="nc_v nc_i popupable" title="a: A" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;a:&lt;a href=&#34;base_simple3.html#base_simple3#A&#34;&gt;A&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">a</span><span>.</span><span class="nc_i popupable" title="call base_simple3#A#run" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#A#run&#34;&gt;call base_simple3#A#run&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#A#run&#34;&gt;run&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">run</span>
+</span><span class="line" id="L58"><span class="nc_k">var</span> <span class="nc_v nc_i">a</span> <span>=</span> <span class="nc_k">new</span> <span class="nc_t">A</span>
+</span><span class="line" id="L59"><span class="nc_v nc_i">a</span><span>.</span><span class="nc_i">run</span>
 </span><span class="line" id="L60">
-</span><span class="line" id="L61"><span class="nc_k">var</span> <span class="nc_v nc_i popupable" title="b: B" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;b:&lt;a href=&#34;base_simple3.html#base_simple3#B&#34;&gt;B&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">b</span> <span>=</span> <span class="nc_k">new</span> <span class="nc_t popupable" title="B" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B&#34;&gt;B&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#B&#34;&gt;B&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">B</span><span>(</span><span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">8</span><span>)</span>
-</span><span class="line" id="L62"><span class="nc_v nc_i popupable" title="b: B" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;b:&lt;a href=&#34;base_simple3.html#base_simple3#B&#34;&gt;B&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">b</span><span>.</span><span class="nc_i popupable" title="call base_simple3#B#run" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#B#run&#34;&gt;call base_simple3#B#run&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#B#run&#34;&gt;run&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">run</span>
+</span><span class="line" id="L61"><span class="nc_k">var</span> <span class="nc_v nc_i">b</span> <span>=</span> <span class="nc_k">new</span> <span class="nc_t">B</span><span>(</span><span class="nc_l">8</span><span>)</span>
+</span><span class="line" id="L62"><span class="nc_v nc_i">b</span><span>.</span><span class="nc_i">run</span>
 </span><span class="line" id="L63">
-</span><span class="line" id="L64"><span class="nc_k">var</span> <span class="nc_v nc_i popupable" title="c: C" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;c:&lt;a href=&#34;base_simple3.html#base_simple3#C&#34;&gt;C&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">c</span> <span>=</span> <span class="nc_k">new</span> <span class="nc_t popupable" title="C" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#C&#34;&gt;C&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#C&#34;&gt;C&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">C</span><span>(</span><span class="nc_l popupable" title="Int" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;class&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">9</span><span>)</span>
-</span><span class="line" id="L65"><span class="nc_v nc_i popupable" title="c: C" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;c:&lt;a href=&#34;base_simple3.html#base_simple3#C&#34;&gt;C&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">c</span><span>.</span><span class="nc_i popupable" title="call base_simple3#C#val1" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#C#val1&#34;&gt;call base_simple3#C#val1&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#C#val1&#34;&gt;val1&lt;&#47;a&gt;&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">val1</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
-</span><span class="line" id="L66"><span class="nc_v nc_i popupable" title="c: C" data-content="&lt;div&gt;&lt;b&gt;local var&lt;&#47;b&gt; &lt;span&gt;c:&lt;a href=&#34;base_simple3.html#base_simple3#C&#34;&gt;C&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">c</span><span>.</span><span class="nc_i popupable" title="call base_simple3#C#val2" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#C#val2&#34;&gt;call base_simple3#C#val2&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#C#val2&#34;&gt;val2&lt;&#47;a&gt;&lt;span&gt;: &lt;a href=&#34;base_simple3.html#base_simple3#Int&#34;&gt;Int&lt;&#47;a&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">val2</span><span>.</span><span class="nc_i popupable" title="call base_simple3#Int#output" data-title="&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;call base_simple3#Int#output&lt;&#47;a&gt;" data-content="&lt;div&gt;&lt;b&gt;call&lt;&#47;b&gt; &lt;span&gt;&lt;a href=&#34;base_simple3.html#base_simple3#Int#output&#34;&gt;output&lt;&#47;a&gt;&lt;span&gt;&lt;&#47;span&gt;&lt;&#47;span&gt;&lt;br&#47;&gt;&lt;&#47;div&gt;" data-toggle="popover">output</span>
+</span><span class="line" id="L64"><span class="nc_k">var</span> <span class="nc_v nc_i">c</span> <span>=</span> <span class="nc_k">new</span> <span class="nc_t">C</span><span>(</span><span class="nc_l">9</span><span>)</span>
+</span><span class="line" id="L65"><span class="nc_v nc_i">c</span><span>.</span><span class="nc_i">val1</span><span>.</span><span class="nc_i">output</span>
+</span><span class="line" id="L66"><span class="nc_v nc_i">c</span><span>.</span><span class="nc_i">val2</span><span>.</span><span class="nc_i">output</span>
 </span></span><span class="line" id="L67"><span></span></span></span>
\ No newline at end of file
index 139f52b..9bd4a19 100644 (file)
          std: 0.926
          sum: 6
        cnbp: number of accessible properties (inherited + local)
-         avg: 6.0
-         max: C (10)
-         min: Object (4)
-         std: 2.268
-         sum: 42
+         avg: 3.0
+         max: C (7)
+         min: Object (1)
+         std: 2.36
+         sum: 24
        cnba: number of accessible attributes (inherited + local)
          avg: 0.0
          max: C (2)
          std: 0.535
          sum: 2
        cnbhp: number of inherited properties
-         avg: 3.0
-         max: Bool (4)
+         avg: 0.0
+         max: Bool (1)
          min: Object (0)
-         std: 1.464
-         sum: 24
+         std: 0.926
+         sum: 6
 
  ## global metrics
        cnoa: number of ancestor classes
          std: 0.926
          sum: 6
        cnbp: number of accessible properties (inherited + local)
-         avg: 6.0
-         max: C (10)
-         min: Object (4)
-         std: 2.268
-         sum: 42
+         avg: 3.0
+         max: C (7)
+         min: Object (1)
+         std: 2.36
+         sum: 24
        cnba: number of accessible attributes (inherited + local)
          avg: 0.0
          max: C (2)
          std: 0.535
          sum: 2
        cnbhp: number of inherited properties
-         avg: 3.0
-         max: Bool (4)
+         avg: 0.0
+         max: Bool (1)
          min: Object (0)
-         std: 1.464
-         sum: 24
+         std: 0.926
+         sum: 6
+--- Metrics of refinement usage ---
+Number of modules: 1
+
+Number of classes: 7
+  Number of interface kind: 1 (14.28%)
+  Number of enum kind: 2 (28.57%)
+  Number of class kind: 4 (57.14%)
+
+Number of class definitions: 7
+Number of refined classes: 0 (0.00%)
+Average number of class refinments by classes: 0.00
+Average number of class refinments by refined classes: na
+
+Number of properties: 18
+  Number of MAttribute: 3 (16.66%)
+  Number of MMethod: 15 (83.33%)
+
+Number of property definitions: 20
+Number of redefined properties: 1 (5.55%)
+Average number of property redefinitions by property: 0.11
+Average number of property redefinitions by redefined property: 2.00
+--- Explicit vs. Implicit Self ---
+Total number of self: 5
+Total number of implicit self: 4 (80.00%)
+--- Construction of tables ---
+Number of runtime classes: 6 (excluding interfaces and abstract classes)
+Average number of composing class definition by runtime class: 2.00
+Total size of tables (classes and instances): 23 (not including stuff like info for subtyping or call-next-method)
+Average size of table by runtime class: 3.83
+Values never redefined: 17 (73.91%)
 --- Poset metrics ---
 ## Module importation hierarchy
 Number of nodes: 1
@@ -458,36 +488,6 @@ Distribution of direct smallers
   bivariants: 0 (na%)
   invariants: 0 (na%)
   total: 0
---- Metrics of refinement usage ---
-Number of modules: 1
-
-Number of classes: 7
-  Number of interface kind: 1 (14.28%)
-  Number of enum kind: 2 (28.57%)
-  Number of class kind: 4 (57.14%)
-
-Number of class definitions: 7
-Number of refined classes: 0 (0.00%)
-Average number of class refinments by classes: 0.00
-Average number of class refinments by refined classes: na
-
-Number of properties: 18
-  Number of MAttribute: 3 (16.66%)
-  Number of MMethod: 15 (83.33%)
-
-Number of property definitions: 20
-Number of redefined properties: 1 (5.55%)
-Average number of property redefinitions by property: 0.11
-Average number of property redefinitions by redefined property: 2.00
---- Explicit vs. Implicit Self ---
-Total number of self: 5
-Total number of implicit self: 4 (80.00%)
---- Construction of tables ---
-Number of runtime classes: 6 (excluding interfaces and abstract classes)
-Average number of composing class definition by runtime class: 2.00
-Total size of tables (classes and instances): 38 (not including stuff like info for subtyping or call-next-method)
-Average size of table by runtime class: 6.33
-Values never redefined: 32 (84.21%)
 generating project_hierarchy.dot
 generating module_hierarchy.dot
 
@@ -695,18 +695,14 @@ Statistics of type usage:
   A: 1 (11.11%)
 
 # Mendel metrics
-       large mclasses (threshold: 2.291)
-          B: 3
-          C: 3
-       budding mclasses (threshold: 0.693)
-          B: 0.75
-          C: 0.75
-       blooming mclasses (threshold: 1.935)
-          B: 2.25
-          C: 2.25
-       blooming mclasses (threshold: 1.935)
-          B: 2.25
-          C: 2.25
+       large mclasses (threshold: 3.354)
+          Sys: 4
+       budding mclasses (threshold: 3.51)
+          Sys: 4.0
+       blooming mclasses (threshold: 12.0)
+          Sys: 16.0
+       blooming mclasses (threshold: 12.0)
+          Sys: 16.0
 --- Detection of the usage of covariance static type conformance ---
 -- Total --
 - Kinds of the subtype -
@@ -880,9 +876,9 @@ MMethodDef locally designated (by number of CallSites)
   base_simple3#C#val1: 1 (4.54%)
   ...
   base_simple3#A#init: 1 (4.54%)
-  base_simple3#Object#baz: 1 (4.54%)
-  base_simple3#Object#bar: 1 (4.54%)
-  base_simple3#Object#foo: 1 (4.54%)
+  base_simple3#Sys#baz: 1 (4.54%)
+  base_simple3#Sys#bar: 1 (4.54%)
+  base_simple3#Sys#foo: 1 (4.54%)
   base_simple3#C#init: 1 (4.54%)
 MMethodDef possibly invoked at runtime (by number of CallSites)
  population: 13
@@ -901,9 +897,9 @@ MMethodDef possibly invoked at runtime (by number of CallSites)
   base_simple3#C#val1: 1 (4.54%)
   ...
   base_simple3#A#init: 1 (4.54%)
-  base_simple3#Object#baz: 1 (4.54%)
-  base_simple3#Object#bar: 1 (4.54%)
-  base_simple3#Object#foo: 1 (4.54%)
+  base_simple3#Sys#baz: 1 (4.54%)
+  base_simple3#Sys#bar: 1 (4.54%)
+  base_simple3#Sys#foo: 1 (4.54%)
   base_simple3#C#init: 1 (4.54%)
 class_hierarchy.dot
 classdef_hierarchy.dot
index 62be912..b69dc33 100644 (file)
@@ -8,6 +8,7 @@ import serialization
 redef class Deserializer
        redef fun deserialize_class(name)
        do
+               # Module: test_serialization
                if name == "Array[Object]" then return new Array[Object].from_deserializer(self)
                if name == "Array[nullable Object]" then return new Array[nullable Object].from_deserializer(self)
                if name == "Array[Serializable]" then return new Array[Serializable].from_deserializer(self)
index e248df6..fd2ef3c 100644 (file)
@@ -12,11 +12,11 @@ digraph G {
                                        fontsize = 8
                                ]
 Object [
- label = "{interface\nObject||+ object_id(): Int\l+ is_same_type(other: Object): Bool\l+ is_same_instance(other: nullable Object): Bool\l+ ==(other: nullable Object): Bool\l+ !=(other: nullable Object): Bool\l+ output()\l+ output_class_name()\l+ hash(): Int\l+ exit(exit_value: Int)\l+ sys(): Sys\l}"
+ label = "{interface\nObject||+ object_id(): Int\l+ is_same_type(other: Object): Bool\l+ is_same_instance(other: nullable Object): Bool\l+ ==(other: nullable Object): Bool\l+ !=(other: nullable Object): Bool\l+ output()\l+ output_class_name()\l+ hash(): Int\l+ sys(): Sys\l}"
 ]
 
 Sys [
- label = "{Sys||+ main()\l+ run()\l+ errno(): Int\l}"
+ label = "{Sys||+ main()\l+ run()\l+ errno(): Int\l+ exit(exit_value: Int)\l}"
 ]
 Object -> Sys [dir=back arrowtail=open style=dashed];
 
@@ -30,6 +30,11 @@ Discrete [
 ]
 Comparable -> Discrete [dir=back arrowtail=open style=dashed];
 
+Cloneable [
+ label = "{interface\nCloneable||+ clone(): SELF\l}"
+]
+Object -> Cloneable [dir=back arrowtail=open style=dashed];
+
 Numeric [
  label = "{interface\nNumeric||+ +(i: OTHER): OTHER\l+ -(i: OTHER): OTHER\l+ unary -(): OTHER\l+ *(i: OTHER): OTHER\l+ /(i: OTHER): OTHER\l+ to_i(): Int\l+ to_f(): Float\l+ is_zero(): Bool\l+ zero(): OTHER\l+ value_of(val: Numeric): OTHER\l}"
 ]
@@ -46,13 +51,13 @@ Float [
 Numeric -> Float [dir=back arrowtail=open style=dashed];
 
 Int [
- label = "{Int||+ %(i: Int): Int\l+ lshift(i: Int): Int\l+ rshift(i: Int): Int\l+ ascii(): Char\l+ digit_count(b: Int): Int\l+ digit_count_base_10(): Int\l+ to_c(): Char\l+ abs(): Int\l}"
+ label = "{Int||+ %(i: Int): Int\l+ lshift(i: Int): Int\l+ \<\<(i: Int): Int\l+ rshift(i: Int): Int\l+ \>\>(i: Int): Int\l+ ascii(): Char\l+ digit_count(b: Int): Int\l+ digit_count_base_10(): Int\l+ to_c(): Char\l+ abs(): Int\l}"
 ]
 Discrete -> Int [dir=back arrowtail=open style=dashed];
 Numeric -> Int [dir=back arrowtail=open style=dashed];
 
 Char [
- label = "{Char||+ to_i(): Int\l+ ascii(): Int\l+ to_lower(): Char\l+ to_upper(): Char\l+ is_digit(): Bool\l+ is_lower(): Bool\l+ is_upper(): Bool\l+ is_letter(): Bool\l}"
+ label = "{Char||+ to_i(): Int\l+ ascii(): Int\l+ to_lower(): Char\l+ to_upper(): Char\l+ is_digit(): Bool\l+ is_lower(): Bool\l+ is_upper(): Bool\l+ is_letter(): Bool\l+ is_whitespace(): Bool\l}"
 ]
 Discrete -> Char [dir=back arrowtail=open style=dashed];
 
index 9a7b30f..43e3f9e 100644 (file)
@@ -12,11 +12,11 @@ digraph G {
                                        fontsize = 8
                                ]
 Object [
- label = "{interface\nObject||+ object_id(): Int\l+ is_same_type(other: Object): Bool\l+ is_same_instance(other: nullable Object): Bool\l+ ==(other: nullable Object): Bool\l+ !=(other: nullable Object): Bool\l+ output()\l+ output_class_name()\l+ hash(): Int\l+ exit(exit_value: Int)\l+ sys(): Sys\l}"
+ label = "{interface\nObject||+ object_id(): Int\l+ is_same_type(other: Object): Bool\l+ is_same_instance(other: nullable Object): Bool\l+ ==(other: nullable Object): Bool\l+ !=(other: nullable Object): Bool\l+ output()\l+ output_class_name()\l+ hash(): Int\l+ sys(): Sys\l}"
 ]
 
 Sys [
- label = "{Sys||+ main()\l+ run()\l+ errno(): Int\l}"
+ label = "{Sys||+ main()\l+ run()\l+ errno(): Int\l+ exit(exit_value: Int)\l}"
 ]
 Object -> Sys [dir=back arrowtail=open style=dashed];
 
@@ -30,6 +30,11 @@ Discrete [
 ]
 Comparable -> Discrete [dir=back arrowtail=open style=dashed];
 
+Cloneable [
+ label = "{interface\nCloneable||+ clone(): SELF\l}"
+]
+Object -> Cloneable [dir=back arrowtail=open style=dashed];
+
 Numeric [
  label = "{interface\nNumeric||+ +(i: OTHER): OTHER\l+ -(i: OTHER): OTHER\l+ unary -(): OTHER\l+ *(i: OTHER): OTHER\l+ /(i: OTHER): OTHER\l+ to_i(): Int\l+ to_f(): Float\l+ is_zero(): Bool\l+ zero(): OTHER\l+ value_of(val: Numeric): OTHER\l}"
 ]
@@ -46,13 +51,13 @@ Float [
 Numeric -> Float [dir=back arrowtail=open style=dashed];
 
 Int [
- label = "{Int||+ %(i: Int): Int\l+ lshift(i: Int): Int\l+ rshift(i: Int): Int\l+ ascii(): Char\l+ digit_count(b: Int): Int\l+ digit_count_base_10(): Int\l+ to_c(): Char\l+ abs(): Int\l}"
+ label = "{Int||+ %(i: Int): Int\l+ lshift(i: Int): Int\l+ \<\<(i: Int): Int\l+ rshift(i: Int): Int\l+ \>\>(i: Int): Int\l+ ascii(): Char\l+ digit_count(b: Int): Int\l+ digit_count_base_10(): Int\l+ to_c(): Char\l+ abs(): Int\l}"
 ]
 Discrete -> Int [dir=back arrowtail=open style=dashed];
 Numeric -> Int [dir=back arrowtail=open style=dashed];
 
 Char [
- label = "{Char||+ to_i(): Int\l+ ascii(): Int\l+ to_lower(): Char\l+ to_upper(): Char\l+ is_digit(): Bool\l+ is_lower(): Bool\l+ is_upper(): Bool\l+ is_letter(): Bool\l}"
+ label = "{Char||+ to_i(): Int\l+ ascii(): Int\l+ to_lower(): Char\l+ to_upper(): Char\l+ is_digit(): Bool\l+ is_lower(): Bool\l+ is_upper(): Bool\l+ is_letter(): Bool\l+ is_whitespace(): Bool\l}"
 ]
 Discrete -> Char [dir=back arrowtail=open style=dashed];
 
index b00e342..e1439ca 100644 (file)
@@ -1,6 +1,6 @@
 test_nitunit.nit:20,1--22,0: ERROR: nitunit.test_nitunit.test_nitunit::X.<class> (in .nitunit/test_nitunit-2.nit): Runtime error: Assert failed (.nitunit/test_nitunit-2.nit:5)
 
-test_nitunit.nit:23,2--25,0: FAILURE: nitunit.test_nitunit.test_nitunit::X.test_nitunit::X::foo (in .nitunit/test_nitunit-3.nit): .nitunit/test_nitunit-3.nit:5,8--27: Error: Method or variable 'undefined_identifier' unknown in Sys.
+test_nitunit.nit:23,2--25,0: FAILURE: nitunit.test_nitunit.test_nitunit::X.test_nitunit::X::foo (in .nitunit/test_nitunit-3.nit): .nitunit/test_nitunit-3.nit:5,8--27: Error: method or variable `undefined_identifier` unknown in `Sys`.
 
 test_test_nitunit.nit:36,2--40,4: ERROR: test_foo1 (in file .nitunit/gen_test_test_nitunit.nit): Runtime error: Assert failed (test_test_nitunit.nit:39)
 
@@ -13,6 +13,6 @@ Class suites: 1; Test Cases: 3; Failures: 1
 </system-out></testcase><testcase classname="nitunit.test_nitunit.test_nitunit::X" name="&lt;class&gt;"><system-err></system-err><system-out>assert false
 </system-out><error message="Runtime error: Assert failed (.nitunit&#47;test_nitunit-2.nit:5)
 "></error></testcase><testcase classname="nitunit.test_nitunit.test_nitunit::X" name="test_nitunit::X::foo"><system-err></system-err><system-out>assert undefined_identifier
-</system-out><failure message=".nitunit&#47;test_nitunit-3.nit:5,8--27: Error: Method or variable &#39;undefined_identifier&#39; unknown in Sys.
+</system-out><failure message=".nitunit&#47;test_nitunit-3.nit:5,8--27: Error: method or variable `undefined_identifier` unknown in `Sys`.
 "></failure></testcase></testsuite><testsuite package="test_test_nitunit"><testcase classname="nitunit.test_test_nitunit.test_test_nitunit::TestX" name="test_test_nitunit::TestX::test_foo"><system-err></system-err><system-out>out</system-out></testcase><testcase classname="nitunit.test_test_nitunit.test_test_nitunit::TestX" name="test_test_nitunit::TestX::test_foo1"><system-err></system-err><system-out>out</system-out><error message="Runtime error: Assert failed (test_test_nitunit.nit:39)
 "></error></testcase><testcase classname="nitunit.test_test_nitunit.test_test_nitunit::TestX" name="test_test_nitunit::TestX::test_foo2"><system-err></system-err><system-out>out</system-out></testcase></testsuite></testsuites>
\ No newline at end of file
index 91eb55f..8c655a2 100644 (file)
@@ -5,17 +5,17 @@ Entities: 4; Documented ones: 3; With nitunits: 3; Failures: 0
 TestSuites:
 No test cases found
 Class suites: 0; Test Cases: 0; Failures: 0
-<testsuites><testsuite package="test_nitunit2"><testcase classname="nitunit.test_nitunit2.standard::Object" name="test_nitunit2::Object::foo1"><system-err></system-err><system-out>if true then
+<testsuites><testsuite package="test_nitunit2"><testcase classname="nitunit.test_nitunit2.standard::Sys" name="test_nitunit2::Sys::foo1"><system-err></system-err><system-out>if true then
 
    assert true
 
 end
-</system-out></testcase><testcase classname="nitunit.test_nitunit2.standard::Object" name="test_nitunit2::Object::bar2"><system-err></system-err><system-out>if true then
+</system-out></testcase><testcase classname="nitunit.test_nitunit2.standard::Sys" name="test_nitunit2::Sys::bar2"><system-err></system-err><system-out>if true then
 
     assert true
 
 end
-</system-out></testcase><testcase classname="nitunit.test_nitunit2.standard::Object" name="test_nitunit2::Object::foo3"><system-err></system-err><system-out>var a = 1
+</system-out></testcase><testcase classname="nitunit.test_nitunit2.standard::Sys" name="test_nitunit2::Sys::foo3"><system-err></system-err><system-out>var a = 1
 assert a == 1
 assert a == 1
 </system-out></testcase></testsuite><testsuite></testsuite></testsuites>
\ No newline at end of file
index 356eaf4..3da2105 100644 (file)
@@ -5,7 +5,7 @@ Entities: 6; Documented ones: 5; With nitunits: 3; Failures: 0
 TestSuites:
 No test cases found
 Class suites: 0; Test Cases: 0; Failures: 0
-<testsuites><testsuite package="test_doc2"><testcase classname="nitunit.test_doc2.standard::Object" name="test_doc2::Object::foo1"><system-err></system-err><system-out>assert true # tested
-</system-out></testcase><testcase classname="nitunit.test_doc2.standard::Object" name="test_doc2::Object::foo2"><system-err></system-err><system-out>assert true # tested
-</system-out></testcase><testcase classname="nitunit.test_doc2.standard::Object" name="test_doc2::Object::foo3"><system-err></system-err><system-out>assert true # tested
+<testsuites><testsuite package="test_doc2"><testcase classname="nitunit.test_doc2.standard::Sys" name="test_doc2::Sys::foo1"><system-err></system-err><system-out>assert true # tested
+</system-out></testcase><testcase classname="nitunit.test_doc2.standard::Sys" name="test_doc2::Sys::foo2"><system-err></system-err><system-out>assert true # tested
+</system-out></testcase><testcase classname="nitunit.test_doc2.standard::Sys" name="test_doc2::Sys::foo3"><system-err></system-err><system-out>assert true # tested
 </system-out></testcase></testsuite><testsuite></testsuite></testsuites>
\ No newline at end of file
diff --git a/tests/sav/nitunit_args6.res b/tests/sav/nitunit_args6.res
new file mode 100644 (file)
index 0000000..f8d4f23
--- /dev/null
@@ -0,0 +1,14 @@
+test_nitunit3/README.md: Error: there is a block of invalid Nit code, thus not considered a nitunit. To suppress this warning, enclose the block with a fence tagged `nitish` or `raw` (see `man nitdoc`). At 1,1: Syntax Error: unknown token `;`..
+test_nitunit3/README.md: ERROR: nitunit.test_nitunit3.<group> (in .nitunit/test_nitunit3-0.nit): Runtime error: Assert failed (.nitunit/test_nitunit3-0.nit:7)
+
+DocUnits:
+Entities: 2; Documented ones: 2; With nitunits: 2; Failures: 2
+
+TestSuites:
+No test cases found
+Class suites: 0; Test Cases: 0; Failures: 0
+<testsuites><testsuite package="test_nitunit3"><testcase classname="nitunit.test_nitunit3" name="&lt;group&gt;"><failure message="test_nitunit3&#47;README.md: Invalid block of code. At 1,1: Syntax Error: unknown token `;`.."></failure><system-err></system-err><system-out>assert false
+assert true
+</system-out><error message="Runtime error: Assert failed (.nitunit&#47;test_nitunit3-0.nit:7)
+"></error></testcase></testsuite><testsuite package="test_nitunit3"><testcase classname="nitunit.test_nitunit3.&lt;module&gt;" name="&lt;module&gt;"><system-err></system-err><system-out>assert true
+</system-out></testcase></testsuite><testsuite></testsuite></testsuites>
\ No newline at end of file
diff --git a/tests/sav/nitunit_args7.res b/tests/sav/nitunit_args7.res
new file mode 100644 (file)
index 0000000..ea6bab2
--- /dev/null
@@ -0,0 +1,13 @@
+test_nitunit_md.md: ERROR: nitunit.<file>.test_nitunit_md.md (in .nitunit/file-0.nit): Runtime error: Assert failed (.nitunit/file-0.nit:8)
+
+DocUnits:
+Entities: 1; Documented ones: 1; With nitunits: 1; Failures: 1
+
+TestSuites:
+No test cases found
+Class suites: 0; Test Cases: 0; Failures: 0
+<testsuites><testsuite package="test_nitunit_md.md"><testcase classname="nitunit.&lt;file&gt;" name="test_nitunit_md.md"><system-err></system-err><system-out>var a = 1
+assert 1 == 1
+assert false
+</system-out><error message="Runtime error: Assert failed (.nitunit&#47;file-0.nit:8)
+"></error></testcase></testsuite></testsuites>
\ No newline at end of file
index 4138d94..bdb2b9f 100644 (file)
@@ -1,5 +1,5 @@
 \e[1m= result for 'foo'\e[0m
 
   fun \e[1m\e[32mfoo\e[0m\e[0m
-  \e[30m\e[1mbase_simple3::Object::foo\e[0m\e[0m\e[30m (lines 49-49)\e[0m
+  \e[30m\e[1mbase_simple3::Sys::foo\e[0m\e[0m\e[30m (lines 49-49)\e[0m
 
index e3174b3..83a361e 100644 (file)
@@ -24,5 +24,5 @@
       \e[30m\e[1mbase_simple3::Object\e[0m\e[0m\e[30m (lines 19-20)\e[0m
       
       class \e[32m\e[1mSys\e[0m\e[0m
-      \e[30m\e[1mbase_simple3::Sys\e[0m\e[0m\e[30m (lines 53-66)\e[0m
+      \e[30m\e[1mbase_simple3::Sys\e[0m\e[0m\e[30m (lines 49-49)\e[0m
 
diff --git a/tests/sav/perlin_noise.res b/tests/sav/perlin_noise.res
new file mode 100644 (file)
index 0000000..58a5cf2
--- /dev/null
@@ -0,0 +1 @@
+0.13691995878400010
index b38fe92..b92b7cc 100644 (file)
@@ -1 +1 @@
-syntax_annotations.nit:15,10--12: Warning: unknown annotation `foo`
+syntax_annotations.nit:15,10--12: Warning: unknown annotation `foo`.
index a1d6fe7..28b728d 100644 (file)
@@ -1,3 +1,3 @@
-syntax_annotations2.nit:16,2--6: Warning: unknown annotation `annot`
-syntax_annotations2.nit:17,2--7: Warning: unknown annotation `annot2`
-syntax_annotations2.nit:38,15--17: Warning: unknown annotation `foo`
+syntax_annotations2.nit:16,2--6: Warning: unknown annotation `annot`.
+syntax_annotations2.nit:17,2--7: Warning: unknown annotation `annot2`.
+syntax_annotations2.nit:38,15--17: Warning: unknown annotation `foo`.
index 957e98d..26fb54f 100644 (file)
@@ -1,14 +1,14 @@
-syntax_annotations3.nit:16,2--20: Warning: unknown annotation `invariant`
-syntax_annotations3.nit:19,3--12: Warning: unknown annotation `pre`
-syntax_annotations3.nit:20,3--22: Warning: unknown annotation `post`
-syntax_annotations3.nit:21,3--19: Warning: unknown annotation `test`
-syntax_annotations3.nit:28,3--7: Warning: unknown annotation `inter`
-syntax_annotations3.nit:33,16--18: Warning: unknown annotation `u32`
-syntax_annotations3.nit:34,19--36: Warning: unknown annotation `after`
-syntax_annotations3.nit:34,12--36: Warning: unknown annotation `daemon`
-syntax_annotations3.nit:34,3--37: Warning: unknown annotation `ondebug`
-syntax_annotations3.nit:35,3--7: Warning: unknown annotation `final`
-syntax_annotations3.nit:38,28--35: Warning: unknown annotation `readable`
-syntax_annotations3.nit:38,38--45: Warning: unknown annotation `initable`
-syntax_annotations3.nit:38,48--56: Warning: unknown annotation `fast_init`
-syntax_annotations3.nit:42,20--28: Warning: unknown annotation `unchecked`
+syntax_annotations3.nit:16,2--20: Warning: unknown annotation `invariant`.
+syntax_annotations3.nit:19,3--12: Warning: unknown annotation `pre`.
+syntax_annotations3.nit:20,3--22: Warning: unknown annotation `post`.
+syntax_annotations3.nit:21,3--19: Warning: unknown annotation `test`.
+syntax_annotations3.nit:28,3--7: Warning: unknown annotation `inter`.
+syntax_annotations3.nit:33,16--18: Warning: unknown annotation `u32`.
+syntax_annotations3.nit:34,19--36: Warning: unknown annotation `after`.
+syntax_annotations3.nit:34,12--36: Warning: unknown annotation `daemon`.
+syntax_annotations3.nit:34,3--37: Warning: unknown annotation `ondebug`.
+syntax_annotations3.nit:35,3--7: Warning: unknown annotation `final`.
+syntax_annotations3.nit:38,28--35: Warning: unknown annotation `readable`.
+syntax_annotations3.nit:38,38--45: Warning: unknown annotation `initable`.
+syntax_annotations3.nit:38,48--56: Warning: unknown annotation `fast_init`.
+syntax_annotations3.nit:42,20--28: Warning: unknown annotation `unchecked`.
index f5f983d..033d032 100644 (file)
@@ -1 +1 @@
-alt/test_annot_pkgconfig_alt1.nit:17,8--27: Error: module name missmatch; declared test_annot_pkgconfig file named test_annot_pkgconfig_alt1
+alt/test_annot_pkgconfig_alt1.nit:17,8--27: Error: module name mismatch; declared test_annot_pkgconfig file named test_annot_pkgconfig_alt1.
index ce1bbe2..a30526f 100644 (file)
@@ -1 +1 @@
-alt/test_annot_pkgconfig_alt2.nit:18,8--27: Error: module name missmatch; declared test_annot_pkgconfig file named test_annot_pkgconfig_alt2
+alt/test_annot_pkgconfig_alt2.nit:18,8--27: Error: module name mismatch; declared test_annot_pkgconfig file named test_annot_pkgconfig_alt2.
index 7862a1e..67755e7 100644 (file)
@@ -1,10 +1,10 @@
-test_attr_easy.nit:19,5--14: Warning: Expression is already a Bool.
-test_attr_easy.nit:19,18--27: Warning: Expression is already a Bool.
-test_attr_easy.nit:19,31--39: Warning: Expression is already a Int.
-test_attr_easy.nit:19,43--53: Warning: Expression is already a Float.
-test_attr_easy.nit:20,5--16: Warning: Expression is already a String.
-test_attr_easy.nit:20,20--26: Warning: Expression is already a B.
-test_attr_easy.nit:20,44--62: Warning: Expression is already a HashMap[Int, B].
+test_attr_easy.nit:19,5--14: Warning: expression is already a `Bool`.
+test_attr_easy.nit:19,18--27: Warning: expression is already a `Bool`.
+test_attr_easy.nit:19,31--39: Warning: expression is already a `Int`.
+test_attr_easy.nit:19,43--53: Warning: expression is already a `Float`.
+test_attr_easy.nit:20,5--16: Warning: expression is already a `String`.
+test_attr_easy.nit:20,20--26: Warning: expression is already a `B`.
+test_attr_easy.nit:20,44--62: Warning: expression is already a `HashMap[Int, B]`.
 true false 12345 1.235 asdf true
 an instance of B
 true true true true
index ca20ef3..025f2d1 100644 (file)
@@ -1,4 +1,4 @@
-alt/test_combined_assignment_alt1.nit:23,3--8: Error: Method '+' doesn't exists in Object.
-alt/test_combined_assignment_alt1.nit:28,3--8: Error: Method '+' doesn't exists in Object.
-alt/test_combined_assignment_alt1.nit:29,10: Type error: expected Int, got Object
-alt/test_combined_assignment_alt1.nit:49,1--8: Error: Method '+' doesn't exists in Object.
+alt/test_combined_assignment_alt1.nit:23,5--6: Error: method `+` does not exists in `Object`.
+alt/test_combined_assignment_alt1.nit:28,5--6: Error: method `+` does not exists in `Object`.
+alt/test_combined_assignment_alt1.nit:29,10: Type Error: expected `Int`, got `Object`.
+alt/test_combined_assignment_alt1.nit:49,5--6: Error: method `+` does not exists in `Object`.
diff --git a/tests/sav/test_deriving.res b/tests/sav/test_deriving.res
new file mode 100644 (file)
index 0000000..6020b5f
--- /dev/null
@@ -0,0 +1,15 @@
+<A i: <Int> s: <FlatString>>
+i=5 s=Hello
+i:5; s:Hello
+
+true
+true
+true
+
+<B i: <Int> s: <FlatString> a: <A i: <Int> s: <FlatString>>>
+i=100 s=World a=i:5; s:Hello
+i:100; s:World; a:i:5; s:Hello
+
+true
+true
+true
diff --git a/tests/sav/test_deriving_alt1.res b/tests/sav/test_deriving_alt1.res
new file mode 100644 (file)
index 0000000..88d1f35
--- /dev/null
@@ -0,0 +1,15 @@
+<A i: <Int> s: <FlatString>>
+i=5 s=Hello
+<A i: <Int> s: <FlatString>>
+
+true
+true
+true
+
+<B i: <Int> s: <FlatString> a: <A i: <Int> s: <FlatString>>>
+i=100 s=World a=<A i: <Int> s: <FlatString>>
+<B i: <Int> s: <FlatString> a: <A i: <Int> s: <FlatString>>>
+
+true
+true
+true
diff --git a/tests/sav/test_deriving_alt2.res b/tests/sav/test_deriving_alt2.res
new file mode 100644 (file)
index 0000000..7af6a70
--- /dev/null
@@ -0,0 +1,15 @@
+<A i: <Int> s: <FlatString>>
+i=5 s=Hello
+i:5; s:Hello
+
+false
+false
+true
+
+<B i: <Int> s: <FlatString> a: <A i: <Int> s: <FlatString>>>
+i=100 s=World a=i:5; s:Hello
+i:100; s:World; a:i:5; s:Hello
+
+false
+false
+true
diff --git a/tests/sav/test_deriving_alt3.res b/tests/sav/test_deriving_alt3.res
new file mode 100644 (file)
index 0000000..9e385ed
--- /dev/null
@@ -0,0 +1,15 @@
+<A i: <Int> s: <FlatString>>
+i=5 s=Hello
+i:5; s:Hello
+
+true
+true
+true
+
+<B i: <Int> s: <FlatString> a: <A i: <Int> s: <FlatString>>>
+i=100 s=World
+i:100; s:World
+
+true
+true
+false
diff --git a/tests/sav/test_deriving_alt4.res b/tests/sav/test_deriving_alt4.res
new file mode 100644 (file)
index 0000000..16cf4a0
--- /dev/null
@@ -0,0 +1,15 @@
+<A i: <Int> s: <FlatString>>
+i=5 s=Hello
+i:5; s:Hello
+
+true
+true
+true
+
+<B a: <A i: <Int> s: <FlatString>>>
+string=World a=i:5; s:Hello
+string:World; a:i:5; s:Hello
+
+true
+true
+true
index 33ac09b..13f9a72 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Aborted (../lib/serialization.nit:72)
+Runtime error: Aborted (../lib/serialization/serialization.nit:109)
 # Nit:
 <A: true a 0.123 1234 asdf false>
 
index 51196e3..2da0aeb 100644 (file)
@@ -55,11 +55,11 @@ h5 {font-weight:bold;}
 .popover { max-width: 800px !important; }
 
 </style>
-</head><body><h3 id='test_doc2'>module test_doc2</h1><h5 id='test_doc2#Object#foo1'>prop test_doc2#Object#foo1</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">true</span> <span># tested
-</span></span><span class="line" id="L2"><span></span></span></span></pre></div><h5 id='test_doc2#Object#foo2'>prop test_doc2#Object#foo2</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">true</span> <span># tested
-</span></span><span class="line" id="L2"><span></span></span></span></pre></div><h5 id='test_doc2#Object#foo3'>prop test_doc2#Object#foo3</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">true</span> <span># tested
-</span></span><span class="line" id="L2"><span></span></span></span></pre></div><h5 id='test_doc2#Object#foo4'>prop test_doc2#Object#foo4</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="rawcode">assert false # not tested (and not highlighted)
-</pre></div><h5 id='test_doc2#Object#foo5'>prop test_doc2#Object#foo5</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">false</span> <span># not tested (but highlighted)
+</head><body><h3 id='test_doc2'>module test_doc2</h1><h5 id='test_doc2#Sys#foo1'>prop test_doc2#Sys#foo1</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">true</span> <span># tested
+</span></span><span class="line" id="L2"><span></span></span></span></pre></div><h5 id='test_doc2#Sys#foo2'>prop test_doc2#Sys#foo2</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">true</span> <span># tested
+</span></span><span class="line" id="L2"><span></span></span></span></pre></div><h5 id='test_doc2#Sys#foo3'>prop test_doc2#Sys#foo3</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">true</span> <span># tested
+</span></span><span class="line" id="L2"><span></span></span></span></pre></div><h5 id='test_doc2#Sys#foo4'>prop test_doc2#Sys#foo4</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="rawcode">assert false # not tested (and not highlighted)
+</pre></div><h5 id='test_doc2#Sys#foo5'>prop test_doc2#Sys#foo5</h3><div class="nitdoc"><p class="synopsys">Test code</p><pre class="nitcode"><span class="nitcode"><span class="line" id="L1"><span class="nc_k">assert</span> <span class="nc_k">false</span> <span># not tested (but highlighted)
 </span></span><span class="line" id="L2"><span></span></span></span></pre></div><script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
 <script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
 <script>$(".popupable").popover({html:true, placement:'top'})/*initialize bootstrap popover*/</script></body></html>
\ No newline at end of file
index aa71e91..893e1ea 100644 (file)
@@ -20,6 +20,9 @@ false
 false
 true
 true
+32
+8
 52
 456
+123
 -123
index a2c2d95..59f0453 100644 (file)
@@ -1 +1 @@
-alt/test_ffi_c_polymorphism_alt1.nit:56,15--25: Type error: expected NativeB, got NativeA
+alt/test_ffi_c_polymorphism_alt1.nit:56,15--25: Type Error: expected `NativeB`, got `NativeA`.
index 58254a5..27d3f66 100644 (file)
@@ -1 +1 @@
-alt/test_ffi_c_polymorphism_alt2.nit:58,12--22: Type error: expected NativeB, got NativeA
+alt/test_ffi_c_polymorphism_alt2.nit:58,12--22: Type Error: expected `NativeB`, got `NativeA`.
index 254e5da..a1e0a96 100644 (file)
@@ -1,5 +1,5 @@
-test_gen_inh.nit:29,15--17: Warning: Useless formal parameter type since `Int` cannnot have subclasses.
-test_gen_inh.nit:34,15--17: Warning: Useless formal parameter type since `Int` cannnot have subclasses.
+test_gen_inh.nit:29,15--17: Warning: useless formal parameter type since `Int` cannot have subclasses.
+test_gen_inh.nit:34,15--17: Warning: useless formal parameter type since `Int` cannot have subclasses.
 11
 22
 33
index dc72c30..5cbab16 100644 (file)
@@ -11,8 +11,8 @@ true
 2
 0
 * test 2 *
-1000
-334
+100
+34
 * test 3 *
 * start:
 true
index 24304a1..2d7a74b 100644 (file)
@@ -1,6 +1,6 @@
-test_isa.nit:25,7--19: Warning: Expression is already a Object.
-test_isa.nit:34,7--19: Warning: Expression is already a Object.
-test_isa.nit:43,7--28: Warning: Expression is already a nullable Object.
+test_isa.nit:25,7--19: Warning: expression is already a `Object`.
+test_isa.nit:34,7--19: Warning: expression is already a `Object`.
+test_isa.nit:43,7--28: Warning: expression is already a `nullable Object`.
 int:
 true
 true
index dabb78b..48cdded 100644 (file)
@@ -10,8 +10,8 @@ true
 2
 0
 * test 2 *
-1000
-334
+100
+34
 * test 3 *
 * start:
 true
index a9be79e..2a5b99a 100644 (file)
@@ -1 +1 @@
-1234567891011121314151617181920212223
+12345678910
diff --git a/tests/sav/test_meta.res b/tests/sav/test_meta.res
new file mode 100644 (file)
index 0000000..6f23d37
--- /dev/null
@@ -0,0 +1,14 @@
+FlatString
+FlatString
+Class[FlatString]
+Class[Class[FlatString]]
+
+XObject
+XObject
+XClass[XObject]
+Class[XClass[XObject]]
+
+YObject
+YObject
+YClass[YObject]
+YClass[YClass[YObject]]
index d7626cd..d9c4a28 100644 (file)
@@ -1,2 +1,2 @@
-test_multiconstraint.nit:64,7: Error: A class G is already defined at line 56.
-test_multiconstraint.nit:70,7: Error: A class G is already defined at line 56.
+test_multiconstraint.nit:64,7: Error: a class `G` is already defined at line 56.
+test_multiconstraint.nit:70,7: Error: a class `G` is already defined at line 56.
index 1137621..8e21637 100644 (file)
@@ -1 +1 @@
-test_multiconstraint_inh.nit:39,18--21: Redef Error: Wrong type for parameter `e'. found J, expected I[E] as in test_multiconstraint_inh#G#baz.
+test_multiconstraint_inh.nit:39,18--21: Redef Error: expected `I[E]` for parameter `e'; got `J`.
index d7626cd..d9c4a28 100644 (file)
@@ -1,2 +1,2 @@
-test_multiconstraint.nit:64,7: Error: A class G is already defined at line 56.
-test_multiconstraint.nit:70,7: Error: A class G is already defined at line 56.
+test_multiconstraint.nit:64,7: Error: a class `G` is already defined at line 56.
+test_multiconstraint.nit:70,7: Error: a class `G` is already defined at line 56.
index d7626cd..d9c4a28 100644 (file)
@@ -1,2 +1,2 @@
-test_multiconstraint.nit:64,7: Error: A class G is already defined at line 56.
-test_multiconstraint.nit:70,7: Error: A class G is already defined at line 56.
+test_multiconstraint.nit:64,7: Error: a class `G` is already defined at line 56.
+test_multiconstraint.nit:70,7: Error: a class `G` is already defined at line 56.
index d21eb0d..43e3636 100644 (file)
@@ -1,4 +1,4 @@
-Runtime error: Cast failed. Expected `E`, got `Bool` (../lib/standard/collection/array.nit:808)
+Runtime error: Cast failed. Expected `E`, got `Bool` (../lib/standard/collection/array.nit:960)
 NativeString
 N
 Nit
index 6c59b79..1e84d63 100644 (file)
@@ -6,6 +6,7 @@ options:
   -n   do not print anything
   -l   only lexer
   -p   lexer and parser (default)
+  -x   instead of a ascii tree, output a XML document
   -e   instead on files, each argument is a content to parse
   -i   tree to parse are read interactively
   -h   print this help
index 36503ed..1f99f54 100644 (file)
@@ -1,5 +1,5 @@
-Start ../src/test_parser.nit:17,1--147,1
-  AModule ../src/test_parser.nit:17,1--146,3
+Start ../src/test_parser.nit:17,1--156,1
+  AModule ../src/test_parser.nit:17,1--155,3
     AModuledecl ../src/test_parser.nit:17,1--18,18
       ADoc ../src/test_parser.nit:17,1--18,0
         TComment "# Program used to test the NIT parser\n" ../src/test_parser.nit:17,1--18,0
@@ -17,99 +17,64 @@ Start ../src/test_parser.nit:17,1--147,1
       TKwimport "import" ../src/test_parser.nit:21,1--6
       AModuleName ../src/test_parser.nit:21,8--18
         TId "parser_util" ../src/test_parser.nit:21,8--18
-    AStdClassdef ../src/test_parser.nit:23,1--37,3
-      APublicVisibility ../src/test_parser.nit:23,1
-      AConcreteClasskind ../src/test_parser.nit:23,1--5
-        TKwclass "class" ../src/test_parser.nit:23,1--5
-      TClassid "PrintTreeVisitor" ../src/test_parser.nit:23,7--22
-      ASuperPropdef ../src/test_parser.nit:24,2--14
-        APublicVisibility ../src/test_parser.nit:24,2
-        TKwsuper "super" ../src/test_parser.nit:24,2--6
-        AType ../src/test_parser.nit:24,8--14
-          TClassid "Visitor" ../src/test_parser.nit:24,8--14
-      AAttrPropdef ../src/test_parser.nit:25,2--26
-        APrivateVisibility ../src/test_parser.nit:25,2--8
-          TKwprivate "private" ../src/test_parser.nit:25,2--8
-        TKwvar "var" ../src/test_parser.nit:25,10--12
-        TId "rank" ../src/test_parser.nit:25,14--17
-        AType ../src/test_parser.nit:25,20--22
-          TClassid "Int" ../src/test_parser.nit:25,20--22
-        ADecIntExpr ../src/test_parser.nit:25,26
-          TNumber "0" ../src/test_parser.nit:25,26
-      AMethPropdef ../src/test_parser.nit:26,2--36,4
-        TKwredef "redef" ../src/test_parser.nit:26,2--6
-        APublicVisibility ../src/test_parser.nit:26,8
-        TKwmeth "fun" ../src/test_parser.nit:26,8--10
-        AIdMethid ../src/test_parser.nit:26,12--16
-          TId "visit" ../src/test_parser.nit:26,12--16
-        ASignature ../src/test_parser.nit:26,17--19
-          TOpar "(" ../src/test_parser.nit:26,17
-          AParam ../src/test_parser.nit:26,18
-            TId "n" ../src/test_parser.nit:26,18
-          TCpar ")" ../src/test_parser.nit:26,19
-        ABlockExpr ../src/test_parser.nit:28,3--36,4
-          AIfExpr ../src/test_parser.nit:28,3--32,5
-            TKwif "if" ../src/test_parser.nit:28,3--4
-            AIsaExpr ../src/test_parser.nit:28,6--16
-              ACallExpr ../src/test_parser.nit:28,6
-                AImplicitSelfExpr ../src/test_parser.nit:28,6
-                TId "n" ../src/test_parser.nit:28,6
-                AListExprs ../src/test_parser.nit:28,6
-              AType ../src/test_parser.nit:28,12--16
-                TClassid "Token" ../src/test_parser.nit:28,12--16
-            ABlockExpr ../src/test_parser.nit:29,4--88
-              ACallExpr ../src/test_parser.nit:29,4--88
-                AImplicitSelfExpr ../src/test_parser.nit:29,4
-                TId "printn" ../src/test_parser.nit:29,4--9
-                AParExprs ../src/test_parser.nit:29,10--88
-                  TOpar "(" ../src/test_parser.nit:29,10
-                  AStarExpr ../src/test_parser.nit:29,11--21
-                    AStringExpr ../src/test_parser.nit:29,11--14
-                      TString "\"  \"" ../src/test_parser.nit:29,11--14
-                    ACallExpr ../src/test_parser.nit:29,18--21
-                      AImplicitSelfExpr ../src/test_parser.nit:29,18
-                      TId "rank" ../src/test_parser.nit:29,18--21
-                      AListExprs ../src/test_parser.nit:29,21
-                  ACallExpr ../src/test_parser.nit:29,24--35
-                    ACallExpr ../src/test_parser.nit:29,24
-                      AImplicitSelfExpr ../src/test_parser.nit:29,24
-                      TId "n" ../src/test_parser.nit:29,24
-                      AListExprs ../src/test_parser.nit:29,24
-                    TId "class_name" ../src/test_parser.nit:29,26--35
-                    AListExprs ../src/test_parser.nit:29,35
-                  AStringExpr ../src/test_parser.nit:29,38--42
-                    TString "\" \\\"\"" ../src/test_parser.nit:29,38--42
-                  ACallExpr ../src/test_parser.nit:29,45--62
-                    ACallExpr ../src/test_parser.nit:29,45--50
-                      ACallExpr ../src/test_parser.nit:29,45
-                        AImplicitSelfExpr ../src/test_parser.nit:29,45
-                        TId "n" ../src/test_parser.nit:29,45
-                        AListExprs ../src/test_parser.nit:29,45
-                      TId "text" ../src/test_parser.nit:29,47--50
-                      AListExprs ../src/test_parser.nit:29,50
-                    TId "escape_to_c" ../src/test_parser.nit:29,52--62
-                    AListExprs ../src/test_parser.nit:29,62
-                  AStringExpr ../src/test_parser.nit:29,65--69
-                    TString "\"\\\" \"" ../src/test_parser.nit:29,65--69
-                  ACallExpr ../src/test_parser.nit:29,72--81
-                    ACallExpr ../src/test_parser.nit:29,72
-                      AImplicitSelfExpr ../src/test_parser.nit:29,72
-                      TId "n" ../src/test_parser.nit:29,72
-                      AListExprs ../src/test_parser.nit:29,72
-                    TId "location" ../src/test_parser.nit:29,74--81
-                    AListExprs ../src/test_parser.nit:29,81
-                  AStringExpr ../src/test_parser.nit:29,84--87
-                    TString "\"\\n\"" ../src/test_parser.nit:29,84--87
-                  TCpar ")" ../src/test_parser.nit:29,88
-            ABlockExpr ../src/test_parser.nit:31,4--32,5
-              ACallExpr ../src/test_parser.nit:31,4--59
+    AStdImport ../src/test_parser.nit:22,1--14
+      APublicVisibility ../src/test_parser.nit:22,1
+      TKwimport "import" ../src/test_parser.nit:22,1--6
+      AModuleName ../src/test_parser.nit:22,8--14
+        TId "astutil" ../src/test_parser.nit:22,8--14
+    AStdClassdef ../src/test_parser.nit:24,1--39,3
+      ADoc ../src/test_parser.nit:24,1--25,0
+        TComment "# A basic visitor that prints AST trees to the screen\n" ../src/test_parser.nit:24,1--25,0
+      APublicVisibility ../src/test_parser.nit:25,1
+      AConcreteClasskind ../src/test_parser.nit:25,1--5
+        TKwclass "class" ../src/test_parser.nit:25,1--5
+      TClassid "PrintTreeVisitor" ../src/test_parser.nit:25,7--22
+      ASuperPropdef ../src/test_parser.nit:26,2--14
+        APublicVisibility ../src/test_parser.nit:26,2
+        TKwsuper "super" ../src/test_parser.nit:26,2--6
+        AType ../src/test_parser.nit:26,8--14
+          TClassid "Visitor" ../src/test_parser.nit:26,8--14
+      AAttrPropdef ../src/test_parser.nit:27,2--26
+        APrivateVisibility ../src/test_parser.nit:27,2--8
+          TKwprivate "private" ../src/test_parser.nit:27,2--8
+        TKwvar "var" ../src/test_parser.nit:27,10--12
+        TId "rank" ../src/test_parser.nit:27,14--17
+        AType ../src/test_parser.nit:27,20--22
+          TClassid "Int" ../src/test_parser.nit:27,20--22
+        ADecIntExpr ../src/test_parser.nit:27,26
+          TNumber "0" ../src/test_parser.nit:27,26
+      AMethPropdef ../src/test_parser.nit:28,2--38,4
+        TKwredef "redef" ../src/test_parser.nit:28,2--6
+        APublicVisibility ../src/test_parser.nit:28,8
+        TKwmeth "fun" ../src/test_parser.nit:28,8--10
+        AIdMethid ../src/test_parser.nit:28,12--16
+          TId "visit" ../src/test_parser.nit:28,12--16
+        ASignature ../src/test_parser.nit:28,17--19
+          TOpar "(" ../src/test_parser.nit:28,17
+          AParam ../src/test_parser.nit:28,18
+            TId "n" ../src/test_parser.nit:28,18
+          TCpar ")" ../src/test_parser.nit:28,19
+        ABlockExpr ../src/test_parser.nit:30,3--38,4
+          AIfExpr ../src/test_parser.nit:30,3--34,5
+            TKwif "if" ../src/test_parser.nit:30,3--4
+            AIsaExpr ../src/test_parser.nit:30,6--16
+              ACallExpr ../src/test_parser.nit:30,6
+                AImplicitSelfExpr ../src/test_parser.nit:30,6
+                TId "n" ../src/test_parser.nit:30,6
+                AListExprs ../src/test_parser.nit:30,6
+              TKwisa "isa" ../src/test_parser.nit:30,8--10
+              AType ../src/test_parser.nit:30,12--16
+                TClassid "Token" ../src/test_parser.nit:30,12--16
+            ABlockExpr ../src/test_parser.nit:31,4--88
+              ACallExpr ../src/test_parser.nit:31,4--88
                 AImplicitSelfExpr ../src/test_parser.nit:31,4
                 TId "printn" ../src/test_parser.nit:31,4--9
-                AParExprs ../src/test_parser.nit:31,10--59
+                AParExprs ../src/test_parser.nit:31,10--88
                   TOpar "(" ../src/test_parser.nit:31,10
                   AStarExpr ../src/test_parser.nit:31,11--21
                     AStringExpr ../src/test_parser.nit:31,11--14
                       TString "\"  \"" ../src/test_parser.nit:31,11--14
+                    TStar "*" ../src/test_parser.nit:31,16
                     ACallExpr ../src/test_parser.nit:31,18--21
                       AImplicitSelfExpr ../src/test_parser.nit:31,18
                       TId "rank" ../src/test_parser.nit:31,18--21
@@ -121,909 +86,1038 @@ Start ../src/test_parser.nit:17,1--147,1
                       AListExprs ../src/test_parser.nit:31,24
                     TId "class_name" ../src/test_parser.nit:31,26--35
                     AListExprs ../src/test_parser.nit:31,35
-                  AStringExpr ../src/test_parser.nit:31,38--40
-                    TString "\" \"" ../src/test_parser.nit:31,38--40
-                  ACallExpr ../src/test_parser.nit:31,43--52
-                    ACallExpr ../src/test_parser.nit:31,43
-                      AImplicitSelfExpr ../src/test_parser.nit:31,43
-                      TId "n" ../src/test_parser.nit:31,43
-                      AListExprs ../src/test_parser.nit:31,43
-                    TId "location" ../src/test_parser.nit:31,45--52
-                    AListExprs ../src/test_parser.nit:31,52
-                  AStringExpr ../src/test_parser.nit:31,55--58
-                    TString "\"\\n\"" ../src/test_parser.nit:31,55--58
-                  TCpar ")" ../src/test_parser.nit:31,59
-              TKwend "end" ../src/test_parser.nit:32,3--5
-          ACallAssignExpr ../src/test_parser.nit:33,3--17
-            AImplicitSelfExpr ../src/test_parser.nit:33,3
-            TId "rank" ../src/test_parser.nit:33,3--6
-            AListExprs ../src/test_parser.nit:33,8
-            TAssign "=" ../src/test_parser.nit:33,8
-            APlusExpr ../src/test_parser.nit:33,10--17
-              ACallExpr ../src/test_parser.nit:33,10--13
-                AImplicitSelfExpr ../src/test_parser.nit:33,10
-                TId "rank" ../src/test_parser.nit:33,10--13
-                AListExprs ../src/test_parser.nit:33,13
-              ADecIntExpr ../src/test_parser.nit:33,17
-                TNumber "1" ../src/test_parser.nit:33,17
-          ACallExpr ../src/test_parser.nit:34,3--19
-            ACallExpr ../src/test_parser.nit:34,3
-              AImplicitSelfExpr ../src/test_parser.nit:34,3
-              TId "n" ../src/test_parser.nit:34,3
-              AListExprs ../src/test_parser.nit:34,3
-            TId "visit_all" ../src/test_parser.nit:34,5--13
-            AParExprs ../src/test_parser.nit:34,14--19
-              TOpar "(" ../src/test_parser.nit:34,14
-              ASelfExpr ../src/test_parser.nit:34,15--18
-                TKwself "self" ../src/test_parser.nit:34,15--18
-              TCpar ")" ../src/test_parser.nit:34,19
+                  AStringExpr ../src/test_parser.nit:31,38--42
+                    TString "\" \\\"\"" ../src/test_parser.nit:31,38--42
+                  ACallExpr ../src/test_parser.nit:31,45--62
+                    ACallExpr ../src/test_parser.nit:31,45--50
+                      ACallExpr ../src/test_parser.nit:31,45
+                        AImplicitSelfExpr ../src/test_parser.nit:31,45
+                        TId "n" ../src/test_parser.nit:31,45
+                        AListExprs ../src/test_parser.nit:31,45
+                      TId "text" ../src/test_parser.nit:31,47--50
+                      AListExprs ../src/test_parser.nit:31,50
+                    TId "escape_to_c" ../src/test_parser.nit:31,52--62
+                    AListExprs ../src/test_parser.nit:31,62
+                  AStringExpr ../src/test_parser.nit:31,65--69
+                    TString "\"\\\" \"" ../src/test_parser.nit:31,65--69
+                  ACallExpr ../src/test_parser.nit:31,72--81
+                    ACallExpr ../src/test_parser.nit:31,72
+                      AImplicitSelfExpr ../src/test_parser.nit:31,72
+                      TId "n" ../src/test_parser.nit:31,72
+                      AListExprs ../src/test_parser.nit:31,72
+                    TId "location" ../src/test_parser.nit:31,74--81
+                    AListExprs ../src/test_parser.nit:31,81
+                  AStringExpr ../src/test_parser.nit:31,84--87
+                    TString "\"\\n\"" ../src/test_parser.nit:31,84--87
+                  TCpar ")" ../src/test_parser.nit:31,88
+            ABlockExpr ../src/test_parser.nit:33,4--34,5
+              ACallExpr ../src/test_parser.nit:33,4--59
+                AImplicitSelfExpr ../src/test_parser.nit:33,4
+                TId "printn" ../src/test_parser.nit:33,4--9
+                AParExprs ../src/test_parser.nit:33,10--59
+                  TOpar "(" ../src/test_parser.nit:33,10
+                  AStarExpr ../src/test_parser.nit:33,11--21
+                    AStringExpr ../src/test_parser.nit:33,11--14
+                      TString "\"  \"" ../src/test_parser.nit:33,11--14
+                    TStar "*" ../src/test_parser.nit:33,16
+                    ACallExpr ../src/test_parser.nit:33,18--21
+                      AImplicitSelfExpr ../src/test_parser.nit:33,18
+                      TId "rank" ../src/test_parser.nit:33,18--21
+                      AListExprs ../src/test_parser.nit:33,21
+                  ACallExpr ../src/test_parser.nit:33,24--35
+                    ACallExpr ../src/test_parser.nit:33,24
+                      AImplicitSelfExpr ../src/test_parser.nit:33,24
+                      TId "n" ../src/test_parser.nit:33,24
+                      AListExprs ../src/test_parser.nit:33,24
+                    TId "class_name" ../src/test_parser.nit:33,26--35
+                    AListExprs ../src/test_parser.nit:33,35
+                  AStringExpr ../src/test_parser.nit:33,38--40
+                    TString "\" \"" ../src/test_parser.nit:33,38--40
+                  ACallExpr ../src/test_parser.nit:33,43--52
+                    ACallExpr ../src/test_parser.nit:33,43
+                      AImplicitSelfExpr ../src/test_parser.nit:33,43
+                      TId "n" ../src/test_parser.nit:33,43
+                      AListExprs ../src/test_parser.nit:33,43
+                    TId "location" ../src/test_parser.nit:33,45--52
+                    AListExprs ../src/test_parser.nit:33,52
+                  AStringExpr ../src/test_parser.nit:33,55--58
+                    TString "\"\\n\"" ../src/test_parser.nit:33,55--58
+                  TCpar ")" ../src/test_parser.nit:33,59
+              TKwend "end" ../src/test_parser.nit:34,3--5
           ACallAssignExpr ../src/test_parser.nit:35,3--17
             AImplicitSelfExpr ../src/test_parser.nit:35,3
             TId "rank" ../src/test_parser.nit:35,3--6
             AListExprs ../src/test_parser.nit:35,8
             TAssign "=" ../src/test_parser.nit:35,8
-            AMinusExpr ../src/test_parser.nit:35,10--17
+            APlusExpr ../src/test_parser.nit:35,10--17
               ACallExpr ../src/test_parser.nit:35,10--13
                 AImplicitSelfExpr ../src/test_parser.nit:35,10
                 TId "rank" ../src/test_parser.nit:35,10--13
                 AListExprs ../src/test_parser.nit:35,13
+              TPlus "+" ../src/test_parser.nit:35,15
               ADecIntExpr ../src/test_parser.nit:35,17
                 TNumber "1" ../src/test_parser.nit:35,17
-          TKwend "end" ../src/test_parser.nit:36,2--4
-      TKwend "end" ../src/test_parser.nit:37,1--3
-    AMainClassdef ../src/test_parser.nit:39,1--146,3
-      AMainMethPropdef ../src/test_parser.nit:39,1--146,3
-        ABlockExpr ../src/test_parser.nit:39,1--146,3
-          AVardeclExpr ../src/test_parser.nit:39,1--20
-            TKwvar "var" ../src/test_parser.nit:39,1--3
-            TId "no_print" ../src/test_parser.nit:39,5--12
-            TAssign "=" ../src/test_parser.nit:39,14
-            AFalseExpr ../src/test_parser.nit:39,16--20
-              TKwfalse "false" ../src/test_parser.nit:39,16--20
-          AVardeclExpr ../src/test_parser.nit:40,1--22
-            TKwvar "var" ../src/test_parser.nit:40,1--3
-            TId "only_lexer" ../src/test_parser.nit:40,5--14
-            TAssign "=" ../src/test_parser.nit:40,16
-            AFalseExpr ../src/test_parser.nit:40,18--22
-              TKwfalse "false" ../src/test_parser.nit:40,18--22
-          AVardeclExpr ../src/test_parser.nit:41,1--21
+          ACallExpr ../src/test_parser.nit:36,3--19
+            ACallExpr ../src/test_parser.nit:36,3
+              AImplicitSelfExpr ../src/test_parser.nit:36,3
+              TId "n" ../src/test_parser.nit:36,3
+              AListExprs ../src/test_parser.nit:36,3
+            TId "visit_all" ../src/test_parser.nit:36,5--13
+            AParExprs ../src/test_parser.nit:36,14--19
+              TOpar "(" ../src/test_parser.nit:36,14
+              ASelfExpr ../src/test_parser.nit:36,15--18
+                TKwself "self" ../src/test_parser.nit:36,15--18
+              TCpar ")" ../src/test_parser.nit:36,19
+          ACallAssignExpr ../src/test_parser.nit:37,3--17
+            AImplicitSelfExpr ../src/test_parser.nit:37,3
+            TId "rank" ../src/test_parser.nit:37,3--6
+            AListExprs ../src/test_parser.nit:37,8
+            TAssign "=" ../src/test_parser.nit:37,8
+            AMinusExpr ../src/test_parser.nit:37,10--17
+              ACallExpr ../src/test_parser.nit:37,10--13
+                AImplicitSelfExpr ../src/test_parser.nit:37,10
+                TId "rank" ../src/test_parser.nit:37,10--13
+                AListExprs ../src/test_parser.nit:37,13
+              TMinus "-" ../src/test_parser.nit:37,15
+              ADecIntExpr ../src/test_parser.nit:37,17
+                TNumber "1" ../src/test_parser.nit:37,17
+          TKwend "end" ../src/test_parser.nit:38,2--4
+      TKwend "end" ../src/test_parser.nit:39,1--3
+    AMainClassdef ../src/test_parser.nit:41,1--155,3
+      AMainMethPropdef ../src/test_parser.nit:41,1--155,3
+        ABlockExpr ../src/test_parser.nit:41,1--155,3
+          AVardeclExpr ../src/test_parser.nit:41,1--20
             TKwvar "var" ../src/test_parser.nit:41,1--3
-            TId "need_help" ../src/test_parser.nit:41,5--13
-            TAssign "=" ../src/test_parser.nit:41,15
-            AFalseExpr ../src/test_parser.nit:41,17--21
-              TKwfalse "false" ../src/test_parser.nit:41,17--21
-          AVardeclExpr ../src/test_parser.nit:42,1--19
+            TId "no_print" ../src/test_parser.nit:41,5--12
+            TAssign "=" ../src/test_parser.nit:41,14
+            AFalseExpr ../src/test_parser.nit:41,16--20
+              TKwfalse "false" ../src/test_parser.nit:41,16--20
+          AVardeclExpr ../src/test_parser.nit:42,1--22
             TKwvar "var" ../src/test_parser.nit:42,1--3
-            TId "no_file" ../src/test_parser.nit:42,5--11
-            TAssign "=" ../src/test_parser.nit:42,13
-            AFalseExpr ../src/test_parser.nit:42,15--19
-              TKwfalse "false" ../src/test_parser.nit:42,15--19
-          AVardeclExpr ../src/test_parser.nit:43,1--23
+            TId "only_lexer" ../src/test_parser.nit:42,5--14
+            TAssign "=" ../src/test_parser.nit:42,16
+            AFalseExpr ../src/test_parser.nit:42,18--22
+              TKwfalse "false" ../src/test_parser.nit:42,18--22
+          AVardeclExpr ../src/test_parser.nit:43,1--21
             TKwvar "var" ../src/test_parser.nit:43,1--3
-            TId "interactive" ../src/test_parser.nit:43,5--15
-            TAssign "=" ../src/test_parser.nit:43,17
-            AFalseExpr ../src/test_parser.nit:43,19--23
-              TKwfalse "false" ../src/test_parser.nit:43,19--23
-          AWhileExpr ../src/test_parser.nit:45,1--63,3
-            TKwwhile "while" ../src/test_parser.nit:45,1--5
-            AAndExpr ../src/test_parser.nit:45,7--57
-              ANotExpr ../src/test_parser.nit:45,7--23
-                TKwnot "not" ../src/test_parser.nit:45,7--9
-                ACallExpr ../src/test_parser.nit:45,11--23
-                  ACallExpr ../src/test_parser.nit:45,11--14
-                    AImplicitSelfExpr ../src/test_parser.nit:45,11
-                    TId "args" ../src/test_parser.nit:45,11--14
-                    AListExprs ../src/test_parser.nit:45,14
-                  TId "is_empty" ../src/test_parser.nit:45,16--23
-                  AListExprs ../src/test_parser.nit:45,23
-              AEqExpr ../src/test_parser.nit:45,29--57
-                ACallExpr ../src/test_parser.nit:45,29--50
-                  ACallExpr ../src/test_parser.nit:45,29--44
-                    ACallExpr ../src/test_parser.nit:45,29--38
-                      ACallExpr ../src/test_parser.nit:45,29--32
-                        AImplicitSelfExpr ../src/test_parser.nit:45,29
-                        TId "args" ../src/test_parser.nit:45,29--32
-                        AListExprs ../src/test_parser.nit:45,32
-                      TId "first" ../src/test_parser.nit:45,34--38
-                      AListExprs ../src/test_parser.nit:45,38
-                    TId "chars" ../src/test_parser.nit:45,40--44
-                    AListExprs ../src/test_parser.nit:45,44
-                  TId "first" ../src/test_parser.nit:45,46--50
-                  AListExprs ../src/test_parser.nit:45,50
-                ACharExpr ../src/test_parser.nit:45,55--57
-                  TChar "\'-\'" ../src/test_parser.nit:45,55--57
-            TKwdo "do" ../src/test_parser.nit:45,59--60
-            ABlockExpr ../src/test_parser.nit:46,2--63,3
-              AIfExpr ../src/test_parser.nit:46,2--61,4
-                TKwif "if" ../src/test_parser.nit:46,2--3
-                AEqExpr ../src/test_parser.nit:46,5--22
-                  ACallExpr ../src/test_parser.nit:46,5--14
-                    ACallExpr ../src/test_parser.nit:46,5--8
-                      AImplicitSelfExpr ../src/test_parser.nit:46,5
-                      TId "args" ../src/test_parser.nit:46,5--8
-                      AListExprs ../src/test_parser.nit:46,8
-                    TId "first" ../src/test_parser.nit:46,10--14
-                    AListExprs ../src/test_parser.nit:46,14
-                  AStringExpr ../src/test_parser.nit:46,19--22
-                    TString "\"-n\"" ../src/test_parser.nit:46,19--22
-                ABlockExpr ../src/test_parser.nit:47,3--17
-                  ACallAssignExpr ../src/test_parser.nit:47,3--17
-                    AImplicitSelfExpr ../src/test_parser.nit:47,3
-                    TId "no_print" ../src/test_parser.nit:47,3--10
-                    AListExprs ../src/test_parser.nit:47,12
-                    TAssign "=" ../src/test_parser.nit:47,12
-                    ATrueExpr ../src/test_parser.nit:47,14--17
-                      TKwtrue "true" ../src/test_parser.nit:47,14--17
-                AIfExpr ../src/test_parser.nit:48,7--61,4
-                  TKwif "if" ../src/test_parser.nit:48,7--8
-                  AEqExpr ../src/test_parser.nit:48,10--27
-                    ACallExpr ../src/test_parser.nit:48,10--19
-                      ACallExpr ../src/test_parser.nit:48,10--13
-                        AImplicitSelfExpr ../src/test_parser.nit:48,10
-                        TId "args" ../src/test_parser.nit:48,10--13
-                        AListExprs ../src/test_parser.nit:48,13
-                      TId "first" ../src/test_parser.nit:48,15--19
-                      AListExprs ../src/test_parser.nit:48,19
-                    AStringExpr ../src/test_parser.nit:48,24--27
-                      TString "\"-l\"" ../src/test_parser.nit:48,24--27
-                  ABlockExpr ../src/test_parser.nit:49,3--19
-                    ACallAssignExpr ../src/test_parser.nit:49,3--19
-                      AImplicitSelfExpr ../src/test_parser.nit:49,3
-                      TId "only_lexer" ../src/test_parser.nit:49,3--12
-                      AListExprs ../src/test_parser.nit:49,14
-                      TAssign "=" ../src/test_parser.nit:49,14
-                      ATrueExpr ../src/test_parser.nit:49,16--19
-                        TKwtrue "true" ../src/test_parser.nit:49,16--19
-                  AIfExpr ../src/test_parser.nit:50,7--61,4
-                    TKwif "if" ../src/test_parser.nit:50,7--8
-                    AEqExpr ../src/test_parser.nit:50,10--27
-                      ACallExpr ../src/test_parser.nit:50,10--19
-                        ACallExpr ../src/test_parser.nit:50,10--13
-                          AImplicitSelfExpr ../src/test_parser.nit:50,10
-                          TId "args" ../src/test_parser.nit:50,10--13
-                          AListExprs ../src/test_parser.nit:50,13
-                        TId "first" ../src/test_parser.nit:50,15--19
-                        AListExprs ../src/test_parser.nit:50,19
-                      AStringExpr ../src/test_parser.nit:50,24--27
-                        TString "\"-p\"" ../src/test_parser.nit:50,24--27
-                    ABlockExpr ../src/test_parser.nit:51,3--20
-                      ACallAssignExpr ../src/test_parser.nit:51,3--20
-                        AImplicitSelfExpr ../src/test_parser.nit:51,3
-                        TId "only_lexer" ../src/test_parser.nit:51,3--12
-                        AListExprs ../src/test_parser.nit:51,14
-                        TAssign "=" ../src/test_parser.nit:51,14
-                        AFalseExpr ../src/test_parser.nit:51,16--20
-                          TKwfalse "false" ../src/test_parser.nit:51,16--20
-                    AIfExpr ../src/test_parser.nit:52,7--61,4
-                      TKwif "if" ../src/test_parser.nit:52,7--8
-                      AEqExpr ../src/test_parser.nit:52,10--27
-                        ACallExpr ../src/test_parser.nit:52,10--19
-                          ACallExpr ../src/test_parser.nit:52,10--13
-                            AImplicitSelfExpr ../src/test_parser.nit:52,10
-                            TId "args" ../src/test_parser.nit:52,10--13
-                            AListExprs ../src/test_parser.nit:52,13
-                          TId "first" ../src/test_parser.nit:52,15--19
-                          AListExprs ../src/test_parser.nit:52,19
-                        AStringExpr ../src/test_parser.nit:52,24--27
-                          TString "\"-e\"" ../src/test_parser.nit:52,24--27
-                      ABlockExpr ../src/test_parser.nit:53,3--16
-                        ACallAssignExpr ../src/test_parser.nit:53,3--16
-                          AImplicitSelfExpr ../src/test_parser.nit:53,3
-                          TId "no_file" ../src/test_parser.nit:53,3--9
-                          AListExprs ../src/test_parser.nit:53,11
-                          TAssign "=" ../src/test_parser.nit:53,11
-                          ATrueExpr ../src/test_parser.nit:53,13--16
-                            TKwtrue "true" ../src/test_parser.nit:53,13--16
-                      AIfExpr ../src/test_parser.nit:54,7--61,4
-                        TKwif "if" ../src/test_parser.nit:54,7--8
-                        AEqExpr ../src/test_parser.nit:54,10--27
-                          ACallExpr ../src/test_parser.nit:54,10--19
-                            ACallExpr ../src/test_parser.nit:54,10--13
-                              AImplicitSelfExpr ../src/test_parser.nit:54,10
-                              TId "args" ../src/test_parser.nit:54,10--13
-                              AListExprs ../src/test_parser.nit:54,13
-                            TId "first" ../src/test_parser.nit:54,15--19
-                            AListExprs ../src/test_parser.nit:54,19
-                          AStringExpr ../src/test_parser.nit:54,24--27
-                            TString "\"-i\"" ../src/test_parser.nit:54,24--27
-                        ABlockExpr ../src/test_parser.nit:55,3--20
-                          ACallAssignExpr ../src/test_parser.nit:55,3--20
-                            AImplicitSelfExpr ../src/test_parser.nit:55,3
-                            TId "interactive" ../src/test_parser.nit:55,3--13
-                            AListExprs ../src/test_parser.nit:55,15
-                            TAssign "=" ../src/test_parser.nit:55,15
-                            ATrueExpr ../src/test_parser.nit:55,17--20
-                              TKwtrue "true" ../src/test_parser.nit:55,17--20
-                        AIfExpr ../src/test_parser.nit:56,7--61,4
-                          TKwif "if" ../src/test_parser.nit:56,7--8
-                          AOrExpr ../src/test_parser.nit:56,10--49
-                            AEqExpr ../src/test_parser.nit:56,10--27
-                              ACallExpr ../src/test_parser.nit:56,10--19
-                                ACallExpr ../src/test_parser.nit:56,10--13
-                                  AImplicitSelfExpr ../src/test_parser.nit:56,10
-                                  TId "args" ../src/test_parser.nit:56,10--13
-                                  AListExprs ../src/test_parser.nit:56,13
-                                TId "first" ../src/test_parser.nit:56,15--19
-                                AListExprs ../src/test_parser.nit:56,19
-                              AStringExpr ../src/test_parser.nit:56,24--27
-                                TString "\"-h\"" ../src/test_parser.nit:56,24--27
-                            AEqExpr ../src/test_parser.nit:56,32--49
-                              ACallExpr ../src/test_parser.nit:56,32--41
-                                ACallExpr ../src/test_parser.nit:56,32--35
-                                  AImplicitSelfExpr ../src/test_parser.nit:56,32
-                                  TId "args" ../src/test_parser.nit:56,32--35
-                                  AListExprs ../src/test_parser.nit:56,35
-                                TId "first" ../src/test_parser.nit:56,37--41
-                                AListExprs ../src/test_parser.nit:56,41
-                              AStringExpr ../src/test_parser.nit:56,46--49
-                                TString "\"-?\"" ../src/test_parser.nit:56,46--49
-                          ABlockExpr ../src/test_parser.nit:57,3--18
-                            ACallAssignExpr ../src/test_parser.nit:57,3--18
-                              AImplicitSelfExpr ../src/test_parser.nit:57,3
-                              TId "need_help" ../src/test_parser.nit:57,3--11
+            TId "need_help" ../src/test_parser.nit:43,5--13
+            TAssign "=" ../src/test_parser.nit:43,15
+            AFalseExpr ../src/test_parser.nit:43,17--21
+              TKwfalse "false" ../src/test_parser.nit:43,17--21
+          AVardeclExpr ../src/test_parser.nit:44,1--19
+            TKwvar "var" ../src/test_parser.nit:44,1--3
+            TId "no_file" ../src/test_parser.nit:44,5--11
+            TAssign "=" ../src/test_parser.nit:44,13
+            AFalseExpr ../src/test_parser.nit:44,15--19
+              TKwfalse "false" ../src/test_parser.nit:44,15--19
+          AVardeclExpr ../src/test_parser.nit:45,1--23
+            TKwvar "var" ../src/test_parser.nit:45,1--3
+            TId "interactive" ../src/test_parser.nit:45,5--15
+            TAssign "=" ../src/test_parser.nit:45,17
+            AFalseExpr ../src/test_parser.nit:45,19--23
+              TKwfalse "false" ../src/test_parser.nit:45,19--23
+          AVardeclExpr ../src/test_parser.nit:46,1--15
+            TKwvar "var" ../src/test_parser.nit:46,1--3
+            TId "xml" ../src/test_parser.nit:46,5--7
+            TAssign "=" ../src/test_parser.nit:46,9
+            AFalseExpr ../src/test_parser.nit:46,11--15
+              TKwfalse "false" ../src/test_parser.nit:46,11--15
+          AWhileExpr ../src/test_parser.nit:48,1--68,3
+            TKwwhile "while" ../src/test_parser.nit:48,1--5
+            AAndExpr ../src/test_parser.nit:48,7--57
+              ANotExpr ../src/test_parser.nit:48,7--23
+                TKwnot "not" ../src/test_parser.nit:48,7--9
+                ACallExpr ../src/test_parser.nit:48,11--23
+                  ACallExpr ../src/test_parser.nit:48,11--14
+                    AImplicitSelfExpr ../src/test_parser.nit:48,11
+                    TId "args" ../src/test_parser.nit:48,11--14
+                    AListExprs ../src/test_parser.nit:48,14
+                  TId "is_empty" ../src/test_parser.nit:48,16--23
+                  AListExprs ../src/test_parser.nit:48,23
+              TKwand "and" ../src/test_parser.nit:48,25--27
+              AEqExpr ../src/test_parser.nit:48,29--57
+                ACallExpr ../src/test_parser.nit:48,29--50
+                  ACallExpr ../src/test_parser.nit:48,29--44
+                    ACallExpr ../src/test_parser.nit:48,29--38
+                      ACallExpr ../src/test_parser.nit:48,29--32
+                        AImplicitSelfExpr ../src/test_parser.nit:48,29
+                        TId "args" ../src/test_parser.nit:48,29--32
+                        AListExprs ../src/test_parser.nit:48,32
+                      TId "first" ../src/test_parser.nit:48,34--38
+                      AListExprs ../src/test_parser.nit:48,38
+                    TId "chars" ../src/test_parser.nit:48,40--44
+                    AListExprs ../src/test_parser.nit:48,44
+                  TId "first" ../src/test_parser.nit:48,46--50
+                  AListExprs ../src/test_parser.nit:48,50
+                TEq "==" ../src/test_parser.nit:48,52--53
+                ACharExpr ../src/test_parser.nit:48,55--57
+                  TChar "\'-\'" ../src/test_parser.nit:48,55--57
+            TKwdo "do" ../src/test_parser.nit:48,59--60
+            ABlockExpr ../src/test_parser.nit:49,2--68,3
+              AIfExpr ../src/test_parser.nit:49,2--66,4
+                TKwif "if" ../src/test_parser.nit:49,2--3
+                AEqExpr ../src/test_parser.nit:49,5--22
+                  ACallExpr ../src/test_parser.nit:49,5--14
+                    ACallExpr ../src/test_parser.nit:49,5--8
+                      AImplicitSelfExpr ../src/test_parser.nit:49,5
+                      TId "args" ../src/test_parser.nit:49,5--8
+                      AListExprs ../src/test_parser.nit:49,8
+                    TId "first" ../src/test_parser.nit:49,10--14
+                    AListExprs ../src/test_parser.nit:49,14
+                  TEq "==" ../src/test_parser.nit:49,16--17
+                  AStringExpr ../src/test_parser.nit:49,19--22
+                    TString "\"-n\"" ../src/test_parser.nit:49,19--22
+                ABlockExpr ../src/test_parser.nit:50,3--17
+                  ACallAssignExpr ../src/test_parser.nit:50,3--17
+                    AImplicitSelfExpr ../src/test_parser.nit:50,3
+                    TId "no_print" ../src/test_parser.nit:50,3--10
+                    AListExprs ../src/test_parser.nit:50,12
+                    TAssign "=" ../src/test_parser.nit:50,12
+                    ATrueExpr ../src/test_parser.nit:50,14--17
+                      TKwtrue "true" ../src/test_parser.nit:50,14--17
+                AIfExpr ../src/test_parser.nit:51,7--66,4
+                  TKwif "if" ../src/test_parser.nit:51,7--8
+                  AEqExpr ../src/test_parser.nit:51,10--27
+                    ACallExpr ../src/test_parser.nit:51,10--19
+                      ACallExpr ../src/test_parser.nit:51,10--13
+                        AImplicitSelfExpr ../src/test_parser.nit:51,10
+                        TId "args" ../src/test_parser.nit:51,10--13
+                        AListExprs ../src/test_parser.nit:51,13
+                      TId "first" ../src/test_parser.nit:51,15--19
+                      AListExprs ../src/test_parser.nit:51,19
+                    TEq "==" ../src/test_parser.nit:51,21--22
+                    AStringExpr ../src/test_parser.nit:51,24--27
+                      TString "\"-l\"" ../src/test_parser.nit:51,24--27
+                  ABlockExpr ../src/test_parser.nit:52,3--19
+                    ACallAssignExpr ../src/test_parser.nit:52,3--19
+                      AImplicitSelfExpr ../src/test_parser.nit:52,3
+                      TId "only_lexer" ../src/test_parser.nit:52,3--12
+                      AListExprs ../src/test_parser.nit:52,14
+                      TAssign "=" ../src/test_parser.nit:52,14
+                      ATrueExpr ../src/test_parser.nit:52,16--19
+                        TKwtrue "true" ../src/test_parser.nit:52,16--19
+                  AIfExpr ../src/test_parser.nit:53,7--66,4
+                    TKwif "if" ../src/test_parser.nit:53,7--8
+                    AEqExpr ../src/test_parser.nit:53,10--27
+                      ACallExpr ../src/test_parser.nit:53,10--19
+                        ACallExpr ../src/test_parser.nit:53,10--13
+                          AImplicitSelfExpr ../src/test_parser.nit:53,10
+                          TId "args" ../src/test_parser.nit:53,10--13
+                          AListExprs ../src/test_parser.nit:53,13
+                        TId "first" ../src/test_parser.nit:53,15--19
+                        AListExprs ../src/test_parser.nit:53,19
+                      TEq "==" ../src/test_parser.nit:53,21--22
+                      AStringExpr ../src/test_parser.nit:53,24--27
+                        TString "\"-p\"" ../src/test_parser.nit:53,24--27
+                    ABlockExpr ../src/test_parser.nit:54,3--20
+                      ACallAssignExpr ../src/test_parser.nit:54,3--20
+                        AImplicitSelfExpr ../src/test_parser.nit:54,3
+                        TId "only_lexer" ../src/test_parser.nit:54,3--12
+                        AListExprs ../src/test_parser.nit:54,14
+                        TAssign "=" ../src/test_parser.nit:54,14
+                        AFalseExpr ../src/test_parser.nit:54,16--20
+                          TKwfalse "false" ../src/test_parser.nit:54,16--20
+                    AIfExpr ../src/test_parser.nit:55,7--66,4
+                      TKwif "if" ../src/test_parser.nit:55,7--8
+                      AEqExpr ../src/test_parser.nit:55,10--27
+                        ACallExpr ../src/test_parser.nit:55,10--19
+                          ACallExpr ../src/test_parser.nit:55,10--13
+                            AImplicitSelfExpr ../src/test_parser.nit:55,10
+                            TId "args" ../src/test_parser.nit:55,10--13
+                            AListExprs ../src/test_parser.nit:55,13
+                          TId "first" ../src/test_parser.nit:55,15--19
+                          AListExprs ../src/test_parser.nit:55,19
+                        TEq "==" ../src/test_parser.nit:55,21--22
+                        AStringExpr ../src/test_parser.nit:55,24--27
+                          TString "\"-x\"" ../src/test_parser.nit:55,24--27
+                      ABlockExpr ../src/test_parser.nit:56,3--12
+                        ACallAssignExpr ../src/test_parser.nit:56,3--12
+                          AImplicitSelfExpr ../src/test_parser.nit:56,3
+                          TId "xml" ../src/test_parser.nit:56,3--5
+                          AListExprs ../src/test_parser.nit:56,7
+                          TAssign "=" ../src/test_parser.nit:56,7
+                          ATrueExpr ../src/test_parser.nit:56,9--12
+                            TKwtrue "true" ../src/test_parser.nit:56,9--12
+                      AIfExpr ../src/test_parser.nit:57,7--66,4
+                        TKwif "if" ../src/test_parser.nit:57,7--8
+                        AEqExpr ../src/test_parser.nit:57,10--27
+                          ACallExpr ../src/test_parser.nit:57,10--19
+                            ACallExpr ../src/test_parser.nit:57,10--13
+                              AImplicitSelfExpr ../src/test_parser.nit:57,10
+                              TId "args" ../src/test_parser.nit:57,10--13
                               AListExprs ../src/test_parser.nit:57,13
-                              TAssign "=" ../src/test_parser.nit:57,13
-                              ATrueExpr ../src/test_parser.nit:57,15--18
-                                TKwtrue "true" ../src/test_parser.nit:57,15--18
-                          ABlockExpr ../src/test_parser.nit:59,3--61,4
-                            ACallExpr ../src/test_parser.nit:59,3--48
-                              ACallExpr ../src/test_parser.nit:59,3--8
-                                AImplicitSelfExpr ../src/test_parser.nit:59,3
-                                TId "stderr" ../src/test_parser.nit:59,3--8
-                                AListExprs ../src/test_parser.nit:59,8
-                              TId "write" ../src/test_parser.nit:59,10--14
-                              AParExprs ../src/test_parser.nit:59,15--48
-                                TOpar "(" ../src/test_parser.nit:59,15
-                                ASuperstringExpr ../src/test_parser.nit:59,16--47
-                                  AStartStringExpr ../src/test_parser.nit:59,16--32
-                                    TStartString "\"Unknown option {" ../src/test_parser.nit:59,16--32
-                                  ACallExpr ../src/test_parser.nit:59,33--42
-                                    ACallExpr ../src/test_parser.nit:59,33--36
-                                      AImplicitSelfExpr ../src/test_parser.nit:59,33
-                                      TId "args" ../src/test_parser.nit:59,33--36
-                                      AListExprs ../src/test_parser.nit:59,36
-                                    TId "first" ../src/test_parser.nit:59,38--42
-                                    AListExprs ../src/test_parser.nit:59,42
-                                  AEndStringExpr ../src/test_parser.nit:59,43--47
-                                    TEndString "}.\\n\"" ../src/test_parser.nit:59,43--47
-                                TCpar ")" ../src/test_parser.nit:59,48
-                            ACallExpr ../src/test_parser.nit:60,3--9
+                            TId "first" ../src/test_parser.nit:57,15--19
+                            AListExprs ../src/test_parser.nit:57,19
+                          TEq "==" ../src/test_parser.nit:57,21--22
+                          AStringExpr ../src/test_parser.nit:57,24--27
+                            TString "\"-e\"" ../src/test_parser.nit:57,24--27
+                        ABlockExpr ../src/test_parser.nit:58,3--16
+                          ACallAssignExpr ../src/test_parser.nit:58,3--16
+                            AImplicitSelfExpr ../src/test_parser.nit:58,3
+                            TId "no_file" ../src/test_parser.nit:58,3--9
+                            AListExprs ../src/test_parser.nit:58,11
+                            TAssign "=" ../src/test_parser.nit:58,11
+                            ATrueExpr ../src/test_parser.nit:58,13--16
+                              TKwtrue "true" ../src/test_parser.nit:58,13--16
+                        AIfExpr ../src/test_parser.nit:59,7--66,4
+                          TKwif "if" ../src/test_parser.nit:59,7--8
+                          AEqExpr ../src/test_parser.nit:59,10--27
+                            ACallExpr ../src/test_parser.nit:59,10--19
+                              ACallExpr ../src/test_parser.nit:59,10--13
+                                AImplicitSelfExpr ../src/test_parser.nit:59,10
+                                TId "args" ../src/test_parser.nit:59,10--13
+                                AListExprs ../src/test_parser.nit:59,13
+                              TId "first" ../src/test_parser.nit:59,15--19
+                              AListExprs ../src/test_parser.nit:59,19
+                            TEq "==" ../src/test_parser.nit:59,21--22
+                            AStringExpr ../src/test_parser.nit:59,24--27
+                              TString "\"-i\"" ../src/test_parser.nit:59,24--27
+                          ABlockExpr ../src/test_parser.nit:60,3--20
+                            ACallAssignExpr ../src/test_parser.nit:60,3--20
                               AImplicitSelfExpr ../src/test_parser.nit:60,3
-                              TId "exit" ../src/test_parser.nit:60,3--6
-                              AParExprs ../src/test_parser.nit:60,7--9
-                                TOpar "(" ../src/test_parser.nit:60,7
-                                ADecIntExpr ../src/test_parser.nit:60,8
-                                  TNumber "0" ../src/test_parser.nit:60,8
-                                TCpar ")" ../src/test_parser.nit:60,9
-                            TKwend "end" ../src/test_parser.nit:61,2--4
-              ACallExpr ../src/test_parser.nit:62,2--11
-                ACallExpr ../src/test_parser.nit:62,2--5
-                  AImplicitSelfExpr ../src/test_parser.nit:62,2
-                  TId "args" ../src/test_parser.nit:62,2--5
-                  AListExprs ../src/test_parser.nit:62,5
-                TId "shift" ../src/test_parser.nit:62,7--11
-                AListExprs ../src/test_parser.nit:62,11
-              TKwend "end" ../src/test_parser.nit:63,1--3
-          AIfExpr ../src/test_parser.nit:65,1--146,3
-            TKwif "if" ../src/test_parser.nit:65,1--2
-            AOrExpr ../src/test_parser.nit:65,4--51
-              AParExpr ../src/test_parser.nit:65,4--38
-                TOpar "(" ../src/test_parser.nit:65,4
-                AAndExpr ../src/test_parser.nit:65,5--37
-                  ACallExpr ../src/test_parser.nit:65,5--17
-                    ACallExpr ../src/test_parser.nit:65,5--8
-                      AImplicitSelfExpr ../src/test_parser.nit:65,5
-                      TId "args" ../src/test_parser.nit:65,5--8
-                      AListExprs ../src/test_parser.nit:65,8
-                    TId "is_empty" ../src/test_parser.nit:65,10--17
-                    AListExprs ../src/test_parser.nit:65,17
-                  ANotExpr ../src/test_parser.nit:65,23--37
-                    TKwnot "not" ../src/test_parser.nit:65,23--25
-                    ACallExpr ../src/test_parser.nit:65,27--37
-                      AImplicitSelfExpr ../src/test_parser.nit:65,27
-                      TId "interactive" ../src/test_parser.nit:65,27--37
-                      AListExprs ../src/test_parser.nit:65,37
-                TCpar ")" ../src/test_parser.nit:65,38
-              ACallExpr ../src/test_parser.nit:65,43--51
-                AImplicitSelfExpr ../src/test_parser.nit:65,43
-                TId "need_help" ../src/test_parser.nit:65,43--51
-                AListExprs ../src/test_parser.nit:65,51
-            ABlockExpr ../src/test_parser.nit:66,2--76,30
-              ACallExpr ../src/test_parser.nit:66,2--16
-                AImplicitSelfExpr ../src/test_parser.nit:66,2
-                TId "print" ../src/test_parser.nit:66,2--6
-                AParExprs ../src/test_parser.nit:66,7--16
-                  TOpar "(" ../src/test_parser.nit:66,7
-                  AStringExpr ../src/test_parser.nit:66,8--15
-                    TString "\"usage:\"" ../src/test_parser.nit:66,8--15
-                  TCpar ")" ../src/test_parser.nit:66,16
-              ACallExpr ../src/test_parser.nit:67,2--54
-                AImplicitSelfExpr ../src/test_parser.nit:67,2
-                TId "print" ../src/test_parser.nit:67,2--6
-                AParExprs ../src/test_parser.nit:67,7--54
-                  TOpar "(" ../src/test_parser.nit:67,7
-                  AStringExpr ../src/test_parser.nit:67,8--53
-                    TString "\"  test_parser [options]... <filename.nit>...\"" ../src/test_parser.nit:67,8--53
-                  TCpar ")" ../src/test_parser.nit:67,54
-              ACallExpr ../src/test_parser.nit:68,2--49
-                AImplicitSelfExpr ../src/test_parser.nit:68,2
-                TId "print" ../src/test_parser.nit:68,2--6
-                AParExprs ../src/test_parser.nit:68,7--49
-                  TOpar "(" ../src/test_parser.nit:68,7
-                  AStringExpr ../src/test_parser.nit:68,8--48
-                    TString "\"  test_parser -e [options]... <text>...\"" ../src/test_parser.nit:68,8--48
-                  TCpar ")" ../src/test_parser.nit:68,49
-              ACallExpr ../src/test_parser.nit:69,2--39
-                AImplicitSelfExpr ../src/test_parser.nit:69,2
-                TId "print" ../src/test_parser.nit:69,2--6
-                AParExprs ../src/test_parser.nit:69,7--39
-                  TOpar "(" ../src/test_parser.nit:69,7
-                  AStringExpr ../src/test_parser.nit:69,8--38
-                    TString "\"  test_parser -i [options]...\"" ../src/test_parser.nit:69,8--38
-                  TCpar ")" ../src/test_parser.nit:69,39
-              ACallExpr ../src/test_parser.nit:70,2--18
-                AImplicitSelfExpr ../src/test_parser.nit:70,2
-                TId "print" ../src/test_parser.nit:70,2--6
-                AParExprs ../src/test_parser.nit:70,7--18
-                  TOpar "(" ../src/test_parser.nit:70,7
-                  AStringExpr ../src/test_parser.nit:70,8--17
-                    TString "\"options:\"" ../src/test_parser.nit:70,8--17
-                  TCpar ")" ../src/test_parser.nit:70,18
-              ACallExpr ../src/test_parser.nit:71,2--36
+                              TId "interactive" ../src/test_parser.nit:60,3--13
+                              AListExprs ../src/test_parser.nit:60,15
+                              TAssign "=" ../src/test_parser.nit:60,15
+                              ATrueExpr ../src/test_parser.nit:60,17--20
+                                TKwtrue "true" ../src/test_parser.nit:60,17--20
+                          AIfExpr ../src/test_parser.nit:61,7--66,4
+                            TKwif "if" ../src/test_parser.nit:61,7--8
+                            AOrExpr ../src/test_parser.nit:61,10--49
+                              AEqExpr ../src/test_parser.nit:61,10--27
+                                ACallExpr ../src/test_parser.nit:61,10--19
+                                  ACallExpr ../src/test_parser.nit:61,10--13
+                                    AImplicitSelfExpr ../src/test_parser.nit:61,10
+                                    TId "args" ../src/test_parser.nit:61,10--13
+                                    AListExprs ../src/test_parser.nit:61,13
+                                  TId "first" ../src/test_parser.nit:61,15--19
+                                  AListExprs ../src/test_parser.nit:61,19
+                                TEq "==" ../src/test_parser.nit:61,21--22
+                                AStringExpr ../src/test_parser.nit:61,24--27
+                                  TString "\"-h\"" ../src/test_parser.nit:61,24--27
+                              TKwor "or" ../src/test_parser.nit:61,29--30
+                              AEqExpr ../src/test_parser.nit:61,32--49
+                                ACallExpr ../src/test_parser.nit:61,32--41
+                                  ACallExpr ../src/test_parser.nit:61,32--35
+                                    AImplicitSelfExpr ../src/test_parser.nit:61,32
+                                    TId "args" ../src/test_parser.nit:61,32--35
+                                    AListExprs ../src/test_parser.nit:61,35
+                                  TId "first" ../src/test_parser.nit:61,37--41
+                                  AListExprs ../src/test_parser.nit:61,41
+                                TEq "==" ../src/test_parser.nit:61,43--44
+                                AStringExpr ../src/test_parser.nit:61,46--49
+                                  TString "\"-?\"" ../src/test_parser.nit:61,46--49
+                            ABlockExpr ../src/test_parser.nit:62,3--18
+                              ACallAssignExpr ../src/test_parser.nit:62,3--18
+                                AImplicitSelfExpr ../src/test_parser.nit:62,3
+                                TId "need_help" ../src/test_parser.nit:62,3--11
+                                AListExprs ../src/test_parser.nit:62,13
+                                TAssign "=" ../src/test_parser.nit:62,13
+                                ATrueExpr ../src/test_parser.nit:62,15--18
+                                  TKwtrue "true" ../src/test_parser.nit:62,15--18
+                            ABlockExpr ../src/test_parser.nit:64,3--66,4
+                              ACallExpr ../src/test_parser.nit:64,3--48
+                                ACallExpr ../src/test_parser.nit:64,3--8
+                                  AImplicitSelfExpr ../src/test_parser.nit:64,3
+                                  TId "stderr" ../src/test_parser.nit:64,3--8
+                                  AListExprs ../src/test_parser.nit:64,8
+                                TId "write" ../src/test_parser.nit:64,10--14
+                                AParExprs ../src/test_parser.nit:64,15--48
+                                  TOpar "(" ../src/test_parser.nit:64,15
+                                  ASuperstringExpr ../src/test_parser.nit:64,16--47
+                                    AStartStringExpr ../src/test_parser.nit:64,16--32
+                                      TStartString "\"Unknown option {" ../src/test_parser.nit:64,16--32
+                                    ACallExpr ../src/test_parser.nit:64,33--42
+                                      ACallExpr ../src/test_parser.nit:64,33--36
+                                        AImplicitSelfExpr ../src/test_parser.nit:64,33
+                                        TId "args" ../src/test_parser.nit:64,33--36
+                                        AListExprs ../src/test_parser.nit:64,36
+                                      TId "first" ../src/test_parser.nit:64,38--42
+                                      AListExprs ../src/test_parser.nit:64,42
+                                    AEndStringExpr ../src/test_parser.nit:64,43--47
+                                      TEndString "}.\\n\"" ../src/test_parser.nit:64,43--47
+                                  TCpar ")" ../src/test_parser.nit:64,48
+                              ACallExpr ../src/test_parser.nit:65,3--9
+                                AImplicitSelfExpr ../src/test_parser.nit:65,3
+                                TId "exit" ../src/test_parser.nit:65,3--6
+                                AParExprs ../src/test_parser.nit:65,7--9
+                                  TOpar "(" ../src/test_parser.nit:65,7
+                                  ADecIntExpr ../src/test_parser.nit:65,8
+                                    TNumber "0" ../src/test_parser.nit:65,8
+                                  TCpar ")" ../src/test_parser.nit:65,9
+                              TKwend "end" ../src/test_parser.nit:66,2--4
+              ACallExpr ../src/test_parser.nit:67,2--11
+                ACallExpr ../src/test_parser.nit:67,2--5
+                  AImplicitSelfExpr ../src/test_parser.nit:67,2
+                  TId "args" ../src/test_parser.nit:67,2--5
+                  AListExprs ../src/test_parser.nit:67,5
+                TId "shift" ../src/test_parser.nit:67,7--11
+                AListExprs ../src/test_parser.nit:67,11
+              TKwend "end" ../src/test_parser.nit:68,1--3
+          AIfExpr ../src/test_parser.nit:70,1--155,3
+            TKwif "if" ../src/test_parser.nit:70,1--2
+            AOrExpr ../src/test_parser.nit:70,4--51
+              AParExpr ../src/test_parser.nit:70,4--38
+                TOpar "(" ../src/test_parser.nit:70,4
+                AAndExpr ../src/test_parser.nit:70,5--37
+                  ACallExpr ../src/test_parser.nit:70,5--17
+                    ACallExpr ../src/test_parser.nit:70,5--8
+                      AImplicitSelfExpr ../src/test_parser.nit:70,5
+                      TId "args" ../src/test_parser.nit:70,5--8
+                      AListExprs ../src/test_parser.nit:70,8
+                    TId "is_empty" ../src/test_parser.nit:70,10--17
+                    AListExprs ../src/test_parser.nit:70,17
+                  TKwand "and" ../src/test_parser.nit:70,19--21
+                  ANotExpr ../src/test_parser.nit:70,23--37
+                    TKwnot "not" ../src/test_parser.nit:70,23--25
+                    ACallExpr ../src/test_parser.nit:70,27--37
+                      AImplicitSelfExpr ../src/test_parser.nit:70,27
+                      TId "interactive" ../src/test_parser.nit:70,27--37
+                      AListExprs ../src/test_parser.nit:70,37
+                TCpar ")" ../src/test_parser.nit:70,38
+              TKwor "or" ../src/test_parser.nit:70,40--41
+              ACallExpr ../src/test_parser.nit:70,43--51
+                AImplicitSelfExpr ../src/test_parser.nit:70,43
+                TId "need_help" ../src/test_parser.nit:70,43--51
+                AListExprs ../src/test_parser.nit:70,51
+            ABlockExpr ../src/test_parser.nit:71,2--82,30
+              ACallExpr ../src/test_parser.nit:71,2--16
                 AImplicitSelfExpr ../src/test_parser.nit:71,2
                 TId "print" ../src/test_parser.nit:71,2--6
-                AParExprs ../src/test_parser.nit:71,7--36
+                AParExprs ../src/test_parser.nit:71,7--16
                   TOpar "(" ../src/test_parser.nit:71,7
-                  AStringExpr ../src/test_parser.nit:71,8--35
-                    TString "\"  -n\11do not print anything\"" ../src/test_parser.nit:71,8--35
-                  TCpar ")" ../src/test_parser.nit:71,36
-              ACallExpr ../src/test_parser.nit:72,2--25
+                  AStringExpr ../src/test_parser.nit:71,8--15
+                    TString "\"usage:\"" ../src/test_parser.nit:71,8--15
+                  TCpar ")" ../src/test_parser.nit:71,16
+              ACallExpr ../src/test_parser.nit:72,2--54
                 AImplicitSelfExpr ../src/test_parser.nit:72,2
                 TId "print" ../src/test_parser.nit:72,2--6
-                AParExprs ../src/test_parser.nit:72,7--25
+                AParExprs ../src/test_parser.nit:72,7--54
                   TOpar "(" ../src/test_parser.nit:72,7
-                  AStringExpr ../src/test_parser.nit:72,8--24
-                    TString "\"  -l\11only lexer\"" ../src/test_parser.nit:72,8--24
-                  TCpar ")" ../src/test_parser.nit:72,25
-              ACallExpr ../src/test_parser.nit:73,2--41
+                  AStringExpr ../src/test_parser.nit:72,8--53
+                    TString "\"  test_parser [options]... <filename.nit>...\"" ../src/test_parser.nit:72,8--53
+                  TCpar ")" ../src/test_parser.nit:72,54
+              ACallExpr ../src/test_parser.nit:73,2--49
                 AImplicitSelfExpr ../src/test_parser.nit:73,2
                 TId "print" ../src/test_parser.nit:73,2--6
-                AParExprs ../src/test_parser.nit:73,7--41
+                AParExprs ../src/test_parser.nit:73,7--49
                   TOpar "(" ../src/test_parser.nit:73,7
-                  AStringExpr ../src/test_parser.nit:73,8--40
-                    TString "\"  -p\11lexer and parser (default)\"" ../src/test_parser.nit:73,8--40
-                  TCpar ")" ../src/test_parser.nit:73,41
-              ACallExpr ../src/test_parser.nit:74,2--68
+                  AStringExpr ../src/test_parser.nit:73,8--48
+                    TString "\"  test_parser -e [options]... <text>...\"" ../src/test_parser.nit:73,8--48
+                  TCpar ")" ../src/test_parser.nit:73,49
+              ACallExpr ../src/test_parser.nit:74,2--39
                 AImplicitSelfExpr ../src/test_parser.nit:74,2
                 TId "print" ../src/test_parser.nit:74,2--6
-                AParExprs ../src/test_parser.nit:74,7--68
+                AParExprs ../src/test_parser.nit:74,7--39
                   TOpar "(" ../src/test_parser.nit:74,7
-                  AStringExpr ../src/test_parser.nit:74,8--67
-                    TString "\"  -e\11instead on files, each argument is a content to parse\"" ../src/test_parser.nit:74,8--67
-                  TCpar ")" ../src/test_parser.nit:74,68
-              ACallExpr ../src/test_parser.nit:75,2--51
+                  AStringExpr ../src/test_parser.nit:74,8--38
+                    TString "\"  test_parser -i [options]...\"" ../src/test_parser.nit:74,8--38
+                  TCpar ")" ../src/test_parser.nit:74,39
+              ACallExpr ../src/test_parser.nit:75,2--18
                 AImplicitSelfExpr ../src/test_parser.nit:75,2
                 TId "print" ../src/test_parser.nit:75,2--6
-                AParExprs ../src/test_parser.nit:75,7--51
+                AParExprs ../src/test_parser.nit:75,7--18
                   TOpar "(" ../src/test_parser.nit:75,7
-                  AStringExpr ../src/test_parser.nit:75,8--50
-                    TString "\"  -i\11tree to parse are read interactively\"" ../src/test_parser.nit:75,8--50
-                  TCpar ")" ../src/test_parser.nit:75,51
-              ACallExpr ../src/test_parser.nit:76,2--30
+                  AStringExpr ../src/test_parser.nit:75,8--17
+                    TString "\"options:\"" ../src/test_parser.nit:75,8--17
+                  TCpar ")" ../src/test_parser.nit:75,18
+              ACallExpr ../src/test_parser.nit:76,2--36
                 AImplicitSelfExpr ../src/test_parser.nit:76,2
                 TId "print" ../src/test_parser.nit:76,2--6
-                AParExprs ../src/test_parser.nit:76,7--30
+                AParExprs ../src/test_parser.nit:76,7--36
                   TOpar "(" ../src/test_parser.nit:76,7
-                  AStringExpr ../src/test_parser.nit:76,8--29
-                    TString "\"  -h\11print this help\"" ../src/test_parser.nit:76,8--29
-                  TCpar ")" ../src/test_parser.nit:76,30
-            AIfExpr ../src/test_parser.nit:77,6--146,3
-              TKwif "if" ../src/test_parser.nit:77,6--7
-              ACallExpr ../src/test_parser.nit:77,9--19
-                AImplicitSelfExpr ../src/test_parser.nit:77,9
-                TId "interactive" ../src/test_parser.nit:77,9--19
-                AListExprs ../src/test_parser.nit:77,19
-              ABlockExpr ../src/test_parser.nit:78,2--111,4
-                AIfExpr ../src/test_parser.nit:78,2--87,4
-                  TKwif "if" ../src/test_parser.nit:78,2--3
-                  ACallExpr ../src/test_parser.nit:78,5--14
-                    AImplicitSelfExpr ../src/test_parser.nit:78,5
-                    TId "only_lexer" ../src/test_parser.nit:78,5--14
-                    AListExprs ../src/test_parser.nit:78,14
-                  ABlockExpr ../src/test_parser.nit:79,3--80,8
-                    ACallExpr ../src/test_parser.nit:79,3--44
-                      AImplicitSelfExpr ../src/test_parser.nit:79,3
-                      TId "print" ../src/test_parser.nit:79,3--7
-                      AListExprs ../src/test_parser.nit:79,9--44
-                        AStringExpr ../src/test_parser.nit:79,9--44
-                          TString "\"Error: -l and -i are incompatibles\"" ../src/test_parser.nit:79,9--44
-                    ACallExpr ../src/test_parser.nit:80,3--8
-                      AImplicitSelfExpr ../src/test_parser.nit:80,3
-                      TId "exit" ../src/test_parser.nit:80,3--6
-                      AListExprs ../src/test_parser.nit:80,8
-                        ADecIntExpr ../src/test_parser.nit:80,8
-                          TNumber "1" ../src/test_parser.nit:80,8
-                  AIfExpr ../src/test_parser.nit:81,7--87,4
-                    TKwif "if" ../src/test_parser.nit:81,7--8
-                    ACallExpr ../src/test_parser.nit:81,10--16
-                      AImplicitSelfExpr ../src/test_parser.nit:81,10
-                      TId "no_file" ../src/test_parser.nit:81,10--16
-                      AListExprs ../src/test_parser.nit:81,16
-                    ABlockExpr ../src/test_parser.nit:82,3--83,8
-                      ACallExpr ../src/test_parser.nit:82,3--44
-                        AImplicitSelfExpr ../src/test_parser.nit:82,3
-                        TId "print" ../src/test_parser.nit:82,3--7
-                        AListExprs ../src/test_parser.nit:82,9--44
-                          AStringExpr ../src/test_parser.nit:82,9--44
-                            TString "\"Error: -e and -i are incompatibles\"" ../src/test_parser.nit:82,9--44
-                      ACallExpr ../src/test_parser.nit:83,3--8
-                        AImplicitSelfExpr ../src/test_parser.nit:83,3
-                        TId "exit" ../src/test_parser.nit:83,3--6
-                        AListExprs ../src/test_parser.nit:83,8
-                          ADecIntExpr ../src/test_parser.nit:83,8
-                            TNumber "1" ../src/test_parser.nit:83,8
-                    AIfExpr ../src/test_parser.nit:84,7--87,4
-                      TKwif "if" ../src/test_parser.nit:84,7--8
-                      ANotExpr ../src/test_parser.nit:84,10--26
-                        TKwnot "not" ../src/test_parser.nit:84,10--12
-                        ACallExpr ../src/test_parser.nit:84,14--26
-                          ACallExpr ../src/test_parser.nit:84,14--17
-                            AImplicitSelfExpr ../src/test_parser.nit:84,14
-                            TId "args" ../src/test_parser.nit:84,14--17
-                            AListExprs ../src/test_parser.nit:84,17
-                          TId "is_empty" ../src/test_parser.nit:84,19--26
-                          AListExprs ../src/test_parser.nit:84,26
-                      ABlockExpr ../src/test_parser.nit:85,3--86,8
-                        ACallExpr ../src/test_parser.nit:85,3--43
-                          AImplicitSelfExpr ../src/test_parser.nit:85,3
-                          TId "print" ../src/test_parser.nit:85,3--7
-                          AListExprs ../src/test_parser.nit:85,9--43
-                            AStringExpr ../src/test_parser.nit:85,9--43
-                              TString "\"Error: -i works without arguments\"" ../src/test_parser.nit:85,9--43
-                        ACallExpr ../src/test_parser.nit:86,3--8
-                          AImplicitSelfExpr ../src/test_parser.nit:86,3
-                          TId "exit" ../src/test_parser.nit:86,3--6
-                          AListExprs ../src/test_parser.nit:86,8
-                            ADecIntExpr ../src/test_parser.nit:86,8
-                              TNumber "1" ../src/test_parser.nit:86,8
-                      ABlockExpr ../src/test_parser.nit:87,2--4
-                        TKwend "end" ../src/test_parser.nit:87,2--4
-                AVardeclExpr ../src/test_parser.nit:89,2--25
-                  TKwvar "var" ../src/test_parser.nit:89,2--4
-                  TId "tc" ../src/test_parser.nit:89,6--7
-                  TAssign "=" ../src/test_parser.nit:89,9
-                  ANewExpr ../src/test_parser.nit:89,11--25
-                    TKwnew "new" ../src/test_parser.nit:89,11--13
-                    AType ../src/test_parser.nit:89,15--25
-                      TClassid "ToolContext" ../src/test_parser.nit:89,15--25
-                    AListExprs ../src/test_parser.nit:89,25
-                ALoopExpr ../src/test_parser.nit:91,2--111,4
-                  TKwloop "loop" ../src/test_parser.nit:91,2--5
-                  ABlockExpr ../src/test_parser.nit:92,3--111,4
-                    AVardeclExpr ../src/test_parser.nit:92,3--37
-                      TKwvar "var" ../src/test_parser.nit:92,3--5
-                      TId "n" ../src/test_parser.nit:92,7
-                      TAssign "=" ../src/test_parser.nit:92,9
-                      ACallExpr ../src/test_parser.nit:92,11--37
-                        ACallExpr ../src/test_parser.nit:92,11--12
-                          AImplicitSelfExpr ../src/test_parser.nit:92,11
-                          TId "tc" ../src/test_parser.nit:92,11--12
-                          AListExprs ../src/test_parser.nit:92,12
-                        TId "interactive_parse" ../src/test_parser.nit:92,14--30
-                        AParExprs ../src/test_parser.nit:92,31--37
-                          TOpar "(" ../src/test_parser.nit:92,31
-                          AStringExpr ../src/test_parser.nit:92,32--36
-                            TString "\"-->\"" ../src/test_parser.nit:92,32--36
-                          TCpar ")" ../src/test_parser.nit:92,37
-                    AIfExpr ../src/test_parser.nit:93,3--101,5
-                      TKwif "if" ../src/test_parser.nit:93,3--4
-                      AIsaExpr ../src/test_parser.nit:93,6--18
-                        ACallExpr ../src/test_parser.nit:93,6
-                          AImplicitSelfExpr ../src/test_parser.nit:93,6
-                          TId "n" ../src/test_parser.nit:93,6
-                          AListExprs ../src/test_parser.nit:93,6
-                        AType ../src/test_parser.nit:93,12--18
-                          TClassid "TString" ../src/test_parser.nit:93,12--18
-                      ABlockExpr ../src/test_parser.nit:94,4--100,11
-                        AVardeclExpr ../src/test_parser.nit:94,4--17
-                          TKwvar "var" ../src/test_parser.nit:94,4--6
-                          TId "s" ../src/test_parser.nit:94,8
-                          TAssign "=" ../src/test_parser.nit:94,10
-                          ACallExpr ../src/test_parser.nit:94,12--17
-                            ACallExpr ../src/test_parser.nit:94,12
-                              AImplicitSelfExpr ../src/test_parser.nit:94,12
-                              TId "n" ../src/test_parser.nit:94,12
-                              AListExprs ../src/test_parser.nit:94,12
-                            TId "text" ../src/test_parser.nit:94,14--17
-                            AListExprs ../src/test_parser.nit:94,17
-                        AIfExpr ../src/test_parser.nit:95,4--99,6
-                          TKwif "if" ../src/test_parser.nit:95,4--5
-                          AEqExpr ../src/test_parser.nit:95,7--15
-                            ACallExpr ../src/test_parser.nit:95,7
-                              AImplicitSelfExpr ../src/test_parser.nit:95,7
-                              TId "s" ../src/test_parser.nit:95,7
-                              AListExprs ../src/test_parser.nit:95,7
-                            AStringExpr ../src/test_parser.nit:95,12--15
-                              TString "\":q\"" ../src/test_parser.nit:95,12--15
-                          ABlockExpr ../src/test_parser.nit:96,5--9
-                            ABreakExpr ../src/test_parser.nit:96,5--9
-                              TKwbreak "break" ../src/test_parser.nit:96,5--9
-                          ABlockExpr ../src/test_parser.nit:98,5--99,6
-                            ACallExpr ../src/test_parser.nit:98,5--24
-                              AImplicitSelfExpr ../src/test_parser.nit:98,5
-                              TId "print" ../src/test_parser.nit:98,5--9
-                              AListExprs ../src/test_parser.nit:98,11--24
-                                AStringExpr ../src/test_parser.nit:98,11--24
-                                  TString "\"`:q` to quit\"" ../src/test_parser.nit:98,11--24
-                            TKwend "end" ../src/test_parser.nit:99,4--6
-                        AContinueExpr ../src/test_parser.nit:100,4--11
-                          TKwcontinue "continue" ../src/test_parser.nit:100,4--11
-                      ABlockExpr ../src/test_parser.nit:101,3--5
-                        TKwend "end" ../src/test_parser.nit:101,3--5
-                    AIfExpr ../src/test_parser.nit:103,3--106,5
-                      TKwif "if" ../src/test_parser.nit:103,3--4
-                      AIsaExpr ../src/test_parser.nit:103,6--17
-                        ACallExpr ../src/test_parser.nit:103,6
-                          AImplicitSelfExpr ../src/test_parser.nit:103,6
-                          TId "n" ../src/test_parser.nit:103,6
-                          AListExprs ../src/test_parser.nit:103,6
-                        AType ../src/test_parser.nit:103,12--17
-                          TClassid "AError" ../src/test_parser.nit:103,12--17
-                      ABlockExpr ../src/test_parser.nit:104,4--105,11
-                        ACallExpr ../src/test_parser.nit:104,4--57
-                          AImplicitSelfExpr ../src/test_parser.nit:104,4
-                          TId "print" ../src/test_parser.nit:104,4--8
-                          AListExprs ../src/test_parser.nit:104,10--57
-                            ASuperstringExpr ../src/test_parser.nit:104,10--57
-                              AStartStringExpr ../src/test_parser.nit:104,10--11
-                                TStartString "\"{" ../src/test_parser.nit:104,10--11
-                              ACallExpr ../src/test_parser.nit:104,12--42
-                                ACallExpr ../src/test_parser.nit:104,12--21
-                                  ACallExpr ../src/test_parser.nit:104,12
-                                    AImplicitSelfExpr ../src/test_parser.nit:104,12
-                                    TId "n" ../src/test_parser.nit:104,12
-                                    AListExprs ../src/test_parser.nit:104,12
-                                  TId "location" ../src/test_parser.nit:104,14--21
-                                  AListExprs ../src/test_parser.nit:104,21
-                                TId "colored_line" ../src/test_parser.nit:104,23--34
-                                AParExprs ../src/test_parser.nit:104,35--42
-                                  TOpar "(" ../src/test_parser.nit:104,35
-                                  AStringExpr ../src/test_parser.nit:104,36--41
-                                    TString "\"0;31\"" ../src/test_parser.nit:104,36--41
-                                  TCpar ")" ../src/test_parser.nit:104,42
-                              AMidStringExpr ../src/test_parser.nit:104,43--46
-                                TMidString "}: {" ../src/test_parser.nit:104,43--46
-                              ACallExpr ../src/test_parser.nit:104,47--55
-                                ACallExpr ../src/test_parser.nit:104,47
-                                  AImplicitSelfExpr ../src/test_parser.nit:104,47
-                                  TId "n" ../src/test_parser.nit:104,47
-                                  AListExprs ../src/test_parser.nit:104,47
-                                TId "message" ../src/test_parser.nit:104,49--55
-                                AListExprs ../src/test_parser.nit:104,55
-                              AEndStringExpr ../src/test_parser.nit:104,56--57
-                                TEndString "}\"" ../src/test_parser.nit:104,56--57
-                        AContinueExpr ../src/test_parser.nit:105,4--11
-                          TKwcontinue "continue" ../src/test_parser.nit:105,4--11
-                      ABlockExpr ../src/test_parser.nit:106,3--5
-                        TKwend "end" ../src/test_parser.nit:106,3--5
-                    AIfExpr ../src/test_parser.nit:108,3--110,5
-                      TKwif "if" ../src/test_parser.nit:108,3--4
-                      ANotExpr ../src/test_parser.nit:108,6--17
-                        TKwnot "not" ../src/test_parser.nit:108,6--8
-                        ACallExpr ../src/test_parser.nit:108,10--17
-                          AImplicitSelfExpr ../src/test_parser.nit:108,10
-                          TId "no_print" ../src/test_parser.nit:108,10--17
-                          AListExprs ../src/test_parser.nit:108,17
-                      ABlockExpr ../src/test_parser.nit:109,4--40
-                        ACallExpr ../src/test_parser.nit:109,4--40
-                          AParExpr ../src/test_parser.nit:109,4--25
-                            TOpar "(" ../src/test_parser.nit:109,4
-                            ANewExpr ../src/test_parser.nit:109,5--24
-                              TKwnew "new" ../src/test_parser.nit:109,5--7
-                              AType ../src/test_parser.nit:109,9--24
-                                TClassid "PrintTreeVisitor" ../src/test_parser.nit:109,9--24
-                              AListExprs ../src/test_parser.nit:109,24
-                            TCpar ")" ../src/test_parser.nit:109,25
-                          TId "enter_visit" ../src/test_parser.nit:109,27--37
-                          AParExprs ../src/test_parser.nit:109,38--40
-                            TOpar "(" ../src/test_parser.nit:109,38
-                            ACallExpr ../src/test_parser.nit:109,39
-                              AImplicitSelfExpr ../src/test_parser.nit:109,39
-                              TId "n" ../src/test_parser.nit:109,39
-                              AListExprs ../src/test_parser.nit:109,39
-                            TCpar ")" ../src/test_parser.nit:109,40
-                      ABlockExpr ../src/test_parser.nit:110,3--5
-                        TKwend "end" ../src/test_parser.nit:110,3--5
-                    TKwend "end" ../src/test_parser.nit:111,2--4
-              ABlockExpr ../src/test_parser.nit:113,2--146,3
-                AForExpr ../src/test_parser.nit:113,2--145,4
-                  TKwfor "for" ../src/test_parser.nit:113,2--4
-                  TId "a" ../src/test_parser.nit:113,6
-                  ACallExpr ../src/test_parser.nit:113,11--14
-                    AImplicitSelfExpr ../src/test_parser.nit:113,11
-                    TId "args" ../src/test_parser.nit:113,11--14
-                    AListExprs ../src/test_parser.nit:113,14
-                  TKwdo "do" ../src/test_parser.nit:113,16--17
-                  ABlockExpr ../src/test_parser.nit:114,3--145,4
-                    AVardeclExpr ../src/test_parser.nit:114,3--12
-                      TKwvar "var" ../src/test_parser.nit:114,3--5
-                      TId "source" ../src/test_parser.nit:114,7--12
-                    AIfExpr ../src/test_parser.nit:115,3--121,5
-                      TKwif "if" ../src/test_parser.nit:115,3--4
-                      ACallExpr ../src/test_parser.nit:115,6--12
-                        AImplicitSelfExpr ../src/test_parser.nit:115,6
-                        TId "no_file" ../src/test_parser.nit:115,6--12
-                        AListExprs ../src/test_parser.nit:115,12
-                      ABlockExpr ../src/test_parser.nit:116,4--45
-                        ACallAssignExpr ../src/test_parser.nit:116,4--45
-                          AImplicitSelfExpr ../src/test_parser.nit:116,4
-                          TId "source" ../src/test_parser.nit:116,4--9
-                          AListExprs ../src/test_parser.nit:116,11
-                          TAssign "=" ../src/test_parser.nit:116,11
-                          ANewExpr ../src/test_parser.nit:116,13--45
-                            TKwnew "new" ../src/test_parser.nit:116,13--15
-                            AType ../src/test_parser.nit:116,17--26
-                              TClassid "SourceFile" ../src/test_parser.nit:116,17--26
-                            TId "from_string" ../src/test_parser.nit:116,28--38
-                            AParExprs ../src/test_parser.nit:116,39--45
-                              TOpar "(" ../src/test_parser.nit:116,39
-                              AStringExpr ../src/test_parser.nit:116,40--41
-                                TString "\"\"" ../src/test_parser.nit:116,40--41
-                              ACallExpr ../src/test_parser.nit:116,44
-                                AImplicitSelfExpr ../src/test_parser.nit:116,44
-                                TId "a" ../src/test_parser.nit:116,44
-                                AListExprs ../src/test_parser.nit:116,44
-                              TCpar ")" ../src/test_parser.nit:116,45
-                      ABlockExpr ../src/test_parser.nit:118,4--121,5
-                        AVardeclExpr ../src/test_parser.nit:118,4--33
-                          TKwvar "var" ../src/test_parser.nit:118,4--6
-                          TId "f" ../src/test_parser.nit:118,8
-                          TAssign "=" ../src/test_parser.nit:118,10
-                          ANewExpr ../src/test_parser.nit:118,12--33
-                            TKwnew "new" ../src/test_parser.nit:118,12--14
-                            AType ../src/test_parser.nit:118,16--25
-                              TClassid "FileReader" ../src/test_parser.nit:118,16--25
-                            TId "open" ../src/test_parser.nit:118,27--30
-                            AParExprs ../src/test_parser.nit:118,31--33
-                              TOpar "(" ../src/test_parser.nit:118,31
-                              ACallExpr ../src/test_parser.nit:118,32
-                                AImplicitSelfExpr ../src/test_parser.nit:118,32
-                                TId "a" ../src/test_parser.nit:118,32
-                                AListExprs ../src/test_parser.nit:118,32
-                              TCpar ")" ../src/test_parser.nit:118,33
-                        ACallAssignExpr ../src/test_parser.nit:119,4--32
-                          AImplicitSelfExpr ../src/test_parser.nit:119,4
-                          TId "source" ../src/test_parser.nit:119,4--9
-                          AListExprs ../src/test_parser.nit:119,11
-                          TAssign "=" ../src/test_parser.nit:119,11
-                          ANewExpr ../src/test_parser.nit:119,13--32
-                            TKwnew "new" ../src/test_parser.nit:119,13--15
-                            AType ../src/test_parser.nit:119,17--26
-                              TClassid "SourceFile" ../src/test_parser.nit:119,17--26
-                            AParExprs ../src/test_parser.nit:119,27--32
-                              TOpar "(" ../src/test_parser.nit:119,27
-                              ACallExpr ../src/test_parser.nit:119,28
-                                AImplicitSelfExpr ../src/test_parser.nit:119,28
-                                TId "a" ../src/test_parser.nit:119,28
-                                AListExprs ../src/test_parser.nit:119,28
-                              ACallExpr ../src/test_parser.nit:119,31
-                                AImplicitSelfExpr ../src/test_parser.nit:119,31
-                                TId "f" ../src/test_parser.nit:119,31
-                                AListExprs ../src/test_parser.nit:119,31
-                              TCpar ")" ../src/test_parser.nit:119,32
-                        ACallExpr ../src/test_parser.nit:120,4--10
-                          ACallExpr ../src/test_parser.nit:120,4
-                            AImplicitSelfExpr ../src/test_parser.nit:120,4
-                            TId "f" ../src/test_parser.nit:120,4
-                            AListExprs ../src/test_parser.nit:120,4
-                          TId "close" ../src/test_parser.nit:120,6--10
-                          AListExprs ../src/test_parser.nit:120,10
-                        TKwend "end" ../src/test_parser.nit:121,3--5
-                    AVardeclExpr ../src/test_parser.nit:122,3--31
-                      TKwvar "var" ../src/test_parser.nit:122,3--5
-                      TId "lexer" ../src/test_parser.nit:122,7--11
-                      TAssign "=" ../src/test_parser.nit:122,13
-                      ANewExpr ../src/test_parser.nit:122,15--31
-                        TKwnew "new" ../src/test_parser.nit:122,15--17
-                        AType ../src/test_parser.nit:122,19--23
-                          TClassid "Lexer" ../src/test_parser.nit:122,19--23
-                        AParExprs ../src/test_parser.nit:122,24--31
-                          TOpar "(" ../src/test_parser.nit:122,24
-                          ACallExpr ../src/test_parser.nit:122,25--30
-                            AImplicitSelfExpr ../src/test_parser.nit:122,25
-                            TId "source" ../src/test_parser.nit:122,25--30
-                            AListExprs ../src/test_parser.nit:122,30
-                          TCpar ")" ../src/test_parser.nit:122,31
-                    AIfExpr ../src/test_parser.nit:123,3--144,5
-                      TKwif "if" ../src/test_parser.nit:123,3--4
-                      ACallExpr ../src/test_parser.nit:123,6--15
-                        AImplicitSelfExpr ../src/test_parser.nit:123,6
-                        TId "only_lexer" ../src/test_parser.nit:123,6--15
-                        AListExprs ../src/test_parser.nit:123,15
-                      ABlockExpr ../src/test_parser.nit:124,4--130,6
-                        AVardeclExpr ../src/test_parser.nit:124,4--25
+                  AStringExpr ../src/test_parser.nit:76,8--35
+                    TString "\"  -n\tdo not print anything\"" ../src/test_parser.nit:76,8--35
+                  TCpar ")" ../src/test_parser.nit:76,36
+              ACallExpr ../src/test_parser.nit:77,2--25
+                AImplicitSelfExpr ../src/test_parser.nit:77,2
+                TId "print" ../src/test_parser.nit:77,2--6
+                AParExprs ../src/test_parser.nit:77,7--25
+                  TOpar "(" ../src/test_parser.nit:77,7
+                  AStringExpr ../src/test_parser.nit:77,8--24
+                    TString "\"  -l\tonly lexer\"" ../src/test_parser.nit:77,8--24
+                  TCpar ")" ../src/test_parser.nit:77,25
+              ACallExpr ../src/test_parser.nit:78,2--41
+                AImplicitSelfExpr ../src/test_parser.nit:78,2
+                TId "print" ../src/test_parser.nit:78,2--6
+                AParExprs ../src/test_parser.nit:78,7--41
+                  TOpar "(" ../src/test_parser.nit:78,7
+                  AStringExpr ../src/test_parser.nit:78,8--40
+                    TString "\"  -p\tlexer and parser (default)\"" ../src/test_parser.nit:78,8--40
+                  TCpar ")" ../src/test_parser.nit:78,41
+              ACallExpr ../src/test_parser.nit:79,2--61
+                AImplicitSelfExpr ../src/test_parser.nit:79,2
+                TId "print" ../src/test_parser.nit:79,2--6
+                AParExprs ../src/test_parser.nit:79,7--61
+                  TOpar "(" ../src/test_parser.nit:79,7
+                  AStringExpr ../src/test_parser.nit:79,8--60
+                    TString "\"  -x\tinstead of a ascii tree, output a XML document\"" ../src/test_parser.nit:79,8--60
+                  TCpar ")" ../src/test_parser.nit:79,61
+              ACallExpr ../src/test_parser.nit:80,2--68
+                AImplicitSelfExpr ../src/test_parser.nit:80,2
+                TId "print" ../src/test_parser.nit:80,2--6
+                AParExprs ../src/test_parser.nit:80,7--68
+                  TOpar "(" ../src/test_parser.nit:80,7
+                  AStringExpr ../src/test_parser.nit:80,8--67
+                    TString "\"  -e\tinstead on files, each argument is a content to parse\"" ../src/test_parser.nit:80,8--67
+                  TCpar ")" ../src/test_parser.nit:80,68
+              ACallExpr ../src/test_parser.nit:81,2--51
+                AImplicitSelfExpr ../src/test_parser.nit:81,2
+                TId "print" ../src/test_parser.nit:81,2--6
+                AParExprs ../src/test_parser.nit:81,7--51
+                  TOpar "(" ../src/test_parser.nit:81,7
+                  AStringExpr ../src/test_parser.nit:81,8--50
+                    TString "\"  -i\ttree to parse are read interactively\"" ../src/test_parser.nit:81,8--50
+                  TCpar ")" ../src/test_parser.nit:81,51
+              ACallExpr ../src/test_parser.nit:82,2--30
+                AImplicitSelfExpr ../src/test_parser.nit:82,2
+                TId "print" ../src/test_parser.nit:82,2--6
+                AParExprs ../src/test_parser.nit:82,7--30
+                  TOpar "(" ../src/test_parser.nit:82,7
+                  AStringExpr ../src/test_parser.nit:82,8--29
+                    TString "\"  -h\tprint this help\"" ../src/test_parser.nit:82,8--29
+                  TCpar ")" ../src/test_parser.nit:82,30
+            AIfExpr ../src/test_parser.nit:83,6--155,3
+              TKwif "if" ../src/test_parser.nit:83,6--7
+              ACallExpr ../src/test_parser.nit:83,9--19
+                AImplicitSelfExpr ../src/test_parser.nit:83,9
+                TId "interactive" ../src/test_parser.nit:83,9--19
+                AListExprs ../src/test_parser.nit:83,19
+              ABlockExpr ../src/test_parser.nit:84,2--117,4
+                AIfExpr ../src/test_parser.nit:84,2--93,4
+                  TKwif "if" ../src/test_parser.nit:84,2--3
+                  ACallExpr ../src/test_parser.nit:84,5--14
+                    AImplicitSelfExpr ../src/test_parser.nit:84,5
+                    TId "only_lexer" ../src/test_parser.nit:84,5--14
+                    AListExprs ../src/test_parser.nit:84,14
+                  ABlockExpr ../src/test_parser.nit:85,3--86,8
+                    ACallExpr ../src/test_parser.nit:85,3--43
+                      AImplicitSelfExpr ../src/test_parser.nit:85,3
+                      TId "print" ../src/test_parser.nit:85,3--7
+                      AListExprs ../src/test_parser.nit:85,9--43
+                        AStringExpr ../src/test_parser.nit:85,9--43
+                          TString "\"Error: -l and -i are incompatible\"" ../src/test_parser.nit:85,9--43
+                    ACallExpr ../src/test_parser.nit:86,3--8
+                      AImplicitSelfExpr ../src/test_parser.nit:86,3
+                      TId "exit" ../src/test_parser.nit:86,3--6
+                      AListExprs ../src/test_parser.nit:86,8
+                        ADecIntExpr ../src/test_parser.nit:86,8
+                          TNumber "1" ../src/test_parser.nit:86,8
+                  AIfExpr ../src/test_parser.nit:87,7--93,4
+                    TKwif "if" ../src/test_parser.nit:87,7--8
+                    ACallExpr ../src/test_parser.nit:87,10--16
+                      AImplicitSelfExpr ../src/test_parser.nit:87,10
+                      TId "no_file" ../src/test_parser.nit:87,10--16
+                      AListExprs ../src/test_parser.nit:87,16
+                    ABlockExpr ../src/test_parser.nit:88,3--89,8
+                      ACallExpr ../src/test_parser.nit:88,3--43
+                        AImplicitSelfExpr ../src/test_parser.nit:88,3
+                        TId "print" ../src/test_parser.nit:88,3--7
+                        AListExprs ../src/test_parser.nit:88,9--43
+                          AStringExpr ../src/test_parser.nit:88,9--43
+                            TString "\"Error: -e and -i are incompatible\"" ../src/test_parser.nit:88,9--43
+                      ACallExpr ../src/test_parser.nit:89,3--8
+                        AImplicitSelfExpr ../src/test_parser.nit:89,3
+                        TId "exit" ../src/test_parser.nit:89,3--6
+                        AListExprs ../src/test_parser.nit:89,8
+                          ADecIntExpr ../src/test_parser.nit:89,8
+                            TNumber "1" ../src/test_parser.nit:89,8
+                    AIfExpr ../src/test_parser.nit:90,7--93,4
+                      TKwif "if" ../src/test_parser.nit:90,7--8
+                      ANotExpr ../src/test_parser.nit:90,10--26
+                        TKwnot "not" ../src/test_parser.nit:90,10--12
+                        ACallExpr ../src/test_parser.nit:90,14--26
+                          ACallExpr ../src/test_parser.nit:90,14--17
+                            AImplicitSelfExpr ../src/test_parser.nit:90,14
+                            TId "args" ../src/test_parser.nit:90,14--17
+                            AListExprs ../src/test_parser.nit:90,17
+                          TId "is_empty" ../src/test_parser.nit:90,19--26
+                          AListExprs ../src/test_parser.nit:90,26
+                      ABlockExpr ../src/test_parser.nit:91,3--92,8
+                        ACallExpr ../src/test_parser.nit:91,3--43
+                          AImplicitSelfExpr ../src/test_parser.nit:91,3
+                          TId "print" ../src/test_parser.nit:91,3--7
+                          AListExprs ../src/test_parser.nit:91,9--43
+                            AStringExpr ../src/test_parser.nit:91,9--43
+                              TString "\"Error: -i works without arguments\"" ../src/test_parser.nit:91,9--43
+                        ACallExpr ../src/test_parser.nit:92,3--8
+                          AImplicitSelfExpr ../src/test_parser.nit:92,3
+                          TId "exit" ../src/test_parser.nit:92,3--6
+                          AListExprs ../src/test_parser.nit:92,8
+                            ADecIntExpr ../src/test_parser.nit:92,8
+                              TNumber "1" ../src/test_parser.nit:92,8
+                      ABlockExpr ../src/test_parser.nit:93,2--4
+                        TKwend "end" ../src/test_parser.nit:93,2--4
+                AVardeclExpr ../src/test_parser.nit:95,2--25
+                  TKwvar "var" ../src/test_parser.nit:95,2--4
+                  TId "tc" ../src/test_parser.nit:95,6--7
+                  TAssign "=" ../src/test_parser.nit:95,9
+                  ANewExpr ../src/test_parser.nit:95,11--25
+                    TKwnew "new" ../src/test_parser.nit:95,11--13
+                    AType ../src/test_parser.nit:95,15--25
+                      TClassid "ToolContext" ../src/test_parser.nit:95,15--25
+                    AListExprs ../src/test_parser.nit:95,25
+                ALoopExpr ../src/test_parser.nit:97,2--117,4
+                  TKwloop "loop" ../src/test_parser.nit:97,2--5
+                  ABlockExpr ../src/test_parser.nit:98,3--117,4
+                    AVardeclExpr ../src/test_parser.nit:98,3--37
+                      TKwvar "var" ../src/test_parser.nit:98,3--5
+                      TId "n" ../src/test_parser.nit:98,7
+                      TAssign "=" ../src/test_parser.nit:98,9
+                      ACallExpr ../src/test_parser.nit:98,11--37
+                        ACallExpr ../src/test_parser.nit:98,11--12
+                          AImplicitSelfExpr ../src/test_parser.nit:98,11
+                          TId "tc" ../src/test_parser.nit:98,11--12
+                          AListExprs ../src/test_parser.nit:98,12
+                        TId "interactive_parse" ../src/test_parser.nit:98,14--30
+                        AParExprs ../src/test_parser.nit:98,31--37
+                          TOpar "(" ../src/test_parser.nit:98,31
+                          AStringExpr ../src/test_parser.nit:98,32--36
+                            TString "\"-->\"" ../src/test_parser.nit:98,32--36
+                          TCpar ")" ../src/test_parser.nit:98,37
+                    AIfExpr ../src/test_parser.nit:99,3--107,5
+                      TKwif "if" ../src/test_parser.nit:99,3--4
+                      AIsaExpr ../src/test_parser.nit:99,6--18
+                        ACallExpr ../src/test_parser.nit:99,6
+                          AImplicitSelfExpr ../src/test_parser.nit:99,6
+                          TId "n" ../src/test_parser.nit:99,6
+                          AListExprs ../src/test_parser.nit:99,6
+                        TKwisa "isa" ../src/test_parser.nit:99,8--10
+                        AType ../src/test_parser.nit:99,12--18
+                          TClassid "TString" ../src/test_parser.nit:99,12--18
+                      ABlockExpr ../src/test_parser.nit:100,4--106,11
+                        AVardeclExpr ../src/test_parser.nit:100,4--17
+                          TKwvar "var" ../src/test_parser.nit:100,4--6
+                          TId "s" ../src/test_parser.nit:100,8
+                          TAssign "=" ../src/test_parser.nit:100,10
+                          ACallExpr ../src/test_parser.nit:100,12--17
+                            ACallExpr ../src/test_parser.nit:100,12
+                              AImplicitSelfExpr ../src/test_parser.nit:100,12
+                              TId "n" ../src/test_parser.nit:100,12
+                              AListExprs ../src/test_parser.nit:100,12
+                            TId "text" ../src/test_parser.nit:100,14--17
+                            AListExprs ../src/test_parser.nit:100,17
+                        AIfExpr ../src/test_parser.nit:101,4--105,6
+                          TKwif "if" ../src/test_parser.nit:101,4--5
+                          AEqExpr ../src/test_parser.nit:101,7--15
+                            ACallExpr ../src/test_parser.nit:101,7
+                              AImplicitSelfExpr ../src/test_parser.nit:101,7
+                              TId "s" ../src/test_parser.nit:101,7
+                              AListExprs ../src/test_parser.nit:101,7
+                            TEq "==" ../src/test_parser.nit:101,9--10
+                            AStringExpr ../src/test_parser.nit:101,12--15
+                              TString "\":q\"" ../src/test_parser.nit:101,12--15
+                          ABlockExpr ../src/test_parser.nit:102,5--9
+                            ABreakExpr ../src/test_parser.nit:102,5--9
+                              TKwbreak "break" ../src/test_parser.nit:102,5--9
+                          ABlockExpr ../src/test_parser.nit:104,5--105,6
+                            ACallExpr ../src/test_parser.nit:104,5--24
+                              AImplicitSelfExpr ../src/test_parser.nit:104,5
+                              TId "print" ../src/test_parser.nit:104,5--9
+                              AListExprs ../src/test_parser.nit:104,11--24
+                                AStringExpr ../src/test_parser.nit:104,11--24
+                                  TString "\"`:q` to quit\"" ../src/test_parser.nit:104,11--24
+                            TKwend "end" ../src/test_parser.nit:105,4--6
+                        AContinueExpr ../src/test_parser.nit:106,4--11
+                          TKwcontinue "continue" ../src/test_parser.nit:106,4--11
+                      ABlockExpr ../src/test_parser.nit:107,3--5
+                        TKwend "end" ../src/test_parser.nit:107,3--5
+                    AIfExpr ../src/test_parser.nit:109,3--112,5
+                      TKwif "if" ../src/test_parser.nit:109,3--4
+                      AIsaExpr ../src/test_parser.nit:109,6--17
+                        ACallExpr ../src/test_parser.nit:109,6
+                          AImplicitSelfExpr ../src/test_parser.nit:109,6
+                          TId "n" ../src/test_parser.nit:109,6
+                          AListExprs ../src/test_parser.nit:109,6
+                        TKwisa "isa" ../src/test_parser.nit:109,8--10
+                        AType ../src/test_parser.nit:109,12--17
+                          TClassid "AError" ../src/test_parser.nit:109,12--17
+                      ABlockExpr ../src/test_parser.nit:110,4--111,11
+                        ACallExpr ../src/test_parser.nit:110,4--57
+                          AImplicitSelfExpr ../src/test_parser.nit:110,4
+                          TId "print" ../src/test_parser.nit:110,4--8
+                          AListExprs ../src/test_parser.nit:110,10--57
+                            ASuperstringExpr ../src/test_parser.nit:110,10--57
+                              AStartStringExpr ../src/test_parser.nit:110,10--11
+                                TStartString "\"{" ../src/test_parser.nit:110,10--11
+                              ACallExpr ../src/test_parser.nit:110,12--42
+                                ACallExpr ../src/test_parser.nit:110,12--21
+                                  ACallExpr ../src/test_parser.nit:110,12
+                                    AImplicitSelfExpr ../src/test_parser.nit:110,12
+                                    TId "n" ../src/test_parser.nit:110,12
+                                    AListExprs ../src/test_parser.nit:110,12
+                                  TId "location" ../src/test_parser.nit:110,14--21
+                                  AListExprs ../src/test_parser.nit:110,21
+                                TId "colored_line" ../src/test_parser.nit:110,23--34
+                                AParExprs ../src/test_parser.nit:110,35--42
+                                  TOpar "(" ../src/test_parser.nit:110,35
+                                  AStringExpr ../src/test_parser.nit:110,36--41
+                                    TString "\"0;31\"" ../src/test_parser.nit:110,36--41
+                                  TCpar ")" ../src/test_parser.nit:110,42
+                              AMidStringExpr ../src/test_parser.nit:110,43--46
+                                TMidString "}: {" ../src/test_parser.nit:110,43--46
+                              ACallExpr ../src/test_parser.nit:110,47--55
+                                ACallExpr ../src/test_parser.nit:110,47
+                                  AImplicitSelfExpr ../src/test_parser.nit:110,47
+                                  TId "n" ../src/test_parser.nit:110,47
+                                  AListExprs ../src/test_parser.nit:110,47
+                                TId "message" ../src/test_parser.nit:110,49--55
+                                AListExprs ../src/test_parser.nit:110,55
+                              AEndStringExpr ../src/test_parser.nit:110,56--57
+                                TEndString "}\"" ../src/test_parser.nit:110,56--57
+                        AContinueExpr ../src/test_parser.nit:111,4--11
+                          TKwcontinue "continue" ../src/test_parser.nit:111,4--11
+                      ABlockExpr ../src/test_parser.nit:112,3--5
+                        TKwend "end" ../src/test_parser.nit:112,3--5
+                    AIfExpr ../src/test_parser.nit:114,3--116,5
+                      TKwif "if" ../src/test_parser.nit:114,3--4
+                      ANotExpr ../src/test_parser.nit:114,6--17
+                        TKwnot "not" ../src/test_parser.nit:114,6--8
+                        ACallExpr ../src/test_parser.nit:114,10--17
+                          AImplicitSelfExpr ../src/test_parser.nit:114,10
+                          TId "no_print" ../src/test_parser.nit:114,10--17
+                          AListExprs ../src/test_parser.nit:114,17
+                      ABlockExpr ../src/test_parser.nit:115,4--40
+                        ACallExpr ../src/test_parser.nit:115,4--40
+                          AParExpr ../src/test_parser.nit:115,4--25
+                            TOpar "(" ../src/test_parser.nit:115,4
+                            ANewExpr ../src/test_parser.nit:115,5--24
+                              TKwnew "new" ../src/test_parser.nit:115,5--7
+                              AType ../src/test_parser.nit:115,9--24
+                                TClassid "PrintTreeVisitor" ../src/test_parser.nit:115,9--24
+                              AListExprs ../src/test_parser.nit:115,24
+                            TCpar ")" ../src/test_parser.nit:115,25
+                          TId "enter_visit" ../src/test_parser.nit:115,27--37
+                          AParExprs ../src/test_parser.nit:115,38--40
+                            TOpar "(" ../src/test_parser.nit:115,38
+                            ACallExpr ../src/test_parser.nit:115,39
+                              AImplicitSelfExpr ../src/test_parser.nit:115,39
+                              TId "n" ../src/test_parser.nit:115,39
+                              AListExprs ../src/test_parser.nit:115,39
+                            TCpar ")" ../src/test_parser.nit:115,40
+                      ABlockExpr ../src/test_parser.nit:116,3--5
+                        TKwend "end" ../src/test_parser.nit:116,3--5
+                    TKwend "end" ../src/test_parser.nit:117,2--4
+              ABlockExpr ../src/test_parser.nit:119,2--155,3
+                AForExpr ../src/test_parser.nit:119,2--154,4
+                  TKwfor "for" ../src/test_parser.nit:119,2--4
+                  TId "a" ../src/test_parser.nit:119,6
+                  ACallExpr ../src/test_parser.nit:119,11--14
+                    AImplicitSelfExpr ../src/test_parser.nit:119,11
+                    TId "args" ../src/test_parser.nit:119,11--14
+                    AListExprs ../src/test_parser.nit:119,14
+                  TKwdo "do" ../src/test_parser.nit:119,16--17
+                  ABlockExpr ../src/test_parser.nit:120,3--154,4
+                    AVardeclExpr ../src/test_parser.nit:120,3--12
+                      TKwvar "var" ../src/test_parser.nit:120,3--5
+                      TId "source" ../src/test_parser.nit:120,7--12
+                    AIfExpr ../src/test_parser.nit:121,3--127,5
+                      TKwif "if" ../src/test_parser.nit:121,3--4
+                      ACallExpr ../src/test_parser.nit:121,6--12
+                        AImplicitSelfExpr ../src/test_parser.nit:121,6
+                        TId "no_file" ../src/test_parser.nit:121,6--12
+                        AListExprs ../src/test_parser.nit:121,12
+                      ABlockExpr ../src/test_parser.nit:122,4--45
+                        ACallAssignExpr ../src/test_parser.nit:122,4--45
+                          AImplicitSelfExpr ../src/test_parser.nit:122,4
+                          TId "source" ../src/test_parser.nit:122,4--9
+                          AListExprs ../src/test_parser.nit:122,11
+                          TAssign "=" ../src/test_parser.nit:122,11
+                          ANewExpr ../src/test_parser.nit:122,13--45
+                            TKwnew "new" ../src/test_parser.nit:122,13--15
+                            AType ../src/test_parser.nit:122,17--26
+                              TClassid "SourceFile" ../src/test_parser.nit:122,17--26
+                            TId "from_string" ../src/test_parser.nit:122,28--38
+                            AParExprs ../src/test_parser.nit:122,39--45
+                              TOpar "(" ../src/test_parser.nit:122,39
+                              AStringExpr ../src/test_parser.nit:122,40--41
+                                TString "\"\"" ../src/test_parser.nit:122,40--41
+                              ACallExpr ../src/test_parser.nit:122,44
+                                AImplicitSelfExpr ../src/test_parser.nit:122,44
+                                TId "a" ../src/test_parser.nit:122,44
+                                AListExprs ../src/test_parser.nit:122,44
+                              TCpar ")" ../src/test_parser.nit:122,45
+                      ABlockExpr ../src/test_parser.nit:124,4--127,5
+                        AVardeclExpr ../src/test_parser.nit:124,4--33
                           TKwvar "var" ../src/test_parser.nit:124,4--6
-                          TId "token" ../src/test_parser.nit:124,8--12
-                          TAssign "=" ../src/test_parser.nit:124,14
-                          ACallExpr ../src/test_parser.nit:124,16--25
-                            ACallExpr ../src/test_parser.nit:124,16--20
-                              AImplicitSelfExpr ../src/test_parser.nit:124,16
-                              TId "lexer" ../src/test_parser.nit:124,16--20
-                              AListExprs ../src/test_parser.nit:124,20
-                            TId "next" ../src/test_parser.nit:124,22--25
-                            AListExprs ../src/test_parser.nit:124,25
-                        AWhileExpr ../src/test_parser.nit:125,4--130,6
-                          TKwwhile "while" ../src/test_parser.nit:125,4--8
-                          ANotExpr ../src/test_parser.nit:125,10--26
-                            TKwnot "not" ../src/test_parser.nit:125,10--12
-                            AIsaExpr ../src/test_parser.nit:125,14--26
-                              ACallExpr ../src/test_parser.nit:125,14--18
-                                AImplicitSelfExpr ../src/test_parser.nit:125,14
-                                TId "token" ../src/test_parser.nit:125,14--18
-                                AListExprs ../src/test_parser.nit:125,18
-                              AType ../src/test_parser.nit:125,24--26
-                                TClassid "EOF" ../src/test_parser.nit:125,24--26
-                          TKwdo "do" ../src/test_parser.nit:125,28--29
-                          ABlockExpr ../src/test_parser.nit:126,5--130,6
-                            AIfExpr ../src/test_parser.nit:126,5--128,7
-                              TKwif "if" ../src/test_parser.nit:126,5--6
-                              ANotExpr ../src/test_parser.nit:126,8--19
-                                TKwnot "not" ../src/test_parser.nit:126,8--10
-                                ACallExpr ../src/test_parser.nit:126,12--19
-                                  AImplicitSelfExpr ../src/test_parser.nit:126,12
-                                  TId "no_print" ../src/test_parser.nit:126,12--19
-                                  AListExprs ../src/test_parser.nit:126,19
-                              ABlockExpr ../src/test_parser.nit:127,6--64
-                                ACallExpr ../src/test_parser.nit:127,6--64
-                                  AImplicitSelfExpr ../src/test_parser.nit:127,6
-                                  TId "print" ../src/test_parser.nit:127,6--10
-                                  AParExprs ../src/test_parser.nit:127,11--64
-                                    TOpar "(" ../src/test_parser.nit:127,11
-                                    ASuperstringExpr ../src/test_parser.nit:127,12--63
-                                      AStartStringExpr ../src/test_parser.nit:127,12--27
-                                        TStartString "\"Read token at {" ../src/test_parser.nit:127,12--27
-                                      ACallExpr ../src/test_parser.nit:127,28--41
-                                        ACallExpr ../src/test_parser.nit:127,28--32
-                                          AImplicitSelfExpr ../src/test_parser.nit:127,28
-                                          TId "token" ../src/test_parser.nit:127,28--32
-                                          AListExprs ../src/test_parser.nit:127,32
-                                        TId "location" ../src/test_parser.nit:127,34--41
-                                        AListExprs ../src/test_parser.nit:127,41
-                                      AMidStringExpr ../src/test_parser.nit:127,42--50
-                                        TMidString "} text=\'{" ../src/test_parser.nit:127,42--50
-                                      ACallExpr ../src/test_parser.nit:127,51--60
-                                        ACallExpr ../src/test_parser.nit:127,51--55
-                                          AImplicitSelfExpr ../src/test_parser.nit:127,51
-                                          TId "token" ../src/test_parser.nit:127,51--55
-                                          AListExprs ../src/test_parser.nit:127,55
-                                        TId "text" ../src/test_parser.nit:127,57--60
-                                        AListExprs ../src/test_parser.nit:127,60
-                                      AEndStringExpr ../src/test_parser.nit:127,61--63
-                                        TEndString "}\'\"" ../src/test_parser.nit:127,61--63
-                                    TCpar ")" ../src/test_parser.nit:127,64
-                              ABlockExpr ../src/test_parser.nit:128,5--7
-                                TKwend "end" ../src/test_parser.nit:128,5--7
-                            ACallAssignExpr ../src/test_parser.nit:129,5--22
-                              AImplicitSelfExpr ../src/test_parser.nit:129,5
-                              TId "token" ../src/test_parser.nit:129,5--9
-                              AListExprs ../src/test_parser.nit:129,11
-                              TAssign "=" ../src/test_parser.nit:129,11
-                              ACallExpr ../src/test_parser.nit:129,13--22
-                                ACallExpr ../src/test_parser.nit:129,13--17
-                                  AImplicitSelfExpr ../src/test_parser.nit:129,13
-                                  TId "lexer" ../src/test_parser.nit:129,13--17
-                                  AListExprs ../src/test_parser.nit:129,17
-                                TId "next" ../src/test_parser.nit:129,19--22
-                                AListExprs ../src/test_parser.nit:129,22
-                            TKwend "end" ../src/test_parser.nit:130,4--6
-                      ABlockExpr ../src/test_parser.nit:132,4--144,5
-                        AVardeclExpr ../src/test_parser.nit:132,4--33
-                          TKwvar "var" ../src/test_parser.nit:132,4--6
-                          TId "parser" ../src/test_parser.nit:132,8--13
-                          TAssign "=" ../src/test_parser.nit:132,15
-                          ANewExpr ../src/test_parser.nit:132,17--33
-                            TKwnew "new" ../src/test_parser.nit:132,17--19
-                            AType ../src/test_parser.nit:132,21--26
-                              TClassid "Parser" ../src/test_parser.nit:132,21--26
-                            AParExprs ../src/test_parser.nit:132,27--33
-                              TOpar "(" ../src/test_parser.nit:132,27
-                              ACallExpr ../src/test_parser.nit:132,28--32
-                                AImplicitSelfExpr ../src/test_parser.nit:132,28
-                                TId "lexer" ../src/test_parser.nit:132,28--32
-                                AListExprs ../src/test_parser.nit:132,32
-                              TCpar ")" ../src/test_parser.nit:132,33
-                        AVardeclExpr ../src/test_parser.nit:133,4--26
-                          TKwvar "var" ../src/test_parser.nit:133,4--6
-                          TId "tree" ../src/test_parser.nit:133,8--11
-                          TAssign "=" ../src/test_parser.nit:133,13
-                          ACallExpr ../src/test_parser.nit:133,15--26
-                            ACallExpr ../src/test_parser.nit:133,15--20
-                              AImplicitSelfExpr ../src/test_parser.nit:133,15
-                              TId "parser" ../src/test_parser.nit:133,15--20
-                              AListExprs ../src/test_parser.nit:133,20
-                            TId "parse" ../src/test_parser.nit:133,22--26
-                            AListExprs ../src/test_parser.nit:133,26
-                        AVardeclExpr ../src/test_parser.nit:135,4--25
-                          TKwvar "var" ../src/test_parser.nit:135,4--6
-                          TId "error" ../src/test_parser.nit:135,8--12
-                          TAssign "=" ../src/test_parser.nit:135,14
-                          ACallExpr ../src/test_parser.nit:135,16--25
-                            ACallExpr ../src/test_parser.nit:135,16--19
-                              AImplicitSelfExpr ../src/test_parser.nit:135,16
-                              TId "tree" ../src/test_parser.nit:135,16--19
-                              AListExprs ../src/test_parser.nit:135,19
-                            TId "n_eof" ../src/test_parser.nit:135,21--25
-                            AListExprs ../src/test_parser.nit:135,25
-                        AIfExpr ../src/test_parser.nit:136,4--139,6
-                          TKwif "if" ../src/test_parser.nit:136,4--5
-                          AIsaExpr ../src/test_parser.nit:136,7--22
-                            ACallExpr ../src/test_parser.nit:136,7--11
-                              AImplicitSelfExpr ../src/test_parser.nit:136,7
-                              TId "error" ../src/test_parser.nit:136,7--11
-                              AListExprs ../src/test_parser.nit:136,11
-                            AType ../src/test_parser.nit:136,17--22
-                              TClassid "AError" ../src/test_parser.nit:136,17--22
-                          ABlockExpr ../src/test_parser.nit:137,5--138,10
-                            ACallExpr ../src/test_parser.nit:137,5--58
-                              AImplicitSelfExpr ../src/test_parser.nit:137,5
-                              TId "print" ../src/test_parser.nit:137,5--9
-                              AParExprs ../src/test_parser.nit:137,10--58
-                                TOpar "(" ../src/test_parser.nit:137,10
-                                ASuperstringExpr ../src/test_parser.nit:137,11--57
-                                  AStartStringExpr ../src/test_parser.nit:137,11--21
-                                    TStartString "\"Error at {" ../src/test_parser.nit:137,11--21
-                                  ACallExpr ../src/test_parser.nit:137,22--35
-                                    ACallExpr ../src/test_parser.nit:137,22--26
-                                      AImplicitSelfExpr ../src/test_parser.nit:137,22
-                                      TId "error" ../src/test_parser.nit:137,22--26
-                                      AListExprs ../src/test_parser.nit:137,26
-                                    TId "location" ../src/test_parser.nit:137,28--35
-                                    AListExprs ../src/test_parser.nit:137,35
-                                  AMidStringExpr ../src/test_parser.nit:137,36--42
-                                    TMidString "}:\\n\\t{" ../src/test_parser.nit:137,36--42
-                                  ACallExpr ../src/test_parser.nit:137,43--55
-                                    ACallExpr ../src/test_parser.nit:137,43--47
-                                      AImplicitSelfExpr ../src/test_parser.nit:137,43
-                                      TId "error" ../src/test_parser.nit:137,43--47
-                                      AListExprs ../src/test_parser.nit:137,47
-                                    TId "message" ../src/test_parser.nit:137,49--55
-                                    AListExprs ../src/test_parser.nit:137,55
-                                  AEndStringExpr ../src/test_parser.nit:137,56--57
-                                    TEndString "}\"" ../src/test_parser.nit:137,56--57
-                                TCpar ")" ../src/test_parser.nit:137,58
-                            AReturnExpr ../src/test_parser.nit:138,5--10
-                              TKwreturn "return" ../src/test_parser.nit:138,5--10
-                          ABlockExpr ../src/test_parser.nit:139,4--6
-                            TKwend "end" ../src/test_parser.nit:139,4--6
-                        AIfExpr ../src/test_parser.nit:141,4--143,6
-                          TKwif "if" ../src/test_parser.nit:141,4--5
-                          ANotExpr ../src/test_parser.nit:141,7--18
-                            TKwnot "not" ../src/test_parser.nit:141,7--9
-                            ACallExpr ../src/test_parser.nit:141,11--18
-                              AImplicitSelfExpr ../src/test_parser.nit:141,11
-                              TId "no_print" ../src/test_parser.nit:141,11--18
-                              AListExprs ../src/test_parser.nit:141,18
-                          ABlockExpr ../src/test_parser.nit:142,5--44
-                            ACallExpr ../src/test_parser.nit:142,5--44
-                              AParExpr ../src/test_parser.nit:142,5--26
-                                TOpar "(" ../src/test_parser.nit:142,5
-                                ANewExpr ../src/test_parser.nit:142,6--25
-                                  TKwnew "new" ../src/test_parser.nit:142,6--8
-                                  AType ../src/test_parser.nit:142,10--25
-                                    TClassid "PrintTreeVisitor" ../src/test_parser.nit:142,10--25
-                                  AListExprs ../src/test_parser.nit:142,25
-                                TCpar ")" ../src/test_parser.nit:142,26
-                              TId "enter_visit" ../src/test_parser.nit:142,28--38
-                              AParExprs ../src/test_parser.nit:142,39--44
-                                TOpar "(" ../src/test_parser.nit:142,39
-                                ACallExpr ../src/test_parser.nit:142,40--43
-                                  AImplicitSelfExpr ../src/test_parser.nit:142,40
-                                  TId "tree" ../src/test_parser.nit:142,40--43
-                                  AListExprs ../src/test_parser.nit:142,43
-                                TCpar ")" ../src/test_parser.nit:142,44
-                          ABlockExpr ../src/test_parser.nit:143,4--6
-                            TKwend "end" ../src/test_parser.nit:143,4--6
-                        TKwend "end" ../src/test_parser.nit:144,3--5
-                    TKwend "end" ../src/test_parser.nit:145,2--4
-                TKwend "end" ../src/test_parser.nit:146,1--3
-  EOF "" ../src/test_parser.nit:147,1
+                          TId "f" ../src/test_parser.nit:124,8
+                          TAssign "=" ../src/test_parser.nit:124,10
+                          ANewExpr ../src/test_parser.nit:124,12--33
+                            TKwnew "new" ../src/test_parser.nit:124,12--14
+                            AType ../src/test_parser.nit:124,16--25
+                              TClassid "FileReader" ../src/test_parser.nit:124,16--25
+                            TId "open" ../src/test_parser.nit:124,27--30
+                            AParExprs ../src/test_parser.nit:124,31--33
+                              TOpar "(" ../src/test_parser.nit:124,31
+                              ACallExpr ../src/test_parser.nit:124,32
+                                AImplicitSelfExpr ../src/test_parser.nit:124,32
+                                TId "a" ../src/test_parser.nit:124,32
+                                AListExprs ../src/test_parser.nit:124,32
+                              TCpar ")" ../src/test_parser.nit:124,33
+                        ACallAssignExpr ../src/test_parser.nit:125,4--32
+                          AImplicitSelfExpr ../src/test_parser.nit:125,4
+                          TId "source" ../src/test_parser.nit:125,4--9
+                          AListExprs ../src/test_parser.nit:125,11
+                          TAssign "=" ../src/test_parser.nit:125,11
+                          ANewExpr ../src/test_parser.nit:125,13--32
+                            TKwnew "new" ../src/test_parser.nit:125,13--15
+                            AType ../src/test_parser.nit:125,17--26
+                              TClassid "SourceFile" ../src/test_parser.nit:125,17--26
+                            AParExprs ../src/test_parser.nit:125,27--32
+                              TOpar "(" ../src/test_parser.nit:125,27
+                              ACallExpr ../src/test_parser.nit:125,28
+                                AImplicitSelfExpr ../src/test_parser.nit:125,28
+                                TId "a" ../src/test_parser.nit:125,28
+                                AListExprs ../src/test_parser.nit:125,28
+                              ACallExpr ../src/test_parser.nit:125,31
+                                AImplicitSelfExpr ../src/test_parser.nit:125,31
+                                TId "f" ../src/test_parser.nit:125,31
+                                AListExprs ../src/test_parser.nit:125,31
+                              TCpar ")" ../src/test_parser.nit:125,32
+                        ACallExpr ../src/test_parser.nit:126,4--10
+                          ACallExpr ../src/test_parser.nit:126,4
+                            AImplicitSelfExpr ../src/test_parser.nit:126,4
+                            TId "f" ../src/test_parser.nit:126,4
+                            AListExprs ../src/test_parser.nit:126,4
+                          TId "close" ../src/test_parser.nit:126,6--10
+                          AListExprs ../src/test_parser.nit:126,10
+                        TKwend "end" ../src/test_parser.nit:127,3--5
+                    AVardeclExpr ../src/test_parser.nit:128,3--31
+                      TKwvar "var" ../src/test_parser.nit:128,3--5
+                      TId "lexer" ../src/test_parser.nit:128,7--11
+                      TAssign "=" ../src/test_parser.nit:128,13
+                      ANewExpr ../src/test_parser.nit:128,15--31
+                        TKwnew "new" ../src/test_parser.nit:128,15--17
+                        AType ../src/test_parser.nit:128,19--23
+                          TClassid "Lexer" ../src/test_parser.nit:128,19--23
+                        AParExprs ../src/test_parser.nit:128,24--31
+                          TOpar "(" ../src/test_parser.nit:128,24
+                          ACallExpr ../src/test_parser.nit:128,25--30
+                            AImplicitSelfExpr ../src/test_parser.nit:128,25
+                            TId "source" ../src/test_parser.nit:128,25--30
+                            AListExprs ../src/test_parser.nit:128,30
+                          TCpar ")" ../src/test_parser.nit:128,31
+                    AIfExpr ../src/test_parser.nit:129,3--153,5
+                      TKwif "if" ../src/test_parser.nit:129,3--4
+                      ACallExpr ../src/test_parser.nit:129,6--15
+                        AImplicitSelfExpr ../src/test_parser.nit:129,6
+                        TId "only_lexer" ../src/test_parser.nit:129,6--15
+                        AListExprs ../src/test_parser.nit:129,15
+                      ABlockExpr ../src/test_parser.nit:130,4--136,6
+                        AVardeclExpr ../src/test_parser.nit:130,4--25
+                          TKwvar "var" ../src/test_parser.nit:130,4--6
+                          TId "token" ../src/test_parser.nit:130,8--12
+                          TAssign "=" ../src/test_parser.nit:130,14
+                          ACallExpr ../src/test_parser.nit:130,16--25
+                            ACallExpr ../src/test_parser.nit:130,16--20
+                              AImplicitSelfExpr ../src/test_parser.nit:130,16
+                              TId "lexer" ../src/test_parser.nit:130,16--20
+                              AListExprs ../src/test_parser.nit:130,20
+                            TId "next" ../src/test_parser.nit:130,22--25
+                            AListExprs ../src/test_parser.nit:130,25
+                        AWhileExpr ../src/test_parser.nit:131,4--136,6
+                          TKwwhile "while" ../src/test_parser.nit:131,4--8
+                          ANotExpr ../src/test_parser.nit:131,10--26
+                            TKwnot "not" ../src/test_parser.nit:131,10--12
+                            AIsaExpr ../src/test_parser.nit:131,14--26
+                              ACallExpr ../src/test_parser.nit:131,14--18
+                                AImplicitSelfExpr ../src/test_parser.nit:131,14
+                                TId "token" ../src/test_parser.nit:131,14--18
+                                AListExprs ../src/test_parser.nit:131,18
+                              TKwisa "isa" ../src/test_parser.nit:131,20--22
+                              AType ../src/test_parser.nit:131,24--26
+                                TClassid "EOF" ../src/test_parser.nit:131,24--26
+                          TKwdo "do" ../src/test_parser.nit:131,28--29
+                          ABlockExpr ../src/test_parser.nit:132,5--136,6
+                            AIfExpr ../src/test_parser.nit:132,5--134,7
+                              TKwif "if" ../src/test_parser.nit:132,5--6
+                              ANotExpr ../src/test_parser.nit:132,8--19
+                                TKwnot "not" ../src/test_parser.nit:132,8--10
+                                ACallExpr ../src/test_parser.nit:132,12--19
+                                  AImplicitSelfExpr ../src/test_parser.nit:132,12
+                                  TId "no_print" ../src/test_parser.nit:132,12--19
+                                  AListExprs ../src/test_parser.nit:132,19
+                              ABlockExpr ../src/test_parser.nit:133,6--64
+                                ACallExpr ../src/test_parser.nit:133,6--64
+                                  AImplicitSelfExpr ../src/test_parser.nit:133,6
+                                  TId "print" ../src/test_parser.nit:133,6--10
+                                  AParExprs ../src/test_parser.nit:133,11--64
+                                    TOpar "(" ../src/test_parser.nit:133,11
+                                    ASuperstringExpr ../src/test_parser.nit:133,12--63
+                                      AStartStringExpr ../src/test_parser.nit:133,12--27
+                                        TStartString "\"Read token at {" ../src/test_parser.nit:133,12--27
+                                      ACallExpr ../src/test_parser.nit:133,28--41
+                                        ACallExpr ../src/test_parser.nit:133,28--32
+                                          AImplicitSelfExpr ../src/test_parser.nit:133,28
+                                          TId "token" ../src/test_parser.nit:133,28--32
+                                          AListExprs ../src/test_parser.nit:133,32
+                                        TId "location" ../src/test_parser.nit:133,34--41
+                                        AListExprs ../src/test_parser.nit:133,41
+                                      AMidStringExpr ../src/test_parser.nit:133,42--50
+                                        TMidString "} text=\'{" ../src/test_parser.nit:133,42--50
+                                      ACallExpr ../src/test_parser.nit:133,51--60
+                                        ACallExpr ../src/test_parser.nit:133,51--55
+                                          AImplicitSelfExpr ../src/test_parser.nit:133,51
+                                          TId "token" ../src/test_parser.nit:133,51--55
+                                          AListExprs ../src/test_parser.nit:133,55
+                                        TId "text" ../src/test_parser.nit:133,57--60
+                                        AListExprs ../src/test_parser.nit:133,60
+                                      AEndStringExpr ../src/test_parser.nit:133,61--63
+                                        TEndString "}\'\"" ../src/test_parser.nit:133,61--63
+                                    TCpar ")" ../src/test_parser.nit:133,64
+                              ABlockExpr ../src/test_parser.nit:134,5--7
+                                TKwend "end" ../src/test_parser.nit:134,5--7
+                            ACallAssignExpr ../src/test_parser.nit:135,5--22
+                              AImplicitSelfExpr ../src/test_parser.nit:135,5
+                              TId "token" ../src/test_parser.nit:135,5--9
+                              AListExprs ../src/test_parser.nit:135,11
+                              TAssign "=" ../src/test_parser.nit:135,11
+                              ACallExpr ../src/test_parser.nit:135,13--22
+                                ACallExpr ../src/test_parser.nit:135,13--17
+                                  AImplicitSelfExpr ../src/test_parser.nit:135,13
+                                  TId "lexer" ../src/test_parser.nit:135,13--17
+                                  AListExprs ../src/test_parser.nit:135,17
+                                TId "next" ../src/test_parser.nit:135,19--22
+                                AListExprs ../src/test_parser.nit:135,22
+                            TKwend "end" ../src/test_parser.nit:136,4--6
+                      ABlockExpr ../src/test_parser.nit:138,4--153,5
+                        AVardeclExpr ../src/test_parser.nit:138,4--33
+                          TKwvar "var" ../src/test_parser.nit:138,4--6
+                          TId "parser" ../src/test_parser.nit:138,8--13
+                          TAssign "=" ../src/test_parser.nit:138,15
+                          ANewExpr ../src/test_parser.nit:138,17--33
+                            TKwnew "new" ../src/test_parser.nit:138,17--19
+                            AType ../src/test_parser.nit:138,21--26
+                              TClassid "Parser" ../src/test_parser.nit:138,21--26
+                            AParExprs ../src/test_parser.nit:138,27--33
+                              TOpar "(" ../src/test_parser.nit:138,27
+                              ACallExpr ../src/test_parser.nit:138,28--32
+                                AImplicitSelfExpr ../src/test_parser.nit:138,28
+                                TId "lexer" ../src/test_parser.nit:138,28--32
+                                AListExprs ../src/test_parser.nit:138,32
+                              TCpar ")" ../src/test_parser.nit:138,33
+                        AVardeclExpr ../src/test_parser.nit:139,4--26
+                          TKwvar "var" ../src/test_parser.nit:139,4--6
+                          TId "tree" ../src/test_parser.nit:139,8--11
+                          TAssign "=" ../src/test_parser.nit:139,13
+                          ACallExpr ../src/test_parser.nit:139,15--26
+                            ACallExpr ../src/test_parser.nit:139,15--20
+                              AImplicitSelfExpr ../src/test_parser.nit:139,15
+                              TId "parser" ../src/test_parser.nit:139,15--20
+                              AListExprs ../src/test_parser.nit:139,20
+                            TId "parse" ../src/test_parser.nit:139,22--26
+                            AListExprs ../src/test_parser.nit:139,26
+                        AVardeclExpr ../src/test_parser.nit:141,4--25
+                          TKwvar "var" ../src/test_parser.nit:141,4--6
+                          TId "error" ../src/test_parser.nit:141,8--12
+                          TAssign "=" ../src/test_parser.nit:141,14
+                          ACallExpr ../src/test_parser.nit:141,16--25
+                            ACallExpr ../src/test_parser.nit:141,16--19
+                              AImplicitSelfExpr ../src/test_parser.nit:141,16
+                              TId "tree" ../src/test_parser.nit:141,16--19
+                              AListExprs ../src/test_parser.nit:141,19
+                            TId "n_eof" ../src/test_parser.nit:141,21--25
+                            AListExprs ../src/test_parser.nit:141,25
+                        AIfExpr ../src/test_parser.nit:142,4--145,6
+                          TKwif "if" ../src/test_parser.nit:142,4--5
+                          AIsaExpr ../src/test_parser.nit:142,7--22
+                            ACallExpr ../src/test_parser.nit:142,7--11
+                              AImplicitSelfExpr ../src/test_parser.nit:142,7
+                              TId "error" ../src/test_parser.nit:142,7--11
+                              AListExprs ../src/test_parser.nit:142,11
+                            TKwisa "isa" ../src/test_parser.nit:142,13--15
+                            AType ../src/test_parser.nit:142,17--22
+                              TClassid "AError" ../src/test_parser.nit:142,17--22
+                          ABlockExpr ../src/test_parser.nit:143,5--144,10
+                            ACallExpr ../src/test_parser.nit:143,5--58
+                              AImplicitSelfExpr ../src/test_parser.nit:143,5
+                              TId "print" ../src/test_parser.nit:143,5--9
+                              AParExprs ../src/test_parser.nit:143,10--58
+                                TOpar "(" ../src/test_parser.nit:143,10
+                                ASuperstringExpr ../src/test_parser.nit:143,11--57
+                                  AStartStringExpr ../src/test_parser.nit:143,11--21
+                                    TStartString "\"Error at {" ../src/test_parser.nit:143,11--21
+                                  ACallExpr ../src/test_parser.nit:143,22--35
+                                    ACallExpr ../src/test_parser.nit:143,22--26
+                                      AImplicitSelfExpr ../src/test_parser.nit:143,22
+                                      TId "error" ../src/test_parser.nit:143,22--26
+                                      AListExprs ../src/test_parser.nit:143,26
+                                    TId "location" ../src/test_parser.nit:143,28--35
+                                    AListExprs ../src/test_parser.nit:143,35
+                                  AMidStringExpr ../src/test_parser.nit:143,36--42
+                                    TMidString "}:\\n\\t{" ../src/test_parser.nit:143,36--42
+                                  ACallExpr ../src/test_parser.nit:143,43--55
+                                    ACallExpr ../src/test_parser.nit:143,43--47
+                                      AImplicitSelfExpr ../src/test_parser.nit:143,43
+                                      TId "error" ../src/test_parser.nit:143,43--47
+                                      AListExprs ../src/test_parser.nit:143,47
+                                    TId "message" ../src/test_parser.nit:143,49--55
+                                    AListExprs ../src/test_parser.nit:143,55
+                                  AEndStringExpr ../src/test_parser.nit:143,56--57
+                                    TEndString "}\"" ../src/test_parser.nit:143,56--57
+                                TCpar ")" ../src/test_parser.nit:143,58
+                            AReturnExpr ../src/test_parser.nit:144,5--10
+                              TKwreturn "return" ../src/test_parser.nit:144,5--10
+                          ABlockExpr ../src/test_parser.nit:145,4--6
+                            TKwend "end" ../src/test_parser.nit:145,4--6
+                        AIfExpr ../src/test_parser.nit:147,4--152,6
+                          TKwif "if" ../src/test_parser.nit:147,4--5
+                          ACallExpr ../src/test_parser.nit:147,7--9
+                            AImplicitSelfExpr ../src/test_parser.nit:147,7
+                            TId "xml" ../src/test_parser.nit:147,7--9
+                            AListExprs ../src/test_parser.nit:147,9
+                          ABlockExpr ../src/test_parser.nit:148,5--149,32
+                            ACallExpr ../src/test_parser.nit:148,5--25
+                              ACallExpr ../src/test_parser.nit:148,5--8
+                                AImplicitSelfExpr ../src/test_parser.nit:148,5
+                                TId "tree" ../src/test_parser.nit:148,5--8
+                                AListExprs ../src/test_parser.nit:148,8
+                              TId "parentize_tokens" ../src/test_parser.nit:148,10--25
+                              AListExprs ../src/test_parser.nit:148,25
+                            ACallExpr ../src/test_parser.nit:149,5--32
+                              ACallExpr ../src/test_parser.nit:149,5--15
+                                ACallExpr ../src/test_parser.nit:149,5--8
+                                  AImplicitSelfExpr ../src/test_parser.nit:149,5
+                                  TId "tree" ../src/test_parser.nit:149,5--8
+                                  AListExprs ../src/test_parser.nit:149,8
+                                TId "to_xml" ../src/test_parser.nit:149,10--15
+                                AListExprs ../src/test_parser.nit:149,15
+                              TId "write_to" ../src/test_parser.nit:149,17--24
+                              AParExprs ../src/test_parser.nit:149,25--32
+                                TOpar "(" ../src/test_parser.nit:149,25
+                                ACallExpr ../src/test_parser.nit:149,26--31
+                                  AImplicitSelfExpr ../src/test_parser.nit:149,26
+                                  TId "stdout" ../src/test_parser.nit:149,26--31
+                                  AListExprs ../src/test_parser.nit:149,31
+                                TCpar ")" ../src/test_parser.nit:149,32
+                          AIfExpr ../src/test_parser.nit:150,9--152,6
+                            TKwif "if" ../src/test_parser.nit:150,9--10
+                            ANotExpr ../src/test_parser.nit:150,12--23
+                              TKwnot "not" ../src/test_parser.nit:150,12--14
+                              ACallExpr ../src/test_parser.nit:150,16--23
+                                AImplicitSelfExpr ../src/test_parser.nit:150,16
+                                TId "no_print" ../src/test_parser.nit:150,16--23
+                                AListExprs ../src/test_parser.nit:150,23
+                            ABlockExpr ../src/test_parser.nit:151,5--44
+                              ACallExpr ../src/test_parser.nit:151,5--44
+                                AParExpr ../src/test_parser.nit:151,5--26
+                                  TOpar "(" ../src/test_parser.nit:151,5
+                                  ANewExpr ../src/test_parser.nit:151,6--25
+                                    TKwnew "new" ../src/test_parser.nit:151,6--8
+                                    AType ../src/test_parser.nit:151,10--25
+                                      TClassid "PrintTreeVisitor" ../src/test_parser.nit:151,10--25
+                                    AListExprs ../src/test_parser.nit:151,25
+                                  TCpar ")" ../src/test_parser.nit:151,26
+                                TId "enter_visit" ../src/test_parser.nit:151,28--38
+                                AParExprs ../src/test_parser.nit:151,39--44
+                                  TOpar "(" ../src/test_parser.nit:151,39
+                                  ACallExpr ../src/test_parser.nit:151,40--43
+                                    AImplicitSelfExpr ../src/test_parser.nit:151,40
+                                    TId "tree" ../src/test_parser.nit:151,40--43
+                                    AListExprs ../src/test_parser.nit:151,43
+                                  TCpar ")" ../src/test_parser.nit:151,44
+                            ABlockExpr ../src/test_parser.nit:152,4--6
+                              TKwend "end" ../src/test_parser.nit:152,4--6
+                        TKwend "end" ../src/test_parser.nit:153,3--5
+                    TKwend "end" ../src/test_parser.nit:154,2--4
+                TKwend "end" ../src/test_parser.nit:155,1--3
+  EOF "" ../src/test_parser.nit:156,1
index 32c94e3..77b3c81 100644 (file)
@@ -46,73 +46,48 @@ Read token at ../src/test_parser.nit:21,1--6 text='import'
 Read token at ../src/test_parser.nit:21,8--18 text='parser_util'
 Read token at ../src/test_parser.nit:21,19--22,0 text='
 '
-Read token at ../src/test_parser.nit:22,1--23,0 text='
-'
-Read token at ../src/test_parser.nit:23,1--5 text='class'
-Read token at ../src/test_parser.nit:23,7--22 text='PrintTreeVisitor'
-Read token at ../src/test_parser.nit:23,23--24,0 text='
-'
-Read token at ../src/test_parser.nit:24,2--6 text='super'
-Read token at ../src/test_parser.nit:24,8--14 text='Visitor'
-Read token at ../src/test_parser.nit:24,15--25,0 text='
-'
-Read token at ../src/test_parser.nit:25,2--8 text='private'
-Read token at ../src/test_parser.nit:25,10--12 text='var'
-Read token at ../src/test_parser.nit:25,14--17 text='rank'
-Read token at ../src/test_parser.nit:25,18 text=':'
-Read token at ../src/test_parser.nit:25,20--22 text='Int'
-Read token at ../src/test_parser.nit:25,24 text='='
-Read token at ../src/test_parser.nit:25,26 text='0'
-Read token at ../src/test_parser.nit:25,27--26,0 text='
-'
-Read token at ../src/test_parser.nit:26,2--6 text='redef'
-Read token at ../src/test_parser.nit:26,8--10 text='fun'
-Read token at ../src/test_parser.nit:26,12--16 text='visit'
-Read token at ../src/test_parser.nit:26,17 text='('
-Read token at ../src/test_parser.nit:26,18 text='n'
-Read token at ../src/test_parser.nit:26,19 text=')'
-Read token at ../src/test_parser.nit:26,20--27,0 text='
-'
-Read token at ../src/test_parser.nit:27,2--3 text='do'
-Read token at ../src/test_parser.nit:27,4--28,0 text='
-'
-Read token at ../src/test_parser.nit:28,3--4 text='if'
-Read token at ../src/test_parser.nit:28,6 text='n'
-Read token at ../src/test_parser.nit:28,8--10 text='isa'
-Read token at ../src/test_parser.nit:28,12--16 text='Token'
-Read token at ../src/test_parser.nit:28,18--21 text='then'
-Read token at ../src/test_parser.nit:28,22--29,0 text='
-'
-Read token at ../src/test_parser.nit:29,4--9 text='printn'
-Read token at ../src/test_parser.nit:29,10 text='('
-Read token at ../src/test_parser.nit:29,11--14 text='"  "'
-Read token at ../src/test_parser.nit:29,16 text='*'
-Read token at ../src/test_parser.nit:29,18--21 text='rank'
-Read token at ../src/test_parser.nit:29,22 text=','
-Read token at ../src/test_parser.nit:29,24 text='n'
-Read token at ../src/test_parser.nit:29,25 text='.'
-Read token at ../src/test_parser.nit:29,26--35 text='class_name'
-Read token at ../src/test_parser.nit:29,36 text=','
-Read token at ../src/test_parser.nit:29,38--42 text='" \""'
-Read token at ../src/test_parser.nit:29,43 text=','
-Read token at ../src/test_parser.nit:29,45 text='n'
-Read token at ../src/test_parser.nit:29,46 text='.'
-Read token at ../src/test_parser.nit:29,47--50 text='text'
-Read token at ../src/test_parser.nit:29,51 text='.'
-Read token at ../src/test_parser.nit:29,52--62 text='escape_to_c'
-Read token at ../src/test_parser.nit:29,63 text=','
-Read token at ../src/test_parser.nit:29,65--69 text='"\" "'
-Read token at ../src/test_parser.nit:29,70 text=','
-Read token at ../src/test_parser.nit:29,72 text='n'
-Read token at ../src/test_parser.nit:29,73 text='.'
-Read token at ../src/test_parser.nit:29,74--81 text='location'
-Read token at ../src/test_parser.nit:29,82 text=','
-Read token at ../src/test_parser.nit:29,84--87 text='"\n"'
-Read token at ../src/test_parser.nit:29,88 text=')'
-Read token at ../src/test_parser.nit:29,89--30,0 text='
-'
-Read token at ../src/test_parser.nit:30,3--6 text='else'
-Read token at ../src/test_parser.nit:30,7--31,0 text='
+Read token at ../src/test_parser.nit:22,1--6 text='import'
+Read token at ../src/test_parser.nit:22,8--14 text='astutil'
+Read token at ../src/test_parser.nit:22,15--23,0 text='
+'
+Read token at ../src/test_parser.nit:23,1--24,0 text='
+'
+Read token at ../src/test_parser.nit:24,1--25,0 text='# A basic visitor that prints AST trees to the screen
+'
+Read token at ../src/test_parser.nit:25,1--5 text='class'
+Read token at ../src/test_parser.nit:25,7--22 text='PrintTreeVisitor'
+Read token at ../src/test_parser.nit:25,23--26,0 text='
+'
+Read token at ../src/test_parser.nit:26,2--6 text='super'
+Read token at ../src/test_parser.nit:26,8--14 text='Visitor'
+Read token at ../src/test_parser.nit:26,15--27,0 text='
+'
+Read token at ../src/test_parser.nit:27,2--8 text='private'
+Read token at ../src/test_parser.nit:27,10--12 text='var'
+Read token at ../src/test_parser.nit:27,14--17 text='rank'
+Read token at ../src/test_parser.nit:27,18 text=':'
+Read token at ../src/test_parser.nit:27,20--22 text='Int'
+Read token at ../src/test_parser.nit:27,24 text='='
+Read token at ../src/test_parser.nit:27,26 text='0'
+Read token at ../src/test_parser.nit:27,27--28,0 text='
+'
+Read token at ../src/test_parser.nit:28,2--6 text='redef'
+Read token at ../src/test_parser.nit:28,8--10 text='fun'
+Read token at ../src/test_parser.nit:28,12--16 text='visit'
+Read token at ../src/test_parser.nit:28,17 text='('
+Read token at ../src/test_parser.nit:28,18 text='n'
+Read token at ../src/test_parser.nit:28,19 text=')'
+Read token at ../src/test_parser.nit:28,20--29,0 text='
+'
+Read token at ../src/test_parser.nit:29,2--3 text='do'
+Read token at ../src/test_parser.nit:29,4--30,0 text='
+'
+Read token at ../src/test_parser.nit:30,3--4 text='if'
+Read token at ../src/test_parser.nit:30,6 text='n'
+Read token at ../src/test_parser.nit:30,8--10 text='isa'
+Read token at ../src/test_parser.nit:30,12--16 text='Token'
+Read token at ../src/test_parser.nit:30,18--21 text='then'
+Read token at ../src/test_parser.nit:30,22--31,0 text='
 '
 Read token at ../src/test_parser.nit:31,4--9 text='printn'
 Read token at ../src/test_parser.nit:31,10 text='('
@@ -124,700 +99,779 @@ Read token at ../src/test_parser.nit:31,24 text='n'
 Read token at ../src/test_parser.nit:31,25 text='.'
 Read token at ../src/test_parser.nit:31,26--35 text='class_name'
 Read token at ../src/test_parser.nit:31,36 text=','
-Read token at ../src/test_parser.nit:31,38--40 text='" "'
-Read token at ../src/test_parser.nit:31,41 text=','
-Read token at ../src/test_parser.nit:31,43 text='n'
-Read token at ../src/test_parser.nit:31,44 text='.'
-Read token at ../src/test_parser.nit:31,45--52 text='location'
-Read token at ../src/test_parser.nit:31,53 text=','
-Read token at ../src/test_parser.nit:31,55--58 text='"\n"'
-Read token at ../src/test_parser.nit:31,59 text=')'
-Read token at ../src/test_parser.nit:31,60--32,0 text='
-'
-Read token at ../src/test_parser.nit:32,3--5 text='end'
-Read token at ../src/test_parser.nit:32,6--33,0 text='
-'
-Read token at ../src/test_parser.nit:33,3--6 text='rank'
-Read token at ../src/test_parser.nit:33,8 text='='
-Read token at ../src/test_parser.nit:33,10--13 text='rank'
-Read token at ../src/test_parser.nit:33,15 text='+'
-Read token at ../src/test_parser.nit:33,17 text='1'
-Read token at ../src/test_parser.nit:33,18--34,0 text='
-'
-Read token at ../src/test_parser.nit:34,3 text='n'
-Read token at ../src/test_parser.nit:34,4 text='.'
-Read token at ../src/test_parser.nit:34,5--13 text='visit_all'
-Read token at ../src/test_parser.nit:34,14 text='('
-Read token at ../src/test_parser.nit:34,15--18 text='self'
-Read token at ../src/test_parser.nit:34,19 text=')'
-Read token at ../src/test_parser.nit:34,20--35,0 text='
+Read token at ../src/test_parser.nit:31,38--42 text='" \""'
+Read token at ../src/test_parser.nit:31,43 text=','
+Read token at ../src/test_parser.nit:31,45 text='n'
+Read token at ../src/test_parser.nit:31,46 text='.'
+Read token at ../src/test_parser.nit:31,47--50 text='text'
+Read token at ../src/test_parser.nit:31,51 text='.'
+Read token at ../src/test_parser.nit:31,52--62 text='escape_to_c'
+Read token at ../src/test_parser.nit:31,63 text=','
+Read token at ../src/test_parser.nit:31,65--69 text='"\" "'
+Read token at ../src/test_parser.nit:31,70 text=','
+Read token at ../src/test_parser.nit:31,72 text='n'
+Read token at ../src/test_parser.nit:31,73 text='.'
+Read token at ../src/test_parser.nit:31,74--81 text='location'
+Read token at ../src/test_parser.nit:31,82 text=','
+Read token at ../src/test_parser.nit:31,84--87 text='"\n"'
+Read token at ../src/test_parser.nit:31,88 text=')'
+Read token at ../src/test_parser.nit:31,89--32,0 text='
+'
+Read token at ../src/test_parser.nit:32,3--6 text='else'
+Read token at ../src/test_parser.nit:32,7--33,0 text='
+'
+Read token at ../src/test_parser.nit:33,4--9 text='printn'
+Read token at ../src/test_parser.nit:33,10 text='('
+Read token at ../src/test_parser.nit:33,11--14 text='"  "'
+Read token at ../src/test_parser.nit:33,16 text='*'
+Read token at ../src/test_parser.nit:33,18--21 text='rank'
+Read token at ../src/test_parser.nit:33,22 text=','
+Read token at ../src/test_parser.nit:33,24 text='n'
+Read token at ../src/test_parser.nit:33,25 text='.'
+Read token at ../src/test_parser.nit:33,26--35 text='class_name'
+Read token at ../src/test_parser.nit:33,36 text=','
+Read token at ../src/test_parser.nit:33,38--40 text='" "'
+Read token at ../src/test_parser.nit:33,41 text=','
+Read token at ../src/test_parser.nit:33,43 text='n'
+Read token at ../src/test_parser.nit:33,44 text='.'
+Read token at ../src/test_parser.nit:33,45--52 text='location'
+Read token at ../src/test_parser.nit:33,53 text=','
+Read token at ../src/test_parser.nit:33,55--58 text='"\n"'
+Read token at ../src/test_parser.nit:33,59 text=')'
+Read token at ../src/test_parser.nit:33,60--34,0 text='
+'
+Read token at ../src/test_parser.nit:34,3--5 text='end'
+Read token at ../src/test_parser.nit:34,6--35,0 text='
 '
 Read token at ../src/test_parser.nit:35,3--6 text='rank'
 Read token at ../src/test_parser.nit:35,8 text='='
 Read token at ../src/test_parser.nit:35,10--13 text='rank'
-Read token at ../src/test_parser.nit:35,15 text='-'
+Read token at ../src/test_parser.nit:35,15 text='+'
 Read token at ../src/test_parser.nit:35,17 text='1'
 Read token at ../src/test_parser.nit:35,18--36,0 text='
 '
-Read token at ../src/test_parser.nit:36,2--4 text='end'
-Read token at ../src/test_parser.nit:36,5--37,0 text='
+Read token at ../src/test_parser.nit:36,3 text='n'
+Read token at ../src/test_parser.nit:36,4 text='.'
+Read token at ../src/test_parser.nit:36,5--13 text='visit_all'
+Read token at ../src/test_parser.nit:36,14 text='('
+Read token at ../src/test_parser.nit:36,15--18 text='self'
+Read token at ../src/test_parser.nit:36,19 text=')'
+Read token at ../src/test_parser.nit:36,20--37,0 text='
 '
-Read token at ../src/test_parser.nit:37,1--3 text='end'
-Read token at ../src/test_parser.nit:37,4--38,0 text='
+Read token at ../src/test_parser.nit:37,3--6 text='rank'
+Read token at ../src/test_parser.nit:37,8 text='='
+Read token at ../src/test_parser.nit:37,10--13 text='rank'
+Read token at ../src/test_parser.nit:37,15 text='-'
+Read token at ../src/test_parser.nit:37,17 text='1'
+Read token at ../src/test_parser.nit:37,18--38,0 text='
 '
-Read token at ../src/test_parser.nit:38,1--39,0 text='
+Read token at ../src/test_parser.nit:38,2--4 text='end'
+Read token at ../src/test_parser.nit:38,5--39,0 text='
 '
-Read token at ../src/test_parser.nit:39,1--3 text='var'
-Read token at ../src/test_parser.nit:39,5--12 text='no_print'
-Read token at ../src/test_parser.nit:39,14 text='='
-Read token at ../src/test_parser.nit:39,16--20 text='false'
-Read token at ../src/test_parser.nit:39,21--40,0 text='
+Read token at ../src/test_parser.nit:39,1--3 text='end'
+Read token at ../src/test_parser.nit:39,4--40,0 text='
 '
-Read token at ../src/test_parser.nit:40,1--3 text='var'
-Read token at ../src/test_parser.nit:40,5--14 text='only_lexer'
-Read token at ../src/test_parser.nit:40,16 text='='
-Read token at ../src/test_parser.nit:40,18--22 text='false'
-Read token at ../src/test_parser.nit:40,23--41,0 text='
+Read token at ../src/test_parser.nit:40,1--41,0 text='
 '
 Read token at ../src/test_parser.nit:41,1--3 text='var'
-Read token at ../src/test_parser.nit:41,5--13 text='need_help'
-Read token at ../src/test_parser.nit:41,15 text='='
-Read token at ../src/test_parser.nit:41,17--21 text='false'
-Read token at ../src/test_parser.nit:41,22--42,0 text='
+Read token at ../src/test_parser.nit:41,5--12 text='no_print'
+Read token at ../src/test_parser.nit:41,14 text='='
+Read token at ../src/test_parser.nit:41,16--20 text='false'
+Read token at ../src/test_parser.nit:41,21--42,0 text='
 '
 Read token at ../src/test_parser.nit:42,1--3 text='var'
-Read token at ../src/test_parser.nit:42,5--11 text='no_file'
-Read token at ../src/test_parser.nit:42,13 text='='
-Read token at ../src/test_parser.nit:42,15--19 text='false'
-Read token at ../src/test_parser.nit:42,20--43,0 text='
+Read token at ../src/test_parser.nit:42,5--14 text='only_lexer'
+Read token at ../src/test_parser.nit:42,16 text='='
+Read token at ../src/test_parser.nit:42,18--22 text='false'
+Read token at ../src/test_parser.nit:42,23--43,0 text='
 '
 Read token at ../src/test_parser.nit:43,1--3 text='var'
-Read token at ../src/test_parser.nit:43,5--15 text='interactive'
-Read token at ../src/test_parser.nit:43,17 text='='
-Read token at ../src/test_parser.nit:43,19--23 text='false'
-Read token at ../src/test_parser.nit:43,24--44,0 text='
-'
-Read token at ../src/test_parser.nit:44,1--45,0 text='
-'
-Read token at ../src/test_parser.nit:45,1--5 text='while'
-Read token at ../src/test_parser.nit:45,7--9 text='not'
-Read token at ../src/test_parser.nit:45,11--14 text='args'
-Read token at ../src/test_parser.nit:45,15 text='.'
-Read token at ../src/test_parser.nit:45,16--23 text='is_empty'
-Read token at ../src/test_parser.nit:45,25--27 text='and'
-Read token at ../src/test_parser.nit:45,29--32 text='args'
-Read token at ../src/test_parser.nit:45,33 text='.'
-Read token at ../src/test_parser.nit:45,34--38 text='first'
-Read token at ../src/test_parser.nit:45,39 text='.'
-Read token at ../src/test_parser.nit:45,40--44 text='chars'
-Read token at ../src/test_parser.nit:45,45 text='.'
-Read token at ../src/test_parser.nit:45,46--50 text='first'
-Read token at ../src/test_parser.nit:45,52--53 text='=='
-Read token at ../src/test_parser.nit:45,55--57 text=''-''
-Read token at ../src/test_parser.nit:45,59--60 text='do'
-Read token at ../src/test_parser.nit:45,61--46,0 text='
-'
-Read token at ../src/test_parser.nit:46,2--3 text='if'
-Read token at ../src/test_parser.nit:46,5--8 text='args'
-Read token at ../src/test_parser.nit:46,9 text='.'
-Read token at ../src/test_parser.nit:46,10--14 text='first'
-Read token at ../src/test_parser.nit:46,16--17 text='=='
-Read token at ../src/test_parser.nit:46,19--22 text='"-n"'
-Read token at ../src/test_parser.nit:46,24--27 text='then'
-Read token at ../src/test_parser.nit:46,28--47,0 text='
-'
-Read token at ../src/test_parser.nit:47,3--10 text='no_print'
-Read token at ../src/test_parser.nit:47,12 text='='
-Read token at ../src/test_parser.nit:47,14--17 text='true'
-Read token at ../src/test_parser.nit:47,18--48,0 text='
-'
-Read token at ../src/test_parser.nit:48,2--5 text='else'
-Read token at ../src/test_parser.nit:48,7--8 text='if'
-Read token at ../src/test_parser.nit:48,10--13 text='args'
-Read token at ../src/test_parser.nit:48,14 text='.'
-Read token at ../src/test_parser.nit:48,15--19 text='first'
-Read token at ../src/test_parser.nit:48,21--22 text='=='
-Read token at ../src/test_parser.nit:48,24--27 text='"-l"'
-Read token at ../src/test_parser.nit:48,29--32 text='then'
-Read token at ../src/test_parser.nit:48,33--49,0 text='
-'
-Read token at ../src/test_parser.nit:49,3--12 text='only_lexer'
-Read token at ../src/test_parser.nit:49,14 text='='
-Read token at ../src/test_parser.nit:49,16--19 text='true'
-Read token at ../src/test_parser.nit:49,20--50,0 text='
-'
-Read token at ../src/test_parser.nit:50,2--5 text='else'
-Read token at ../src/test_parser.nit:50,7--8 text='if'
-Read token at ../src/test_parser.nit:50,10--13 text='args'
-Read token at ../src/test_parser.nit:50,14 text='.'
-Read token at ../src/test_parser.nit:50,15--19 text='first'
-Read token at ../src/test_parser.nit:50,21--22 text='=='
-Read token at ../src/test_parser.nit:50,24--27 text='"-p"'
-Read token at ../src/test_parser.nit:50,29--32 text='then'
-Read token at ../src/test_parser.nit:50,33--51,0 text='
-'
-Read token at ../src/test_parser.nit:51,3--12 text='only_lexer'
-Read token at ../src/test_parser.nit:51,14 text='='
-Read token at ../src/test_parser.nit:51,16--20 text='false'
-Read token at ../src/test_parser.nit:51,21--52,0 text='
-'
-Read token at ../src/test_parser.nit:52,2--5 text='else'
-Read token at ../src/test_parser.nit:52,7--8 text='if'
-Read token at ../src/test_parser.nit:52,10--13 text='args'
-Read token at ../src/test_parser.nit:52,14 text='.'
-Read token at ../src/test_parser.nit:52,15--19 text='first'
-Read token at ../src/test_parser.nit:52,21--22 text='=='
-Read token at ../src/test_parser.nit:52,24--27 text='"-e"'
-Read token at ../src/test_parser.nit:52,29--32 text='then'
-Read token at ../src/test_parser.nit:52,33--53,0 text='
-'
-Read token at ../src/test_parser.nit:53,3--9 text='no_file'
-Read token at ../src/test_parser.nit:53,11 text='='
-Read token at ../src/test_parser.nit:53,13--16 text='true'
-Read token at ../src/test_parser.nit:53,17--54,0 text='
-'
-Read token at ../src/test_parser.nit:54,2--5 text='else'
-Read token at ../src/test_parser.nit:54,7--8 text='if'
-Read token at ../src/test_parser.nit:54,10--13 text='args'
-Read token at ../src/test_parser.nit:54,14 text='.'
-Read token at ../src/test_parser.nit:54,15--19 text='first'
-Read token at ../src/test_parser.nit:54,21--22 text='=='
-Read token at ../src/test_parser.nit:54,24--27 text='"-i"'
-Read token at ../src/test_parser.nit:54,29--32 text='then'
-Read token at ../src/test_parser.nit:54,33--55,0 text='
-'
-Read token at ../src/test_parser.nit:55,3--13 text='interactive'
-Read token at ../src/test_parser.nit:55,15 text='='
-Read token at ../src/test_parser.nit:55,17--20 text='true'
-Read token at ../src/test_parser.nit:55,21--56,0 text='
-'
-Read token at ../src/test_parser.nit:56,2--5 text='else'
-Read token at ../src/test_parser.nit:56,7--8 text='if'
-Read token at ../src/test_parser.nit:56,10--13 text='args'
-Read token at ../src/test_parser.nit:56,14 text='.'
-Read token at ../src/test_parser.nit:56,15--19 text='first'
-Read token at ../src/test_parser.nit:56,21--22 text='=='
-Read token at ../src/test_parser.nit:56,24--27 text='"-h"'
-Read token at ../src/test_parser.nit:56,29--30 text='or'
-Read token at ../src/test_parser.nit:56,32--35 text='args'
-Read token at ../src/test_parser.nit:56,36 text='.'
-Read token at ../src/test_parser.nit:56,37--41 text='first'
-Read token at ../src/test_parser.nit:56,43--44 text='=='
-Read token at ../src/test_parser.nit:56,46--49 text='"-?"'
-Read token at ../src/test_parser.nit:56,51--54 text='then'
-Read token at ../src/test_parser.nit:56,55--57,0 text='
-'
-Read token at ../src/test_parser.nit:57,3--11 text='need_help'
-Read token at ../src/test_parser.nit:57,13 text='='
-Read token at ../src/test_parser.nit:57,15--18 text='true'
-Read token at ../src/test_parser.nit:57,19--58,0 text='
-'
-Read token at ../src/test_parser.nit:58,2--5 text='else'
-Read token at ../src/test_parser.nit:58,6--59,0 text='
-'
-Read token at ../src/test_parser.nit:59,3--8 text='stderr'
-Read token at ../src/test_parser.nit:59,9 text='.'
-Read token at ../src/test_parser.nit:59,10--14 text='write'
-Read token at ../src/test_parser.nit:59,15 text='('
-Read token at ../src/test_parser.nit:59,16--32 text='"Unknown option {'
-Read token at ../src/test_parser.nit:59,33--36 text='args'
-Read token at ../src/test_parser.nit:59,37 text='.'
-Read token at ../src/test_parser.nit:59,38--42 text='first'
-Read token at ../src/test_parser.nit:59,43--47 text='}.\n"'
-Read token at ../src/test_parser.nit:59,48 text=')'
-Read token at ../src/test_parser.nit:59,49--60,0 text='
-'
-Read token at ../src/test_parser.nit:60,3--6 text='exit'
-Read token at ../src/test_parser.nit:60,7 text='('
-Read token at ../src/test_parser.nit:60,8 text='0'
-Read token at ../src/test_parser.nit:60,9 text=')'
-Read token at ../src/test_parser.nit:60,10--61,0 text='
-'
-Read token at ../src/test_parser.nit:61,2--4 text='end'
-Read token at ../src/test_parser.nit:61,5--62,0 text='
-'
-Read token at ../src/test_parser.nit:62,2--5 text='args'
-Read token at ../src/test_parser.nit:62,6 text='.'
-Read token at ../src/test_parser.nit:62,7--11 text='shift'
-Read token at ../src/test_parser.nit:62,12--63,0 text='
-'
-Read token at ../src/test_parser.nit:63,1--3 text='end'
-Read token at ../src/test_parser.nit:63,4--64,0 text='
-'
-Read token at ../src/test_parser.nit:64,1--65,0 text='
-'
-Read token at ../src/test_parser.nit:65,1--2 text='if'
-Read token at ../src/test_parser.nit:65,4 text='('
-Read token at ../src/test_parser.nit:65,5--8 text='args'
-Read token at ../src/test_parser.nit:65,9 text='.'
-Read token at ../src/test_parser.nit:65,10--17 text='is_empty'
-Read token at ../src/test_parser.nit:65,19--21 text='and'
-Read token at ../src/test_parser.nit:65,23--25 text='not'
-Read token at ../src/test_parser.nit:65,27--37 text='interactive'
-Read token at ../src/test_parser.nit:65,38 text=')'
-Read token at ../src/test_parser.nit:65,40--41 text='or'
-Read token at ../src/test_parser.nit:65,43--51 text='need_help'
-Read token at ../src/test_parser.nit:65,53--56 text='then'
-Read token at ../src/test_parser.nit:65,57--66,0 text='
-'
-Read token at ../src/test_parser.nit:66,2--6 text='print'
-Read token at ../src/test_parser.nit:66,7 text='('
-Read token at ../src/test_parser.nit:66,8--15 text='"usage:"'
-Read token at ../src/test_parser.nit:66,16 text=')'
-Read token at ../src/test_parser.nit:66,17--67,0 text='
-'
-Read token at ../src/test_parser.nit:67,2--6 text='print'
-Read token at ../src/test_parser.nit:67,7 text='('
-Read token at ../src/test_parser.nit:67,8--53 text='"  test_parser [options]... <filename.nit>..."'
-Read token at ../src/test_parser.nit:67,54 text=')'
-Read token at ../src/test_parser.nit:67,55--68,0 text='
-'
-Read token at ../src/test_parser.nit:68,2--6 text='print'
-Read token at ../src/test_parser.nit:68,7 text='('
-Read token at ../src/test_parser.nit:68,8--48 text='"  test_parser -e [options]... <text>..."'
-Read token at ../src/test_parser.nit:68,49 text=')'
-Read token at ../src/test_parser.nit:68,50--69,0 text='
-'
-Read token at ../src/test_parser.nit:69,2--6 text='print'
-Read token at ../src/test_parser.nit:69,7 text='('
-Read token at ../src/test_parser.nit:69,8--38 text='"  test_parser -i [options]..."'
-Read token at ../src/test_parser.nit:69,39 text=')'
-Read token at ../src/test_parser.nit:69,40--70,0 text='
-'
-Read token at ../src/test_parser.nit:70,2--6 text='print'
-Read token at ../src/test_parser.nit:70,7 text='('
-Read token at ../src/test_parser.nit:70,8--17 text='"options:"'
-Read token at ../src/test_parser.nit:70,18 text=')'
-Read token at ../src/test_parser.nit:70,19--71,0 text='
+Read token at ../src/test_parser.nit:43,5--13 text='need_help'
+Read token at ../src/test_parser.nit:43,15 text='='
+Read token at ../src/test_parser.nit:43,17--21 text='false'
+Read token at ../src/test_parser.nit:43,22--44,0 text='
+'
+Read token at ../src/test_parser.nit:44,1--3 text='var'
+Read token at ../src/test_parser.nit:44,5--11 text='no_file'
+Read token at ../src/test_parser.nit:44,13 text='='
+Read token at ../src/test_parser.nit:44,15--19 text='false'
+Read token at ../src/test_parser.nit:44,20--45,0 text='
+'
+Read token at ../src/test_parser.nit:45,1--3 text='var'
+Read token at ../src/test_parser.nit:45,5--15 text='interactive'
+Read token at ../src/test_parser.nit:45,17 text='='
+Read token at ../src/test_parser.nit:45,19--23 text='false'
+Read token at ../src/test_parser.nit:45,24--46,0 text='
+'
+Read token at ../src/test_parser.nit:46,1--3 text='var'
+Read token at ../src/test_parser.nit:46,5--7 text='xml'
+Read token at ../src/test_parser.nit:46,9 text='='
+Read token at ../src/test_parser.nit:46,11--15 text='false'
+Read token at ../src/test_parser.nit:46,16--47,0 text='
+'
+Read token at ../src/test_parser.nit:47,1--48,0 text='
+'
+Read token at ../src/test_parser.nit:48,1--5 text='while'
+Read token at ../src/test_parser.nit:48,7--9 text='not'
+Read token at ../src/test_parser.nit:48,11--14 text='args'
+Read token at ../src/test_parser.nit:48,15 text='.'
+Read token at ../src/test_parser.nit:48,16--23 text='is_empty'
+Read token at ../src/test_parser.nit:48,25--27 text='and'
+Read token at ../src/test_parser.nit:48,29--32 text='args'
+Read token at ../src/test_parser.nit:48,33 text='.'
+Read token at ../src/test_parser.nit:48,34--38 text='first'
+Read token at ../src/test_parser.nit:48,39 text='.'
+Read token at ../src/test_parser.nit:48,40--44 text='chars'
+Read token at ../src/test_parser.nit:48,45 text='.'
+Read token at ../src/test_parser.nit:48,46--50 text='first'
+Read token at ../src/test_parser.nit:48,52--53 text='=='
+Read token at ../src/test_parser.nit:48,55--57 text=''-''
+Read token at ../src/test_parser.nit:48,59--60 text='do'
+Read token at ../src/test_parser.nit:48,61--49,0 text='
+'
+Read token at ../src/test_parser.nit:49,2--3 text='if'
+Read token at ../src/test_parser.nit:49,5--8 text='args'
+Read token at ../src/test_parser.nit:49,9 text='.'
+Read token at ../src/test_parser.nit:49,10--14 text='first'
+Read token at ../src/test_parser.nit:49,16--17 text='=='
+Read token at ../src/test_parser.nit:49,19--22 text='"-n"'
+Read token at ../src/test_parser.nit:49,24--27 text='then'
+Read token at ../src/test_parser.nit:49,28--50,0 text='
+'
+Read token at ../src/test_parser.nit:50,3--10 text='no_print'
+Read token at ../src/test_parser.nit:50,12 text='='
+Read token at ../src/test_parser.nit:50,14--17 text='true'
+Read token at ../src/test_parser.nit:50,18--51,0 text='
+'
+Read token at ../src/test_parser.nit:51,2--5 text='else'
+Read token at ../src/test_parser.nit:51,7--8 text='if'
+Read token at ../src/test_parser.nit:51,10--13 text='args'
+Read token at ../src/test_parser.nit:51,14 text='.'
+Read token at ../src/test_parser.nit:51,15--19 text='first'
+Read token at ../src/test_parser.nit:51,21--22 text='=='
+Read token at ../src/test_parser.nit:51,24--27 text='"-l"'
+Read token at ../src/test_parser.nit:51,29--32 text='then'
+Read token at ../src/test_parser.nit:51,33--52,0 text='
+'
+Read token at ../src/test_parser.nit:52,3--12 text='only_lexer'
+Read token at ../src/test_parser.nit:52,14 text='='
+Read token at ../src/test_parser.nit:52,16--19 text='true'
+Read token at ../src/test_parser.nit:52,20--53,0 text='
+'
+Read token at ../src/test_parser.nit:53,2--5 text='else'
+Read token at ../src/test_parser.nit:53,7--8 text='if'
+Read token at ../src/test_parser.nit:53,10--13 text='args'
+Read token at ../src/test_parser.nit:53,14 text='.'
+Read token at ../src/test_parser.nit:53,15--19 text='first'
+Read token at ../src/test_parser.nit:53,21--22 text='=='
+Read token at ../src/test_parser.nit:53,24--27 text='"-p"'
+Read token at ../src/test_parser.nit:53,29--32 text='then'
+Read token at ../src/test_parser.nit:53,33--54,0 text='
+'
+Read token at ../src/test_parser.nit:54,3--12 text='only_lexer'
+Read token at ../src/test_parser.nit:54,14 text='='
+Read token at ../src/test_parser.nit:54,16--20 text='false'
+Read token at ../src/test_parser.nit:54,21--55,0 text='
+'
+Read token at ../src/test_parser.nit:55,2--5 text='else'
+Read token at ../src/test_parser.nit:55,7--8 text='if'
+Read token at ../src/test_parser.nit:55,10--13 text='args'
+Read token at ../src/test_parser.nit:55,14 text='.'
+Read token at ../src/test_parser.nit:55,15--19 text='first'
+Read token at ../src/test_parser.nit:55,21--22 text='=='
+Read token at ../src/test_parser.nit:55,24--27 text='"-x"'
+Read token at ../src/test_parser.nit:55,29--32 text='then'
+Read token at ../src/test_parser.nit:55,33--56,0 text='
+'
+Read token at ../src/test_parser.nit:56,3--5 text='xml'
+Read token at ../src/test_parser.nit:56,7 text='='
+Read token at ../src/test_parser.nit:56,9--12 text='true'
+Read token at ../src/test_parser.nit:56,13--57,0 text='
+'
+Read token at ../src/test_parser.nit:57,2--5 text='else'
+Read token at ../src/test_parser.nit:57,7--8 text='if'
+Read token at ../src/test_parser.nit:57,10--13 text='args'
+Read token at ../src/test_parser.nit:57,14 text='.'
+Read token at ../src/test_parser.nit:57,15--19 text='first'
+Read token at ../src/test_parser.nit:57,21--22 text='=='
+Read token at ../src/test_parser.nit:57,24--27 text='"-e"'
+Read token at ../src/test_parser.nit:57,29--32 text='then'
+Read token at ../src/test_parser.nit:57,33--58,0 text='
+'
+Read token at ../src/test_parser.nit:58,3--9 text='no_file'
+Read token at ../src/test_parser.nit:58,11 text='='
+Read token at ../src/test_parser.nit:58,13--16 text='true'
+Read token at ../src/test_parser.nit:58,17--59,0 text='
+'
+Read token at ../src/test_parser.nit:59,2--5 text='else'
+Read token at ../src/test_parser.nit:59,7--8 text='if'
+Read token at ../src/test_parser.nit:59,10--13 text='args'
+Read token at ../src/test_parser.nit:59,14 text='.'
+Read token at ../src/test_parser.nit:59,15--19 text='first'
+Read token at ../src/test_parser.nit:59,21--22 text='=='
+Read token at ../src/test_parser.nit:59,24--27 text='"-i"'
+Read token at ../src/test_parser.nit:59,29--32 text='then'
+Read token at ../src/test_parser.nit:59,33--60,0 text='
+'
+Read token at ../src/test_parser.nit:60,3--13 text='interactive'
+Read token at ../src/test_parser.nit:60,15 text='='
+Read token at ../src/test_parser.nit:60,17--20 text='true'
+Read token at ../src/test_parser.nit:60,21--61,0 text='
+'
+Read token at ../src/test_parser.nit:61,2--5 text='else'
+Read token at ../src/test_parser.nit:61,7--8 text='if'
+Read token at ../src/test_parser.nit:61,10--13 text='args'
+Read token at ../src/test_parser.nit:61,14 text='.'
+Read token at ../src/test_parser.nit:61,15--19 text='first'
+Read token at ../src/test_parser.nit:61,21--22 text='=='
+Read token at ../src/test_parser.nit:61,24--27 text='"-h"'
+Read token at ../src/test_parser.nit:61,29--30 text='or'
+Read token at ../src/test_parser.nit:61,32--35 text='args'
+Read token at ../src/test_parser.nit:61,36 text='.'
+Read token at ../src/test_parser.nit:61,37--41 text='first'
+Read token at ../src/test_parser.nit:61,43--44 text='=='
+Read token at ../src/test_parser.nit:61,46--49 text='"-?"'
+Read token at ../src/test_parser.nit:61,51--54 text='then'
+Read token at ../src/test_parser.nit:61,55--62,0 text='
+'
+Read token at ../src/test_parser.nit:62,3--11 text='need_help'
+Read token at ../src/test_parser.nit:62,13 text='='
+Read token at ../src/test_parser.nit:62,15--18 text='true'
+Read token at ../src/test_parser.nit:62,19--63,0 text='
+'
+Read token at ../src/test_parser.nit:63,2--5 text='else'
+Read token at ../src/test_parser.nit:63,6--64,0 text='
+'
+Read token at ../src/test_parser.nit:64,3--8 text='stderr'
+Read token at ../src/test_parser.nit:64,9 text='.'
+Read token at ../src/test_parser.nit:64,10--14 text='write'
+Read token at ../src/test_parser.nit:64,15 text='('
+Read token at ../src/test_parser.nit:64,16--32 text='"Unknown option {'
+Read token at ../src/test_parser.nit:64,33--36 text='args'
+Read token at ../src/test_parser.nit:64,37 text='.'
+Read token at ../src/test_parser.nit:64,38--42 text='first'
+Read token at ../src/test_parser.nit:64,43--47 text='}.\n"'
+Read token at ../src/test_parser.nit:64,48 text=')'
+Read token at ../src/test_parser.nit:64,49--65,0 text='
+'
+Read token at ../src/test_parser.nit:65,3--6 text='exit'
+Read token at ../src/test_parser.nit:65,7 text='('
+Read token at ../src/test_parser.nit:65,8 text='0'
+Read token at ../src/test_parser.nit:65,9 text=')'
+Read token at ../src/test_parser.nit:65,10--66,0 text='
+'
+Read token at ../src/test_parser.nit:66,2--4 text='end'
+Read token at ../src/test_parser.nit:66,5--67,0 text='
+'
+Read token at ../src/test_parser.nit:67,2--5 text='args'
+Read token at ../src/test_parser.nit:67,6 text='.'
+Read token at ../src/test_parser.nit:67,7--11 text='shift'
+Read token at ../src/test_parser.nit:67,12--68,0 text='
+'
+Read token at ../src/test_parser.nit:68,1--3 text='end'
+Read token at ../src/test_parser.nit:68,4--69,0 text='
+'
+Read token at ../src/test_parser.nit:69,1--70,0 text='
+'
+Read token at ../src/test_parser.nit:70,1--2 text='if'
+Read token at ../src/test_parser.nit:70,4 text='('
+Read token at ../src/test_parser.nit:70,5--8 text='args'
+Read token at ../src/test_parser.nit:70,9 text='.'
+Read token at ../src/test_parser.nit:70,10--17 text='is_empty'
+Read token at ../src/test_parser.nit:70,19--21 text='and'
+Read token at ../src/test_parser.nit:70,23--25 text='not'
+Read token at ../src/test_parser.nit:70,27--37 text='interactive'
+Read token at ../src/test_parser.nit:70,38 text=')'
+Read token at ../src/test_parser.nit:70,40--41 text='or'
+Read token at ../src/test_parser.nit:70,43--51 text='need_help'
+Read token at ../src/test_parser.nit:70,53--56 text='then'
+Read token at ../src/test_parser.nit:70,57--71,0 text='
 '
 Read token at ../src/test_parser.nit:71,2--6 text='print'
 Read token at ../src/test_parser.nit:71,7 text='('
-Read token at ../src/test_parser.nit:71,8--35 text='"  -n      do not print anything"'
-Read token at ../src/test_parser.nit:71,36 text=')'
-Read token at ../src/test_parser.nit:71,37--72,0 text='
+Read token at ../src/test_parser.nit:71,8--15 text='"usage:"'
+Read token at ../src/test_parser.nit:71,16 text=')'
+Read token at ../src/test_parser.nit:71,17--72,0 text='
 '
 Read token at ../src/test_parser.nit:72,2--6 text='print'
 Read token at ../src/test_parser.nit:72,7 text='('
-Read token at ../src/test_parser.nit:72,8--24 text='"  -l      only lexer"'
-Read token at ../src/test_parser.nit:72,25 text=')'
-Read token at ../src/test_parser.nit:72,26--73,0 text='
+Read token at ../src/test_parser.nit:72,8--53 text='"  test_parser [options]... <filename.nit>..."'
+Read token at ../src/test_parser.nit:72,54 text=')'
+Read token at ../src/test_parser.nit:72,55--73,0 text='
 '
 Read token at ../src/test_parser.nit:73,2--6 text='print'
 Read token at ../src/test_parser.nit:73,7 text='('
-Read token at ../src/test_parser.nit:73,8--40 text='"  -p      lexer and parser (default)"'
-Read token at ../src/test_parser.nit:73,41 text=')'
-Read token at ../src/test_parser.nit:73,42--74,0 text='
+Read token at ../src/test_parser.nit:73,8--48 text='"  test_parser -e [options]... <text>..."'
+Read token at ../src/test_parser.nit:73,49 text=')'
+Read token at ../src/test_parser.nit:73,50--74,0 text='
 '
 Read token at ../src/test_parser.nit:74,2--6 text='print'
 Read token at ../src/test_parser.nit:74,7 text='('
-Read token at ../src/test_parser.nit:74,8--67 text='"  -e      instead on files, each argument is a content to parse"'
-Read token at ../src/test_parser.nit:74,68 text=')'
-Read token at ../src/test_parser.nit:74,69--75,0 text='
+Read token at ../src/test_parser.nit:74,8--38 text='"  test_parser -i [options]..."'
+Read token at ../src/test_parser.nit:74,39 text=')'
+Read token at ../src/test_parser.nit:74,40--75,0 text='
 '
 Read token at ../src/test_parser.nit:75,2--6 text='print'
 Read token at ../src/test_parser.nit:75,7 text='('
-Read token at ../src/test_parser.nit:75,8--50 text='"  -i      tree to parse are read interactively"'
-Read token at ../src/test_parser.nit:75,51 text=')'
-Read token at ../src/test_parser.nit:75,52--76,0 text='
+Read token at ../src/test_parser.nit:75,8--17 text='"options:"'
+Read token at ../src/test_parser.nit:75,18 text=')'
+Read token at ../src/test_parser.nit:75,19--76,0 text='
 '
 Read token at ../src/test_parser.nit:76,2--6 text='print'
 Read token at ../src/test_parser.nit:76,7 text='('
-Read token at ../src/test_parser.nit:76,8--29 text='"  -h      print this help"'
-Read token at ../src/test_parser.nit:76,30 text=')'
-Read token at ../src/test_parser.nit:76,31--77,0 text='
-'
-Read token at ../src/test_parser.nit:77,1--4 text='else'
-Read token at ../src/test_parser.nit:77,6--7 text='if'
-Read token at ../src/test_parser.nit:77,9--19 text='interactive'
-Read token at ../src/test_parser.nit:77,21--24 text='then'
-Read token at ../src/test_parser.nit:77,25--78,0 text='
-'
-Read token at ../src/test_parser.nit:78,2--3 text='if'
-Read token at ../src/test_parser.nit:78,5--14 text='only_lexer'
-Read token at ../src/test_parser.nit:78,16--19 text='then'
-Read token at ../src/test_parser.nit:78,20--79,0 text='
-'
-Read token at ../src/test_parser.nit:79,3--7 text='print'
-Read token at ../src/test_parser.nit:79,9--44 text='"Error: -l and -i are incompatibles"'
-Read token at ../src/test_parser.nit:79,45--80,0 text='
-'
-Read token at ../src/test_parser.nit:80,3--6 text='exit'
-Read token at ../src/test_parser.nit:80,8 text='1'
-Read token at ../src/test_parser.nit:80,9--81,0 text='
-'
-Read token at ../src/test_parser.nit:81,2--5 text='else'
-Read token at ../src/test_parser.nit:81,7--8 text='if'
-Read token at ../src/test_parser.nit:81,10--16 text='no_file'
-Read token at ../src/test_parser.nit:81,18--21 text='then'
-Read token at ../src/test_parser.nit:81,22--82,0 text='
-'
-Read token at ../src/test_parser.nit:82,3--7 text='print'
-Read token at ../src/test_parser.nit:82,9--44 text='"Error: -e and -i are incompatibles"'
-Read token at ../src/test_parser.nit:82,45--83,0 text='
-'
-Read token at ../src/test_parser.nit:83,3--6 text='exit'
-Read token at ../src/test_parser.nit:83,8 text='1'
-Read token at ../src/test_parser.nit:83,9--84,0 text='
-'
-Read token at ../src/test_parser.nit:84,2--5 text='else'
-Read token at ../src/test_parser.nit:84,7--8 text='if'
-Read token at ../src/test_parser.nit:84,10--12 text='not'
-Read token at ../src/test_parser.nit:84,14--17 text='args'
-Read token at ../src/test_parser.nit:84,18 text='.'
-Read token at ../src/test_parser.nit:84,19--26 text='is_empty'
-Read token at ../src/test_parser.nit:84,28--31 text='then'
-Read token at ../src/test_parser.nit:84,32--85,0 text='
+Read token at ../src/test_parser.nit:76,8--35 text='"  -n      do not print anything"'
+Read token at ../src/test_parser.nit:76,36 text=')'
+Read token at ../src/test_parser.nit:76,37--77,0 text='
+'
+Read token at ../src/test_parser.nit:77,2--6 text='print'
+Read token at ../src/test_parser.nit:77,7 text='('
+Read token at ../src/test_parser.nit:77,8--24 text='"  -l      only lexer"'
+Read token at ../src/test_parser.nit:77,25 text=')'
+Read token at ../src/test_parser.nit:77,26--78,0 text='
+'
+Read token at ../src/test_parser.nit:78,2--6 text='print'
+Read token at ../src/test_parser.nit:78,7 text='('
+Read token at ../src/test_parser.nit:78,8--40 text='"  -p      lexer and parser (default)"'
+Read token at ../src/test_parser.nit:78,41 text=')'
+Read token at ../src/test_parser.nit:78,42--79,0 text='
+'
+Read token at ../src/test_parser.nit:79,2--6 text='print'
+Read token at ../src/test_parser.nit:79,7 text='('
+Read token at ../src/test_parser.nit:79,8--60 text='"  -x      instead of a ascii tree, output a XML document"'
+Read token at ../src/test_parser.nit:79,61 text=')'
+Read token at ../src/test_parser.nit:79,62--80,0 text='
+'
+Read token at ../src/test_parser.nit:80,2--6 text='print'
+Read token at ../src/test_parser.nit:80,7 text='('
+Read token at ../src/test_parser.nit:80,8--67 text='"  -e      instead on files, each argument is a content to parse"'
+Read token at ../src/test_parser.nit:80,68 text=')'
+Read token at ../src/test_parser.nit:80,69--81,0 text='
+'
+Read token at ../src/test_parser.nit:81,2--6 text='print'
+Read token at ../src/test_parser.nit:81,7 text='('
+Read token at ../src/test_parser.nit:81,8--50 text='"  -i      tree to parse are read interactively"'
+Read token at ../src/test_parser.nit:81,51 text=')'
+Read token at ../src/test_parser.nit:81,52--82,0 text='
+'
+Read token at ../src/test_parser.nit:82,2--6 text='print'
+Read token at ../src/test_parser.nit:82,7 text='('
+Read token at ../src/test_parser.nit:82,8--29 text='"  -h      print this help"'
+Read token at ../src/test_parser.nit:82,30 text=')'
+Read token at ../src/test_parser.nit:82,31--83,0 text='
+'
+Read token at ../src/test_parser.nit:83,1--4 text='else'
+Read token at ../src/test_parser.nit:83,6--7 text='if'
+Read token at ../src/test_parser.nit:83,9--19 text='interactive'
+Read token at ../src/test_parser.nit:83,21--24 text='then'
+Read token at ../src/test_parser.nit:83,25--84,0 text='
+'
+Read token at ../src/test_parser.nit:84,2--3 text='if'
+Read token at ../src/test_parser.nit:84,5--14 text='only_lexer'
+Read token at ../src/test_parser.nit:84,16--19 text='then'
+Read token at ../src/test_parser.nit:84,20--85,0 text='
 '
 Read token at ../src/test_parser.nit:85,3--7 text='print'
-Read token at ../src/test_parser.nit:85,9--43 text='"Error: -i works without arguments"'
+Read token at ../src/test_parser.nit:85,9--43 text='"Error: -l and -i are incompatible"'
 Read token at ../src/test_parser.nit:85,44--86,0 text='
 '
 Read token at ../src/test_parser.nit:86,3--6 text='exit'
 Read token at ../src/test_parser.nit:86,8 text='1'
 Read token at ../src/test_parser.nit:86,9--87,0 text='
 '
-Read token at ../src/test_parser.nit:87,2--4 text='end'
-Read token at ../src/test_parser.nit:87,5--88,0 text='
-'
-Read token at ../src/test_parser.nit:88,1--89,0 text='
-'
-Read token at ../src/test_parser.nit:89,2--4 text='var'
-Read token at ../src/test_parser.nit:89,6--7 text='tc'
-Read token at ../src/test_parser.nit:89,9 text='='
-Read token at ../src/test_parser.nit:89,11--13 text='new'
-Read token at ../src/test_parser.nit:89,15--25 text='ToolContext'
-Read token at ../src/test_parser.nit:89,26--90,0 text='
-'
-Read token at ../src/test_parser.nit:90,1--91,0 text='
-'
-Read token at ../src/test_parser.nit:91,2--5 text='loop'
-Read token at ../src/test_parser.nit:91,6--92,0 text='
-'
-Read token at ../src/test_parser.nit:92,3--5 text='var'
-Read token at ../src/test_parser.nit:92,7 text='n'
-Read token at ../src/test_parser.nit:92,9 text='='
-Read token at ../src/test_parser.nit:92,11--12 text='tc'
-Read token at ../src/test_parser.nit:92,13 text='.'
-Read token at ../src/test_parser.nit:92,14--30 text='interactive_parse'
-Read token at ../src/test_parser.nit:92,31 text='('
-Read token at ../src/test_parser.nit:92,32--36 text='"-->"'
-Read token at ../src/test_parser.nit:92,37 text=')'
-Read token at ../src/test_parser.nit:92,38--93,0 text='
-'
-Read token at ../src/test_parser.nit:93,3--4 text='if'
-Read token at ../src/test_parser.nit:93,6 text='n'
-Read token at ../src/test_parser.nit:93,8--10 text='isa'
-Read token at ../src/test_parser.nit:93,12--18 text='TString'
-Read token at ../src/test_parser.nit:93,20--23 text='then'
-Read token at ../src/test_parser.nit:93,24--94,0 text='
-'
-Read token at ../src/test_parser.nit:94,4--6 text='var'
-Read token at ../src/test_parser.nit:94,8 text='s'
-Read token at ../src/test_parser.nit:94,10 text='='
-Read token at ../src/test_parser.nit:94,12 text='n'
-Read token at ../src/test_parser.nit:94,13 text='.'
-Read token at ../src/test_parser.nit:94,14--17 text='text'
-Read token at ../src/test_parser.nit:94,18--95,0 text='
-'
-Read token at ../src/test_parser.nit:95,4--5 text='if'
-Read token at ../src/test_parser.nit:95,7 text='s'
-Read token at ../src/test_parser.nit:95,9--10 text='=='
-Read token at ../src/test_parser.nit:95,12--15 text='":q"'
-Read token at ../src/test_parser.nit:95,17--20 text='then'
-Read token at ../src/test_parser.nit:95,21--96,0 text='
-'
-Read token at ../src/test_parser.nit:96,5--9 text='break'
-Read token at ../src/test_parser.nit:96,10--97,0 text='
-'
-Read token at ../src/test_parser.nit:97,4--7 text='else'
-Read token at ../src/test_parser.nit:97,8--98,0 text='
-'
-Read token at ../src/test_parser.nit:98,5--9 text='print'
-Read token at ../src/test_parser.nit:98,11--24 text='"`:q` to quit"'
-Read token at ../src/test_parser.nit:98,25--99,0 text='
-'
-Read token at ../src/test_parser.nit:99,4--6 text='end'
-Read token at ../src/test_parser.nit:99,7--100,0 text='
-'
-Read token at ../src/test_parser.nit:100,4--11 text='continue'
-Read token at ../src/test_parser.nit:100,12--101,0 text='
-'
-Read token at ../src/test_parser.nit:101,3--5 text='end'
-Read token at ../src/test_parser.nit:101,6--102,0 text='
-'
-Read token at ../src/test_parser.nit:102,1--103,0 text='
-'
-Read token at ../src/test_parser.nit:103,3--4 text='if'
-Read token at ../src/test_parser.nit:103,6 text='n'
-Read token at ../src/test_parser.nit:103,8--10 text='isa'
-Read token at ../src/test_parser.nit:103,12--17 text='AError'
-Read token at ../src/test_parser.nit:103,19--22 text='then'
-Read token at ../src/test_parser.nit:103,23--104,0 text='
-'
-Read token at ../src/test_parser.nit:104,4--8 text='print'
-Read token at ../src/test_parser.nit:104,10--11 text='"{'
-Read token at ../src/test_parser.nit:104,12 text='n'
-Read token at ../src/test_parser.nit:104,13 text='.'
-Read token at ../src/test_parser.nit:104,14--21 text='location'
-Read token at ../src/test_parser.nit:104,22 text='.'
-Read token at ../src/test_parser.nit:104,23--34 text='colored_line'
-Read token at ../src/test_parser.nit:104,35 text='('
-Read token at ../src/test_parser.nit:104,36--41 text='"0;31"'
-Read token at ../src/test_parser.nit:104,42 text=')'
-Read token at ../src/test_parser.nit:104,43--46 text='}: {'
-Read token at ../src/test_parser.nit:104,47 text='n'
-Read token at ../src/test_parser.nit:104,48 text='.'
-Read token at ../src/test_parser.nit:104,49--55 text='message'
-Read token at ../src/test_parser.nit:104,56--57 text='}"'
-Read token at ../src/test_parser.nit:104,58--105,0 text='
-'
-Read token at ../src/test_parser.nit:105,4--11 text='continue'
-Read token at ../src/test_parser.nit:105,12--106,0 text='
-'
-Read token at ../src/test_parser.nit:106,3--5 text='end'
-Read token at ../src/test_parser.nit:106,6--107,0 text='
-'
-Read token at ../src/test_parser.nit:107,1--108,0 text='
-'
-Read token at ../src/test_parser.nit:108,3--4 text='if'
-Read token at ../src/test_parser.nit:108,6--8 text='not'
-Read token at ../src/test_parser.nit:108,10--17 text='no_print'
-Read token at ../src/test_parser.nit:108,19--22 text='then'
-Read token at ../src/test_parser.nit:108,23--109,0 text='
-'
-Read token at ../src/test_parser.nit:109,4 text='('
-Read token at ../src/test_parser.nit:109,5--7 text='new'
-Read token at ../src/test_parser.nit:109,9--24 text='PrintTreeVisitor'
-Read token at ../src/test_parser.nit:109,25 text=')'
-Read token at ../src/test_parser.nit:109,26 text='.'
-Read token at ../src/test_parser.nit:109,27--37 text='enter_visit'
-Read token at ../src/test_parser.nit:109,38 text='('
-Read token at ../src/test_parser.nit:109,39 text='n'
-Read token at ../src/test_parser.nit:109,40 text=')'
-Read token at ../src/test_parser.nit:109,41--110,0 text='
-'
-Read token at ../src/test_parser.nit:110,3--5 text='end'
-Read token at ../src/test_parser.nit:110,6--111,0 text='
-'
-Read token at ../src/test_parser.nit:111,2--4 text='end'
-Read token at ../src/test_parser.nit:111,5--112,0 text='
-'
-Read token at ../src/test_parser.nit:112,1--4 text='else'
-Read token at ../src/test_parser.nit:112,5--113,0 text='
-'
-Read token at ../src/test_parser.nit:113,2--4 text='for'
-Read token at ../src/test_parser.nit:113,6 text='a'
-Read token at ../src/test_parser.nit:113,8--9 text='in'
-Read token at ../src/test_parser.nit:113,11--14 text='args'
-Read token at ../src/test_parser.nit:113,16--17 text='do'
-Read token at ../src/test_parser.nit:113,18--114,0 text='
-'
-Read token at ../src/test_parser.nit:114,3--5 text='var'
-Read token at ../src/test_parser.nit:114,7--12 text='source'
-Read token at ../src/test_parser.nit:114,13--115,0 text='
-'
-Read token at ../src/test_parser.nit:115,3--4 text='if'
-Read token at ../src/test_parser.nit:115,6--12 text='no_file'
-Read token at ../src/test_parser.nit:115,14--17 text='then'
-Read token at ../src/test_parser.nit:115,18--116,0 text='
-'
-Read token at ../src/test_parser.nit:116,4--9 text='source'
-Read token at ../src/test_parser.nit:116,11 text='='
-Read token at ../src/test_parser.nit:116,13--15 text='new'
-Read token at ../src/test_parser.nit:116,17--26 text='SourceFile'
-Read token at ../src/test_parser.nit:116,27 text='.'
-Read token at ../src/test_parser.nit:116,28--38 text='from_string'
-Read token at ../src/test_parser.nit:116,39 text='('
-Read token at ../src/test_parser.nit:116,40--41 text='""'
-Read token at ../src/test_parser.nit:116,42 text=','
-Read token at ../src/test_parser.nit:116,44 text='a'
-Read token at ../src/test_parser.nit:116,45 text=')'
-Read token at ../src/test_parser.nit:116,46--117,0 text='
-'
-Read token at ../src/test_parser.nit:117,3--6 text='else'
-Read token at ../src/test_parser.nit:117,7--118,0 text='
-'
-Read token at ../src/test_parser.nit:118,4--6 text='var'
-Read token at ../src/test_parser.nit:118,8 text='f'
-Read token at ../src/test_parser.nit:118,10 text='='
-Read token at ../src/test_parser.nit:118,12--14 text='new'
-Read token at ../src/test_parser.nit:118,16--25 text='FileReader'
-Read token at ../src/test_parser.nit:118,26 text='.'
-Read token at ../src/test_parser.nit:118,27--30 text='open'
-Read token at ../src/test_parser.nit:118,31 text='('
-Read token at ../src/test_parser.nit:118,32 text='a'
-Read token at ../src/test_parser.nit:118,33 text=')'
-Read token at ../src/test_parser.nit:118,34--119,0 text='
-'
-Read token at ../src/test_parser.nit:119,4--9 text='source'
-Read token at ../src/test_parser.nit:119,11 text='='
-Read token at ../src/test_parser.nit:119,13--15 text='new'
-Read token at ../src/test_parser.nit:119,17--26 text='SourceFile'
-Read token at ../src/test_parser.nit:119,27 text='('
-Read token at ../src/test_parser.nit:119,28 text='a'
-Read token at ../src/test_parser.nit:119,29 text=','
-Read token at ../src/test_parser.nit:119,31 text='f'
-Read token at ../src/test_parser.nit:119,32 text=')'
-Read token at ../src/test_parser.nit:119,33--120,0 text='
-'
-Read token at ../src/test_parser.nit:120,4 text='f'
-Read token at ../src/test_parser.nit:120,5 text='.'
-Read token at ../src/test_parser.nit:120,6--10 text='close'
-Read token at ../src/test_parser.nit:120,11--121,0 text='
-'
-Read token at ../src/test_parser.nit:121,3--5 text='end'
-Read token at ../src/test_parser.nit:121,6--122,0 text='
-'
-Read token at ../src/test_parser.nit:122,3--5 text='var'
-Read token at ../src/test_parser.nit:122,7--11 text='lexer'
-Read token at ../src/test_parser.nit:122,13 text='='
-Read token at ../src/test_parser.nit:122,15--17 text='new'
-Read token at ../src/test_parser.nit:122,19--23 text='Lexer'
-Read token at ../src/test_parser.nit:122,24 text='('
-Read token at ../src/test_parser.nit:122,25--30 text='source'
-Read token at ../src/test_parser.nit:122,31 text=')'
-Read token at ../src/test_parser.nit:122,32--123,0 text='
-'
-Read token at ../src/test_parser.nit:123,3--4 text='if'
-Read token at ../src/test_parser.nit:123,6--15 text='only_lexer'
-Read token at ../src/test_parser.nit:123,17--20 text='then'
-Read token at ../src/test_parser.nit:123,21--124,0 text='
+Read token at ../src/test_parser.nit:87,2--5 text='else'
+Read token at ../src/test_parser.nit:87,7--8 text='if'
+Read token at ../src/test_parser.nit:87,10--16 text='no_file'
+Read token at ../src/test_parser.nit:87,18--21 text='then'
+Read token at ../src/test_parser.nit:87,22--88,0 text='
+'
+Read token at ../src/test_parser.nit:88,3--7 text='print'
+Read token at ../src/test_parser.nit:88,9--43 text='"Error: -e and -i are incompatible"'
+Read token at ../src/test_parser.nit:88,44--89,0 text='
+'
+Read token at ../src/test_parser.nit:89,3--6 text='exit'
+Read token at ../src/test_parser.nit:89,8 text='1'
+Read token at ../src/test_parser.nit:89,9--90,0 text='
+'
+Read token at ../src/test_parser.nit:90,2--5 text='else'
+Read token at ../src/test_parser.nit:90,7--8 text='if'
+Read token at ../src/test_parser.nit:90,10--12 text='not'
+Read token at ../src/test_parser.nit:90,14--17 text='args'
+Read token at ../src/test_parser.nit:90,18 text='.'
+Read token at ../src/test_parser.nit:90,19--26 text='is_empty'
+Read token at ../src/test_parser.nit:90,28--31 text='then'
+Read token at ../src/test_parser.nit:90,32--91,0 text='
+'
+Read token at ../src/test_parser.nit:91,3--7 text='print'
+Read token at ../src/test_parser.nit:91,9--43 text='"Error: -i works without arguments"'
+Read token at ../src/test_parser.nit:91,44--92,0 text='
+'
+Read token at ../src/test_parser.nit:92,3--6 text='exit'
+Read token at ../src/test_parser.nit:92,8 text='1'
+Read token at ../src/test_parser.nit:92,9--93,0 text='
+'
+Read token at ../src/test_parser.nit:93,2--4 text='end'
+Read token at ../src/test_parser.nit:93,5--94,0 text='
+'
+Read token at ../src/test_parser.nit:94,1--95,0 text='
+'
+Read token at ../src/test_parser.nit:95,2--4 text='var'
+Read token at ../src/test_parser.nit:95,6--7 text='tc'
+Read token at ../src/test_parser.nit:95,9 text='='
+Read token at ../src/test_parser.nit:95,11--13 text='new'
+Read token at ../src/test_parser.nit:95,15--25 text='ToolContext'
+Read token at ../src/test_parser.nit:95,26--96,0 text='
+'
+Read token at ../src/test_parser.nit:96,1--97,0 text='
+'
+Read token at ../src/test_parser.nit:97,2--5 text='loop'
+Read token at ../src/test_parser.nit:97,6--98,0 text='
+'
+Read token at ../src/test_parser.nit:98,3--5 text='var'
+Read token at ../src/test_parser.nit:98,7 text='n'
+Read token at ../src/test_parser.nit:98,9 text='='
+Read token at ../src/test_parser.nit:98,11--12 text='tc'
+Read token at ../src/test_parser.nit:98,13 text='.'
+Read token at ../src/test_parser.nit:98,14--30 text='interactive_parse'
+Read token at ../src/test_parser.nit:98,31 text='('
+Read token at ../src/test_parser.nit:98,32--36 text='"-->"'
+Read token at ../src/test_parser.nit:98,37 text=')'
+Read token at ../src/test_parser.nit:98,38--99,0 text='
+'
+Read token at ../src/test_parser.nit:99,3--4 text='if'
+Read token at ../src/test_parser.nit:99,6 text='n'
+Read token at ../src/test_parser.nit:99,8--10 text='isa'
+Read token at ../src/test_parser.nit:99,12--18 text='TString'
+Read token at ../src/test_parser.nit:99,20--23 text='then'
+Read token at ../src/test_parser.nit:99,24--100,0 text='
+'
+Read token at ../src/test_parser.nit:100,4--6 text='var'
+Read token at ../src/test_parser.nit:100,8 text='s'
+Read token at ../src/test_parser.nit:100,10 text='='
+Read token at ../src/test_parser.nit:100,12 text='n'
+Read token at ../src/test_parser.nit:100,13 text='.'
+Read token at ../src/test_parser.nit:100,14--17 text='text'
+Read token at ../src/test_parser.nit:100,18--101,0 text='
+'
+Read token at ../src/test_parser.nit:101,4--5 text='if'
+Read token at ../src/test_parser.nit:101,7 text='s'
+Read token at ../src/test_parser.nit:101,9--10 text='=='
+Read token at ../src/test_parser.nit:101,12--15 text='":q"'
+Read token at ../src/test_parser.nit:101,17--20 text='then'
+Read token at ../src/test_parser.nit:101,21--102,0 text='
+'
+Read token at ../src/test_parser.nit:102,5--9 text='break'
+Read token at ../src/test_parser.nit:102,10--103,0 text='
+'
+Read token at ../src/test_parser.nit:103,4--7 text='else'
+Read token at ../src/test_parser.nit:103,8--104,0 text='
+'
+Read token at ../src/test_parser.nit:104,5--9 text='print'
+Read token at ../src/test_parser.nit:104,11--24 text='"`:q` to quit"'
+Read token at ../src/test_parser.nit:104,25--105,0 text='
+'
+Read token at ../src/test_parser.nit:105,4--6 text='end'
+Read token at ../src/test_parser.nit:105,7--106,0 text='
+'
+Read token at ../src/test_parser.nit:106,4--11 text='continue'
+Read token at ../src/test_parser.nit:106,12--107,0 text='
+'
+Read token at ../src/test_parser.nit:107,3--5 text='end'
+Read token at ../src/test_parser.nit:107,6--108,0 text='
+'
+Read token at ../src/test_parser.nit:108,1--109,0 text='
+'
+Read token at ../src/test_parser.nit:109,3--4 text='if'
+Read token at ../src/test_parser.nit:109,6 text='n'
+Read token at ../src/test_parser.nit:109,8--10 text='isa'
+Read token at ../src/test_parser.nit:109,12--17 text='AError'
+Read token at ../src/test_parser.nit:109,19--22 text='then'
+Read token at ../src/test_parser.nit:109,23--110,0 text='
+'
+Read token at ../src/test_parser.nit:110,4--8 text='print'
+Read token at ../src/test_parser.nit:110,10--11 text='"{'
+Read token at ../src/test_parser.nit:110,12 text='n'
+Read token at ../src/test_parser.nit:110,13 text='.'
+Read token at ../src/test_parser.nit:110,14--21 text='location'
+Read token at ../src/test_parser.nit:110,22 text='.'
+Read token at ../src/test_parser.nit:110,23--34 text='colored_line'
+Read token at ../src/test_parser.nit:110,35 text='('
+Read token at ../src/test_parser.nit:110,36--41 text='"0;31"'
+Read token at ../src/test_parser.nit:110,42 text=')'
+Read token at ../src/test_parser.nit:110,43--46 text='}: {'
+Read token at ../src/test_parser.nit:110,47 text='n'
+Read token at ../src/test_parser.nit:110,48 text='.'
+Read token at ../src/test_parser.nit:110,49--55 text='message'
+Read token at ../src/test_parser.nit:110,56--57 text='}"'
+Read token at ../src/test_parser.nit:110,58--111,0 text='
+'
+Read token at ../src/test_parser.nit:111,4--11 text='continue'
+Read token at ../src/test_parser.nit:111,12--112,0 text='
+'
+Read token at ../src/test_parser.nit:112,3--5 text='end'
+Read token at ../src/test_parser.nit:112,6--113,0 text='
+'
+Read token at ../src/test_parser.nit:113,1--114,0 text='
+'
+Read token at ../src/test_parser.nit:114,3--4 text='if'
+Read token at ../src/test_parser.nit:114,6--8 text='not'
+Read token at ../src/test_parser.nit:114,10--17 text='no_print'
+Read token at ../src/test_parser.nit:114,19--22 text='then'
+Read token at ../src/test_parser.nit:114,23--115,0 text='
+'
+Read token at ../src/test_parser.nit:115,4 text='('
+Read token at ../src/test_parser.nit:115,5--7 text='new'
+Read token at ../src/test_parser.nit:115,9--24 text='PrintTreeVisitor'
+Read token at ../src/test_parser.nit:115,25 text=')'
+Read token at ../src/test_parser.nit:115,26 text='.'
+Read token at ../src/test_parser.nit:115,27--37 text='enter_visit'
+Read token at ../src/test_parser.nit:115,38 text='('
+Read token at ../src/test_parser.nit:115,39 text='n'
+Read token at ../src/test_parser.nit:115,40 text=')'
+Read token at ../src/test_parser.nit:115,41--116,0 text='
+'
+Read token at ../src/test_parser.nit:116,3--5 text='end'
+Read token at ../src/test_parser.nit:116,6--117,0 text='
+'
+Read token at ../src/test_parser.nit:117,2--4 text='end'
+Read token at ../src/test_parser.nit:117,5--118,0 text='
+'
+Read token at ../src/test_parser.nit:118,1--4 text='else'
+Read token at ../src/test_parser.nit:118,5--119,0 text='
+'
+Read token at ../src/test_parser.nit:119,2--4 text='for'
+Read token at ../src/test_parser.nit:119,6 text='a'
+Read token at ../src/test_parser.nit:119,8--9 text='in'
+Read token at ../src/test_parser.nit:119,11--14 text='args'
+Read token at ../src/test_parser.nit:119,16--17 text='do'
+Read token at ../src/test_parser.nit:119,18--120,0 text='
+'
+Read token at ../src/test_parser.nit:120,3--5 text='var'
+Read token at ../src/test_parser.nit:120,7--12 text='source'
+Read token at ../src/test_parser.nit:120,13--121,0 text='
+'
+Read token at ../src/test_parser.nit:121,3--4 text='if'
+Read token at ../src/test_parser.nit:121,6--12 text='no_file'
+Read token at ../src/test_parser.nit:121,14--17 text='then'
+Read token at ../src/test_parser.nit:121,18--122,0 text='
+'
+Read token at ../src/test_parser.nit:122,4--9 text='source'
+Read token at ../src/test_parser.nit:122,11 text='='
+Read token at ../src/test_parser.nit:122,13--15 text='new'
+Read token at ../src/test_parser.nit:122,17--26 text='SourceFile'
+Read token at ../src/test_parser.nit:122,27 text='.'
+Read token at ../src/test_parser.nit:122,28--38 text='from_string'
+Read token at ../src/test_parser.nit:122,39 text='('
+Read token at ../src/test_parser.nit:122,40--41 text='""'
+Read token at ../src/test_parser.nit:122,42 text=','
+Read token at ../src/test_parser.nit:122,44 text='a'
+Read token at ../src/test_parser.nit:122,45 text=')'
+Read token at ../src/test_parser.nit:122,46--123,0 text='
+'
+Read token at ../src/test_parser.nit:123,3--6 text='else'
+Read token at ../src/test_parser.nit:123,7--124,0 text='
 '
 Read token at ../src/test_parser.nit:124,4--6 text='var'
-Read token at ../src/test_parser.nit:124,8--12 text='token'
-Read token at ../src/test_parser.nit:124,14 text='='
-Read token at ../src/test_parser.nit:124,16--20 text='lexer'
-Read token at ../src/test_parser.nit:124,21 text='.'
-Read token at ../src/test_parser.nit:124,22--25 text='next'
-Read token at ../src/test_parser.nit:124,26--125,0 text='
-'
-Read token at ../src/test_parser.nit:125,4--8 text='while'
-Read token at ../src/test_parser.nit:125,10--12 text='not'
-Read token at ../src/test_parser.nit:125,14--18 text='token'
-Read token at ../src/test_parser.nit:125,20--22 text='isa'
-Read token at ../src/test_parser.nit:125,24--26 text='EOF'
-Read token at ../src/test_parser.nit:125,28--29 text='do'
-Read token at ../src/test_parser.nit:125,30--126,0 text='
-'
-Read token at ../src/test_parser.nit:126,5--6 text='if'
-Read token at ../src/test_parser.nit:126,8--10 text='not'
-Read token at ../src/test_parser.nit:126,12--19 text='no_print'
-Read token at ../src/test_parser.nit:126,21--24 text='then'
-Read token at ../src/test_parser.nit:126,25--127,0 text='
-'
-Read token at ../src/test_parser.nit:127,6--10 text='print'
-Read token at ../src/test_parser.nit:127,11 text='('
-Read token at ../src/test_parser.nit:127,12--27 text='"Read token at {'
-Read token at ../src/test_parser.nit:127,28--32 text='token'
-Read token at ../src/test_parser.nit:127,33 text='.'
-Read token at ../src/test_parser.nit:127,34--41 text='location'
-Read token at ../src/test_parser.nit:127,42--50 text='} text='{'
-Read token at ../src/test_parser.nit:127,51--55 text='token'
-Read token at ../src/test_parser.nit:127,56 text='.'
-Read token at ../src/test_parser.nit:127,57--60 text='text'
-Read token at ../src/test_parser.nit:127,61--63 text='}'"'
-Read token at ../src/test_parser.nit:127,64 text=')'
-Read token at ../src/test_parser.nit:127,65--128,0 text='
-'
-Read token at ../src/test_parser.nit:128,5--7 text='end'
-Read token at ../src/test_parser.nit:128,8--129,0 text='
-'
-Read token at ../src/test_parser.nit:129,5--9 text='token'
-Read token at ../src/test_parser.nit:129,11 text='='
-Read token at ../src/test_parser.nit:129,13--17 text='lexer'
-Read token at ../src/test_parser.nit:129,18 text='.'
-Read token at ../src/test_parser.nit:129,19--22 text='next'
-Read token at ../src/test_parser.nit:129,23--130,0 text='
-'
-Read token at ../src/test_parser.nit:130,4--6 text='end'
-Read token at ../src/test_parser.nit:130,7--131,0 text='
-'
-Read token at ../src/test_parser.nit:131,3--6 text='else'
-Read token at ../src/test_parser.nit:131,7--132,0 text='
-'
-Read token at ../src/test_parser.nit:132,4--6 text='var'
-Read token at ../src/test_parser.nit:132,8--13 text='parser'
-Read token at ../src/test_parser.nit:132,15 text='='
-Read token at ../src/test_parser.nit:132,17--19 text='new'
-Read token at ../src/test_parser.nit:132,21--26 text='Parser'
-Read token at ../src/test_parser.nit:132,27 text='('
-Read token at ../src/test_parser.nit:132,28--32 text='lexer'
-Read token at ../src/test_parser.nit:132,33 text=')'
-Read token at ../src/test_parser.nit:132,34--133,0 text='
-'
-Read token at ../src/test_parser.nit:133,4--6 text='var'
-Read token at ../src/test_parser.nit:133,8--11 text='tree'
-Read token at ../src/test_parser.nit:133,13 text='='
-Read token at ../src/test_parser.nit:133,15--20 text='parser'
-Read token at ../src/test_parser.nit:133,21 text='.'
-Read token at ../src/test_parser.nit:133,22--26 text='parse'
-Read token at ../src/test_parser.nit:133,27--134,0 text='
-'
-Read token at ../src/test_parser.nit:134,1--135,0 text='
-'
-Read token at ../src/test_parser.nit:135,4--6 text='var'
-Read token at ../src/test_parser.nit:135,8--12 text='error'
-Read token at ../src/test_parser.nit:135,14 text='='
-Read token at ../src/test_parser.nit:135,16--19 text='tree'
-Read token at ../src/test_parser.nit:135,20 text='.'
-Read token at ../src/test_parser.nit:135,21--25 text='n_eof'
-Read token at ../src/test_parser.nit:135,26--136,0 text='
-'
-Read token at ../src/test_parser.nit:136,4--5 text='if'
-Read token at ../src/test_parser.nit:136,7--11 text='error'
-Read token at ../src/test_parser.nit:136,13--15 text='isa'
-Read token at ../src/test_parser.nit:136,17--22 text='AError'
-Read token at ../src/test_parser.nit:136,24--27 text='then'
-Read token at ../src/test_parser.nit:136,28--137,0 text='
-'
-Read token at ../src/test_parser.nit:137,5--9 text='print'
-Read token at ../src/test_parser.nit:137,10 text='('
-Read token at ../src/test_parser.nit:137,11--21 text='"Error at {'
-Read token at ../src/test_parser.nit:137,22--26 text='error'
-Read token at ../src/test_parser.nit:137,27 text='.'
-Read token at ../src/test_parser.nit:137,28--35 text='location'
-Read token at ../src/test_parser.nit:137,36--42 text='}:\n\t{'
-Read token at ../src/test_parser.nit:137,43--47 text='error'
-Read token at ../src/test_parser.nit:137,48 text='.'
-Read token at ../src/test_parser.nit:137,49--55 text='message'
-Read token at ../src/test_parser.nit:137,56--57 text='}"'
-Read token at ../src/test_parser.nit:137,58 text=')'
-Read token at ../src/test_parser.nit:137,59--138,0 text='
-'
-Read token at ../src/test_parser.nit:138,5--10 text='return'
-Read token at ../src/test_parser.nit:138,11--139,0 text='
-'
-Read token at ../src/test_parser.nit:139,4--6 text='end'
-Read token at ../src/test_parser.nit:139,7--140,0 text='
+Read token at ../src/test_parser.nit:124,8 text='f'
+Read token at ../src/test_parser.nit:124,10 text='='
+Read token at ../src/test_parser.nit:124,12--14 text='new'
+Read token at ../src/test_parser.nit:124,16--25 text='FileReader'
+Read token at ../src/test_parser.nit:124,26 text='.'
+Read token at ../src/test_parser.nit:124,27--30 text='open'
+Read token at ../src/test_parser.nit:124,31 text='('
+Read token at ../src/test_parser.nit:124,32 text='a'
+Read token at ../src/test_parser.nit:124,33 text=')'
+Read token at ../src/test_parser.nit:124,34--125,0 text='
+'
+Read token at ../src/test_parser.nit:125,4--9 text='source'
+Read token at ../src/test_parser.nit:125,11 text='='
+Read token at ../src/test_parser.nit:125,13--15 text='new'
+Read token at ../src/test_parser.nit:125,17--26 text='SourceFile'
+Read token at ../src/test_parser.nit:125,27 text='('
+Read token at ../src/test_parser.nit:125,28 text='a'
+Read token at ../src/test_parser.nit:125,29 text=','
+Read token at ../src/test_parser.nit:125,31 text='f'
+Read token at ../src/test_parser.nit:125,32 text=')'
+Read token at ../src/test_parser.nit:125,33--126,0 text='
+'
+Read token at ../src/test_parser.nit:126,4 text='f'
+Read token at ../src/test_parser.nit:126,5 text='.'
+Read token at ../src/test_parser.nit:126,6--10 text='close'
+Read token at ../src/test_parser.nit:126,11--127,0 text='
+'
+Read token at ../src/test_parser.nit:127,3--5 text='end'
+Read token at ../src/test_parser.nit:127,6--128,0 text='
+'
+Read token at ../src/test_parser.nit:128,3--5 text='var'
+Read token at ../src/test_parser.nit:128,7--11 text='lexer'
+Read token at ../src/test_parser.nit:128,13 text='='
+Read token at ../src/test_parser.nit:128,15--17 text='new'
+Read token at ../src/test_parser.nit:128,19--23 text='Lexer'
+Read token at ../src/test_parser.nit:128,24 text='('
+Read token at ../src/test_parser.nit:128,25--30 text='source'
+Read token at ../src/test_parser.nit:128,31 text=')'
+Read token at ../src/test_parser.nit:128,32--129,0 text='
+'
+Read token at ../src/test_parser.nit:129,3--4 text='if'
+Read token at ../src/test_parser.nit:129,6--15 text='only_lexer'
+Read token at ../src/test_parser.nit:129,17--20 text='then'
+Read token at ../src/test_parser.nit:129,21--130,0 text='
+'
+Read token at ../src/test_parser.nit:130,4--6 text='var'
+Read token at ../src/test_parser.nit:130,8--12 text='token'
+Read token at ../src/test_parser.nit:130,14 text='='
+Read token at ../src/test_parser.nit:130,16--20 text='lexer'
+Read token at ../src/test_parser.nit:130,21 text='.'
+Read token at ../src/test_parser.nit:130,22--25 text='next'
+Read token at ../src/test_parser.nit:130,26--131,0 text='
+'
+Read token at ../src/test_parser.nit:131,4--8 text='while'
+Read token at ../src/test_parser.nit:131,10--12 text='not'
+Read token at ../src/test_parser.nit:131,14--18 text='token'
+Read token at ../src/test_parser.nit:131,20--22 text='isa'
+Read token at ../src/test_parser.nit:131,24--26 text='EOF'
+Read token at ../src/test_parser.nit:131,28--29 text='do'
+Read token at ../src/test_parser.nit:131,30--132,0 text='
+'
+Read token at ../src/test_parser.nit:132,5--6 text='if'
+Read token at ../src/test_parser.nit:132,8--10 text='not'
+Read token at ../src/test_parser.nit:132,12--19 text='no_print'
+Read token at ../src/test_parser.nit:132,21--24 text='then'
+Read token at ../src/test_parser.nit:132,25--133,0 text='
+'
+Read token at ../src/test_parser.nit:133,6--10 text='print'
+Read token at ../src/test_parser.nit:133,11 text='('
+Read token at ../src/test_parser.nit:133,12--27 text='"Read token at {'
+Read token at ../src/test_parser.nit:133,28--32 text='token'
+Read token at ../src/test_parser.nit:133,33 text='.'
+Read token at ../src/test_parser.nit:133,34--41 text='location'
+Read token at ../src/test_parser.nit:133,42--50 text='} text='{'
+Read token at ../src/test_parser.nit:133,51--55 text='token'
+Read token at ../src/test_parser.nit:133,56 text='.'
+Read token at ../src/test_parser.nit:133,57--60 text='text'
+Read token at ../src/test_parser.nit:133,61--63 text='}'"'
+Read token at ../src/test_parser.nit:133,64 text=')'
+Read token at ../src/test_parser.nit:133,65--134,0 text='
+'
+Read token at ../src/test_parser.nit:134,5--7 text='end'
+Read token at ../src/test_parser.nit:134,8--135,0 text='
+'
+Read token at ../src/test_parser.nit:135,5--9 text='token'
+Read token at ../src/test_parser.nit:135,11 text='='
+Read token at ../src/test_parser.nit:135,13--17 text='lexer'
+Read token at ../src/test_parser.nit:135,18 text='.'
+Read token at ../src/test_parser.nit:135,19--22 text='next'
+Read token at ../src/test_parser.nit:135,23--136,0 text='
+'
+Read token at ../src/test_parser.nit:136,4--6 text='end'
+Read token at ../src/test_parser.nit:136,7--137,0 text='
+'
+Read token at ../src/test_parser.nit:137,3--6 text='else'
+Read token at ../src/test_parser.nit:137,7--138,0 text='
+'
+Read token at ../src/test_parser.nit:138,4--6 text='var'
+Read token at ../src/test_parser.nit:138,8--13 text='parser'
+Read token at ../src/test_parser.nit:138,15 text='='
+Read token at ../src/test_parser.nit:138,17--19 text='new'
+Read token at ../src/test_parser.nit:138,21--26 text='Parser'
+Read token at ../src/test_parser.nit:138,27 text='('
+Read token at ../src/test_parser.nit:138,28--32 text='lexer'
+Read token at ../src/test_parser.nit:138,33 text=')'
+Read token at ../src/test_parser.nit:138,34--139,0 text='
+'
+Read token at ../src/test_parser.nit:139,4--6 text='var'
+Read token at ../src/test_parser.nit:139,8--11 text='tree'
+Read token at ../src/test_parser.nit:139,13 text='='
+Read token at ../src/test_parser.nit:139,15--20 text='parser'
+Read token at ../src/test_parser.nit:139,21 text='.'
+Read token at ../src/test_parser.nit:139,22--26 text='parse'
+Read token at ../src/test_parser.nit:139,27--140,0 text='
 '
 Read token at ../src/test_parser.nit:140,1--141,0 text='
 '
-Read token at ../src/test_parser.nit:141,4--5 text='if'
-Read token at ../src/test_parser.nit:141,7--9 text='not'
-Read token at ../src/test_parser.nit:141,11--18 text='no_print'
-Read token at ../src/test_parser.nit:141,20--23 text='then'
-Read token at ../src/test_parser.nit:141,24--142,0 text='
-'
-Read token at ../src/test_parser.nit:142,5 text='('
-Read token at ../src/test_parser.nit:142,6--8 text='new'
-Read token at ../src/test_parser.nit:142,10--25 text='PrintTreeVisitor'
-Read token at ../src/test_parser.nit:142,26 text=')'
-Read token at ../src/test_parser.nit:142,27 text='.'
-Read token at ../src/test_parser.nit:142,28--38 text='enter_visit'
-Read token at ../src/test_parser.nit:142,39 text='('
-Read token at ../src/test_parser.nit:142,40--43 text='tree'
-Read token at ../src/test_parser.nit:142,44 text=')'
-Read token at ../src/test_parser.nit:142,45--143,0 text='
-'
-Read token at ../src/test_parser.nit:143,4--6 text='end'
-Read token at ../src/test_parser.nit:143,7--144,0 text='
-'
-Read token at ../src/test_parser.nit:144,3--5 text='end'
-Read token at ../src/test_parser.nit:144,6--145,0 text='
-'
-Read token at ../src/test_parser.nit:145,2--4 text='end'
-Read token at ../src/test_parser.nit:145,5--146,0 text='
-'
-Read token at ../src/test_parser.nit:146,1--3 text='end'
-Read token at ../src/test_parser.nit:146,4--147,0 text='
+Read token at ../src/test_parser.nit:141,4--6 text='var'
+Read token at ../src/test_parser.nit:141,8--12 text='error'
+Read token at ../src/test_parser.nit:141,14 text='='
+Read token at ../src/test_parser.nit:141,16--19 text='tree'
+Read token at ../src/test_parser.nit:141,20 text='.'
+Read token at ../src/test_parser.nit:141,21--25 text='n_eof'
+Read token at ../src/test_parser.nit:141,26--142,0 text='
+'
+Read token at ../src/test_parser.nit:142,4--5 text='if'
+Read token at ../src/test_parser.nit:142,7--11 text='error'
+Read token at ../src/test_parser.nit:142,13--15 text='isa'
+Read token at ../src/test_parser.nit:142,17--22 text='AError'
+Read token at ../src/test_parser.nit:142,24--27 text='then'
+Read token at ../src/test_parser.nit:142,28--143,0 text='
+'
+Read token at ../src/test_parser.nit:143,5--9 text='print'
+Read token at ../src/test_parser.nit:143,10 text='('
+Read token at ../src/test_parser.nit:143,11--21 text='"Error at {'
+Read token at ../src/test_parser.nit:143,22--26 text='error'
+Read token at ../src/test_parser.nit:143,27 text='.'
+Read token at ../src/test_parser.nit:143,28--35 text='location'
+Read token at ../src/test_parser.nit:143,36--42 text='}:\n\t{'
+Read token at ../src/test_parser.nit:143,43--47 text='error'
+Read token at ../src/test_parser.nit:143,48 text='.'
+Read token at ../src/test_parser.nit:143,49--55 text='message'
+Read token at ../src/test_parser.nit:143,56--57 text='}"'
+Read token at ../src/test_parser.nit:143,58 text=')'
+Read token at ../src/test_parser.nit:143,59--144,0 text='
+'
+Read token at ../src/test_parser.nit:144,5--10 text='return'
+Read token at ../src/test_parser.nit:144,11--145,0 text='
+'
+Read token at ../src/test_parser.nit:145,4--6 text='end'
+Read token at ../src/test_parser.nit:145,7--146,0 text='
+'
+Read token at ../src/test_parser.nit:146,1--147,0 text='
+'
+Read token at ../src/test_parser.nit:147,4--5 text='if'
+Read token at ../src/test_parser.nit:147,7--9 text='xml'
+Read token at ../src/test_parser.nit:147,11--14 text='then'
+Read token at ../src/test_parser.nit:147,15--148,0 text='
+'
+Read token at ../src/test_parser.nit:148,5--8 text='tree'
+Read token at ../src/test_parser.nit:148,9 text='.'
+Read token at ../src/test_parser.nit:148,10--25 text='parentize_tokens'
+Read token at ../src/test_parser.nit:148,26--149,0 text='
+'
+Read token at ../src/test_parser.nit:149,5--8 text='tree'
+Read token at ../src/test_parser.nit:149,9 text='.'
+Read token at ../src/test_parser.nit:149,10--15 text='to_xml'
+Read token at ../src/test_parser.nit:149,16 text='.'
+Read token at ../src/test_parser.nit:149,17--24 text='write_to'
+Read token at ../src/test_parser.nit:149,25 text='('
+Read token at ../src/test_parser.nit:149,26--31 text='stdout'
+Read token at ../src/test_parser.nit:149,32 text=')'
+Read token at ../src/test_parser.nit:149,33--150,0 text='
+'
+Read token at ../src/test_parser.nit:150,4--7 text='else'
+Read token at ../src/test_parser.nit:150,9--10 text='if'
+Read token at ../src/test_parser.nit:150,12--14 text='not'
+Read token at ../src/test_parser.nit:150,16--23 text='no_print'
+Read token at ../src/test_parser.nit:150,25--28 text='then'
+Read token at ../src/test_parser.nit:150,29--151,0 text='
+'
+Read token at ../src/test_parser.nit:151,5 text='('
+Read token at ../src/test_parser.nit:151,6--8 text='new'
+Read token at ../src/test_parser.nit:151,10--25 text='PrintTreeVisitor'
+Read token at ../src/test_parser.nit:151,26 text=')'
+Read token at ../src/test_parser.nit:151,27 text='.'
+Read token at ../src/test_parser.nit:151,28--38 text='enter_visit'
+Read token at ../src/test_parser.nit:151,39 text='('
+Read token at ../src/test_parser.nit:151,40--43 text='tree'
+Read token at ../src/test_parser.nit:151,44 text=')'
+Read token at ../src/test_parser.nit:151,45--152,0 text='
+'
+Read token at ../src/test_parser.nit:152,4--6 text='end'
+Read token at ../src/test_parser.nit:152,7--153,0 text='
+'
+Read token at ../src/test_parser.nit:153,3--5 text='end'
+Read token at ../src/test_parser.nit:153,6--154,0 text='
+'
+Read token at ../src/test_parser.nit:154,2--4 text='end'
+Read token at ../src/test_parser.nit:154,5--155,0 text='
+'
+Read token at ../src/test_parser.nit:155,1--3 text='end'
+Read token at ../src/test_parser.nit:155,4--156,0 text='
 '
index 100c6c8..2baaaf4 100644 (file)
@@ -1,2 +1,2 @@
 Error at ./error_syntax.nit:19,2:
-       Syntax error: unknown token ?.
+       Syntax Error: unknown token `?`.
index 2b55dba..cf02491 100644 (file)
@@ -1,2 +1,2 @@
 Error at ./error_syntax3.nit:1,1--4:
-       Syntax error: unexpected keyword 'else'.
+       Syntax Error: unexpected keyword 'else'.
index 4496bff..fcd0e45 100644 (file)
@@ -21,6 +21,7 @@ Start 1,1--42
                     AImplicitSelfExpr 1,32
                     TId "toto" 1,32--35
                     AListExprs 1,35
+                  TPlus "+" 1,36
                   ACallExpr 1,37--40
                     AImplicitSelfExpr 1,37
                     TId "toto" 1,37--40
index 04d16f1..34ceaf4 100644 (file)
@@ -74,7 +74,7 @@
             TKwend "end" 4,1--3
         TKwend "end" 5,1--3
 --> ...        \e[0;31mfun\e[0m fun fun fu
-       ^: Syntax error: unexpected keyword 'fun'.
+       ^: Syntax Error: unexpected keyword 'fun'.
 -->    %\e[0;31m$\e[0m&^*
-        ^: Syntax error: unknown token $.
+        ^: Syntax Error: unknown token `$`.
 --> 
\ No newline at end of file
index 7299792..119c004 100644 (file)
@@ -1 +1 @@
-error_syntax3.nit:1,1--4: Syntax error: unexpected keyword 'else'.
+error_syntax3.nit:1,1--4: Syntax Error: unexpected keyword 'else'.
diff --git a/tests/sav/test_platform_ios.res b/tests/sav/test_platform_ios.res
new file mode 100644 (file)
index 0000000..3c5611a
--- /dev/null
@@ -0,0 +1,4 @@
+out/test_platform_ios.bin
+out/test_platform_ios.bin/Info.plist
+out/test_platform_ios.bin/PkgInfo
+out/test_platform_ios.bin/test_platform_ios
index 67cf6fc..3fd0f10 100644 (file)
@@ -1 +1 @@
-alt/test_string_triple4_alt1.nit:15,7--14: Syntax error: unexpected malformed string "#alt1# .
+alt/test_string_triple4_alt1.nit:15,7--14: Syntax Error: unexpected malformed string "#alt1# .
index 2eb8251..78c1dcc 100644 (file)
@@ -1,4 +1,4 @@
-test_super_gen.nit:27,12--14: Warning: Useless formal parameter type since `Int` cannnot have subclasses.
+test_super_gen.nit:27,12--14: Warning: useless formal parameter type since `Int` cannot have subclasses.
 1
 0
 5
index 8566ddc..1fc76c7 100644 (file)
@@ -1,4 +1,4 @@
-test_super_gen.nit:27,12--14: Warning: Useless formal parameter type since `Int` cannnot have subclasses.
-test_super_gen_raf.nit:19,12--14: Warning: Useless formal parameter type since `Int` cannnot have subclasses.
+test_super_gen.nit:27,12--14: Warning: useless formal parameter type since `Int` cannot have subclasses.
+test_super_gen_raf.nit:19,12--14: Warning: useless formal parameter type since `Int` cannot have subclasses.
 0
 20
index b11da69..b2b26fe 100644 (file)
@@ -1 +1 @@
-test_super_param2.nit:20,10: Type error: class C not found in module test_super_param2.
+test_super_param2.nit:20,10: Error: class `C` not found in module `test_super_param2`.
index 7f95a14..85394fc 100644 (file)
@@ -1 +1 @@
-alt/test_superstring_alt1.nit:24,16--19: Type error: expected Object, got null
+alt/test_superstring_alt1.nit:24,16--19: Type Error: expected `Object`, got `null`.
index 6e0ca35..ad80c05 100644 (file)
@@ -5,7 +5,7 @@ _DUMMY_TOOL()
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
-       opts="--warn --warning --quiet --stop-on-first-error --no-color --log --log-dir --nit-dir --help --version --set-dummy-tool --verbose --bash-completion --stub-man --option-a --option-b"
+       opts="--warn --warning --quiet --stop-on-first-error --keep-going --no-color --log --log-dir --nit-dir --help --version --set-dummy-tool --verbose --bash-completion --stub-man --option-a --option-b"
        if [[ ${cur} == -* ]] ; then
                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                return 0
index b14caf6..464f929 100644 (file)
@@ -4,6 +4,7 @@ Test for ToolContext, try --bash-completion.
   -w, --warning           Show/hide a specific warning
   -q, --quiet             Do not show warnings
   --stop-on-first-error   Stop on first error
+  --keep-going            Continue after errors, whatever the consequences
   --no-color              Do not use color to display errors and warnings
   --log                   Generate various log files
   --log-dir               Directory where to generate log files
index 2bff123..035d7c1 100644 (file)
@@ -1,2 +1,2 @@
-test_variance_attr.nit:28,20--31: Redef Error: Wrong type for parameter `foo'. found nullable Int, expected nullable Object.
-test_variance_attr.nit:29,20--29: Redef Error: Wrong type for parameter `bar'. found nullable B, expected nullable A.
+test_variance_attr.nit:28,20--31: Redef Error: expected `nullable Object` type for parameter `foo'; got `nullable Int`.
+test_variance_attr.nit:29,20--29: Redef Error: expected `nullable A` type for parameter `bar'; got `nullable B`.
diff --git a/tests/sav/threaded_example.res b/tests/sav/threaded_example.res
new file mode 100644 (file)
index 0000000..e90aa48
--- /dev/null
@@ -0,0 +1,4 @@
+main
+threaded
+10
+parameterized and threaded
index 77faf65..112bdb0 100644 (file)
@@ -1,3 +1,3 @@
-../examples/nitcorn/src/xymus_net.nit:24,8--14: Error: cannot find module tnitter from nitcorn. tried alt, ../lib, ../examples/nitcorn
-../examples/nitcorn/src/xymus_net.nit:25,8--26: Error: cannot find module benitlux_controller from nitcorn. tried alt, ../lib, ../examples/nitcorn
-../examples/nitcorn/src/xymus_net.nit:26,8--29: Error: cannot find module opportunity_controller from nitcorn. tried alt, ../lib, ../examples/nitcorn
+../examples/nitcorn/src/xymus_net.nit:24,8--14: Error: cannot find module `tnitter` from `nitcorn`. Tried: alt, ../lib, ../examples/nitcorn.
+../examples/nitcorn/src/xymus_net.nit:25,8--26: Error: cannot find module `benitlux_controller` from `nitcorn`. Tried: alt, ../lib, ../examples/nitcorn.
+../examples/nitcorn/src/xymus_net.nit:26,8--29: Error: cannot find module `opportunity_controller` from `nitcorn`. Tried: alt, ../lib, ../examples/nitcorn.
diff --git a/tests/test_deriving.nit b/tests/test_deriving.nit
new file mode 100644 (file)
index 0000000..5f02241
--- /dev/null
@@ -0,0 +1,82 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import deriving
+
+redef class Object
+       # Redef to avoid unstable `object_id`
+       redef fun inspect_head do return "{class_name}"
+end
+
+class A
+       auto_inspect
+       auto_derive
+       super DeriveToS#alt1#
+       super DeriveEqual#alt2#
+
+       var i: Int
+       var s: String
+end
+
+class A2
+       super DeriveToS
+       super DeriveEqual
+
+       redef fun derive_to_map
+       do
+               var res = super
+               res["string"] = s # drop i
+               return res
+       end
+
+       var i: Int
+       var s: String
+end
+
+class B
+       super A#alt4#super A2
+
+       auto_inspect
+       auto_derive#alt3#
+
+       var a: A
+end
+
+var a = new A(5, "Hello")
+print a.inspect
+print a.derive_to_map.join(" ", "=")
+print a
+
+print ""
+
+var a2 = new A(5, "Hel" + "lo")
+var a3 = new A(6, "Hel" + "lo")
+print a == a2
+print a.hash == a2.hash
+print a != a3
+
+print ""
+
+var b = new B(100, "World", a)
+print b.inspect
+print b.derive_to_map.join(" ", "=")
+print b
+
+print ""
+
+var b2 = new B(100, "World", a2)
+var b3 = new B(100, "World", a3)
+print b == b2
+print b.hash == b2.hash
+print b != b3
index fee35a5..5445bbf 100644 (file)
@@ -21,7 +21,7 @@ end
 fun foo do print "foo"
 
 fun call_a_fun import foo `{
-       Object_foo(recv);
+       Sys_foo(recv);
 `}
 
 fun call_a_constructor import A, A.bar `{
index 6be81fe..5fb5b35 100644 (file)
@@ -33,7 +33,7 @@ fun in2(i: Float) do print "Back in Nit: in2"
 
 fun out(i: Int, f: Float): Int import in1, in2, A, A.alt, A.to_i `{
        printf("From C, beginning out: %ld\n", i);
-       Object_in1(recv, i);
+       Sys_in1(recv, i);
        A a = new_A();
        A b = new_A_alt(10);
        printf("From C, a=%ld\n", A_to_i(a));
index ecc608f..5261b5e 100644 (file)
@@ -26,6 +26,11 @@ class A
                return new_A( s + o );
        `}
 
+       fun +: A import value, A `{
+               int s = A_value(recv);
+               return new_A(+s);
+       `}
+
        fun -( other : A ) : A import value, A `{
                int s = A_value( recv );
                int o = A_value( other );
@@ -97,14 +102,16 @@ class A
                return A_value( recv ) <= A_value( other );
        `}
 
-       fun >>( other : A ) import value, value=, A `{
+       fun >>( other : A ): A import value, value=, A `{
                int new_val = A_value( recv ) >> A_value( other );
                A_value__assign( recv, new_val );
+               return recv;
        `}
 
-       fun <<( other : A ) import value, A `{
+       fun <<( other : A ): A import value, A `{
                int new_val = A_value( recv ) << A_value( other );
                A_value__assign( recv, new_val );
+               return recv;
        `}
 
        fun []( index : Int ) : A import A `{
@@ -149,13 +156,13 @@ print new A( 1 ) >= new A( 100 ) # false
 print new A( 100 ) >= new A( 100 ) # true
 print new A( 100 ) >= new A( 1 ) # true
 
-#var x = new A( 1 )
-#x << new A( 5 )
-#print x # 16
+var x = new A( 1 )
+x = x << new A( 5 )
+print x # 32
 
-#var y = new A( 32 )
-#y >> new A( 2 )
-#print y # 8
+var y = new A( 32 )
+y = y >> new A( 2 )
+print y # 8
 
 var a = new A( 456 )
 print a[ 52 ] # 52
@@ -163,4 +170,5 @@ print a[ 52 ] # 52
 a[ 74 ] = new A( 96 )
 print a # 96
 
+print(+(new A(123)))
 print(-(new A(123)))
index 9b0cd1c..4512519 100644 (file)
@@ -24,7 +24,7 @@ import bar, String.to_cstring, Int.+ in "ObjC" `{
 
        printf("From Objective-C: %ld %f %s\n", ii, f, cstr);
 
-       Object_bar(recv, ii, f, s);
+       Sys_bar(recv, ii, f, s);
 `}
 
 fun bar(i: Int, f: Float, s: String)
index c5b9eea..8e147f7 100644 (file)
@@ -40,7 +40,7 @@ end
 fun test2(h: Map[Int, Int])
 do
        print("* test 2 *")
-       var nb = 999
+       var nb = 99
        
        var i = 0
        while i <= nb do
index 9487e82..dc9d167 100644 (file)
@@ -27,4 +27,7 @@ fun foo(n: Int): List[Int]
        return a
     end
 
-print(foo(23))
+var n = 10
+if args.not_empty then n = args.first.to_i
+
+print(foo(n))
diff --git a/tests/test_meta.nit b/tests/test_meta.nit
new file mode 100644 (file)
index 0000000..936982e
--- /dev/null
@@ -0,0 +1,56 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import meta
+
+class XObject
+       redef type CLASS: XClass[SELF]
+       redef fun class_factory(name) do return new XClass[SELF](name)
+end
+
+class XClass[E: XObject]
+       super Class[E]
+end
+
+class YObject
+       redef type CLASS: YClass[SELF]
+       redef fun class_factory(name) do return new YClass[SELF](name)
+end
+
+class YClass[E: YObject]
+       super Class[E]
+       super YObject # Yeah, a meta-loop!
+end
+
+var s = "hello"
+print s.class_name
+print s.get_class
+print s.get_class.get_class
+print s.get_class.get_class.get_class
+
+print ""
+
+var x = new XObject
+print x.class_name
+print x.get_class
+print x.get_class.get_class
+print x.get_class.get_class.get_class
+
+print ""
+
+var y = new YObject
+print y.class_name
+print y.get_class
+print y.get_class.get_class
+print y.get_class.get_class.get_class
diff --git a/tests/test_nitunit3/README.md b/tests/test_nitunit3/README.md
new file mode 100644 (file)
index 0000000..5c19d05
--- /dev/null
@@ -0,0 +1,13 @@
+Bla bla
+
+~~~
+assert false
+~~~
+
+~~~
+;'\][]
+~~~
+
+~~~
+assert true
+~~~
diff --git a/tests/test_nitunit3/test_nitunit3.nit b/tests/test_nitunit3/test_nitunit3.nit
new file mode 100644 (file)
index 0000000..033b187
--- /dev/null
@@ -0,0 +1,18 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Test
+#
+#     assert true
+module test_nitunit3
diff --git a/tests/test_nitunit_md.md b/tests/test_nitunit_md.md
new file mode 100644 (file)
index 0000000..5bcfa88
--- /dev/null
@@ -0,0 +1,15 @@
+# Test
+
+~~~
+var a = 1
+~~~
+
+~~~raw
+ignored
+~~~
+
+~~~
+assert 1 == 1
+~~~
+
+    assert false
diff --git a/tests/test_platform_ios.nit b/tests/test_platform_ios.nit
new file mode 100644 (file)
index 0000000..b49f379
--- /dev/null
@@ -0,0 +1,15 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import ios
index d474ea0..175e6fc 100644 (file)
@@ -18,7 +18,7 @@ module platform
 import end
 
 # Root of everything.
-class Object
+interface Object
        # Used for comparisons.
        type OTHER: nullable Object
 
diff --git a/tests/testosx.sh b/tests/testosx.sh
new file mode 100755 (executable)
index 0000000..8976424
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/bash
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Tests to run on OS X for the host platform and iOS
+./tests.sh $@ \
+       test_ffi_objc_*.nit \
+       test_*ios.nit \
+       ../lib/ios/examples/*.nit \
+       ../lib/cocoa*/examples/*.nit
index 6c76366..39e0cbd 100755 (executable)
@@ -50,6 +50,7 @@ Usage: $e [options] modulenames
 --outdir    Use a specific output folder (default=out/)
 --compdir   Use a specific temporary compilation folder (default=.nit_compile)
 --node      Run as a node in parallel, will not output context information
+--autosav   Copy the .res files directly in the sav folder overriding existing .res files
 END
 }
 
@@ -69,7 +70,9 @@ saferun()
                        *) stop=true
                esac
        done
-       if test -n "$TIME"; then
+       if test -d "$1"; then
+               find $1 | sort
+       elif test -n "$TIME"; then
                $TIME -o "$o" $a $TIMEOUT "$@"
        else
                if test -n "$a"; then echo 0 >> "$o"; else echo 0 > "$o"; fi
@@ -232,6 +235,7 @@ function process_result()
                        echo "[*ok*] $outdir/$pattern.res $SAV - but $OLD remains!"
                        echo >>$xml "<error message='`xmlesc "ok $outdir/$pattern.res - but $OLD remains"`'/>"
                        remains="$remains $OLD"
+                       test "$autosav" = "true" && rm "$OLD"
                else
                        echo "[ok] $outdir/$pattern.res $SAV"
                fi
@@ -241,6 +245,7 @@ function process_result()
                        echo "[*fixme*] $outdir/$pattern.res $FIXME - but $OLD remains!"
                        echo >>$xml "<error message='`xmlesc "ok $outdir/$pattern.res - but $OLD remains"`'/>"
                        remains="$remains $OLD"
+                       test "$autosav" = "true" && rm "$OLD"
                else
                        echo "[fixme] $outdir/$pattern.res $FIXME"
                        echo >>$xml "<skipped/>"
@@ -258,6 +263,7 @@ function process_result()
                echo >>$xml "]]></system-out>"
                nok="$nok $pattern"
                echo "$ii" >> "$ERRLIST"
+               test "$autosav" = "true" && cp "$outdir/$pattern.res" "$SOSO"
        elif [ -n "$SOSOF" ]; then
                echo "[======= fixme soso $outdir/$pattern.res $SOSOF =======]"
                echo >>$xml "<error message='`xmlesc "soso $outdir/$pattern.res $SOSO"`'/>"
@@ -266,6 +272,7 @@ function process_result()
                echo >>$xml "]]></system-out>"
                nok="$nok $pattern"
                echo "$ii" >> "$ERRLIST"
+               test "$autosav" = "true" && cp "$outdir/$pattern.res" && "$SOSO"
        elif [ -n "$NSAV" ]; then
                echo "[======= fail $outdir/$pattern.res $NSAV =======]"
                echo >>$xml "<error message='`xmlesc "fail $outdir/$pattern.res $NSAV"`'/>"
@@ -274,6 +281,7 @@ function process_result()
                echo >>$xml "]]></system-out>"
                nok="$nok $pattern"
                echo "$ii" >> "$ERRLIST"
+               test "$autosav" = "true" && cp "$outdir/$pattern.res" "$NSAV"
        elif [ -n "$NFIXME" ]; then
                echo "[======= changed $outdir/$pattern.res $NFIXME ======]"
                echo >>$xml "<error message='`xmlesc "changed $outdir/$pattern.res $NFIXME"`'/>"
@@ -282,6 +290,7 @@ function process_result()
                echo >>$xml "]]></system-out>"
                nok="$nok $pattern"
                echo "$ii" >> "$ERRLIST"
+               test "$autosav" = "true" && cp "$outdir/$pattern.res" "$NFIXME"
        elif [ -s "$outdir/$pattern.res" ]; then
                echo "[=== no sav ===] $outdir/$pattern.res is not empty"
                echo >>$xml "<error message='no sav and not empty'/>"
@@ -290,6 +299,7 @@ function process_result()
                echo >>$xml "]]></system-out>"
                nos="$nos $pattern"
                echo "$ii" >> "$ERRLIST"
+               test "$autosav" = "true" && cp "$outdir/$pattern.res" "sav/"
        else
                # no sav but empty res
                echo "[0k] $outdir/$pattern.res is empty"
@@ -362,6 +372,7 @@ find_nitc()
 
 verbose=false
 isnode=false
+autosav=false
 stop=false
 engine=nitc
 noskip=
@@ -376,6 +387,7 @@ while [ $stop = false ]; do
                --outdir) outdir="$2"; shift; shift;;
                --compdir) compdir="$2"; shift; shift;;
                --node) isnode=true; shift;;
+               --autosav) autosav=true; shift;;
                *) stop=true
        esac
 done