Merge: Love contrib
authorJean Privat <jean@pryen.org>
Mon, 8 Jun 2015 10:05:00 +0000 (06:05 -0400)
committerJean Privat <jean@pryen.org>
Mon, 8 Jun 2015 10:05:00 +0000 (06:05 -0400)
One day, a package manager will simplify the installation and the maintenance of third-party projects, libraries and programs in Nit, so that `import foo` will import the project `foo` if installed.

Noways, `contrib` is used as a placeholder for some independent projects that are not mainly a library (or borderline). However, the nature of the Nit language, especially the refinement of class blurry the difference between libraries and programs and make it conceivable to extends an existing program by refining it (or just reuse its base libraries).
However, `import foo` will not work if foo is in contrib, this issue has two current workarounds:

* the user use `-I` with some relative path location in the Makefile, that is not practical because it should be used on each tools thus broke basic manual commands (like nitc on the command line) and automatic commands (like vim+nitpick).
* the project just move itself to lib/ so that client can easily import it, but this is hard to conceptualize for some project like `nitiwiki`

The easy solution to solve this issue is to add `contrib` to the libpath.

Note: the loader still has to be rewritten to be less buggy, more simple and saner. cf #1250

Pull-Request: #1436
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

contrib/opportunity/src/templates/meetup.nit
share/man/nitc.md
src/compiler/abstract_compiler.nit
src/mkcsrc
src/parser/nit.sablecc3xx
src/parser/parser_nodes.nit
src/parser/parser_work.nit
src/parser/tables_nit.c
tests/sav/test_float.res
tests/test_float.nit

index 6eca566..07a5f66 100644 (file)
@@ -356,7 +356,7 @@ redef class Meetup
                end
                t.add """
 <tr id="total">
-       <th>Total</th>
+       <th>Total ({{{participants(db).length}}})</th>
                """
                for i in answers(db) do
                        t.add """<th id="total{{{i.id}}}"><center>{{{i.count(db)}}}"""
index 91e8d8c..9e0fbf5 100644 (file)
@@ -404,8 +404,18 @@ They are useless for a normal user.
 `--no-main`
 :   Do not generate main entry point.
 
-`--stacktrace`
-:   Control the generation of stack traces.
+`--no-stacktrace`
+:   The compiled program will not display stack traces on runtime errors.
+
+    Because stack traces rely on libunwind, this option might be useful in order to generate more portable binaries
+    since libunwind might be non available on the runtime system (or available with an ABI incompatible version).
+
+    The generated C is API-portable and can be reused, distributed and compiled on any supported system.
+    If the option `--no-stacktrace` is not used but the development files of the library `libunwind` are not available, then a warning will be displayed
+    and stack trace will be disabled.
+
+    Note that the `--no-stacktrace` option (or this absence) can be toggled manually in the generated Makefile (search `NO_STACKTRACE` in the Makefile).
+    Moreover, the environment variable `NIT_NO_STACK` (see bellow) can also be used at runtime to disable stack traces.
 
 `--max-c-lines`
 :   Maximum number of lines in generated C files. Use 0 for unlimited.
@@ -481,6 +491,20 @@ This option is used to test the robustness of the tools by allowing phases to pr
     * large: disable the GC and just allocate a large memory area to use for all instantiation.
     * help: show the list of available options.
 
+`NIT_NO_STACK`
+:   Runtime control of stack traces.
+
+    By default, stack traces are printed when a runtime errors occurs during the execution of a compiled program.
+    When setting this environment variable to a non empty value, such stack traces are disabled.
+
+    The environment variable is used when programs are executed, not when they are compiled.
+    Thus, you do not need to recompile programs in order to disable generated stack traces.
+
+    Note that stack traces require that, during the compilation, development files of the library `libunwind` are available.
+    If they are not available, then programs are compiled without any stack trace support.
+
+    To completely disable stack traces, see the option `--no-stacktrace`.
+
 # SEE ALSO
 
 The Nit language documentation and the source code of its tools and libraries may be downloaded from <http://nitlanguage.org>
index 0a4d430..a095201 100644 (file)
@@ -63,8 +63,8 @@ redef class ToolContext
        var opt_invocation_metrics = new OptionBool("Enable static and dynamic count of all method invocations", "--invocation-metrics")
        # --isset-checks-metrics
        var opt_isset_checks_metrics = new OptionBool("Enable static and dynamic count of isset checks before attributes access", "--isset-checks-metrics")
-       # --stacktrace
-       var opt_stacktrace = new OptionString("Control the generation of stack traces", "--stacktrace")
+       # --no-stacktrace
+       var opt_no_stacktrace = new OptionBool("Disable the generation of stack traces", "--no-stacktrace")
        # --no-gcc-directives
        var opt_no_gcc_directive = new OptionArray("Disable a advanced gcc directives for optimization", "--no-gcc-directive")
        # --release
@@ -76,7 +76,7 @@ redef class ToolContext
                self.option_context.add_option(self.opt_output, self.opt_dir, self.opt_no_cc, self.opt_no_main, self.opt_make_flags, self.opt_compile_dir, self.opt_hardening)
                self.option_context.add_option(self.opt_no_check_covariance, self.opt_no_check_attr_isset, self.opt_no_check_assert, self.opt_no_check_autocast, self.opt_no_check_null, self.opt_no_check_all)
                self.option_context.add_option(self.opt_typing_test_metrics, self.opt_invocation_metrics, self.opt_isset_checks_metrics)
-               self.option_context.add_option(self.opt_stacktrace)
+               self.option_context.add_option(self.opt_no_stacktrace)
                self.option_context.add_option(self.opt_no_gcc_directive)
                self.option_context.add_option(self.opt_release)
                self.option_context.add_option(self.opt_max_c_lines, self.opt_group_c_files)
@@ -88,17 +88,6 @@ redef class ToolContext
        do
                super
 
-               var st = opt_stacktrace.value
-               if st == "none" or st == "libunwind" or st == "nitstack" then
-                       # Fine, do nothing
-               else if st == "auto" or st == null then
-                       # Default is nitstack
-                       opt_stacktrace.value = "nitstack"
-               else
-                       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 "Option Error: cannot use both --dir and --output"
                        exit(1)
@@ -212,7 +201,7 @@ class MakefileToolchain
        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
+               if platform.supports_libunwind then compiler.build_c_to_nit_bindings
                var cc_opt_with_libgc = "-DWITH_LIBGC"
                if not platform.supports_libgc then cc_opt_with_libgc = ""
 
@@ -355,25 +344,50 @@ class MakefileToolchain
 
                makefile.write("CC = ccache cc\nCXX = ccache c++\nCFLAGS = -g -O2 -Wno-unused-value -Wno-switch -Wno-attributes\nCINCL =\nLDFLAGS ?= \nLDLIBS  ?= -lm {linker_options.join(" ")}\n\n")
 
-               var ost = toolcontext.opt_stacktrace.value
-               if (ost == "libunwind" or ost == "nitstack") and platform.supports_libunwind then makefile.write("NEED_LIBUNWIND := YesPlease\n")
+               makefile.write "\n# SPECIAL CONFIGURATION FLAGS\n"
+               if platform.supports_libunwind then
+                       if toolcontext.opt_no_stacktrace.value then
+                               makefile.write "NO_STACKTRACE=True"
+                       else
+                               makefile.write "NO_STACKTRACE= # Set to `True` to enable"
+                       end
+               end
 
                # Dynamic adaptations
                # While `platform` enable complex toolchains, they are statically applied
                # For a dynamic adaptsation of the compilation, the generated Makefile should check and adapt things itself
+               makefile.write "\n\n"
 
                # Check and adapt the targeted system
                makefile.write("uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')\n")
-               makefile.write("ifeq ($(uname_S),Darwin)\n")
-               # remove -lunwind since it is already included on macosx
-               makefile.write("\tNEED_LIBUNWIND :=\n")
-               makefile.write("endif\n\n")
 
                # Check and adapt for the compiler used
                # clang need an additionnal `-Qunused-arguments`
                makefile.write("clang_check := $(shell sh -c '$(CC) -v 2>&1 | grep -q clang; echo $$?')\nifeq ($(clang_check), 0)\n\tCFLAGS += -Qunused-arguments\nendif\n")
 
-               makefile.write("ifdef NEED_LIBUNWIND\n\tLDLIBS += -lunwind\nendif\n")
+               if platform.supports_libunwind then
+                       makefile.write """
+ifneq ($(NO_STACKTRACE), True)
+  # Check and include lib-unwind in a portable way
+  ifneq ($(uname_S),Darwin)
+    # already included on macosx, but need to get the correct flags in other supported platforms.
+    ifeq ($(shell pkg-config --exists 'libunwind'; echo $$?), 0)
+      LDLIBS += `pkg-config --libs libunwind`
+      CFLAGS += `pkg-config --cflags libunwind`
+    else
+      $(warning "[_] stack-traces disabled. Please install libunwind-dev.")
+      CFLAGS += -D NO_STACKTRACE
+    endif
+  endif
+else
+  # Stacktraces disabled
+  CFLAGS += -D NO_STACKTRACE
+endif
+
+"""
+               else
+                       makefile.write("CFLAGS += -D NO_STACKTRACE\n\n")
+               end
 
                makefile.write("all: {outpath}\n")
                if outpath != real_outpath then
@@ -731,19 +745,16 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
        do
                var v = self.new_visitor
                v.add_decl("#include <signal.h>")
-               var ost = modelbuilder.toolcontext.opt_stacktrace.value
                var platform = target_platform
 
-               if not platform.supports_libunwind then ost = "none"
-
                var no_main = platform.no_main or modelbuilder.toolcontext.opt_no_main.value
 
-               if ost == "nitstack" or ost == "libunwind" then
+               if platform.supports_libunwind then
+                       v.add_decl("#ifndef NO_STACKTRACE")
                        v.add_decl("#define UNW_LOCAL_ONLY")
                        v.add_decl("#include <libunwind.h>")
-                       if ost == "nitstack" then
-                               v.add_decl("#include \"c_functions_hash.h\"")
-                       end
+                       v.add_decl("#include \"c_functions_hash.h\"")
+                       v.add_decl("#endif")
                end
                v.add_decl("int glob_argc;")
                v.add_decl("char **glob_argv;")
@@ -777,7 +788,8 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
                end
 
                v.add_decl("static void show_backtrace(void) \{")
-               if ost == "nitstack" or ost == "libunwind" then
+               if platform.supports_libunwind then
+                       v.add_decl("#ifndef NO_STACKTRACE")
                        v.add_decl("char* opt = getenv(\"NIT_NO_STACK\");")
                        v.add_decl("unw_cursor_t cursor;")
                        v.add_decl("if(opt==NULL)\{")
@@ -791,20 +803,17 @@ extern void nitni_global_ref_decr( struct nitni_ref *ref );
                        v.add_decl("PRINT_ERROR(\"-------------------------------------------------\\n\");")
                        v.add_decl("while (unw_step(&cursor) > 0) \{")
                        v.add_decl("    unw_get_proc_name(&cursor, procname, 100, &ip);")
-                       if ost == "nitstack" then
                        v.add_decl("    const char* recv = get_nit_name(procname, strlen(procname));")
                        v.add_decl("    if (recv != NULL)\{")
                        v.add_decl("            PRINT_ERROR(\"` %s\\n\", recv);")
                        v.add_decl("    \}else\{")
                        v.add_decl("            PRINT_ERROR(\"` %s\\n\", procname);")
                        v.add_decl("    \}")
-                       else
-                       v.add_decl("    PRINT_ERROR(\"` %s \\n\",procname);")
-                       end
                        v.add_decl("\}")
                        v.add_decl("PRINT_ERROR(\"-------------------------------------------------\\n\");")
                        v.add_decl("free(procname);")
                        v.add_decl("\}")
+                       v.add_decl("#endif /* NO_STACKTRACE */")
                end
                v.add_decl("\}")
 
index e1f43cc..de71f37 100755 (executable)
@@ -3,7 +3,7 @@
 # Regeneration of c_src from the current nitc
 
 rm -r ../c_src
-./nitc nith.nit --stacktrace none --semi-global --compile-dir ../c_src --output ../c_src/nitg --no-cc
+./nitc nith.nit --semi-global --compile-dir ../c_src --output ../c_src/nitg --no-cc
 
 # Remove old compilation flags
 sed -i -e 's/OLDNITCOPT=.*/OLDNITCOPT=/' Makefile
index 769f05b..592cc42 100644 (file)
@@ -207,7 +207,7 @@ bytenum = digit+ 'u8';
 hex_bytenum = ('0x' | '0X') hexdigit+ 'u8';
 bin_bytenum = ('0b' | '0B') bindigit+ 'u8';
 oct_bytenum = ('0o' | '0O') octdigit+ 'u8';
-float = digit* '.' digit+;
+float = digit* '.' digit+ | (digit+ | digit* '.' digit+) ('E'|'e') ('+'|'-'|) digit+;
 string = '"' str_body '"' | '"' '"' '"' long_str_body lsend1 | ''' ''' ''' long_sstr_body ''' ''' ''';
 start_string = '"' str_body '{' | '"' '"' '"' long_str_body lsend2;
 mid_string = '}' str_body '{' | '}' '}' '}' long_str_body lsend2;
index 6ec146f..9131c3e 100644 (file)
@@ -311,6 +311,35 @@ abstract class Token
        # May have disappeared in the AST
        var next_token: nullable Token = null
 
+       # Is `self` a token discarded from the AST?
+       #
+       # Loose tokens are not present in the AST.
+       # It means they were identified by the lexer but were discarded by the parser.
+       # It also means that they are not visited or manipulated by AST-related functions.
+       #
+       # Each loose token is attached to the non-loose token that precedes or follows it.
+       # The rules are the following:
+       #
+       # * tokens that follow a non-loose token on a same line are attached to it.
+       #   See `next_looses`.
+       # * other tokens, thus that precede a non-loose token on the same line or the next one,
+       # are attached to this one. See `prev_looses`.
+       #
+       # Loose tokens are mostly end of lines (`TEol`) and comments (`TComment`).
+       # Whitespace are ignored by the lexer, so they are not even considered as loose tokens.
+       # See `blank_before` to get the whitespace that separate tokens.
+       var is_loose = false
+
+       # Loose tokens that precede `self`.
+       #
+       # These tokens start the line or belong to a line with only loose tokens.
+       var prev_looses = new Array[Token] is lazy
+
+       # Loose tokens that follow `self`
+       #
+       # These tokens are on the same line than `self`.
+       var next_looses = new Array[Token] is lazy
+
        # The verbatim blank text between `prev_token` and `self`
        fun blank_before: String
        do
index c2eff11..a344fc7 100644 (file)
@@ -141,7 +141,8 @@ class Parser
                                var node1 = pop
                                assert node1 isa AModule
                                var node = new Start(node1, node2)
-                               (new ComputeProdLocationVisitor).enter_visit(node)
+                               node2.parent = node
+                               (new ComputeProdLocationVisitor(lexer.file.first_token)).enter_visit(node)
                                return node
                        else if action_type == 3 then # ERROR
                                # skip injected tokens
@@ -176,21 +177,55 @@ end
 # Uses existing token locations to infer location of productions.
 private class ComputeProdLocationVisitor
        super Visitor
+
+       # The current (or starting) cursor on the token sequence used to collect loose tokens
+       var token: nullable Token
+
        # Currently visited productions that need a first token
        var need_first_prods = new Array[Prod]
 
        # Already visited epsilon productions that waits something after them
        var need_after_epsilons = new Array[Prod]
 
-       # Location of the last visited token in the current production
-       var last_location: nullable Location = null
+       # The last visited token in the current production
+       var last_token: nullable Token = null
 
        redef fun visit(n: ANode)
        do
                if n isa Token then
+                       # Skip injected tokens
                        if not isset n._location then return
+
+                       # Collect loose tokens (not in the AST) and attach them to token in the AST
+                       var cursor = token
+                       if n != cursor then
+                               var lt = last_token
+                               # In order, we have the tokens:
+                               # * `lt` the previous visited token in the AST (if any)
+                               # * then `cursor` the loose tokens to attach
+                               # * then `n` the current visited token in the AST
+
+                               # In the following, we advance `cursor` to add them to `lt.next_looses` or to `n.prev_looses`.
+                               if lt != null then
+                                       var ltl = lt.location.line_end
+                                       # floating tokens on the same line of a AST-token follows it
+                                       while cursor != null and cursor != n and ltl == cursor.location.line_start do
+                                               cursor.is_loose = true
+                                               lt.next_looses.add cursor
+                                               cursor = cursor.next_token
+                                       end
+                               end
+                               # other loose tokens precede the next AST-token
+                               while cursor != null and cursor != n do
+                                       cursor.is_loose = true
+                                       n.prev_looses.add cursor
+                                       cursor = cursor.next_token
+                               end
+                       end
+                       token = n.next_token
+
                        var loc = n._location
-                       _last_location = loc
+                       _last_token = n
 
                        # Add a first token to productions that need one
                        if not _need_first_prods.is_empty then
@@ -217,8 +252,7 @@ private class ComputeProdLocationVisitor
                        var startl = n._first_location
                        if startl != null then
                                # Non-epsilon production
-                               var endl = _last_location
-                               assert endl != null
+                               var endl = _last_token.location
 
                                if startl == endl then
                                        n.location = startl
index ce36ccc..4fd03ae 100644 (file)
@@ -140,254 +140,258 @@ static const int lexer_goto_row19[] = {
        61, 61, 75
 };
 static const int lexer_goto_row20[] = {
-       9,
+       11,
        46, 46, 76,
        48, 57, 20,
        66, 66, 77,
-       79, 79, 78,
-       88, 88, 79,
-       98, 98, 80,
-       111, 111, 81,
-       117, 117, 82,
-       120, 120, 83
+       69, 69, 78,
+       79, 79, 79,
+       88, 88, 80,
+       98, 98, 81,
+       101, 101, 82,
+       111, 111, 83,
+       117, 117, 84,
+       120, 120, 85
 };
 static const int lexer_goto_row21[] = {
-       2,
+       4,
        46, 57, -21,
-       117, 117, 82
+       69, 69, 78,
+       101, 101, 82,
+       117, 117, 84
 };
 static const int lexer_goto_row22[] = {
        1,
-       58, 58, 84
+       58, 58, 86
 };
 static const int lexer_goto_row24[] = {
        2,
-       60, 60, 85,
-       61, 61, 86
+       60, 60, 87,
+       61, 61, 88
 };
 static const int lexer_goto_row25[] = {
        1,
-       61, 61, 87
+       61, 61, 89
 };
 static const int lexer_goto_row26[] = {
        2,
-       61, 61, 88,
-       62, 62, 89
+       61, 61, 90,
+       62, 62, 91
 };
 static const int lexer_goto_row28[] = {
        4,
-       48, 57, 90,
-       65, 90, 91,
-       95, 95, 92,
-       97, 122, 93
+       48, 57, 92,
+       65, 90, 93,
+       95, 95, 94,
+       97, 122, 95
 };
 static const int lexer_goto_row31[] = {
        1,
-       61, 61, 94
+       61, 61, 96
 };
 static const int lexer_goto_row32[] = {
        2,
-       95, 95, 95,
-       97, 122, 96
+       95, 95, 97,
+       97, 122, 98
 };
 static const int lexer_goto_row33[] = {
        1,
-       123, 123, 97
+       123, 123, 99
 };
 static const int lexer_goto_row34[] = {
        10,
-       48, 57, 98,
-       65, 90, 99,
-       95, 95, 100,
-       97, 97, 101,
-       98, 98, 102,
-       99, 109, 101,
-       110, 110, 103,
-       111, 114, 101,
-       115, 115, 104,
-       116, 122, 101
+       48, 57, 100,
+       65, 90, 101,
+       95, 95, 102,
+       97, 97, 103,
+       98, 98, 104,
+       99, 109, 103,
+       110, 110, 105,
+       111, 114, 103,
+       115, 115, 106,
+       116, 122, 103
 };
 static const int lexer_goto_row35[] = {
        4,
        48, 95, -35,
-       97, 113, 101,
-       114, 114, 105,
-       115, 122, 101
+       97, 113, 103,
+       114, 114, 107,
+       115, 122, 103
 };
 static const int lexer_goto_row36[] = {
        6,
        48, 95, -35,
-       97, 107, 101,
-       108, 108, 106,
-       109, 110, 101,
-       111, 111, 107,
-       112, 122, 101
+       97, 107, 103,
+       108, 108, 108,
+       109, 110, 103,
+       111, 111, 109,
+       112, 122, 103
 };
 static const int lexer_goto_row37[] = {
        4,
        48, 95, -35,
-       97, 110, 101,
-       111, 111, 108,
-       112, 122, 101
+       97, 110, 103,
+       111, 111, 110,
+       112, 122, 103
 };
 static const int lexer_goto_row38[] = {
        7,
        48, 107, -37,
-       108, 108, 109,
-       109, 109, 101,
-       110, 110, 110,
-       111, 119, 101,
-       120, 120, 111,
-       121, 122, 101
+       108, 108, 111,
+       109, 109, 103,
+       110, 110, 112,
+       111, 119, 103,
+       120, 120, 113,
+       121, 122, 103
 };
 static const int lexer_goto_row39[] = {
        7,
        48, 95, -35,
-       97, 97, 112,
-       98, 110, 101,
-       111, 111, 113,
-       112, 116, 101,
-       117, 117, 114,
-       118, 122, 101
+       97, 97, 114,
+       98, 110, 103,
+       111, 111, 115,
+       112, 116, 103,
+       117, 117, 116,
+       118, 122, 103
 };
 static const int lexer_goto_row40[] = {
        2,
        48, 95, -35,
-       97, 122, 101
+       97, 122, 103
 };
 static const int lexer_goto_row41[] = {
        9,
        48, 95, -35,
-       97, 101, 101,
-       102, 102, 115,
-       103, 108, 101,
-       109, 109, 116,
-       110, 110, 117,
-       111, 114, 101,
-       115, 115, 118,
-       116, 122, 101
+       97, 101, 103,
+       102, 102, 117,
+       103, 108, 103,
+       109, 109, 118,
+       110, 110, 119,
+       111, 114, 103,
+       115, 115, 120,
+       116, 122, 103
 };
 static const int lexer_goto_row42[] = {
        5,
        48, 95, -35,
-       97, 97, 119,
-       98, 110, 101,
-       111, 111, 120,
-       112, 122, 101
+       97, 97, 121,
+       98, 110, 103,
+       111, 111, 122,
+       112, 122, 103
 };
 static const int lexer_goto_row43[] = {
        3,
        48, 110, -38,
-       111, 111, 121,
-       112, 122, 101
+       111, 111, 123,
+       112, 122, 103
 };
 static const int lexer_goto_row44[] = {
        8,
        48, 95, -35,
-       97, 100, 101,
-       101, 101, 122,
-       102, 110, 101,
-       111, 111, 123,
-       112, 116, 101,
-       117, 117, 124,
-       118, 122, 101
+       97, 100, 103,
+       101, 101, 124,
+       102, 110, 103,
+       111, 111, 125,
+       112, 116, 103,
+       117, 117, 126,
+       118, 122, 103
 };
 static const int lexer_goto_row45[] = {
        6,
        48, 95, -35,
-       97, 109, 101,
-       110, 110, 125,
-       111, 113, 101,
-       114, 114, 126,
-       115, 122, 101
+       97, 109, 103,
+       110, 110, 127,
+       111, 113, 103,
+       114, 114, 128,
+       115, 122, 103
 };
 static const int lexer_goto_row46[] = {
        7,
        48, 95, -35,
-       97, 97, 127,
-       98, 113, 101,
-       114, 114, 128,
-       115, 116, 101,
-       117, 117, 129,
-       118, 122, 101
+       97, 97, 129,
+       98, 113, 103,
+       114, 114, 130,
+       115, 116, 103,
+       117, 117, 131,
+       118, 122, 103
 };
 static const int lexer_goto_row47[] = {
        3,
        48, 100, -45,
-       101, 101, 130,
-       102, 122, 101
+       101, 101, 132,
+       102, 122, 103
 };
 static const int lexer_goto_row48[] = {
        5,
        48, 100, -45,
-       101, 101, 131,
-       102, 116, 101,
-       117, 117, 132,
-       118, 122, 101
+       101, 101, 133,
+       102, 116, 103,
+       117, 117, 134,
+       118, 122, 103
 };
 static const int lexer_goto_row49[] = {
        8,
        48, 95, -35,
-       97, 103, 101,
-       104, 104, 133,
-       105, 113, 101,
-       114, 114, 134,
-       115, 120, 101,
-       121, 121, 135,
-       122, 122, 101
+       97, 103, 103,
+       104, 104, 135,
+       105, 113, 103,
+       114, 114, 136,
+       115, 120, 103,
+       121, 121, 137,
+       122, 122, 103
 };
 static const int lexer_goto_row50[] = {
        3,
        48, 109, -46,
-       110, 110, 136,
-       111, 122, 101
+       110, 110, 138,
+       111, 122, 103
 };
 static const int lexer_goto_row51[] = {
        3,
        48, 95, -35,
-       97, 97, 137,
-       98, 122, 101
+       97, 97, 139,
+       98, 122, 103
 };
 static const int lexer_goto_row52[] = {
        4,
        48, 103, -50,
-       104, 104, 138,
-       105, 105, 139,
-       106, 122, 101
+       104, 104, 140,
+       105, 105, 141,
+       106, 122, 103
 };
 static const int lexer_goto_row53[] = {
        1,
-       61, 61, 140
+       61, 61, 142
 };
 static const int lexer_goto_row54[] = {
        11,
-       0, 9, 141,
-       11, 12, 141,
-       14, 33, 141,
-       34, 34, 142,
-       35, 91, 141,
-       92, 92, 143,
-       93, 122, 141,
-       123, 123, 144,
-       124, 124, 141,
-       125, 125, 145,
-       126, 255, 141
+       0, 9, 143,
+       11, 12, 143,
+       14, 33, 143,
+       34, 34, 144,
+       35, 91, 143,
+       92, 92, 145,
+       93, 122, 143,
+       123, 123, 146,
+       124, 124, 143,
+       125, 125, 147,
+       126, 255, 143
 };
 static const int lexer_goto_row58[] = {
        3,
        0, 33, -8,
-       34, 34, 146,
+       34, 34, 148,
        35, 255, -8
 };
 static const int lexer_goto_row59[] = {
        1,
-       34, 34, 147
+       34, 34, 149
 };
 static const int lexer_goto_row60[] = {
        3,
-       0, 9, 148,
-       11, 12, 148,
-       14, 255, 148
+       0, 9, 150,
+       11, 12, 150,
+       14, 255, 150
 };
 static const int lexer_goto_row62[] = {
        1,
@@ -395,33 +399,34 @@ static const int lexer_goto_row62[] = {
 };
 static const int lexer_goto_row64[] = {
        1,
-       10, 10, 149
+       10, 10, 151
 };
 static const int lexer_goto_row67[] = {
        1,
-       39, 39, 150
+       39, 39, 152
 };
 static const int lexer_goto_row68[] = {
        1,
-       39, 39, 151
+       39, 39, 153
 };
 static const int lexer_goto_row69[] = {
        3,
-       0, 9, 152,
-       11, 12, 152,
-       14, 255, 152
+       0, 9, 154,
+       11, 12, 154,
+       14, 255, 154
 };
 static const int lexer_goto_row70[] = {
        1,
-       61, 61, 153
+       61, 61, 155
 };
 static const int lexer_goto_row74[] = {
        1,
-       46, 46, 154
+       46, 46, 156
 };
 static const int lexer_goto_row75[] = {
-       1,
-       48, 57, 74
+       2,
+       48, 57, 74,
+       69, 101, -22
 };
 static const int lexer_goto_row77[] = {
        1,
@@ -429,57 +434,59 @@ static const int lexer_goto_row77[] = {
 };
 static const int lexer_goto_row78[] = {
        3,
-       48, 48, 155,
-       49, 49, 156,
-       95, 95, 157
+       48, 48, 157,
+       49, 49, 158,
+       95, 95, 159
 };
 static const int lexer_goto_row79[] = {
-       2,
-       48, 55, 158,
-       95, 95, 159
+       3,
+       43, 43, 160,
+       45, 45, 161,
+       48, 57, 162
 };
 static const int lexer_goto_row80[] = {
-       4,
-       48, 57, 160,
-       65, 70, 161,
-       95, 95, 162,
-       97, 102, 163
+       2,
+       48, 55, 163,
+       95, 95, 164
 };
 static const int lexer_goto_row81[] = {
-       1,
-       48, 95, -79
+       4,
+       48, 57, 165,
+       65, 70, 166,
+       95, 95, 167,
+       97, 102, 168
 };
 static const int lexer_goto_row82[] = {
        1,
-       48, 95, -80
+       48, 95, -79
 };
 static const int lexer_goto_row83[] = {
        1,
-       56, 56, 164
+       43, 57, -80
 };
 static const int lexer_goto_row84[] = {
        1,
-       48, 102, -81
+       48, 95, -81
 };
-static const int lexer_goto_row86[] = {
+static const int lexer_goto_row85[] = {
        1,
-       61, 61, 165
+       56, 56, 169
 };
-static const int lexer_goto_row87[] = {
+static const int lexer_goto_row86[] = {
        1,
-       62, 62, 166
+       48, 102, -82
 };
-static const int lexer_goto_row90[] = {
+static const int lexer_goto_row88[] = {
        1,
-       61, 61, 167
+       61, 61, 170
 };
-static const int lexer_goto_row91[] = {
+static const int lexer_goto_row89[] = {
        1,
-       48, 122, -29
+       62, 62, 171
 };
 static const int lexer_goto_row92[] = {
        1,
-       48, 122, -29
+       61, 61, 172
 };
 static const int lexer_goto_row93[] = {
        1,
@@ -489,817 +496,809 @@ static const int lexer_goto_row94[] = {
        1,
        48, 122, -29
 };
+static const int lexer_goto_row95[] = {
+       1,
+       48, 122, -29
+};
 static const int lexer_goto_row96[] = {
        1,
-       100, 100, 168
+       48, 122, -29
+};
+static const int lexer_goto_row98[] = {
+       1,
+       100, 100, 173
 };
-static const int lexer_goto_row97[] = {
+static const int lexer_goto_row99[] = {
        4,
-       48, 57, 169,
-       65, 90, 170,
-       95, 95, 171,
-       97, 122, 172
+       48, 57, 174,
+       65, 90, 175,
+       95, 95, 176,
+       97, 122, 177
 };
-static const int lexer_goto_row98[] = {
+static const int lexer_goto_row100[] = {
        5,
-       0, 91, 173,
-       92, 92, 174,
-       93, 95, 173,
-       96, 96, 175,
-       97, 255, 173
+       0, 91, 178,
+       92, 92, 179,
+       93, 95, 178,
+       96, 96, 180,
+       97, 255, 178
 };
-static const int lexer_goto_row99[] = {
+static const int lexer_goto_row101[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row100[] = {
+static const int lexer_goto_row102[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row101[] = {
+static const int lexer_goto_row103[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row102[] = {
+static const int lexer_goto_row104[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row103[] = {
+static const int lexer_goto_row105[] = {
        5,
        48, 110, -38,
-       111, 111, 176,
-       112, 114, 101,
-       115, 115, 177,
-       116, 122, 101
+       111, 111, 181,
+       112, 114, 103,
+       115, 115, 182,
+       116, 122, 103
 };
-static const int lexer_goto_row104[] = {
+static const int lexer_goto_row106[] = {
        4,
        48, 95, -35,
-       97, 99, 101,
-       100, 100, 178,
-       101, 122, 101
+       97, 99, 103,
+       100, 100, 183,
+       101, 122, 103
 };
-static const int lexer_goto_row105[] = {
+static const int lexer_goto_row107[] = {
        4,
        48, 95, -35,
-       97, 114, 101,
-       115, 115, 179,
-       116, 122, 101
+       97, 114, 103,
+       115, 115, 184,
+       116, 122, 103
 };
-static const int lexer_goto_row106[] = {
+static const int lexer_goto_row108[] = {
        3,
        48, 100, -45,
-       101, 101, 180,
-       102, 122, 101
+       101, 101, 185,
+       102, 122, 103
 };
-static const int lexer_goto_row107[] = {
+static const int lexer_goto_row109[] = {
        3,
        48, 95, -35,
-       97, 97, 181,
-       98, 122, 101
+       97, 97, 186,
+       98, 122, 103
 };
-static const int lexer_goto_row108[] = {
+static const int lexer_goto_row110[] = {
        3,
        48, 109, -46,
-       110, 110, 182,
-       111, 122, 101
+       110, 110, 187,
+       111, 122, 103
 };
-static const int lexer_goto_row109[] = {
+static const int lexer_goto_row111[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row110[] = {
+static const int lexer_goto_row112[] = {
        3,
-       48, 114, -106,
-       115, 115, 183,
-       116, 122, 101
+       48, 114, -108,
+       115, 115, 188,
+       116, 122, 103
 };
-static const int lexer_goto_row111[] = {
+static const int lexer_goto_row113[] = {
        5,
-       48, 99, -105,
-       100, 100, 184,
-       101, 116, 101,
-       117, 117, 185,
-       118, 122, 101
+       48, 99, -107,
+       100, 100, 189,
+       101, 116, 103,
+       117, 117, 190,
+       118, 122, 103
 };
-static const int lexer_goto_row112[] = {
+static const int lexer_goto_row114[] = {
        4,
        48, 95, -35,
-       97, 115, 101,
-       116, 116, 186,
-       117, 122, 101
+       97, 115, 103,
+       116, 116, 191,
+       117, 122, 103
 };
-static const int lexer_goto_row113[] = {
+static const int lexer_goto_row115[] = {
        3,
        48, 107, -37,
-       108, 108, 187,
-       109, 122, 101
+       108, 108, 192,
+       109, 122, 103
 };
-static const int lexer_goto_row114[] = {
+static const int lexer_goto_row116[] = {
        3,
        48, 113, -36,
-       114, 114, 188,
-       115, 122, 101
+       114, 114, 193,
+       115, 122, 103
 };
-static const int lexer_goto_row115[] = {
+static const int lexer_goto_row117[] = {
        3,
        48, 109, -46,
-       110, 110, 189,
-       111, 122, 101
+       110, 110, 194,
+       111, 122, 103
 };
-static const int lexer_goto_row116[] = {
+static const int lexer_goto_row118[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row117[] = {
+static const int lexer_goto_row119[] = {
        4,
        48, 95, -35,
-       97, 111, 101,
-       112, 112, 190,
-       113, 122, 101
+       97, 111, 103,
+       112, 112, 195,
+       113, 122, 103
 };
-static const int lexer_goto_row118[] = {
+static const int lexer_goto_row120[] = {
        6,
        48, 95, -35,
-       97, 104, 101,
-       105, 105, 191,
-       106, 115, 101,
-       116, 116, 192,
-       117, 122, 101
+       97, 104, 103,
+       105, 105, 196,
+       106, 115, 103,
+       116, 116, 197,
+       117, 122, 103
 };
-static const int lexer_goto_row119[] = {
+static const int lexer_goto_row121[] = {
        5,
        48, 95, -35,
-       97, 97, 193,
-       98, 114, 101,
-       115, 115, 194,
-       116, 122, 101
+       97, 97, 198,
+       98, 114, 103,
+       115, 115, 199,
+       116, 122, 103
 };
-static const int lexer_goto_row120[] = {
+static const int lexer_goto_row122[] = {
        3,
        48, 97, -35,
-       98, 98, 195,
-       99, 122, 101
+       98, 98, 200,
+       99, 122, 103
 };
-static const int lexer_goto_row121[] = {
+static const int lexer_goto_row123[] = {
        3,
        48, 110, -38,
-       111, 111, 196,
-       112, 122, 101
+       111, 111, 201,
+       112, 122, 103
 };
-static const int lexer_goto_row122[] = {
+static const int lexer_goto_row124[] = {
        3,
-       48, 99, -105,
-       100, 100, 197,
-       101, 122, 101
+       48, 99, -107,
+       100, 100, 202,
+       101, 122, 103
 };
-static const int lexer_goto_row123[] = {
+static const int lexer_goto_row125[] = {
        4,
        48, 95, -35,
-       97, 118, 101,
-       119, 119, 198,
-       120, 122, 101
+       97, 118, 103,
+       119, 119, 203,
+       120, 122, 103
 };
-static const int lexer_goto_row124[] = {
+static const int lexer_goto_row126[] = {
        3,
-       48, 115, -113,
-       116, 116, 199,
-       117, 122, 101
+       48, 115, -115,
+       116, 116, 204,
+       117, 122, 103
 };
-static const int lexer_goto_row125[] = {
+static const int lexer_goto_row127[] = {
        3,
        48, 107, -37,
-       108, 108, 200,
-       109, 122, 101
+       108, 108, 205,
+       109, 122, 103
 };
-static const int lexer_goto_row126[] = {
+static const int lexer_goto_row128[] = {
        4,
        48, 95, -35,
-       97, 98, 101,
-       99, 99, 201,
-       100, 122, 101
+       97, 98, 103,
+       99, 99, 206,
+       100, 122, 103
 };
-static const int lexer_goto_row127[] = {
+static const int lexer_goto_row129[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row128[] = {
-       3,
-       48, 98, -127,
-       99, 99, 202,
-       100, 122, 101
-};
-static const int lexer_goto_row129[] = {
-       5,
-       48, 104, -119,
-       105, 105, 203,
-       106, 110, 101,
-       111, 111, 204,
-       112, 122, 101
-};
 static const int lexer_goto_row130[] = {
        3,
-       48, 97, -35,
-       98, 98, 205,
-       99, 122, 101
+       48, 98, -129,
+       99, 99, 207,
+       100, 122, 103
 };
 static const int lexer_goto_row131[] = {
        5,
-       48, 99, -105,
-       100, 100, 206,
-       101, 115, 101,
-       116, 116, 207,
-       117, 122, 101
+       48, 104, -121,
+       105, 105, 208,
+       106, 110, 103,
+       111, 111, 209,
+       112, 122, 103
 };
 static const int lexer_goto_row132[] = {
        3,
-       48, 107, -37,
-       108, 108, 208,
-       109, 122, 101
+       48, 97, -35,
+       98, 98, 210,
+       99, 122, 103
 };
 static const int lexer_goto_row133[] = {
-       3,
-       48, 111, -118,
-       112, 112, 209,
-       113, 122, 101
+       5,
+       48, 99, -107,
+       100, 100, 211,
+       101, 115, 103,
+       116, 116, 212,
+       117, 122, 103
 };
 static const int lexer_goto_row134[] = {
        3,
-       48, 100, -45,
-       101, 101, 210,
-       102, 122, 101
+       48, 107, -37,
+       108, 108, 213,
+       109, 122, 103
 };
 static const int lexer_goto_row135[] = {
-       4,
-       48, 95, -35,
-       97, 116, 101,
-       117, 117, 211,
-       118, 122, 101
+       3,
+       48, 111, -120,
+       112, 112, 214,
+       113, 122, 103
 };
 static const int lexer_goto_row136[] = {
        3,
-       48, 111, -118,
-       112, 112, 212,
-       113, 122, 101
+       48, 100, -45,
+       101, 101, 215,
+       102, 122, 103
 };
 static const int lexer_goto_row137[] = {
-       3,
-       48, 104, -119,
-       105, 105, 213,
-       106, 122, 101
+       4,
+       48, 95, -35,
+       97, 116, 103,
+       117, 117, 216,
+       118, 122, 103
 };
 static const int lexer_goto_row138[] = {
        3,
-       48, 113, -36,
-       114, 114, 214,
-       115, 122, 101
+       48, 111, -120,
+       112, 112, 217,
+       113, 122, 103
 };
 static const int lexer_goto_row139[] = {
        3,
-       48, 104, -119,
-       105, 105, 215,
-       106, 122, 101
+       48, 104, -121,
+       105, 105, 218,
+       106, 122, 103
 };
 static const int lexer_goto_row140[] = {
        3,
-       48, 115, -113,
-       116, 116, 216,
-       117, 122, 101
+       48, 113, -36,
+       114, 114, 219,
+       115, 122, 103
+};
+static const int lexer_goto_row141[] = {
+       3,
+       48, 104, -121,
+       105, 105, 220,
+       106, 122, 103
 };
 static const int lexer_goto_row142[] = {
+       3,
+       48, 115, -115,
+       116, 116, 221,
+       117, 122, 103
+};
+static const int lexer_goto_row144[] = {
        2,
        0, 123, -55,
-       124, 255, 141
+       124, 255, 143
 };
-static const int lexer_goto_row144[] = {
+static const int lexer_goto_row146[] = {
        3,
-       0, 9, 217,
-       11, 12, 217,
-       14, 255, 217
+       0, 9, 222,
+       11, 12, 222,
+       14, 255, 222
 };
-static const int lexer_goto_row146[] = {
+static const int lexer_goto_row148[] = {
        3,
        0, 124, -55,
-       125, 125, 218,
-       126, 255, 141
+       125, 125, 223,
+       126, 255, 143
 };
-static const int lexer_goto_row148[] = {
+static const int lexer_goto_row150[] = {
        11,
-       0, 9, 219,
-       10, 10, 220,
-       11, 12, 219,
-       13, 13, 221,
-       14, 33, 219,
-       34, 34, 222,
-       35, 91, 219,
-       92, 92, 223,
-       93, 122, 219,
-       123, 123, 224,
-       124, 255, 219
-};
-static const int lexer_goto_row149[] = {
+       0, 9, 224,
+       10, 10, 225,
+       11, 12, 224,
+       13, 13, 226,
+       14, 33, 224,
+       34, 34, 227,
+       35, 91, 224,
+       92, 92, 228,
+       93, 122, 224,
+       123, 123, 229,
+       124, 255, 224
+};
+static const int lexer_goto_row151[] = {
        1,
        0, 255, -59
 };
-static const int lexer_goto_row152[] = {
+static const int lexer_goto_row154[] = {
        9,
-       0, 9, 225,
-       10, 10, 226,
-       11, 12, 225,
-       13, 13, 227,
-       14, 38, 225,
-       39, 39, 228,
-       40, 91, 225,
-       92, 92, 229,
-       93, 255, 225
+       0, 9, 230,
+       10, 10, 231,
+       11, 12, 230,
+       13, 13, 232,
+       14, 38, 230,
+       39, 39, 233,
+       40, 91, 230,
+       92, 92, 234,
+       93, 255, 230
 };
-static const int lexer_goto_row153[] = {
+static const int lexer_goto_row155[] = {
        1,
-       39, 39, 230
+       39, 39, 235
 };
-static const int lexer_goto_row156[] = {
+static const int lexer_goto_row158[] = {
        2,
        48, 95, -79,
-       117, 117, 231
-};
-static const int lexer_goto_row157[] = {
-       1,
-       48, 117, -157
-};
-static const int lexer_goto_row158[] = {
-       1,
-       48, 117, -157
+       117, 117, 236
 };
 static const int lexer_goto_row159[] = {
-       2,
-       48, 95, -80,
-       117, 117, 232
+       1,
+       48, 117, -159
 };
 static const int lexer_goto_row160[] = {
        1,
-       48, 117, -160
+       48, 117, -159
 };
 static const int lexer_goto_row161[] = {
-       2,
-       48, 102, -81,
-       117, 117, 233
+       1,
+       48, 57, 162
 };
 static const int lexer_goto_row162[] = {
        1,
-       48, 117, -162
+       48, 57, 162
 };
 static const int lexer_goto_row163[] = {
        1,
-       48, 117, -162
+       48, 57, 162
 };
 static const int lexer_goto_row164[] = {
-       1,
-       48, 117, -162
+       2,
+       48, 95, -81,
+       117, 117, 237
 };
-static const int lexer_goto_row169[] = {
+static const int lexer_goto_row165[] = {
        1,
-       101, 101, 234
+       48, 117, -165
 };
-static const int lexer_goto_row170[] = {
-       1,
-       48, 122, -98
+static const int lexer_goto_row166[] = {
+       2,
+       48, 102, -82,
+       117, 117, 238
 };
-static const int lexer_goto_row171[] = {
+static const int lexer_goto_row167[] = {
        1,
-       48, 122, -98
+       48, 117, -167
 };
-static const int lexer_goto_row172[] = {
+static const int lexer_goto_row168[] = {
        1,
-       48, 122, -98
+       48, 117, -167
 };
-static const int lexer_goto_row173[] = {
+static const int lexer_goto_row169[] = {
        1,
-       48, 122, -98
+       48, 117, -167
 };
 static const int lexer_goto_row174[] = {
        1,
-       0, 255, -99
+       101, 101, 239
 };
 static const int lexer_goto_row175[] = {
        1,
-       0, 255, 235
+       48, 122, -100
 };
 static const int lexer_goto_row176[] = {
-       3,
-       0, 124, 236,
-       125, 125, 237,
-       126, 255, 236
+       1,
+       48, 122, -100
 };
 static const int lexer_goto_row177[] = {
-       3,
-       48, 113, -36,
-       114, 114, 238,
-       115, 122, 101
+       1,
+       48, 122, -100
 };
 static const int lexer_goto_row178[] = {
-       3,
-       48, 115, -113,
-       116, 116, 239,
-       117, 122, 101
+       1,
+       48, 122, -100
 };
 static const int lexer_goto_row179[] = {
        1,
-       48, 122, -41
+       0, 255, -101
 };
 static const int lexer_goto_row180[] = {
-       3,
-       48, 100, -45,
-       101, 101, 240,
-       102, 122, 101
+       1,
+       0, 255, 240
 };
 static const int lexer_goto_row181[] = {
        3,
-       48, 95, -35,
-       97, 97, 241,
-       98, 122, 101
+       0, 124, 241,
+       125, 125, 242,
+       126, 255, 241
 };
 static const int lexer_goto_row182[] = {
        3,
-       48, 114, -106,
-       115, 115, 242,
-       116, 122, 101
+       48, 113, -36,
+       114, 114, 243,
+       115, 122, 103
 };
 static const int lexer_goto_row183[] = {
        3,
-       48, 115, -113,
-       116, 116, 243,
-       117, 122, 101
+       48, 115, -115,
+       116, 116, 244,
+       117, 122, 103
 };
 static const int lexer_goto_row184[] = {
-       3,
-       48, 100, -45,
-       101, 101, 244,
-       102, 122, 101
-};
-static const int lexer_goto_row185[] = {
        1,
        48, 122, -41
 };
+static const int lexer_goto_row185[] = {
+       3,
+       48, 100, -45,
+       101, 101, 245,
+       102, 122, 103
+};
 static const int lexer_goto_row186[] = {
-       4,
+       3,
        48, 95, -35,
-       97, 108, 101,
-       109, 109, 245,
-       110, 122, 101
+       97, 97, 246,
+       98, 122, 103
 };
 static const int lexer_goto_row187[] = {
        3,
-       48, 100, -45,
-       101, 101, 246,
-       102, 122, 101
+       48, 114, -108,
+       115, 115, 247,
+       116, 122, 103
 };
 static const int lexer_goto_row188[] = {
        3,
-       48, 114, -106,
-       115, 115, 247,
-       116, 122, 101
+       48, 115, -115,
+       116, 116, 248,
+       117, 122, 103
 };
 static const int lexer_goto_row189[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 100, -45,
+       101, 101, 249,
+       102, 122, 103
 };
 static const int lexer_goto_row190[] = {
        1,
        48, 122, -41
 };
 static const int lexer_goto_row191[] = {
-       5,
-       48, 107, -37,
-       108, 108, 248,
-       109, 110, 101,
-       111, 111, 249,
-       112, 122, 101
+       4,
+       48, 95, -35,
+       97, 108, 103,
+       109, 109, 250,
+       110, 122, 103
 };
 static const int lexer_goto_row192[] = {
        3,
-       48, 115, -113,
-       116, 116, 250,
-       117, 122, 101
-};
-static const int lexer_goto_row193[] = {
-       5,
        48, 100, -45,
        101, 101, 251,
-       102, 113, 101,
-       114, 114, 252,
-       115, 122, 101
+       102, 122, 103
+};
+static const int lexer_goto_row193[] = {
+       3,
+       48, 114, -108,
+       115, 115, 252,
+       116, 122, 103
 };
 static const int lexer_goto_row194[] = {
        1,
        48, 122, -41
 };
 static const int lexer_goto_row195[] = {
-       3,
-       48, 100, -45,
-       101, 101, 253,
-       102, 122, 101
+       1,
+       48, 122, -41
 };
 static const int lexer_goto_row196[] = {
-       3,
-       48, 100, -45,
-       101, 101, 254,
-       102, 122, 101
+       5,
+       48, 107, -37,
+       108, 108, 253,
+       109, 110, 103,
+       111, 111, 254,
+       112, 122, 103
 };
 static const int lexer_goto_row197[] = {
        3,
-       48, 111, -118,
-       112, 112, 255,
-       113, 122, 101
+       48, 115, -115,
+       116, 116, 255,
+       117, 122, 103
 };
 static const int lexer_goto_row198[] = {
-       3,
-       48, 116, -136,
-       117, 117, 256,
-       118, 122, 101
+       5,
+       48, 100, -45,
+       101, 101, 256,
+       102, 113, 103,
+       114, 114, 257,
+       115, 122, 103
 };
 static const int lexer_goto_row199[] = {
        1,
        48, 122, -41
 };
 static const int lexer_goto_row200[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 100, -45,
+       101, 101, 258,
+       102, 122, 103
 };
 static const int lexer_goto_row201[] = {
        3,
-       48, 107, -37,
-       108, 108, 257,
-       109, 122, 101
+       48, 100, -45,
+       101, 101, 259,
+       102, 122, 103
 };
 static const int lexer_goto_row202[] = {
        3,
-       48, 100, -45,
-       101, 101, 258,
-       102, 122, 101
+       48, 111, -120,
+       112, 112, 260,
+       113, 122, 103
 };
 static const int lexer_goto_row203[] = {
-       4,
-       48, 95, -35,
-       97, 106, 101,
-       107, 107, 259,
-       108, 122, 101
+       3,
+       48, 116, -138,
+       117, 117, 261,
+       118, 122, 103
 };
 static const int lexer_goto_row204[] = {
-       4,
-       48, 95, -35,
-       97, 117, 101,
-       118, 118, 260,
-       119, 122, 101
+       1,
+       48, 122, -41
 };
 static const int lexer_goto_row205[] = {
-       3,
-       48, 115, -113,
-       116, 116, 261,
-       117, 122, 101
+       1,
+       48, 122, -41
 };
 static const int lexer_goto_row206[] = {
        3,
        48, 107, -37,
        108, 108, 262,
-       109, 122, 101
+       109, 122, 103
 };
 static const int lexer_goto_row207[] = {
        3,
        48, 100, -45,
        101, 101, 263,
-       102, 122, 101
+       102, 122, 103
 };
 static const int lexer_goto_row208[] = {
-       3,
-       48, 116, -136,
-       117, 117, 264,
-       118, 122, 101
+       4,
+       48, 95, -35,
+       97, 106, 103,
+       107, 107, 264,
+       108, 122, 103
 };
 static const int lexer_goto_row209[] = {
-       3,
-       48, 101, -42,
-       102, 102, 265,
-       103, 122, 101
+       4,
+       48, 95, -35,
+       97, 117, 103,
+       118, 118, 265,
+       119, 122, 103
 };
 static const int lexer_goto_row210[] = {
        3,
-       48, 100, -45,
-       101, 101, 266,
-       102, 122, 101
+       48, 115, -115,
+       116, 116, 266,
+       117, 122, 103
 };
 static const int lexer_goto_row211[] = {
        3,
-       48, 109, -46,
-       110, 110, 267,
-       111, 122, 101
+       48, 107, -37,
+       108, 108, 267,
+       109, 122, 103
 };
 static const int lexer_goto_row212[] = {
        3,
        48, 100, -45,
        101, 101, 268,
-       102, 122, 101
+       102, 122, 103
 };
 static const int lexer_goto_row213[] = {
        3,
-       48, 100, -45,
-       101, 101, 269,
-       102, 122, 101
+       48, 116, -138,
+       117, 117, 269,
+       118, 122, 103
 };
 static const int lexer_goto_row214[] = {
        3,
-       48, 117, -205,
-       118, 118, 270,
-       119, 122, 101
+       48, 101, -42,
+       102, 102, 270,
+       103, 122, 103
 };
 static const int lexer_goto_row215[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 100, -45,
+       101, 101, 271,
+       102, 122, 103
 };
 static const int lexer_goto_row216[] = {
        3,
-       48, 107, -37,
-       108, 108, 271,
-       109, 122, 101
+       48, 109, -46,
+       110, 110, 272,
+       111, 122, 103
 };
 static const int lexer_goto_row217[] = {
        3,
-       48, 103, -50,
-       104, 104, 272,
-       105, 122, 101
+       48, 100, -45,
+       101, 101, 273,
+       102, 122, 103
 };
 static const int lexer_goto_row218[] = {
-       1,
-       0, 255, -143
+       3,
+       48, 100, -45,
+       101, 101, 274,
+       102, 122, 103
 };
 static const int lexer_goto_row219[] = {
-       11,
-       0, 9, 273,
-       10, 10, 274,
-       11, 12, 273,
-       13, 13, 275,
-       14, 33, 273,
-       34, 34, 276,
-       35, 91, 273,
-       92, 92, 277,
-       93, 122, 273,
-       123, 123, 278,
-       124, 255, 273
+       3,
+       48, 117, -210,
+       118, 118, 275,
+       119, 122, 103
 };
 static const int lexer_goto_row220[] = {
        1,
-       0, 255, -149
+       48, 122, -41
 };
 static const int lexer_goto_row221[] = {
-       1,
-       0, 255, -149
+       3,
+       48, 107, -37,
+       108, 108, 276,
+       109, 122, 103
 };
 static const int lexer_goto_row222[] = {
-       1,
-       0, 255, -149
+       3,
+       48, 103, -50,
+       104, 104, 277,
+       105, 122, 103
 };
 static const int lexer_goto_row223[] = {
-       5,
-       0, 33, -149,
-       34, 34, 279,
-       35, 122, -149,
-       123, 123, 280,
-       124, 255, 219
+       1,
+       0, 255, -145
 };
 static const int lexer_goto_row224[] = {
-       3,
-       0, 9, 281,
-       11, 12, 281,
-       14, 255, 281
+       11,
+       0, 9, 278,
+       10, 10, 279,
+       11, 12, 278,
+       13, 13, 280,
+       14, 33, 278,
+       34, 34, 281,
+       35, 91, 278,
+       92, 92, 282,
+       93, 122, 278,
+       123, 123, 283,
+       124, 255, 278
 };
 static const int lexer_goto_row225[] = {
-       5,
-       0, 33, -149,
-       34, 34, 282,
-       35, 122, -149,
-       123, 123, 283,
-       124, 255, 219
+       1,
+       0, 255, -151
 };
 static const int lexer_goto_row226[] = {
        1,
-       0, 255, -153
+       0, 255, -151
 };
 static const int lexer_goto_row227[] = {
        1,
-       0, 255, -153
+       0, 255, -151
 };
 static const int lexer_goto_row228[] = {
-       1,
-       0, 255, -153
+       5,
+       0, 33, -151,
+       34, 34, 284,
+       35, 122, -151,
+       123, 123, 285,
+       124, 255, 224
 };
 static const int lexer_goto_row229[] = {
-       9,
-       0, 9, 284,
-       10, 10, 285,
-       11, 12, 284,
-       13, 13, 286,
-       14, 38, 284,
-       39, 39, 287,
-       40, 91, 284,
-       92, 92, 288,
-       93, 255, 284
+       3,
+       0, 9, 286,
+       11, 12, 286,
+       14, 255, 286
 };
 static const int lexer_goto_row230[] = {
-       3,
-       0, 9, 289,
-       11, 12, 289,
-       14, 255, 289
+       5,
+       0, 33, -151,
+       34, 34, 287,
+       35, 122, -151,
+       123, 123, 288,
+       124, 255, 224
+};
+static const int lexer_goto_row231[] = {
+       1,
+       0, 255, -155
 };
 static const int lexer_goto_row232[] = {
        1,
-       56, 56, 290
+       0, 255, -155
 };
 static const int lexer_goto_row233[] = {
        1,
-       56, 56, 291
+       0, 255, -155
 };
 static const int lexer_goto_row234[] = {
-       1,
-       56, 56, 292
+       9,
+       0, 9, 289,
+       10, 10, 290,
+       11, 12, 289,
+       13, 13, 291,
+       14, 38, 289,
+       39, 39, 292,
+       40, 91, 289,
+       92, 92, 293,
+       93, 255, 289
 };
 static const int lexer_goto_row235[] = {
-       1,
-       98, 98, 293
+       3,
+       0, 9, 294,
+       11, 12, 294,
+       14, 255, 294
 };
-static const int lexer_goto_row236[] = {
+static const int lexer_goto_row237[] = {
        1,
-       0, 255, -99
+       56, 56, 295
 };
-static const int lexer_goto_row237[] = {
+static const int lexer_goto_row238[] = {
        1,
-       0, 255, -99
+       56, 56, 296
 };
 static const int lexer_goto_row239[] = {
-       3,
-       48, 115, -113,
-       116, 116, 294,
-       117, 122, 101
+       1,
+       56, 56, 297
 };
 static const int lexer_goto_row240[] = {
-       3,
-       48, 113, -36,
-       114, 114, 295,
-       115, 122, 101
+       1,
+       98, 98, 298
 };
 static const int lexer_goto_row241[] = {
-       3,
-       48, 113, -36,
-       114, 114, 296,
-       115, 122, 101
+       1,
+       0, 255, -101
 };
 static const int lexer_goto_row242[] = {
-       3,
-       48, 106, -204,
-       107, 107, 297,
-       108, 122, 101
-};
-static const int lexer_goto_row243[] = {
-       3,
-       48, 114, -106,
-       115, 115, 298,
-       116, 122, 101
+       1,
+       0, 255, -101
 };
 static const int lexer_goto_row244[] = {
        3,
-       48, 104, -119,
-       105, 105, 299,
-       106, 122, 101
+       48, 115, -115,
+       116, 116, 299,
+       117, 122, 103
 };
 static const int lexer_goto_row245[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 113, -36,
+       114, 114, 300,
+       115, 122, 103
 };
 static const int lexer_goto_row246[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 113, -36,
+       114, 114, 301,
+       115, 122, 103
 };
 static const int lexer_goto_row247[] = {
        3,
-       48, 113, -36,
-       114, 114, 300,
-       115, 122, 101
+       48, 106, -209,
+       107, 107, 302,
+       108, 122, 103
 };
 static const int lexer_goto_row248[] = {
        3,
-       48, 100, -45,
-       101, 101, 301,
-       102, 122, 101
+       48, 114, -108,
+       115, 115, 303,
+       116, 122, 103
 };
 static const int lexer_goto_row249[] = {
        3,
-       48, 104, -119,
-       105, 105, 302,
-       106, 122, 101
+       48, 104, -121,
+       105, 105, 304,
+       106, 122, 103
 };
 static const int lexer_goto_row250[] = {
-       3,
-       48, 113, -36,
-       114, 114, 303,
-       115, 122, 101
+       1,
+       48, 122, -41
 };
 static const int lexer_goto_row251[] = {
        1,
@@ -1308,26 +1307,26 @@ static const int lexer_goto_row251[] = {
 static const int lexer_goto_row252[] = {
        3,
        48, 113, -36,
-       114, 114, 304,
-       115, 122, 101
+       114, 114, 305,
+       115, 122, 103
 };
 static const int lexer_goto_row253[] = {
        3,
-       48, 116, -136,
-       117, 117, 305,
-       118, 122, 101
+       48, 100, -45,
+       101, 101, 306,
+       102, 122, 103
 };
 static const int lexer_goto_row254[] = {
        3,
-       48, 115, -113,
-       116, 116, 306,
-       117, 122, 101
+       48, 104, -121,
+       105, 105, 307,
+       106, 122, 103
 };
 static const int lexer_goto_row255[] = {
        3,
-       48, 107, -37,
-       108, 108, 307,
-       109, 122, 101
+       48, 113, -36,
+       114, 114, 308,
+       115, 122, 103
 };
 static const int lexer_goto_row256[] = {
        1,
@@ -1335,466 +1334,468 @@ static const int lexer_goto_row256[] = {
 };
 static const int lexer_goto_row257[] = {
        3,
-       48, 107, -37,
-       108, 108, 308,
-       109, 122, 101
+       48, 113, -36,
+       114, 114, 309,
+       115, 122, 103
 };
 static const int lexer_goto_row258[] = {
        3,
-       48, 95, -35,
-       97, 97, 309,
-       98, 122, 101
+       48, 116, -138,
+       117, 117, 310,
+       118, 122, 103
 };
 static const int lexer_goto_row259[] = {
+       3,
+       48, 115, -115,
+       116, 116, 311,
+       117, 122, 103
+};
+static const int lexer_goto_row260[] = {
+       3,
+       48, 107, -37,
+       108, 108, 312,
+       109, 122, 103
+};
+static const int lexer_goto_row261[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row260[] = {
+static const int lexer_goto_row262[] = {
+       3,
+       48, 107, -37,
+       108, 108, 313,
+       109, 122, 103
+};
+static const int lexer_goto_row263[] = {
        3,
        48, 95, -35,
-       97, 97, 310,
-       98, 122, 101
+       97, 97, 314,
+       98, 122, 103
 };
-static const int lexer_goto_row261[] = {
+static const int lexer_goto_row264[] = {
+       1,
+       48, 122, -41
+};
+static const int lexer_goto_row265[] = {
        3,
        48, 95, -35,
-       97, 97, 311,
-       98, 122, 101
+       97, 97, 315,
+       98, 122, 103
 };
-static const int lexer_goto_row262[] = {
+static const int lexer_goto_row266[] = {
+       3,
+       48, 95, -35,
+       97, 97, 316,
+       98, 122, 103
+};
+static const int lexer_goto_row267[] = {
        3,
        48, 100, -45,
-       101, 101, 312,
-       102, 122, 101
+       101, 101, 317,
+       102, 122, 103
 };
-static const int lexer_goto_row263[] = {
+static const int lexer_goto_row268[] = {
        3,
-       48, 104, -119,
-       105, 105, 313,
-       106, 122, 101
+       48, 104, -121,
+       105, 105, 318,
+       106, 122, 103
 };
-static const int lexer_goto_row264[] = {
+static const int lexer_goto_row269[] = {
        3,
        48, 101, -42,
-       102, 102, 314,
-       103, 122, 101
+       102, 102, 319,
+       103, 122, 103
 };
-static const int lexer_goto_row265[] = {
+static const int lexer_goto_row270[] = {
        3,
        48, 113, -36,
-       114, 114, 315,
-       115, 122, 101
+       114, 114, 320,
+       115, 122, 103
 };
-static const int lexer_goto_row266[] = {
+static const int lexer_goto_row271[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row267[] = {
+static const int lexer_goto_row272[] = {
        3,
        48, 113, -36,
-       114, 114, 316,
-       115, 122, 101
+       114, 114, 321,
+       115, 122, 103
 };
-static const int lexer_goto_row268[] = {
+static const int lexer_goto_row273[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row269[] = {
+static const int lexer_goto_row274[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row270[] = {
+static const int lexer_goto_row275[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row271[] = {
+static const int lexer_goto_row276[] = {
        3,
        48, 100, -45,
-       101, 101, 317,
-       102, 122, 101
+       101, 101, 322,
+       102, 122, 103
 };
-static const int lexer_goto_row272[] = {
+static const int lexer_goto_row277[] = {
        3,
        48, 100, -45,
-       101, 101, 318,
-       102, 122, 101
+       101, 101, 323,
+       102, 122, 103
 };
-static const int lexer_goto_row273[] = {
+static const int lexer_goto_row278[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row274[] = {
+static const int lexer_goto_row279[] = {
        1,
-       0, 255, -220
+       0, 255, -225
 };
-static const int lexer_goto_row275[] = {
+static const int lexer_goto_row280[] = {
        11,
-       0, 9, 319,
-       10, 10, 274,
-       11, 12, 319,
-       13, 13, 275,
-       14, 33, 319,
-       34, 34, 320,
-       35, 91, 319,
-       92, 92, 321,
-       93, 122, 319,
-       123, 123, 322,
-       124, 255, 319
+       0, 9, 324,
+       10, 10, 279,
+       11, 12, 324,
+       13, 13, 280,
+       14, 33, 324,
+       34, 34, 325,
+       35, 91, 324,
+       92, 92, 326,
+       93, 122, 324,
+       123, 123, 327,
+       124, 255, 324
 };
-static const int lexer_goto_row276[] = {
+static const int lexer_goto_row281[] = {
        1,
-       0, 255, -276
+       0, 255, -281
 };
-static const int lexer_goto_row277[] = {
+static const int lexer_goto_row282[] = {
        5,
-       0, 33, -276,
-       34, 34, 323,
-       35, 122, -276,
-       123, 123, 324,
-       124, 255, 319
+       0, 33, -281,
+       34, 34, 328,
+       35, 122, -281,
+       123, 123, 329,
+       124, 255, 324
 };
-static const int lexer_goto_row278[] = {
+static const int lexer_goto_row283[] = {
        3,
-       0, 9, 325,
-       11, 12, 325,
-       14, 255, 325
+       0, 9, 330,
+       11, 12, 330,
+       14, 255, 330
 };
-static const int lexer_goto_row279[] = {
+static const int lexer_goto_row284[] = {
        5,
-       0, 33, -276,
-       34, 34, 326,
-       35, 122, -276,
-       123, 123, 327,
-       124, 255, 319
+       0, 33, -281,
+       34, 34, 331,
+       35, 122, -281,
+       123, 123, 332,
+       124, 255, 324
 };
-static const int lexer_goto_row280[] = {
+static const int lexer_goto_row285[] = {
        3,
-       0, 33, -149,
-       34, 34, 328,
-       35, 255, -224
+       0, 33, -151,
+       34, 34, 333,
+       35, 255, -229
 };
-static const int lexer_goto_row281[] = {
+static const int lexer_goto_row286[] = {
        3,
-       0, 122, -226,
-       123, 123, 329,
-       124, 255, 219
+       0, 122, -231,
+       123, 123, 334,
+       124, 255, 224
 };
-static const int lexer_goto_row282[] = {
+static const int lexer_goto_row287[] = {
        1,
-       0, 255, -149
+       0, 255, -151
 };
-static const int lexer_goto_row283[] = {
+static const int lexer_goto_row288[] = {
        3,
-       0, 33, -149,
-       34, 34, 330,
-       35, 255, -224
+       0, 33, -151,
+       34, 34, 335,
+       35, 255, -229
 };
-static const int lexer_goto_row284[] = {
+static const int lexer_goto_row289[] = {
        3,
-       0, 122, -226,
-       123, 123, 331,
-       124, 255, 219
+       0, 122, -231,
+       123, 123, 336,
+       124, 255, 224
 };
-static const int lexer_goto_row285[] = {
+static const int lexer_goto_row290[] = {
        1,
-       0, 255, -153
+       0, 255, -155
 };
-static const int lexer_goto_row286[] = {
+static const int lexer_goto_row291[] = {
        1,
-       0, 255, -153
+       0, 255, -155
 };
-static const int lexer_goto_row287[] = {
+static const int lexer_goto_row292[] = {
        1,
-       0, 255, -153
+       0, 255, -155
 };
-static const int lexer_goto_row288[] = {
+static const int lexer_goto_row293[] = {
        9,
-       0, 9, 332,
-       10, 10, 333,
-       11, 12, 332,
-       13, 13, 334,
-       14, 38, 332,
-       39, 39, 335,
-       40, 91, 332,
-       92, 92, 336,
-       93, 255, 332
-};
-static const int lexer_goto_row289[] = {
-       3,
        0, 9, 337,
+       10, 10, 338,
        11, 12, 337,
-       14, 255, 337
+       13, 13, 339,
+       14, 38, 337,
+       39, 39, 340,
+       40, 91, 337,
+       92, 92, 341,
+       93, 255, 337
 };
-static const int lexer_goto_row290[] = {
+static const int lexer_goto_row294[] = {
+       3,
+       0, 9, 342,
+       11, 12, 342,
+       14, 255, 342
+};
+static const int lexer_goto_row295[] = {
        1,
-       0, 255, -153
+       0, 255, -155
 };
-static const int lexer_goto_row294[] = {
+static const int lexer_goto_row299[] = {
        1,
-       117, 117, 338
+       117, 117, 343
 };
-static const int lexer_goto_row295[] = {
+static const int lexer_goto_row300[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row296[] = {
+static const int lexer_goto_row301[] = {
        3,
        48, 95, -35,
-       97, 97, 339,
-       98, 122, 101
+       97, 97, 344,
+       98, 122, 103
 };
-static const int lexer_goto_row297[] = {
+static const int lexer_goto_row302[] = {
        3,
-       48, 115, -113,
-       116, 116, 340,
-       117, 122, 101
+       48, 115, -115,
+       116, 116, 345,
+       117, 122, 103
 };
-static const int lexer_goto_row298[] = {
+static const int lexer_goto_row303[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row299[] = {
+static const int lexer_goto_row304[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row300[] = {
+static const int lexer_goto_row305[] = {
        3,
        48, 109, -46,
-       110, 110, 341,
-       111, 122, 101
+       110, 110, 346,
+       111, 122, 103
 };
-static const int lexer_goto_row301[] = {
+static const int lexer_goto_row306[] = {
        3,
        48, 109, -46,
-       110, 110, 342,
-       111, 122, 101
+       110, 110, 347,
+       111, 122, 103
 };
-static const int lexer_goto_row302[] = {
+static const int lexer_goto_row307[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row303[] = {
+static const int lexer_goto_row308[] = {
        3,
        48, 100, -45,
-       101, 101, 343,
-       102, 122, 101
+       101, 101, 348,
+       102, 122, 103
 };
-static const int lexer_goto_row304[] = {
+static const int lexer_goto_row309[] = {
        3,
-       48, 115, -113,
-       116, 116, 344,
-       117, 122, 101
+       48, 115, -115,
+       116, 116, 349,
+       117, 122, 103
 };
-static const int lexer_goto_row305[] = {
+static const int lexer_goto_row310[] = {
        3,
        48, 101, -42,
-       102, 102, 345,
-       103, 122, 101
+       102, 102, 350,
+       103, 122, 103
 };
-static const int lexer_goto_row306[] = {
+static const int lexer_goto_row311[] = {
        3,
-       48, 99, -105,
-       100, 100, 346,
-       101, 122, 101
+       48, 99, -107,
+       100, 100, 351,
+       101, 122, 103
 };
-static const int lexer_goto_row307[] = {
+static const int lexer_goto_row312[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row308[] = {
+static const int lexer_goto_row313[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row309[] = {
+static const int lexer_goto_row314[] = {
        3,
        48, 100, -45,
-       101, 101, 347,
-       102, 122, 101
+       101, 101, 352,
+       102, 122, 103
 };
-static const int lexer_goto_row310[] = {
+static const int lexer_goto_row315[] = {
        3,
        48, 97, -35,
-       98, 98, 348,
-       99, 122, 101
+       98, 98, 353,
+       99, 122, 103
 };
-static const int lexer_goto_row311[] = {
+static const int lexer_goto_row316[] = {
        4,
        48, 95, -35,
-       97, 102, 101,
-       103, 103, 349,
-       104, 122, 101
+       97, 102, 103,
+       103, 103, 354,
+       104, 122, 103
 };
-static const int lexer_goto_row312[] = {
+static const int lexer_goto_row317[] = {
        3,
-       48, 115, -113,
-       116, 116, 350,
-       117, 122, 101
+       48, 115, -115,
+       116, 116, 355,
+       117, 122, 103
 };
-static const int lexer_goto_row313[] = {
+static const int lexer_goto_row318[] = {
        3,
-       48, 98, -127,
-       99, 99, 351,
-       100, 122, 101
+       48, 98, -129,
+       99, 99, 356,
+       100, 122, 103
 };
-static const int lexer_goto_row314[] = {
+static const int lexer_goto_row319[] = {
        3,
-       48, 98, -127,
-       99, 99, 352,
-       100, 122, 101
+       48, 98, -129,
+       99, 99, 357,
+       100, 122, 103
 };
-static const int lexer_goto_row315[] = {
+static const int lexer_goto_row320[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row316[] = {
+static const int lexer_goto_row321[] = {
        3,
        48, 109, -46,
-       110, 110, 353,
-       111, 122, 101
+       110, 110, 358,
+       111, 122, 103
 };
-static const int lexer_goto_row317[] = {
+static const int lexer_goto_row322[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row318[] = {
+static const int lexer_goto_row323[] = {
        3,
        48, 113, -36,
-       114, 114, 354,
-       115, 122, 101
+       114, 114, 359,
+       115, 122, 103
 };
-static const int lexer_goto_row319[] = {
+static const int lexer_goto_row324[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row320[] = {
-       1,
-       0, 255, -276
-};
-static const int lexer_goto_row321[] = {
-       1,
-       0, 255, -278
-};
-static const int lexer_goto_row322[] = {
-       3,
-       0, 9, 355,
-       11, 12, 355,
-       14, 255, 355
-};
-static const int lexer_goto_row323[] = {
-       1,
-       0, 255, -280
-};
-static const int lexer_goto_row324[] = {
-       3,
-       0, 33, -276,
-       34, 34, 356,
-       35, 255, -278
-};
 static const int lexer_goto_row325[] = {
-       3,
-       0, 122, -280,
-       123, 123, 357,
-       124, 255, 319
+       1,
+       0, 255, -281
 };
 static const int lexer_goto_row326[] = {
        1,
-       0, 255, -220
+       0, 255, -283
 };
 static const int lexer_goto_row327[] = {
        3,
-       0, 33, -276,
-       34, 34, 358,
-       35, 255, -278
+       0, 9, 360,
+       11, 12, 360,
+       14, 255, 360
 };
 static const int lexer_goto_row328[] = {
-       3,
-       0, 122, -280,
-       123, 123, 359,
-       124, 255, 319
+       1,
+       0, 255, -285
 };
 static const int lexer_goto_row329[] = {
-       1,
-       34, 34, 360
+       3,
+       0, 33, -281,
+       34, 34, 361,
+       35, 255, -283
 };
 static const int lexer_goto_row330[] = {
-       1,
-       0, 255, -285
+       3,
+       0, 122, -285,
+       123, 123, 362,
+       124, 255, 324
 };
 static const int lexer_goto_row331[] = {
        1,
-       0, 255, -281
+       0, 255, -225
 };
 static const int lexer_goto_row332[] = {
-       1,
-       123, 123, 361
+       3,
+       0, 33, -281,
+       34, 34, 363,
+       35, 255, -283
 };
 static const int lexer_goto_row333[] = {
-       1,
-       0, 255, -153
+       3,
+       0, 122, -285,
+       123, 123, 364,
+       124, 255, 324
 };
 static const int lexer_goto_row334[] = {
        1,
-       0, 255, -153
+       34, 34, 365
 };
 static const int lexer_goto_row335[] = {
        1,
-       0, 255, -153
+       0, 255, -290
+};
+static const int lexer_goto_row336[] = {
+       1,
+       0, 255, -286
 };
 static const int lexer_goto_row337[] = {
-       3,
-       0, 9, 362,
-       11, 12, 362,
-       14, 255, 362
+       1,
+       123, 123, 366
 };
 static const int lexer_goto_row338[] = {
        1,
-       0, 255, -153
+       0, 255, -155
 };
 static const int lexer_goto_row339[] = {
        1,
-       103, 103, 363
+       0, 255, -155
 };
 static const int lexer_goto_row340[] = {
-       3,
-       48, 98, -127,
-       99, 99, 364,
-       100, 122, 101
-};
-static const int lexer_goto_row341[] = {
        1,
-       48, 122, -41
+       0, 255, -155
 };
 static const int lexer_goto_row342[] = {
        3,
-       48, 116, -136,
-       117, 117, 365,
-       118, 122, 101
+       0, 9, 367,
+       11, 12, 367,
+       14, 255, 367
 };
 static const int lexer_goto_row343[] = {
        1,
-       48, 122, -41
+       0, 255, -155
 };
 static const int lexer_goto_row344[] = {
-       3,
-       48, 114, -106,
-       115, 115, 366,
-       116, 122, 101
+       1,
+       103, 103, 368
 };
 static const int lexer_goto_row345[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 98, -129,
+       99, 99, 369,
+       100, 122, 103
 };
 static const int lexer_goto_row346[] = {
-       3,
-       48, 95, -35,
-       97, 97, 367,
-       98, 122, 101
+       1,
+       48, 122, -41
 };
 static const int lexer_goto_row347[] = {
        3,
-       48, 100, -45,
-       101, 101, 368,
-       102, 122, 101
+       48, 116, -138,
+       117, 117, 370,
+       118, 122, 103
 };
 static const int lexer_goto_row348[] = {
        1,
@@ -1802,113 +1803,115 @@ static const int lexer_goto_row348[] = {
 };
 static const int lexer_goto_row349[] = {
        3,
-       48, 107, -37,
-       108, 108, 369,
-       109, 122, 101
+       48, 114, -108,
+       115, 115, 371,
+       116, 122, 103
 };
 static const int lexer_goto_row350[] = {
-       3,
-       48, 100, -45,
-       101, 101, 370,
-       102, 122, 101
+       1,
+       48, 122, -41
 };
 static const int lexer_goto_row351[] = {
        3,
-       48, 100, -45,
-       101, 101, 371,
-       102, 122, 101
+       48, 95, -35,
+       97, 97, 372,
+       98, 122, 103
 };
 static const int lexer_goto_row352[] = {
        3,
-       48, 115, -113,
-       116, 116, 372,
-       117, 122, 101
+       48, 100, -45,
+       101, 101, 373,
+       102, 122, 103
 };
 static const int lexer_goto_row353[] = {
        1,
        48, 122, -41
 };
 static const int lexer_goto_row354[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 107, -37,
+       108, 108, 374,
+       109, 122, 103
 };
 static const int lexer_goto_row355[] = {
        3,
-       48, 114, -106,
-       115, 115, 373,
-       116, 122, 101
+       48, 100, -45,
+       101, 101, 375,
+       102, 122, 103
 };
 static const int lexer_goto_row356[] = {
-       1,
-       0, 255, -276
+       3,
+       48, 100, -45,
+       101, 101, 376,
+       102, 122, 103
 };
 static const int lexer_goto_row357[] = {
-       1,
-       34, 34, 374
+       3,
+       48, 115, -115,
+       116, 116, 377,
+       117, 122, 103
 };
 static const int lexer_goto_row358[] = {
        1,
-       0, 255, -329
+       48, 122, -41
 };
 static const int lexer_goto_row359[] = {
        1,
-       0, 255, -325
+       48, 122, -41
 };
 static const int lexer_goto_row360[] = {
-       1,
-       123, 123, 375
+       3,
+       48, 114, -108,
+       115, 115, 378,
+       116, 122, 103
 };
 static const int lexer_goto_row361[] = {
        1,
-       34, 34, 360
+       0, 255, -281
 };
 static const int lexer_goto_row362[] = {
        1,
-       123, 123, 361
+       34, 34, 379
 };
 static const int lexer_goto_row363[] = {
        1,
-       0, 255, -153
+       0, 255, -334
 };
 static const int lexer_goto_row364[] = {
        1,
-       95, 95, 376
+       0, 255, -330
 };
 static const int lexer_goto_row365[] = {
-       3,
-       48, 115, -113,
-       116, 116, 377,
-       117, 122, 101
+       1,
+       123, 123, 380
 };
 static const int lexer_goto_row366[] = {
-       3,
-       48, 100, -45,
-       101, 101, 378,
-       102, 122, 101
+       1,
+       34, 34, 365
 };
 static const int lexer_goto_row367[] = {
        1,
-       48, 122, -41
+       123, 123, 366
 };
 static const int lexer_goto_row368[] = {
-       3,
-       48, 98, -127,
-       99, 99, 379,
-       100, 122, 101
+       1,
+       0, 255, -155
 };
 static const int lexer_goto_row369[] = {
        1,
-       48, 122, -41
+       95, 95, 381
 };
 static const int lexer_goto_row370[] = {
        3,
-       48, 100, -45,
-       101, 101, 380,
-       102, 122, 101
+       48, 115, -115,
+       116, 116, 382,
+       117, 122, 103
 };
 static const int lexer_goto_row371[] = {
-       1,
-       48, 122, -41
+       3,
+       48, 100, -45,
+       101, 101, 383,
+       102, 122, 103
 };
 static const int lexer_goto_row372[] = {
        1,
@@ -1916,67 +1919,91 @@ static const int lexer_goto_row372[] = {
 };
 static const int lexer_goto_row373[] = {
        3,
-       48, 100, -45,
-       101, 101, 381,
-       102, 122, 101
+       48, 98, -129,
+       99, 99, 384,
+       100, 122, 103
 };
 static const int lexer_goto_row374[] = {
-       3,
-       48, 95, -35,
-       97, 97, 382,
-       98, 122, 101
+       1,
+       48, 122, -41
 };
 static const int lexer_goto_row375[] = {
-       1,
-       34, 34, 374
+       3,
+       48, 100, -45,
+       101, 101, 385,
+       102, 122, 103
 };
 static const int lexer_goto_row376[] = {
        1,
-       123, 123, 375
+       48, 122, -41
 };
 static const int lexer_goto_row377[] = {
        1,
-       95, 95, 383
+       48, 122, -41
 };
 static const int lexer_goto_row378[] = {
+       3,
+       48, 100, -45,
+       101, 101, 386,
+       102, 122, 103
+};
+static const int lexer_goto_row379[] = {
+       3,
+       48, 95, -35,
+       97, 97, 387,
+       98, 122, 103
+};
+static const int lexer_goto_row380[] = {
+       1,
+       34, 34, 379
+};
+static const int lexer_goto_row381[] = {
+       1,
+       123, 123, 380
+};
+static const int lexer_goto_row382[] = {
+       1,
+       95, 95, 388
+};
+static const int lexer_goto_row383[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row379[] = {
+static const int lexer_goto_row384[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row380[] = {
+static const int lexer_goto_row385[] = {
        3,
        48, 100, -45,
-       101, 101, 384,
-       102, 122, 101
+       101, 101, 389,
+       102, 122, 103
 };
-static const int lexer_goto_row381[] = {
+static const int lexer_goto_row386[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row382[] = {
+static const int lexer_goto_row387[] = {
        3,
-       48, 99, -105,
-       100, 100, 385,
-       101, 122, 101
+       48, 99, -107,
+       100, 100, 390,
+       101, 122, 103
 };
-static const int lexer_goto_row383[] = {
+static const int lexer_goto_row388[] = {
        3,
        48, 107, -37,
-       108, 108, 386,
-       109, 122, 101
+       108, 108, 391,
+       109, 122, 103
 };
-static const int lexer_goto_row385[] = {
+static const int lexer_goto_row390[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row386[] = {
+static const int lexer_goto_row391[] = {
        1,
        48, 122, -41
 };
-static const int lexer_goto_row387[] = {
+static const int lexer_goto_row392[] = {
        1,
        48, 122, -41
 };
@@ -2066,19 +2093,19 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row82,
        lexer_goto_row83,
        lexer_goto_row84,
-       lexer_goto_row_null,
+       lexer_goto_row85,
        lexer_goto_row86,
-       lexer_goto_row87,
+       lexer_goto_row_null,
+       lexer_goto_row88,
+       lexer_goto_row89,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row90,
-       lexer_goto_row91,
        lexer_goto_row92,
        lexer_goto_row93,
        lexer_goto_row94,
-       lexer_goto_row_null,
+       lexer_goto_row95,
        lexer_goto_row96,
-       lexer_goto_row97,
+       lexer_goto_row_null,
        lexer_goto_row98,
        lexer_goto_row99,
        lexer_goto_row100,
@@ -2122,7 +2149,7 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row138,
        lexer_goto_row139,
        lexer_goto_row140,
-       lexer_goto_row_null,
+       lexer_goto_row141,
        lexer_goto_row142,
        lexer_goto_row_null,
        lexer_goto_row144,
@@ -2130,15 +2157,15 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row146,
        lexer_goto_row_null,
        lexer_goto_row148,
-       lexer_goto_row149,
+       lexer_goto_row_null,
+       lexer_goto_row150,
+       lexer_goto_row151,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row152,
-       lexer_goto_row153,
+       lexer_goto_row154,
+       lexer_goto_row155,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row156,
-       lexer_goto_row157,
        lexer_goto_row158,
        lexer_goto_row159,
        lexer_goto_row160,
@@ -2146,15 +2173,15 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row162,
        lexer_goto_row163,
        lexer_goto_row164,
+       lexer_goto_row165,
+       lexer_goto_row166,
+       lexer_goto_row167,
+       lexer_goto_row168,
+       lexer_goto_row169,
        lexer_goto_row_null,
        lexer_goto_row_null,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row169,
-       lexer_goto_row170,
-       lexer_goto_row171,
-       lexer_goto_row172,
-       lexer_goto_row173,
        lexer_goto_row174,
        lexer_goto_row175,
        lexer_goto_row176,
@@ -2212,19 +2239,19 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row228,
        lexer_goto_row229,
        lexer_goto_row230,
-       lexer_goto_row_null,
+       lexer_goto_row231,
        lexer_goto_row232,
        lexer_goto_row233,
        lexer_goto_row234,
        lexer_goto_row235,
-       lexer_goto_row236,
-       lexer_goto_row237,
        lexer_goto_row_null,
+       lexer_goto_row237,
+       lexer_goto_row238,
        lexer_goto_row239,
        lexer_goto_row240,
        lexer_goto_row241,
        lexer_goto_row242,
-       lexer_goto_row243,
+       lexer_goto_row_null,
        lexer_goto_row244,
        lexer_goto_row245,
        lexer_goto_row246,
@@ -2272,14 +2299,14 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row288,
        lexer_goto_row289,
        lexer_goto_row290,
+       lexer_goto_row291,
+       lexer_goto_row292,
+       lexer_goto_row293,
+       lexer_goto_row294,
+       lexer_goto_row295,
        lexer_goto_row_null,
        lexer_goto_row_null,
        lexer_goto_row_null,
-       lexer_goto_row294,
-       lexer_goto_row295,
-       lexer_goto_row296,
-       lexer_goto_row297,
-       lexer_goto_row298,
        lexer_goto_row299,
        lexer_goto_row300,
        lexer_goto_row301,
@@ -2317,12 +2344,12 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row333,
        lexer_goto_row334,
        lexer_goto_row335,
-       lexer_goto_row_null,
+       lexer_goto_row336,
        lexer_goto_row337,
        lexer_goto_row338,
        lexer_goto_row339,
        lexer_goto_row340,
-       lexer_goto_row341,
+       lexer_goto_row_null,
        lexer_goto_row342,
        lexer_goto_row343,
        lexer_goto_row344,
@@ -2365,14 +2392,19 @@ const int* const lexer_goto_table[] = {
        lexer_goto_row381,
        lexer_goto_row382,
        lexer_goto_row383,
-       lexer_goto_row_null,
+       lexer_goto_row384,
        lexer_goto_row385,
        lexer_goto_row386,
-       lexer_goto_row387
+       lexer_goto_row387,
+       lexer_goto_row388,
+       lexer_goto_row_null,
+       lexer_goto_row390,
+       lexer_goto_row391,
+       lexer_goto_row392
 };
 
 const int lexer_accept_table[] = {
-       -1,0,1,1,0,94,114,2,80,83,-1,53,54,77,75,57,76,74,79,100,100,58,96,87,60,90,95,97,55,56,82,-1,-1,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,81,114,84,1,86,114,109,-1,110,2,2,2,65,69,115,115,115,78,63,61,62,73,108,64,-1,-1,-1,-1,-1,-1,-1,-1,59,89,88,85,91,92,97,97,97,97,68,-1,99,-1,98,98,98,98,98,98,47,98,98,98,16,98,98,98,98,98,98,23,98,29,15,98,98,98,98,98,98,98,31,98,98,98,98,98,98,98,98,98,98,98,98,98,67,114,112,-1,111,114,109,114,114,2,113,114,115,66,72,102,102,102,103,103,101,101,101,101,104,70,93,71,-1,99,99,99,99,-1,-1,-1,98,98,30,98,98,98,98,98,10,98,98,98,28,11,98,98,98,40,98,98,98,98,39,32,98,98,98,98,98,98,98,98,98,98,98,98,98,98,17,98,98,114,114,114,114,114,-1,-1,-1,114,114,114,-1,-1,113,-1,-1,-1,-1,-1,-1,116,98,98,98,98,98,98,25,9,98,98,98,98,13,98,98,98,98,27,98,46,41,98,98,98,98,98,98,43,98,24,44,12,98,98,51,114,-1,-1,112,-1,111,-1,-1,114,-1,-1,114,114,114,-1,-1,114,106,107,105,-1,37,98,98,36,6,98,98,45,98,98,98,98,49,50,98,98,98,98,98,98,14,98,42,98,26,-1,-1,-1,-1,-1,-1,114,-1,-1,109,-1,-1,110,114,114,114,109,-1,114,-1,98,38,98,18,98,5,98,98,4,98,98,98,98,19,34,98,-1,112,-1,-1,111,109,110,114,-1,98,98,33,98,22,98,3,21,98,98,112,111,-1,7,35,98,48,98,98,52,8,20,9
+       -1,0,1,1,0,94,114,2,80,83,-1,53,54,77,75,57,76,74,79,100,100,58,96,87,60,90,95,97,55,56,82,-1,-1,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,81,114,84,1,86,114,109,-1,110,2,2,2,65,69,115,115,115,78,63,61,62,73,108,64,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,59,89,88,85,91,92,97,97,97,97,68,-1,99,-1,98,98,98,98,98,98,47,98,98,98,16,98,98,98,98,98,98,23,98,29,15,98,98,98,98,98,98,98,31,98,98,98,98,98,98,98,98,98,98,98,98,98,67,114,112,-1,111,114,109,114,114,2,113,114,115,66,72,102,102,102,-1,-1,108,103,103,101,101,101,101,104,70,93,71,-1,99,99,99,99,-1,-1,-1,98,98,30,98,98,98,98,98,10,98,98,98,28,11,98,98,98,40,98,98,98,98,39,32,98,98,98,98,98,98,98,98,98,98,98,98,98,98,17,98,98,114,114,114,114,114,-1,-1,-1,114,114,114,-1,-1,113,-1,-1,-1,-1,-1,-1,116,98,98,98,98,98,98,25,9,98,98,98,98,13,98,98,98,98,27,98,46,41,98,98,98,98,98,98,43,98,24,44,12,98,98,51,114,-1,-1,112,-1,111,-1,-1,114,-1,-1,114,114,114,-1,-1,114,106,107,105,-1,37,98,98,36,6,98,98,45,98,98,98,98,49,50,98,98,98,98,98,98,14,98,42,98,26,-1,-1,-1,-1,-1,-1,114,-1,-1,109,-1,-1,110,114,114,114,109,-1,114,-1,98,38,98,18,98,5,98,98,4,98,98,98,98,19,34,98,-1,112,-1,-1,111,109,110,114,-1,98,98,33,98,22,98,3,21,98,98,112,111,-1,7,35,98,48,98,98,52,8,20,9
 };
 
 static int parser_action_row1[] = {
index cd932ee..feaed3f 100644 (file)
@@ -5,3 +5,9 @@
 12.346
 12.3
 12
+0.5
+0.000
+0.000003125
+3410.0
+400.0
+10.0
index 387c312..a997f01 100644 (file)
@@ -23,3 +23,14 @@ print(f.to_s)
 print(f.to_precision(3))
 print(f.to_precision(1))
 print(f.to_precision(0))
+f = 5.0e-1
+print(f)
+f = 3.125e-6
+print(f.to_precision(3))
+print(f.to_precision(9))
+f = 3.41e3
+print f
+f = 4e2
+print f
+f = .1e2
+print f