LCOV - code coverage report
Current view: top level - tests - catch_lexer.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1159 1174 98.7 %
Date: 2023-07-29 22:00:24 Functions: 14 15 93.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright (c) 2011-2023  Made to Order Software Corp.  All Rights Reserved
       2             : //
       3             : // https://snapwebsites.org/project/as2js
       4             : // contact@m2osw.com
       5             : //
       6             : // This program is free software: you can redistribute it and/or modify
       7             : // it under the terms of the GNU General Public License as published by
       8             : // the Free Software Foundation, either version 3 of the License, or
       9             : // (at your option) any later version.
      10             : //
      11             : // This program is distributed in the hope that it will be useful,
      12             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14             : // GNU General Public License for more details.
      15             : //
      16             : // You should have received a copy of the GNU General Public License
      17             : // along with this program.  If not, see <https://www.gnu.org/licenses/>.
      18             : 
      19             : // as2js
      20             : //
      21             : #include    <as2js/lexer.h>
      22             : 
      23             : #include    <as2js/exception.h>
      24             : #include    <as2js/message.h>
      25             : 
      26             : 
      27             : // self
      28             : //
      29             : #include    "catch_main.h"
      30             : 
      31             : 
      32             : // libutf8
      33             : //
      34             : #include    <libutf8/libutf8.h>
      35             : 
      36             : 
      37             : // ICU
      38             : //
      39             : // See http://icu-project.org/apiref/icu4c/index.html
      40             : #include <unicode/uchar.h>
      41             : //#include <unicode/cuchar> // once available in Linux...
      42             : 
      43             : 
      44             : // C++
      45             : //
      46             : #include    <cstring>
      47             : #include    <algorithm>
      48             : #include    <iomanip>
      49             : 
      50             : 
      51             : // last include
      52             : //
      53             : #include    <snapdev/poison.h>
      54             : 
      55             : 
      56             : 
      57             : namespace
      58             : {
      59             : 
      60             : class lexer_test_callback
      61             :     : public as2js::message_callback
      62             : {
      63             : public:
      64      374784 :     lexer_test_callback()
      65      374784 :     {
      66      374784 :         as2js::set_message_callback(this);
      67      374784 :     }
      68             : 
      69      374784 :     ~lexer_test_callback()
      70      374784 :     {
      71             :         // make sure the pointer gets reset!
      72             :         //
      73      374784 :         as2js::set_message_callback(nullptr);
      74      374784 :     }
      75             : 
      76        3072 :     virtual void    output(
      77             :                           as2js::message_level_t message_level
      78             :                         , as2js::err_code_t error_code
      79             :                         , as2js::position const & pos
      80             :                         , std::string const & message)
      81             :     {
      82        3072 :         snapdev::NOT_USED(error_code);
      83        3072 :         std::stringstream ss;
      84        3072 :         ss << message_level
      85        3072 :            << ':'
      86        3072 :            << pos
      87             :            << ": "
      88        3072 :            << message;
      89        3072 :         if(ss.str() != f_expected_message)
      90             :         {
      91             :             std::cerr
      92             :                 << "--- error: expected messages differ for \""
      93           0 :                 << f_working_on
      94           0 :                 << "\".\n";
      95           0 :             CATCH_REQUIRE(ss.str() == f_expected_message);
      96             :         }
      97        6144 :     }
      98             : 
      99             :     std::string         f_working_on = std::string();
     100             :     std::string         f_expected_message = std::string();
     101             : };
     102             : 
     103             : enum check_value_t
     104             : {
     105             :     CHECK_VALUE_IGNORE,
     106             :     CHECK_VALUE_INTEGER,
     107             :     CHECK_VALUE_FLOATING_POINT,
     108             :     CHECK_VALUE_STRING,
     109             :     CHECK_VALUE_BOOLEAN
     110             : };
     111             : 
     112             : struct option_t
     113             : {
     114             :     as2js::option_t    f_option;
     115             : };
     116             : 
     117             : //struct message_t
     118             : //{
     119             : //    // condition
     120             : //    option_t const *            f_options_on;
     121             : //    option_t const *            f_options_off;
     122             : //
     123             : //    // expected message
     124             : //    std::string                 f_message;
     125             : //};
     126             : 
     127             : struct result_t
     128             : {
     129             :     // this token, with that value if options match
     130             :     as2js::node_t               f_token = as2js::node_t::NODE_UNKNOWN;
     131             :     check_value_t               f_check_value = CHECK_VALUE_IGNORE;
     132             :         std::int64_t                f_integer = 0;
     133             :         double                      f_floating_point = 0.0;
     134             :         char const *                f_string = nullptr; // utf8
     135             :         bool                        f_boolean = false;
     136             :     option_t const *            f_options = nullptr;
     137             : };
     138             : 
     139             : struct token_t
     140             : {
     141             :     char const *                f_input = nullptr;
     142             :     result_t const *            f_results = nullptr;
     143             :     char const *                f_expected_message = nullptr; // "optional" (i.e. the get_next_token() may not generate that message at all)
     144             : };
     145             : 
     146             : option_t const g_option_extended_statements[] =
     147             : {
     148             :     as2js::option_t::OPTION_EXTENDED_STATEMENTS,
     149             :     as2js::option_t::OPTION_max
     150             : };
     151             : 
     152             : option_t const g_option_extended_escape_sequences[] =
     153             : {
     154             :     as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES,
     155             :     as2js::option_t::OPTION_max
     156             : };
     157             : 
     158             : //option_t const g_option_binary[] =
     159             : //{
     160             : //    as2js::option_t::OPTION_BINARY,
     161             : //    as2js::option_t::OPTION_max
     162             : //};
     163             : 
     164             : option_t const g_option_octal[] =
     165             : {
     166             :     as2js::option_t::OPTION_OCTAL,
     167             :     as2js::option_t::OPTION_max
     168             : };
     169             : 
     170             : //option_t const g_option_extended_operators[] =
     171             : //{
     172             : //    as2js::option_t::OPTION_EXTENDED_OPERATORS,
     173             : //    as2js::option_t::OPTION_max
     174             : //};
     175             : 
     176             : //message_t const g_message_unknown_escape[] =
     177             : //{
     178             : //    {
     179             : //        nullptr,
     180             : //        g_option_extended_escape_sequences,
     181             : //        "error:unknown-file:1:45::76: unknown escape letter \"e\"",
     182             : //    },
     183             : //};
     184             : 
     185             : result_t const g_result_test_a_string[] =
     186             : {
     187             :     {
     188             :         as2js::node_t::NODE_STRING,
     189             :         CHECK_VALUE_STRING, 0, 0.0, "Test a String", false,
     190             :         nullptr,
     191             :     },
     192             :     {}
     193             : };
     194             : 
     195             : result_t const g_result_escaped_characters[] =
     196             : {
     197             :     {
     198             :         as2js::node_t::NODE_STRING,
     199             :         CHECK_VALUE_STRING, 0, 0.0, "Escaped characters: Backspace \b, Escape \033, Formfeed \f, Newline \n, Carriage Return \r, Horizontal Tab \t, Vertical Tab \v, Double Quote \", Single Quote ', Template Quote `, Backslash \\", false,
     200             :         g_option_extended_escape_sequences,
     201             :     },
     202             :     {
     203             :         as2js::node_t::NODE_STRING,
     204             :         CHECK_VALUE_STRING, 0, 0.0, "Escaped characters: Backspace \b, Escape ?, Formfeed \f, Newline \n, Carriage Return \r, Horizontal Tab \t, Vertical Tab \v, Double Quote \", Single Quote ', Template Quote `, Backslash \\", false,
     205             :         nullptr,
     206             :     },
     207             :     {}
     208             : };
     209             : 
     210             : result_t const g_result_empty_string[] =
     211             : {
     212             :     {
     213             :         as2js::node_t::NODE_STRING,
     214             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
     215             :         nullptr,
     216             :     },
     217             :     {}
     218             : };
     219             : 
     220             : result_t const g_result_template[] =
     221             : {
     222             :     {
     223             :         as2js::node_t::NODE_TEMPLATE,
     224             :         CHECK_VALUE_STRING, 0, 0.0, "template", false,
     225             :         nullptr,
     226             :     },
     227             :     {}
     228             : };
     229             : 
     230             : result_t const g_result_regex[] =
     231             : {
     232             :     {
     233             :         as2js::node_t::NODE_REGULAR_EXPRESSION,
     234             :         CHECK_VALUE_STRING, 0, 0.0, "/regex/abc", false,
     235             :         nullptr,
     236             :     },
     237             :     {}
     238             : };
     239             : 
     240             : result_t const g_result_integer_1234[] =
     241             : {
     242             :     {
     243             :         as2js::node_t::NODE_INTEGER,
     244             :         CHECK_VALUE_INTEGER, 1234, 0.0, "", false,
     245             :         nullptr,
     246             :     },
     247             :     {}
     248             : };
     249             : 
     250             : result_t const g_result_integer_binary_1234[] =
     251             : {
     252             :     {
     253             :         as2js::node_t::NODE_INTEGER,
     254             :         CHECK_VALUE_INTEGER, 1234, 0.0, "", false,
     255             :         nullptr,
     256             :     },
     257             :     //{
     258             :     //    as2js::node_t::NODE_INTEGER,
     259             :     //    CHECK_VALUE_INTEGER, -1, 0.0, "", false,
     260             :     //    nullptr,
     261             :     //},
     262             :     {}
     263             : };
     264             : 
     265             : result_t const g_result_integer_legacy_octal_207[] =
     266             : {
     267             :     {
     268             :         as2js::node_t::NODE_INTEGER,
     269             :         CHECK_VALUE_INTEGER, 207, 0.0, "", false,
     270             :         g_option_octal,
     271             :     },
     272             :     {
     273             :         as2js::node_t::NODE_INTEGER,
     274             :         CHECK_VALUE_INTEGER, 0, 0.0, "", false,
     275             :         nullptr,
     276             :     },
     277             :     {}
     278             : };
     279             : 
     280             : result_t const g_result_integer_octal_207[] =
     281             : {
     282             :     {
     283             :         as2js::node_t::NODE_INTEGER,
     284             :         CHECK_VALUE_INTEGER, 207, 0.0, "", false,
     285             :         nullptr,
     286             :     },
     287             :     {
     288             :         as2js::node_t::NODE_INTEGER,
     289             :         CHECK_VALUE_INTEGER, 0, 0.0, "", false,
     290             :         nullptr,
     291             :     },
     292             :     {}
     293             : };
     294             : 
     295             : result_t const g_result_float64_1_234[] =
     296             : {
     297             :     {
     298             :         as2js::node_t::NODE_FLOATING_POINT,
     299             :         CHECK_VALUE_FLOATING_POINT, 0, 1.234, "", false,
     300             :         nullptr,
     301             :     },
     302             :     {}
     303             : };
     304             : 
     305             : result_t const g_result_float64_3_14159[] =
     306             : {
     307             :     {
     308             :         as2js::node_t::NODE_FLOATING_POINT,
     309             :         CHECK_VALUE_FLOATING_POINT, 0, 3.14159, "", false,
     310             :         nullptr,
     311             :     },
     312             :     {}
     313             : };
     314             : 
     315             : result_t const g_result_float64__33[] =
     316             : {
     317             :     {
     318             :         as2js::node_t::NODE_FLOATING_POINT,
     319             :         CHECK_VALUE_FLOATING_POINT, 0, 0.33, "", false,
     320             :         nullptr,
     321             :     },
     322             :     {}
     323             : };
     324             : 
     325             : result_t const g_result_float64__330000[] =
     326             : {
     327             :     {
     328             :         as2js::node_t::NODE_FLOATING_POINT,
     329             :         CHECK_VALUE_FLOATING_POINT, 0, 330000.0, "", false,
     330             :         nullptr,
     331             :     },
     332             :     {}
     333             : };
     334             : 
     335             : result_t const g_result_add[] =
     336             : {
     337             :     {
     338             :         as2js::node_t::NODE_ADD,
     339             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     340             :         nullptr,
     341             :     },
     342             :     {}
     343             : };
     344             : 
     345             : result_t const g_result_bitwise_and[] =
     346             : {
     347             :     {
     348             :         as2js::node_t::NODE_BITWISE_AND,
     349             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     350             :         nullptr,
     351             :     },
     352             :     {}
     353             : };
     354             : 
     355             : result_t const g_result_bitwise_not[] =
     356             : {
     357             :     {
     358             :         as2js::node_t::NODE_BITWISE_NOT,
     359             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     360             :         nullptr,
     361             :     },
     362             :     {}
     363             : };
     364             : 
     365             : result_t const g_result_assignment[] =
     366             : {
     367             :     {
     368             :         as2js::node_t::NODE_ASSIGNMENT,
     369             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     370             :         nullptr,
     371             :     },
     372             :     {}
     373             : };
     374             : 
     375             : result_t const g_result_bitwise_or[] =
     376             : {
     377             :     {
     378             :         as2js::node_t::NODE_BITWISE_OR,
     379             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     380             :         nullptr,
     381             :     },
     382             :     {}
     383             : };
     384             : 
     385             : result_t const g_result_bitwise_xor[] =
     386             : {
     387             :     {
     388             :         as2js::node_t::NODE_BITWISE_XOR,
     389             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     390             :         nullptr,
     391             :     },
     392             :     {}
     393             : };
     394             : 
     395             : result_t const g_result_close_curvly_bracket[] =
     396             : {
     397             :     {
     398             :         as2js::node_t::NODE_CLOSE_CURVLY_BRACKET,
     399             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     400             :         nullptr,
     401             :     },
     402             :     {}
     403             : };
     404             : 
     405             : result_t const g_result_close_parenthesis[] =
     406             : {
     407             :     {
     408             :         as2js::node_t::NODE_CLOSE_PARENTHESIS,
     409             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     410             :         nullptr,
     411             :     },
     412             :     {}
     413             : };
     414             : 
     415             : result_t const g_result_close_square_bracket[] =
     416             : {
     417             :     {
     418             :         as2js::node_t::NODE_CLOSE_SQUARE_BRACKET,
     419             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     420             :         nullptr,
     421             :     },
     422             :     {}
     423             : };
     424             : 
     425             : result_t const g_result_colon[] =
     426             : {
     427             :     {
     428             :         as2js::node_t::NODE_COLON,
     429             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     430             :         nullptr,
     431             :     },
     432             :     {}
     433             : };
     434             : 
     435             : result_t const g_result_comma[] =
     436             : {
     437             :     {
     438             :         as2js::node_t::NODE_COMMA,
     439             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     440             :         nullptr,
     441             :     },
     442             :     {}
     443             : };
     444             : 
     445             : result_t const g_result_conditional[] =
     446             : {
     447             :     {
     448             :         as2js::node_t::NODE_CONDITIONAL,
     449             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     450             :         nullptr,
     451             :     },
     452             :     {}
     453             : };
     454             : 
     455             : result_t const g_result_divide[] =
     456             : {
     457             :     {
     458             :         as2js::node_t::NODE_DIVIDE,
     459             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     460             :         nullptr,
     461             :     },
     462             :     {}
     463             : };
     464             : 
     465             : result_t const g_result_greater[] =
     466             : {
     467             :     {
     468             :         as2js::node_t::NODE_GREATER,
     469             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     470             :         nullptr,
     471             :     },
     472             :     {}
     473             : };
     474             : 
     475             : result_t const g_result_less[] =
     476             : {
     477             :     {
     478             :         as2js::node_t::NODE_LESS,
     479             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     480             :         nullptr,
     481             :     },
     482             :     {}
     483             : };
     484             : 
     485             : result_t const g_result_logical_not[] =
     486             : {
     487             :     {
     488             :         as2js::node_t::NODE_LOGICAL_NOT,
     489             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     490             :         nullptr,
     491             :     },
     492             :     {}
     493             : };
     494             : 
     495             : result_t const g_result_modulo[] =
     496             : {
     497             :     {
     498             :         as2js::node_t::NODE_MODULO,
     499             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     500             :         nullptr,
     501             :     },
     502             :     {}
     503             : };
     504             : 
     505             : result_t const g_result_multiply[] =
     506             : {
     507             :     {
     508             :         as2js::node_t::NODE_MULTIPLY,
     509             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     510             :         nullptr,
     511             :     },
     512             :     {}
     513             : };
     514             : 
     515             : result_t const g_result_open_curvly_bracket[] =
     516             : {
     517             :     {
     518             :         as2js::node_t::NODE_OPEN_CURVLY_BRACKET,
     519             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     520             :         nullptr,
     521             :     },
     522             :     {}
     523             : };
     524             : 
     525             : result_t const g_result_open_parenthesis[] =
     526             : {
     527             :     {
     528             :         as2js::node_t::NODE_OPEN_PARENTHESIS,
     529             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     530             :         nullptr,
     531             :     },
     532             :     {}
     533             : };
     534             : 
     535             : result_t const g_result_open_square_bracket[] =
     536             : {
     537             :     {
     538             :         as2js::node_t::NODE_OPEN_SQUARE_BRACKET,
     539             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     540             :         nullptr,
     541             :     },
     542             :     {}
     543             : };
     544             : 
     545             : result_t const g_result_member[] =
     546             : {
     547             :     {
     548             :         as2js::node_t::NODE_MEMBER,
     549             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     550             :         nullptr,
     551             :     },
     552             :     {}
     553             : };
     554             : 
     555             : result_t const g_result_semicolon[] =
     556             : {
     557             :     {
     558             :         as2js::node_t::NODE_SEMICOLON,
     559             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     560             :         nullptr,
     561             :     },
     562             :     {}
     563             : };
     564             : 
     565             : result_t const g_result_subtract[] =
     566             : {
     567             :     {
     568             :         as2js::node_t::NODE_SUBTRACT,
     569             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     570             :         nullptr,
     571             :     },
     572             :     {}
     573             : };
     574             : 
     575             : result_t const g_result_shift_left[] =
     576             : {
     577             :     {
     578             :         as2js::node_t::NODE_SHIFT_LEFT,
     579             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     580             :         nullptr,
     581             :     },
     582             :     {}
     583             : };
     584             : 
     585             : result_t const g_result_assignment_shift_left[] =
     586             : {
     587             :     {
     588             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_LEFT,
     589             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     590             :         nullptr,
     591             :     },
     592             :     {}
     593             : };
     594             : 
     595             : result_t const g_result_less_equal[] =
     596             : {
     597             :     {
     598             :         as2js::node_t::NODE_LESS_EQUAL,
     599             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     600             :         nullptr,
     601             :     },
     602             :     {}
     603             : };
     604             : 
     605             : result_t const g_result_extended_not_equal[] =
     606             : {
     607             :     {
     608             :         as2js::node_t::NODE_NOT_EQUAL,
     609             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     610             :         nullptr,
     611             :     },
     612             :     {}
     613             : };
     614             : 
     615             : result_t const g_result_minimum[] =
     616             : {
     617             :     {
     618             :         as2js::node_t::NODE_MINIMUM,
     619             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     620             :         nullptr,
     621             :     },
     622             :     {}
     623             : };
     624             : 
     625             : result_t const g_result_assignment_minimum[] =
     626             : {
     627             :     {
     628             :         as2js::node_t::NODE_ASSIGNMENT_MINIMUM,
     629             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     630             :         nullptr,
     631             :     },
     632             :     {}
     633             : };
     634             : 
     635             : result_t const g_result_rotate_left[] =
     636             : {
     637             :     {
     638             :         as2js::node_t::NODE_ROTATE_LEFT,
     639             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     640             :         nullptr,
     641             :     },
     642             :     {}
     643             : };
     644             : 
     645             : result_t const g_result_assignment_rotate_left[] =
     646             : {
     647             :     {
     648             :         as2js::node_t::NODE_ASSIGNMENT_ROTATE_LEFT,
     649             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     650             :         nullptr,
     651             :     },
     652             :     {}
     653             : };
     654             : 
     655             : result_t const g_result_shift_right[] =
     656             : {
     657             :     {
     658             :         as2js::node_t::NODE_SHIFT_RIGHT,
     659             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     660             :         nullptr,
     661             :     },
     662             :     {}
     663             : };
     664             : 
     665             : result_t const g_result_unsigned_shift_right[] =
     666             : {
     667             :     {
     668             :         as2js::node_t::NODE_SHIFT_RIGHT_UNSIGNED,
     669             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     670             :         nullptr,
     671             :     },
     672             :     {}
     673             : };
     674             : 
     675             : result_t const g_result_assignment_shift_right[] =
     676             : {
     677             :     {
     678             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT,
     679             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     680             :         nullptr,
     681             :     },
     682             :     {}
     683             : };
     684             : 
     685             : result_t const g_result_assignment_unsigned_shift_right[] =
     686             : {
     687             :     {
     688             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT_UNSIGNED,
     689             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     690             :         nullptr,
     691             :     },
     692             :     {}
     693             : };
     694             : 
     695             : result_t const g_result_compare[] =
     696             : {
     697             :     {
     698             :         as2js::node_t::NODE_COMPARE,
     699             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     700             :         nullptr,
     701             :     },
     702             :     {}
     703             : };
     704             : 
     705             : result_t const g_result_greater_equal[] =
     706             : {
     707             :     {
     708             :         as2js::node_t::NODE_GREATER_EQUAL,
     709             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     710             :         nullptr,
     711             :     },
     712             :     {}
     713             : };
     714             : 
     715             : result_t const g_result_maximum[] =
     716             : {
     717             :     {
     718             :         as2js::node_t::NODE_MAXIMUM,
     719             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     720             :         nullptr,
     721             :     },
     722             :     {}
     723             : };
     724             : 
     725             : result_t const g_result_assignment_maximum[] =
     726             : {
     727             :     {
     728             :         as2js::node_t::NODE_ASSIGNMENT_MAXIMUM,
     729             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     730             :         nullptr,
     731             :     },
     732             :     {}
     733             : };
     734             : 
     735             : result_t const g_result_rotate_right[] =
     736             : {
     737             :     {
     738             :         as2js::node_t::NODE_ROTATE_RIGHT,
     739             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     740             :         nullptr,
     741             :     },
     742             :     {}
     743             : };
     744             : 
     745             : result_t const g_result_assignment_rotate_right[] =
     746             : {
     747             :     {
     748             :         as2js::node_t::NODE_ASSIGNMENT_ROTATE_RIGHT,
     749             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     750             :         nullptr,
     751             :     },
     752             :     {}
     753             : };
     754             : 
     755             : result_t const g_result_not_equal[] =
     756             : {
     757             :     {
     758             :         as2js::node_t::NODE_NOT_EQUAL,
     759             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     760             :         nullptr,
     761             :     },
     762             :     {}
     763             : };
     764             : 
     765             : result_t const g_result_strictly_not_equal[] =
     766             : {
     767             :     {
     768             :         as2js::node_t::NODE_STRICTLY_NOT_EQUAL,
     769             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     770             :         nullptr,
     771             :     },
     772             :     {}
     773             : };
     774             : 
     775             : result_t const g_result_equal[] =
     776             : {
     777             :     {
     778             :         as2js::node_t::NODE_EQUAL,
     779             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     780             :         nullptr,
     781             :     },
     782             :     {}
     783             : };
     784             : 
     785             : result_t const g_result_strictly_equal[] =
     786             : {
     787             :     {
     788             :         as2js::node_t::NODE_STRICTLY_EQUAL,
     789             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     790             :         nullptr,
     791             :     },
     792             :     {}
     793             : };
     794             : 
     795             : result_t const g_result_extended_assignment[] =
     796             : {
     797             :     {
     798             :         as2js::node_t::NODE_ASSIGNMENT,
     799             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     800             :         nullptr,
     801             :     },
     802             :     {}
     803             : };
     804             : 
     805             : result_t const g_result_scope[] =
     806             : {
     807             :     {
     808             :         as2js::node_t::NODE_SCOPE,
     809             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     810             :         nullptr,
     811             :     },
     812             :     {}
     813             : };
     814             : 
     815             : result_t const g_result_match[] =
     816             : {
     817             :     {
     818             :         as2js::node_t::NODE_MATCH,
     819             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     820             :         nullptr,
     821             :     },
     822             :     {}
     823             : };
     824             : 
     825             : result_t const g_result_not_match[] =
     826             : {
     827             :     {
     828             :         as2js::node_t::NODE_NOT_MATCH,
     829             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     830             :         nullptr,
     831             :     },
     832             :     {}
     833             : };
     834             : 
     835             : result_t const g_result_smart_match[] =
     836             : {
     837             :     {
     838             :         as2js::node_t::NODE_SMART_MATCH,
     839             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     840             :         nullptr,
     841             :     },
     842             :     {}
     843             : };
     844             : 
     845             : result_t const g_result_assignment_add[] =
     846             : {
     847             :     {
     848             :         as2js::node_t::NODE_ASSIGNMENT_ADD,
     849             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     850             :         nullptr,
     851             :     },
     852             :     {}
     853             : };
     854             : 
     855             : result_t const g_result_increment[] =
     856             : {
     857             :     {
     858             :         as2js::node_t::NODE_INCREMENT,
     859             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     860             :         nullptr,
     861             :     },
     862             :     {}
     863             : };
     864             : 
     865             : result_t const g_result_assignment_subtract[] =
     866             : {
     867             :     {
     868             :         as2js::node_t::NODE_ASSIGNMENT_SUBTRACT,
     869             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     870             :         nullptr,
     871             :     },
     872             :     {}
     873             : };
     874             : 
     875             : result_t const g_result_decrement[] =
     876             : {
     877             :     {
     878             :         as2js::node_t::NODE_DECREMENT,
     879             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     880             :         nullptr,
     881             :     },
     882             :     {}
     883             : };
     884             : 
     885             : result_t const g_result_assignment_multiply[] =
     886             : {
     887             :     {
     888             :         as2js::node_t::NODE_ASSIGNMENT_MULTIPLY,
     889             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     890             :         nullptr,
     891             :     },
     892             :     {}
     893             : };
     894             : 
     895             : result_t const g_result_power[] =
     896             : {
     897             :     {
     898             :         as2js::node_t::NODE_POWER,
     899             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     900             :         nullptr,
     901             :     },
     902             :     {}
     903             : };
     904             : 
     905             : result_t const g_result_assignment_power[] =
     906             : {
     907             :     {
     908             :         as2js::node_t::NODE_ASSIGNMENT_POWER,
     909             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     910             :         nullptr,
     911             :     },
     912             :     {}
     913             : };
     914             : 
     915             : result_t const g_result_assignment_divide[] =
     916             : {
     917             :     {
     918             :         as2js::node_t::NODE_ASSIGNMENT_DIVIDE,
     919             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     920             :         nullptr,
     921             :     },
     922             :     {}
     923             : };
     924             : 
     925             : result_t const g_result_assignment_modulo[] =
     926             : {
     927             :     {
     928             :         as2js::node_t::NODE_ASSIGNMENT_MODULO,
     929             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     930             :         nullptr,
     931             :     },
     932             :     {}
     933             : };
     934             : 
     935             : result_t const g_result_assignment_bitwise_and[] =
     936             : {
     937             :     {
     938             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_AND,
     939             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     940             :         nullptr,
     941             :     },
     942             :     {}
     943             : };
     944             : 
     945             : result_t const g_result_logical_and[] =
     946             : {
     947             :     {
     948             :         as2js::node_t::NODE_LOGICAL_AND,
     949             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     950             :         nullptr,
     951             :     },
     952             :     {}
     953             : };
     954             : 
     955             : result_t const g_result_assignment_logical_and[] =
     956             : {
     957             :     {
     958             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_AND,
     959             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     960             :         nullptr,
     961             :     },
     962             :     {}
     963             : };
     964             : 
     965             : result_t const g_result_assignment_bitwise_xor[] =
     966             : {
     967             :     {
     968             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_XOR,
     969             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     970             :         nullptr,
     971             :     },
     972             :     {}
     973             : };
     974             : 
     975             : result_t const g_result_logical_xor[] =
     976             : {
     977             :     {
     978             :         as2js::node_t::NODE_LOGICAL_XOR,
     979             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     980             :         nullptr,
     981             :     },
     982             :     {}
     983             : };
     984             : 
     985             : result_t const g_result_assignment_logical_xor[] =
     986             : {
     987             :     {
     988             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_XOR,
     989             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
     990             :         nullptr,
     991             :     },
     992             :     {}
     993             : };
     994             : 
     995             : result_t const g_result_assignment_bitwise_or[] =
     996             : {
     997             :     {
     998             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR,
     999             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1000             :         nullptr,
    1001             :     },
    1002             :     {}
    1003             : };
    1004             : 
    1005             : result_t const g_result_logical_or[] =
    1006             : {
    1007             :     {
    1008             :         as2js::node_t::NODE_LOGICAL_OR,
    1009             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1010             :         nullptr,
    1011             :     },
    1012             :     {}
    1013             : };
    1014             : 
    1015             : result_t const g_result_assignment_logical_or[] =
    1016             : {
    1017             :     {
    1018             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_OR,
    1019             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1020             :         nullptr,
    1021             :     },
    1022             :     {}
    1023             : };
    1024             : 
    1025             : result_t const g_result_range[] =
    1026             : {
    1027             :     {
    1028             :         as2js::node_t::NODE_RANGE,
    1029             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1030             :         nullptr,
    1031             :     },
    1032             :     {}
    1033             : };
    1034             : 
    1035             : result_t const g_result_rest[] =
    1036             : {
    1037             :     {
    1038             :         as2js::node_t::NODE_REST,
    1039             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1040             :         nullptr,
    1041             :     },
    1042             :     {}
    1043             : };
    1044             : 
    1045             : result_t const g_result_identifier_test_an_identifier[] =
    1046             : {
    1047             :     {
    1048             :         as2js::node_t::NODE_IDENTIFIER,
    1049             :         CHECK_VALUE_STRING, 0, 0.0, "Test_An_Identifier", false,
    1050             :         nullptr,
    1051             :     },
    1052             :     {}
    1053             : };
    1054             : 
    1055             : result_t const g_result_keyword_abstract[] =
    1056             : {
    1057             :     {
    1058             :         as2js::node_t::NODE_ABSTRACT,
    1059             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1060             :         nullptr,
    1061             :     },
    1062             :     {}
    1063             : };
    1064             : 
    1065             : result_t const g_result_keyword_as[] =
    1066             : {
    1067             :     {
    1068             :         as2js::node_t::NODE_AS,
    1069             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1070             :         nullptr,
    1071             :     },
    1072             :     {}
    1073             : };
    1074             : 
    1075             : result_t const g_result_keyword_boolean[] =
    1076             : {
    1077             :     {
    1078             :         as2js::node_t::NODE_BOOLEAN,
    1079             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1080             :         nullptr,
    1081             :     },
    1082             :     {}
    1083             : };
    1084             : 
    1085             : result_t const g_result_keyword_break[] =
    1086             : {
    1087             :     {
    1088             :         as2js::node_t::NODE_BREAK,
    1089             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1090             :         nullptr,
    1091             :     },
    1092             :     {}
    1093             : };
    1094             : 
    1095             : 
    1096             : result_t const g_result_keyword_byte[] =
    1097             : {
    1098             :     {
    1099             :         as2js::node_t::NODE_BYTE,
    1100             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1101             :         nullptr,
    1102             :     },
    1103             :     {}
    1104             : };
    1105             : result_t const g_result_keyword_case[] =
    1106             : {
    1107             :     {
    1108             :         as2js::node_t::NODE_CASE,
    1109             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1110             :         nullptr,
    1111             :     },
    1112             :     {}
    1113             : };
    1114             : 
    1115             : result_t const g_result_keyword_catch[] =
    1116             : {
    1117             :     {
    1118             :         as2js::node_t::NODE_CATCH,
    1119             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1120             :         nullptr,
    1121             :     },
    1122             :     {}
    1123             : };
    1124             : 
    1125             : result_t const g_result_keyword_char[] =
    1126             : {
    1127             :     {
    1128             :         as2js::node_t::NODE_CHAR,
    1129             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1130             :         nullptr,
    1131             :     },
    1132             :     {}
    1133             : };
    1134             : 
    1135             : result_t const g_result_keyword_class[] =
    1136             : {
    1137             :     {
    1138             :         as2js::node_t::NODE_CLASS,
    1139             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1140             :         nullptr,
    1141             :     },
    1142             :     {}
    1143             : };
    1144             : 
    1145             : result_t const g_result_keyword_const[] =
    1146             : {
    1147             :     {
    1148             :         as2js::node_t::NODE_CONST,
    1149             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1150             :         nullptr,
    1151             :     },
    1152             :     {}
    1153             : };
    1154             : 
    1155             : result_t const g_result_keyword_continue[] =
    1156             : {
    1157             :     {
    1158             :         as2js::node_t::NODE_CONTINUE,
    1159             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1160             :         nullptr,
    1161             :     },
    1162             :     {}
    1163             : };
    1164             : 
    1165             : result_t const g_result_keyword_debugger[] =
    1166             : {
    1167             :     {
    1168             :         as2js::node_t::NODE_DEBUGGER,
    1169             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1170             :         nullptr,
    1171             :     },
    1172             :     {}
    1173             : };
    1174             : 
    1175             : result_t const g_result_keyword_default[] =
    1176             : {
    1177             :     {
    1178             :         as2js::node_t::NODE_DEFAULT,
    1179             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1180             :         nullptr,
    1181             :     },
    1182             :     {}
    1183             : };
    1184             : 
    1185             : result_t const g_result_keyword_delete[] =
    1186             : {
    1187             :     {
    1188             :         as2js::node_t::NODE_DELETE,
    1189             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1190             :         nullptr,
    1191             :     },
    1192             :     {}
    1193             : };
    1194             : 
    1195             : result_t const g_result_keyword_do[] =
    1196             : {
    1197             :     {
    1198             :         as2js::node_t::NODE_DO,
    1199             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1200             :         nullptr,
    1201             :     },
    1202             :     {}
    1203             : };
    1204             : 
    1205             : result_t const g_result_keyword_double[] =
    1206             : {
    1207             :     {
    1208             :         as2js::node_t::NODE_DOUBLE,
    1209             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1210             :         nullptr,
    1211             :     },
    1212             :     {}
    1213             : };
    1214             : 
    1215             : result_t const g_result_keyword_else[] =
    1216             : {
    1217             :     {
    1218             :         as2js::node_t::NODE_ELSE,
    1219             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1220             :         nullptr,
    1221             :     },
    1222             :     {}
    1223             : };
    1224             : 
    1225             : result_t const g_result_keyword_ensure[] =
    1226             : {
    1227             :     {
    1228             :         as2js::node_t::NODE_ENSURE,
    1229             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1230             :         nullptr,
    1231             :     },
    1232             :     {}
    1233             : };
    1234             : 
    1235             : result_t const g_result_keyword_enum[] =
    1236             : {
    1237             :     {
    1238             :         as2js::node_t::NODE_ENUM,
    1239             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1240             :         nullptr,
    1241             :     },
    1242             :     {}
    1243             : };
    1244             : 
    1245             : result_t const g_result_keyword_export[] =
    1246             : {
    1247             :     {
    1248             :         as2js::node_t::NODE_EXPORT,
    1249             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1250             :         nullptr,
    1251             :     },
    1252             :     {}
    1253             : };
    1254             : 
    1255             : result_t const g_result_keyword_extends[] =
    1256             : {
    1257             :     {
    1258             :         as2js::node_t::NODE_EXTENDS,
    1259             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1260             :         nullptr,
    1261             :     },
    1262             :     {},
    1263             : };
    1264             : 
    1265             : result_t const g_result_keyword_extern[] =
    1266             : {
    1267             :     {
    1268             :         as2js::node_t::NODE_EXTERN,
    1269             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1270             :         nullptr,
    1271             :     },
    1272             :     {},
    1273             : };
    1274             : 
    1275             : result_t const g_result_keyword_false[] =
    1276             : {
    1277             :     {
    1278             :         as2js::node_t::NODE_FALSE,
    1279             :         CHECK_VALUE_BOOLEAN, 0, 0.0, "", false,
    1280             :         nullptr,
    1281             :     },
    1282             :     {}
    1283             : };
    1284             : 
    1285             : result_t const g_result_keyword_final[] =
    1286             : {
    1287             :     {
    1288             :         as2js::node_t::NODE_FINAL,
    1289             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1290             :         nullptr,
    1291             :     },
    1292             :     {}
    1293             : };
    1294             : 
    1295             : result_t const g_result_keyword_finally[] =
    1296             : {
    1297             :     {
    1298             :         as2js::node_t::NODE_FINALLY,
    1299             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1300             :         nullptr,
    1301             :     },
    1302             :     {}
    1303             : };
    1304             : 
    1305             : result_t const g_result_keyword_float[] =
    1306             : {
    1307             :     {
    1308             :         as2js::node_t::NODE_FLOAT,
    1309             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1310             :         nullptr,
    1311             :     },
    1312             :     {}
    1313             : };
    1314             : 
    1315             : result_t const g_result_keyword_for[] =
    1316             : {
    1317             :     {
    1318             :         as2js::node_t::NODE_FOR,
    1319             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1320             :         nullptr,
    1321             :     },
    1322             :     {}
    1323             : };
    1324             : 
    1325             : result_t const g_result_keyword_function[] =
    1326             : {
    1327             :     {
    1328             :         as2js::node_t::NODE_FUNCTION,
    1329             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1330             :         nullptr,
    1331             :     },
    1332             :     {}
    1333             : };
    1334             : 
    1335             : result_t const g_result_keyword_goto[] =
    1336             : {
    1337             :     {
    1338             :         as2js::node_t::NODE_GOTO,
    1339             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1340             :         nullptr,
    1341             :     },
    1342             :     {}
    1343             : };
    1344             : 
    1345             : result_t const g_result_keyword_if[] =
    1346             : {
    1347             :     {
    1348             :         as2js::node_t::NODE_IF,
    1349             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1350             :         nullptr,
    1351             :     },
    1352             :     {}
    1353             : };
    1354             : 
    1355             : result_t const g_result_keyword_implements[] =
    1356             : {
    1357             :     {
    1358             :         as2js::node_t::NODE_IMPLEMENTS,
    1359             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1360             :         nullptr,
    1361             :     },
    1362             :     {}
    1363             : };
    1364             : 
    1365             : result_t const g_result_keyword_import[] =
    1366             : {
    1367             :     {
    1368             :         as2js::node_t::NODE_IMPORT,
    1369             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1370             :         nullptr,
    1371             :     },
    1372             :     {}
    1373             : };
    1374             : 
    1375             : result_t const g_result_keyword_in[] =
    1376             : {
    1377             :     {
    1378             :         as2js::node_t::NODE_IN,
    1379             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1380             :         nullptr,
    1381             :     },
    1382             :     {}
    1383             : };
    1384             : 
    1385             : result_t const g_result_keyword_inline[] =
    1386             : {
    1387             :     {
    1388             :         as2js::node_t::NODE_INLINE,
    1389             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1390             :         nullptr,
    1391             :     },
    1392             :     {}
    1393             : };
    1394             : 
    1395             : result_t const g_result_keyword_instanceof[] =
    1396             : {
    1397             :     {
    1398             :         as2js::node_t::NODE_INSTANCEOF,
    1399             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1400             :         nullptr,
    1401             :     },
    1402             :     {}
    1403             : };
    1404             : 
    1405             : result_t const g_result_keyword_interface[] =
    1406             : {
    1407             :     {
    1408             :         as2js::node_t::NODE_INTERFACE,
    1409             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1410             :         nullptr,
    1411             :     },
    1412             :     {}
    1413             : };
    1414             : 
    1415             : result_t const g_result_keyword_invariant[] =
    1416             : {
    1417             :     {
    1418             :         as2js::node_t::NODE_INVARIANT,
    1419             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1420             :         nullptr,
    1421             :     },
    1422             :     {}
    1423             : };
    1424             : 
    1425             : result_t const g_result_keyword_is[] =
    1426             : {
    1427             :     {
    1428             :         as2js::node_t::NODE_IS,
    1429             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1430             :         nullptr,
    1431             :     },
    1432             :     {}
    1433             : };
    1434             : 
    1435             : result_t const g_result_keyword_infinity[] =
    1436             : {
    1437             :     {
    1438             :         as2js::node_t::NODE_FLOATING_POINT,
    1439             :         CHECK_VALUE_FLOATING_POINT, 0, std::numeric_limits<double>::infinity(), "", false,
    1440             :         nullptr,
    1441             :     },
    1442             :     {}
    1443             : };
    1444             : 
    1445             : result_t const g_result_keyword_long[] =
    1446             : {
    1447             :     {
    1448             :         as2js::node_t::NODE_LONG,
    1449             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1450             :         nullptr,
    1451             :     },
    1452             :     {}
    1453             : };
    1454             : 
    1455             : result_t const g_result_keyword_namespace[] =
    1456             : {
    1457             :     {
    1458             :         as2js::node_t::NODE_NAMESPACE,
    1459             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1460             :         nullptr,
    1461             :     },
    1462             :     {}
    1463             : };
    1464             : 
    1465             : result_t const g_result_keyword_new[] =
    1466             : {
    1467             :     {
    1468             :         as2js::node_t::NODE_NEW,
    1469             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1470             :         nullptr,
    1471             :     },
    1472             :     {}
    1473             : };
    1474             : 
    1475             : result_t const g_result_keyword_null[] =
    1476             : {
    1477             :     {
    1478             :         as2js::node_t::NODE_NULL,
    1479             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1480             :         nullptr,
    1481             :     },
    1482             :     {}
    1483             : };
    1484             : 
    1485             : result_t const g_result_keyword_nan[] =
    1486             : {
    1487             :     {
    1488             :         as2js::node_t::NODE_FLOATING_POINT,
    1489             :         CHECK_VALUE_FLOATING_POINT, 0, std::numeric_limits<double>::quiet_NaN(), "", false,
    1490             :         nullptr,
    1491             :     },
    1492             :     {}
    1493             : };
    1494             : 
    1495             : result_t const g_result_keyword_native[] =
    1496             : {
    1497             :     {
    1498             :         as2js::node_t::NODE_NATIVE,
    1499             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1500             :         nullptr,
    1501             :     },
    1502             :     {}
    1503             : };
    1504             : 
    1505             : result_t const g_result_keyword_package[] =
    1506             : {
    1507             :     {
    1508             :         as2js::node_t::NODE_PACKAGE,
    1509             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    1510             :         nullptr,
    1511             :     },
    1512             :     {}
    1513             : };
    1514             : 
    1515             : result_t const g_result_keyword_private[] =
    1516             : {
    1517             :     {
    1518             :         as2js::node_t::NODE_PRIVATE,
    1519             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1520             :         nullptr,
    1521             :     },
    1522             :     {}
    1523             : };
    1524             : 
    1525             : result_t const g_result_keyword_protected[] =
    1526             : {
    1527             :     {
    1528             :         as2js::node_t::NODE_PROTECTED,
    1529             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1530             :         nullptr,
    1531             :     },
    1532             :     {},
    1533             : };
    1534             : 
    1535             : result_t const g_result_keyword_public[] =
    1536             : {
    1537             :     {
    1538             :         as2js::node_t::NODE_PUBLIC,
    1539             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1540             :         nullptr,
    1541             :     },
    1542             :     {}
    1543             : };
    1544             : 
    1545             : result_t const g_result_keyword_require[] =
    1546             : {
    1547             :     {
    1548             :         as2js::node_t::NODE_REQUIRE,
    1549             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1550             :         nullptr,
    1551             :     },
    1552             :     {}
    1553             : };
    1554             : 
    1555             : result_t const g_result_keyword_return[] =
    1556             : {
    1557             :     {
    1558             :         as2js::node_t::NODE_RETURN,
    1559             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1560             :         nullptr,
    1561             :     },
    1562             :     {}
    1563             : };
    1564             : 
    1565             : result_t const g_result_keyword_short[] =
    1566             : {
    1567             :     {
    1568             :         as2js::node_t::NODE_SHORT,
    1569             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1570             :         nullptr,
    1571             :     },
    1572             :     {}
    1573             : };
    1574             : 
    1575             : result_t const g_result_keyword_static[] =
    1576             : {
    1577             :     {
    1578             :         as2js::node_t::NODE_STATIC,
    1579             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1580             :         nullptr,
    1581             :     },
    1582             :     {}
    1583             : };
    1584             : 
    1585             : result_t const g_result_keyword_super[] =
    1586             : {
    1587             :     {
    1588             :         as2js::node_t::NODE_SUPER,
    1589             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1590             :         nullptr,
    1591             :     },
    1592             :     {}
    1593             : };
    1594             : 
    1595             : result_t const g_result_keyword_switch[] =
    1596             : {
    1597             :     {
    1598             :         as2js::node_t::NODE_SWITCH,
    1599             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1600             :         nullptr,
    1601             :     },
    1602             :     {}
    1603             : };
    1604             : 
    1605             : result_t const g_result_keyword_synchronized[] =
    1606             : {
    1607             :     {
    1608             :         as2js::node_t::NODE_SYNCHRONIZED,
    1609             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1610             :         nullptr,
    1611             :     },
    1612             :     {}
    1613             : };
    1614             : 
    1615             : result_t const g_result_keyword_then[] =
    1616             : {
    1617             :     {
    1618             :         as2js::node_t::NODE_THEN,
    1619             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1620             :         nullptr,
    1621             :     },
    1622             :     {}
    1623             : };
    1624             : 
    1625             : result_t const g_result_keyword_this[] =
    1626             : {
    1627             :     {
    1628             :         as2js::node_t::NODE_THIS,
    1629             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1630             :         nullptr,
    1631             :     },
    1632             :     {}
    1633             : };
    1634             : 
    1635             : result_t const g_result_keyword_throw[] =
    1636             : {
    1637             :     {
    1638             :         as2js::node_t::NODE_THROW,
    1639             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1640             :         nullptr,
    1641             :     },
    1642             :     {}
    1643             : };
    1644             : 
    1645             : result_t const g_result_keyword_throws[] =
    1646             : {
    1647             :     {
    1648             :         as2js::node_t::NODE_THROWS,
    1649             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1650             :         nullptr,
    1651             :     },
    1652             :     {}
    1653             : };
    1654             : 
    1655             : result_t const g_result_keyword_transient[] =
    1656             : {
    1657             :     {
    1658             :         as2js::node_t::NODE_TRANSIENT,
    1659             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    1660             :         nullptr,
    1661             :     },
    1662             :     {}
    1663             : };
    1664             : 
    1665             : result_t const g_result_keyword_true[] =
    1666             : {
    1667             :     {
    1668             :         as2js::node_t::NODE_TRUE,
    1669             :         CHECK_VALUE_BOOLEAN, 0, 0.0, "", true,
    1670             :         nullptr,
    1671             :     },
    1672             :     {}
    1673             : };
    1674             : 
    1675             : result_t const g_result_keyword_try[] =
    1676             : {
    1677             :     {
    1678             :         as2js::node_t::NODE_TRY,
    1679             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1680             :         nullptr,
    1681             :     },
    1682             :     {}
    1683             : };
    1684             : 
    1685             : result_t const g_result_keyword_typeof[] =
    1686             : {
    1687             :     {
    1688             :         as2js::node_t::NODE_TYPEOF,
    1689             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1690             :         nullptr,
    1691             :     },
    1692             :     {}
    1693             : };
    1694             : 
    1695             : result_t const g_result_keyword_undefined[] =
    1696             : {
    1697             :     {
    1698             :         as2js::node_t::NODE_UNDEFINED,
    1699             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1700             :         nullptr,
    1701             :     },
    1702             :     {}
    1703             : };
    1704             : 
    1705             : result_t const g_result_keyword_use[] =
    1706             : {
    1707             :     {
    1708             :         as2js::node_t::NODE_USE,
    1709             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1710             :         nullptr,
    1711             :     },
    1712             :     {}
    1713             : };
    1714             : 
    1715             : result_t const g_result_keyword_var[] =
    1716             : {
    1717             :     {
    1718             :         as2js::node_t::NODE_VAR,
    1719             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1720             :         nullptr,
    1721             :     },
    1722             :     {}
    1723             : };
    1724             : 
    1725             : result_t const g_result_keyword_void[] =
    1726             : {
    1727             :     {
    1728             :         as2js::node_t::NODE_VOID,
    1729             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1730             :         nullptr,
    1731             :     },
    1732             :     {}
    1733             : };
    1734             : 
    1735             : result_t const g_result_keyword_volatile[] =
    1736             : {
    1737             :     {
    1738             :         as2js::node_t::NODE_VOLATILE,
    1739             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1740             :         nullptr,
    1741             :     },
    1742             :     {}
    1743             : };
    1744             : 
    1745             : result_t const g_result_keyword_while[] =
    1746             : {
    1747             :     {
    1748             :         as2js::node_t::NODE_WHILE,
    1749             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1750             :         nullptr,
    1751             :     },
    1752             :     {}
    1753             : };
    1754             : 
    1755             : result_t const g_result_keyword_with[] =
    1756             : {
    1757             :     {
    1758             :         as2js::node_t::NODE_WITH,
    1759             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1760             :         nullptr,
    1761             :     },
    1762             :     {}
    1763             : };
    1764             : 
    1765             : result_t const g_result_keyword_yield[] =
    1766             : {
    1767             :     {
    1768             :         as2js::node_t::NODE_YIELD,
    1769             :         CHECK_VALUE_IGNORE, 0, 0.0, "", true,
    1770             :         nullptr,
    1771             :     },
    1772             :     {}
    1773             : };
    1774             : 
    1775             : result_t const g_result_keyword_file[] =
    1776             : {
    1777             :     {
    1778             :         // we use a StringInput which filename is set to "-"
    1779             :         as2js::node_t::NODE_STRING,
    1780             :         CHECK_VALUE_STRING, 0, 0.0, "", true,
    1781             :         nullptr,
    1782             :     },
    1783             :     {}
    1784             : };
    1785             : 
    1786             : result_t const g_result_keyword_line[] =
    1787             : {
    1788             :     {
    1789             :         as2js::node_t::NODE_INTEGER,
    1790             :         CHECK_VALUE_INTEGER, 1, 0.0, "", true,
    1791             :         nullptr,
    1792             :     },
    1793             :     {}
    1794             : };
    1795             : 
    1796             : token_t const g_tokens[] =
    1797             : {
    1798             :     /******************
    1799             :      * LITERALS       *
    1800             :      ******************/
    1801             :     {
    1802             :         "\"Test a String\"",
    1803             :         g_result_test_a_string,
    1804             :     },
    1805             :     {
    1806             :         "'Test a String'",
    1807             :         g_result_test_a_string,
    1808             :     },
    1809             :     {
    1810             :         "\"Escaped characters: Backspace \\b, Escape \\e, Formfeed \\f, Newline \\n, Carriage Return \\r, Horizontal Tab \\t, Vertical Tab \\v, Double Quote \\\", Single Quote \\', Template Quote \\`, Backslash \\\\\"",
    1811             :         g_result_escaped_characters,
    1812             :         "error:unknown-file:1:45:: unknown escape letter \"e\"",
    1813             :     },
    1814             :     {
    1815             :         "\"\"", // empty string
    1816             :         g_result_empty_string
    1817             :     },
    1818             :     {
    1819             :         "''", // empty string
    1820             :         g_result_empty_string
    1821             :     },
    1822             :     {
    1823             :         "`template`", // template
    1824             :         g_result_template
    1825             :     },
    1826             :     {
    1827             :         "/regex/abc", // normal JavaScript "ugly" regex
    1828             :         g_result_regex
    1829             :     },
    1830             :     {
    1831             :         "1234",
    1832             :         g_result_integer_1234
    1833             :     },
    1834             :     {
    1835             :         "1234n",
    1836             :         g_result_integer_1234
    1837             :     },
    1838             :     {
    1839             :         "0x4D2",
    1840             :         g_result_integer_1234
    1841             :     },
    1842             :     {
    1843             :         "0x4D2n",
    1844             :         g_result_integer_1234
    1845             :     },
    1846             :     {
    1847             :         "0X4D2",
    1848             :         g_result_integer_1234
    1849             :     },
    1850             :     {
    1851             :         "0X00004d2",
    1852             :         g_result_integer_1234
    1853             :     },
    1854             :     {
    1855             :         "0X00004d2n",
    1856             :         g_result_integer_1234
    1857             :     },
    1858             :     {
    1859             :         "0b10011010010",
    1860             :         g_result_integer_binary_1234
    1861             :     },
    1862             :     {
    1863             :         "0b10011010010n",
    1864             :         g_result_integer_binary_1234
    1865             :     },
    1866             :     {
    1867             :         "0b00010011010010",
    1868             :         g_result_integer_binary_1234
    1869             :     },
    1870             :     {
    1871             :         "0317",
    1872             :         g_result_integer_legacy_octal_207
    1873             :     },
    1874             :     {
    1875             :         "0317n",
    1876             :         g_result_integer_legacy_octal_207
    1877             :     },
    1878             :     {
    1879             :         "0o317",
    1880             :         g_result_integer_octal_207
    1881             :     },
    1882             :     {
    1883             :         "0o317n",
    1884             :         g_result_integer_octal_207
    1885             :     },
    1886             :     {
    1887             :         "0O317",
    1888             :         g_result_integer_octal_207
    1889             :     },
    1890             :     {
    1891             :         "0O317n",
    1892             :         g_result_integer_octal_207
    1893             :     },
    1894             :     {
    1895             :         "1.234",
    1896             :         g_result_float64_1_234
    1897             :     },
    1898             :     {
    1899             :         "314159.0e-5",
    1900             :         g_result_float64_3_14159
    1901             :     },
    1902             :     {
    1903             :         ".0000314159e+5",
    1904             :         g_result_float64_3_14159
    1905             :     },
    1906             :     {
    1907             :         "0.00314159e3",
    1908             :         g_result_float64_3_14159
    1909             :     },
    1910             :     {
    1911             :         "3141.59e-3",
    1912             :         g_result_float64_3_14159
    1913             :     },
    1914             :     {
    1915             :         ".33",
    1916             :         g_result_float64__33
    1917             :     },
    1918             :     {
    1919             :         "33e4",
    1920             :         g_result_float64__330000
    1921             :     },
    1922             :     {
    1923             :         "33e+4",
    1924             :         g_result_float64__330000
    1925             :     },
    1926             :     {
    1927             :         "330000000e-3",
    1928             :         g_result_float64__330000
    1929             :     },
    1930             :     {
    1931             :         "33.e4",
    1932             :         g_result_float64__330000
    1933             :     },
    1934             :     {
    1935             :         "33.e+4",
    1936             :         g_result_float64__330000
    1937             :     },
    1938             :     {
    1939             :         "330000000.e-3",
    1940             :         g_result_float64__330000
    1941             :     },
    1942             :     {
    1943             :         "\xE2\x88\x9E", // 0x221E -- INFINITY
    1944             :         g_result_keyword_infinity
    1945             :     },
    1946             :     {
    1947             :         "\xEF\xBF\xBD", // 0xFFFD -- REPLACEMENT CHARACTER
    1948             :         g_result_keyword_nan
    1949             :     },
    1950             : 
    1951             :     /******************
    1952             :      * OPERATORS      *
    1953             :      ******************/
    1954             :     {
    1955             :         "+",
    1956             :         g_result_add
    1957             :     },
    1958             :     {
    1959             :         "&",
    1960             :         g_result_bitwise_and
    1961             :     },
    1962             :     {
    1963             :         "~",
    1964             :         g_result_bitwise_not
    1965             :     },
    1966             :     {
    1967             :         "=",
    1968             :         g_result_assignment
    1969             :     },
    1970             :     {
    1971             :         "|",
    1972             :         g_result_bitwise_or
    1973             :     },
    1974             :     {
    1975             :         "^",
    1976             :         g_result_bitwise_xor
    1977             :     },
    1978             :     {
    1979             :         "}",
    1980             :         g_result_close_curvly_bracket
    1981             :     },
    1982             :     {
    1983             :         ")",
    1984             :         g_result_close_parenthesis
    1985             :     },
    1986             :     {
    1987             :         "]",
    1988             :         g_result_close_square_bracket
    1989             :     },
    1990             :     {
    1991             :         ":",
    1992             :         g_result_colon
    1993             :     },
    1994             :     {
    1995             :         ",",
    1996             :         g_result_comma
    1997             :     },
    1998             :     {
    1999             :         "?",
    2000             :         g_result_conditional
    2001             :     },
    2002             :     {
    2003             :         "/",
    2004             :         g_result_divide
    2005             :     },
    2006             :     {
    2007             :         ">",
    2008             :         g_result_greater
    2009             :     },
    2010             :     {
    2011             :         "<",
    2012             :         g_result_less
    2013             :     },
    2014             :     {
    2015             :         "!",
    2016             :         g_result_logical_not
    2017             :     },
    2018             :     {
    2019             :         "%",
    2020             :         g_result_modulo
    2021             :     },
    2022             :     {
    2023             :         "*",
    2024             :         g_result_multiply
    2025             :     },
    2026             :     {
    2027             :         "{",
    2028             :         g_result_open_curvly_bracket
    2029             :     },
    2030             :     {
    2031             :         "(",
    2032             :         g_result_open_parenthesis
    2033             :     },
    2034             :     {
    2035             :         "[",
    2036             :         g_result_open_square_bracket
    2037             :     },
    2038             :     {
    2039             :         ".",
    2040             :         g_result_member
    2041             :     },
    2042             :     {
    2043             :         ";",
    2044             :         g_result_semicolon
    2045             :     },
    2046             :     {
    2047             :         "-",
    2048             :         g_result_subtract
    2049             :     },
    2050             :     {
    2051             :         "<<",
    2052             :         g_result_shift_left
    2053             :     },
    2054             :     {
    2055             :         "<<=",
    2056             :         g_result_assignment_shift_left
    2057             :     },
    2058             :     {
    2059             :         "<=",
    2060             :         g_result_less_equal
    2061             :     },
    2062             :     {
    2063             :         "<>",
    2064             :         g_result_extended_not_equal,
    2065             :         "error:unknown-file:1:3:: the \"<>\" operator is only available when extended operators are authorized (use extended_operators;)."
    2066             :     },
    2067             :     {
    2068             :         "<?",
    2069             :         g_result_minimum
    2070             :     },
    2071             :     {
    2072             :         "<?=",
    2073             :         g_result_assignment_minimum
    2074             :     },
    2075             :     {
    2076             :         "<%",
    2077             :         g_result_rotate_left
    2078             :     },
    2079             :     {
    2080             :         "<%=",
    2081             :         g_result_assignment_rotate_left
    2082             :     },
    2083             :     {
    2084             :         ">>",
    2085             :         g_result_shift_right
    2086             :     },
    2087             :     {
    2088             :         ">>>",
    2089             :         g_result_unsigned_shift_right
    2090             :     },
    2091             :     {
    2092             :         ">>=",
    2093             :         g_result_assignment_shift_right
    2094             :     },
    2095             :     {
    2096             :         ">>>=",
    2097             :         g_result_assignment_unsigned_shift_right
    2098             :     },
    2099             :     {
    2100             :         "<=>",
    2101             :         g_result_compare
    2102             :     },
    2103             :     {
    2104             :         ">=",
    2105             :         g_result_greater_equal
    2106             :     },
    2107             :     {
    2108             :         ">?",
    2109             :         g_result_maximum
    2110             :     },
    2111             :     {
    2112             :         ">?=",
    2113             :         g_result_assignment_maximum
    2114             :     },
    2115             :     {
    2116             :         ">%",
    2117             :         g_result_rotate_right
    2118             :     },
    2119             :     {
    2120             :         ">%=",
    2121             :         g_result_assignment_rotate_right
    2122             :     },
    2123             :     {
    2124             :         "!=",
    2125             :         g_result_not_equal
    2126             :     },
    2127             :     {
    2128             :         "!==",
    2129             :         g_result_strictly_not_equal,
    2130             :     },
    2131             :     {
    2132             :         "==",
    2133             :         g_result_equal,
    2134             :     },
    2135             :     {
    2136             :         "===",
    2137             :         g_result_strictly_equal,
    2138             :     },
    2139             :     {
    2140             :         ":=",
    2141             :         g_result_extended_assignment,
    2142             :         "error:unknown-file:1:3:: the \":=\" operator is only available when extended operators are authorized (use extended_operators;).",
    2143             :     },
    2144             :     {
    2145             :         "::",
    2146             :         g_result_scope,
    2147             :     },
    2148             :     {
    2149             :         "~=",
    2150             :         g_result_match,
    2151             :     },
    2152             :     {
    2153             :         "~!",
    2154             :         g_result_not_match
    2155             :     },
    2156             :     {
    2157             :         "~~",
    2158             :         g_result_smart_match
    2159             :     },
    2160             :     {
    2161             :         "+=",
    2162             :         g_result_assignment_add
    2163             :     },
    2164             :     {
    2165             :         "++",
    2166             :         g_result_increment
    2167             :     },
    2168             :     {
    2169             :         "-=",
    2170             :         g_result_assignment_subtract
    2171             :     },
    2172             :     {
    2173             :         "--",
    2174             :         g_result_decrement
    2175             :     },
    2176             :     {
    2177             :         "*=",
    2178             :         g_result_assignment_multiply
    2179             :     },
    2180             :     {
    2181             :         "**",
    2182             :         g_result_power
    2183             :     },
    2184             :     {
    2185             :         "**=",
    2186             :         g_result_assignment_power
    2187             :     },
    2188             :     {
    2189             :         "/=",
    2190             :         g_result_assignment_divide
    2191             :     },
    2192             :     {
    2193             :         "%=",
    2194             :         g_result_assignment_modulo
    2195             :     },
    2196             :     {
    2197             :         "&=",
    2198             :         g_result_assignment_bitwise_and
    2199             :     },
    2200             :     {
    2201             :         "&&",
    2202             :         g_result_logical_and
    2203             :     },
    2204             :     {
    2205             :         "&&=",
    2206             :         g_result_assignment_logical_and
    2207             :     },
    2208             :     {
    2209             :         "^=",
    2210             :         g_result_assignment_bitwise_xor
    2211             :     },
    2212             :     {
    2213             :         "^^",
    2214             :         g_result_logical_xor
    2215             :     },
    2216             :     {
    2217             :         "^^=",
    2218             :         g_result_assignment_logical_xor
    2219             :     },
    2220             :     {
    2221             :         "|=",
    2222             :         g_result_assignment_bitwise_or
    2223             :     },
    2224             :     {
    2225             :         "||",
    2226             :         g_result_logical_or
    2227             :     },
    2228             :     {
    2229             :         "||=",
    2230             :         g_result_assignment_logical_or
    2231             :     },
    2232             :     {
    2233             :         "..",
    2234             :         g_result_range
    2235             :     },
    2236             :     {
    2237             :         "...",
    2238             :         g_result_rest
    2239             :     },
    2240             : 
    2241             :     /**************************
    2242             :      * IDENTIFIERS / KEYWORDS *
    2243             :      **************************/
    2244             :     {
    2245             :         "Test_An_Identifier",
    2246             :         g_result_identifier_test_an_identifier
    2247             :     },
    2248             :     {
    2249             :         "abstract",
    2250             :         g_result_keyword_abstract
    2251             :     },
    2252             :     {
    2253             :         "as",
    2254             :         g_result_keyword_as
    2255             :     },
    2256             :     {
    2257             :         "boolean",
    2258             :         g_result_keyword_boolean
    2259             :     },
    2260             :     {
    2261             :         "break",
    2262             :         g_result_keyword_break
    2263             :     },
    2264             :     {
    2265             :         "byte",
    2266             :         g_result_keyword_byte
    2267             :     },
    2268             :     {
    2269             :         "case",
    2270             :         g_result_keyword_case
    2271             :     },
    2272             :     {
    2273             :         "catch",
    2274             :         g_result_keyword_catch
    2275             :     },
    2276             :     {
    2277             :         "char",
    2278             :         g_result_keyword_char
    2279             :     },
    2280             :     {
    2281             :         "class",
    2282             :         g_result_keyword_class
    2283             :     },
    2284             :     {
    2285             :         "const",
    2286             :         g_result_keyword_const
    2287             :     },
    2288             :     {
    2289             :         "continue",
    2290             :         g_result_keyword_continue
    2291             :     },
    2292             :     {
    2293             :         "debugger",
    2294             :         g_result_keyword_debugger
    2295             :     },
    2296             :     {
    2297             :         "default",
    2298             :         g_result_keyword_default
    2299             :     },
    2300             :     {
    2301             :         "delete",
    2302             :         g_result_keyword_delete
    2303             :     },
    2304             :     {
    2305             :         "do",
    2306             :         g_result_keyword_do
    2307             :     },
    2308             :     {
    2309             :         "double",
    2310             :         g_result_keyword_double
    2311             :     },
    2312             :     {
    2313             :         "else",
    2314             :         g_result_keyword_else
    2315             :     },
    2316             :     {
    2317             :         "ensure",
    2318             :         g_result_keyword_ensure
    2319             :     },
    2320             :     {
    2321             :         "enum",
    2322             :         g_result_keyword_enum
    2323             :     },
    2324             :     {
    2325             :         "export",
    2326             :         g_result_keyword_export
    2327             :     },
    2328             :     {
    2329             :         "extends",
    2330             :         g_result_keyword_extends
    2331             :     },
    2332             :     {
    2333             :         "extern",
    2334             :         g_result_keyword_extern
    2335             :     },
    2336             :     {
    2337             :         "false",
    2338             :         g_result_keyword_false
    2339             :     },
    2340             :     {
    2341             :         "final",
    2342             :         g_result_keyword_final
    2343             :     },
    2344             :     {
    2345             :         "finally",
    2346             :         g_result_keyword_finally
    2347             :     },
    2348             :     {
    2349             :         "float",
    2350             :         g_result_keyword_float
    2351             :     },
    2352             :     {
    2353             :         "for",
    2354             :         g_result_keyword_for
    2355             :     },
    2356             :     {
    2357             :         "function",
    2358             :         g_result_keyword_function
    2359             :     },
    2360             :     {
    2361             :         "goto",
    2362             :         g_result_keyword_goto
    2363             :     },
    2364             :     {
    2365             :         "if",
    2366             :         g_result_keyword_if
    2367             :     },
    2368             :     {
    2369             :         "implements",
    2370             :         g_result_keyword_implements
    2371             :     },
    2372             :     {
    2373             :         "import",
    2374             :         g_result_keyword_import
    2375             :     },
    2376             :     {
    2377             :         "in",
    2378             :         g_result_keyword_in
    2379             :     },
    2380             :     {
    2381             :         "inline",
    2382             :         g_result_keyword_inline
    2383             :     },
    2384             :     {
    2385             :         "instanceof",
    2386             :         g_result_keyword_instanceof
    2387             :     },
    2388             :     {
    2389             :         "interface",
    2390             :         g_result_keyword_interface
    2391             :     },
    2392             :     {
    2393             :         "invariant",
    2394             :         g_result_keyword_invariant
    2395             :     },
    2396             :     {
    2397             :         "is",
    2398             :         g_result_keyword_is
    2399             :     },
    2400             :     {
    2401             :         "Infinity",
    2402             :         g_result_keyword_infinity
    2403             :     },
    2404             :     {
    2405             :         "long",
    2406             :         g_result_keyword_long
    2407             :     },
    2408             :     {
    2409             :         "namespace",
    2410             :         g_result_keyword_namespace
    2411             :     },
    2412             :     {
    2413             :         "NaN",
    2414             :         g_result_keyword_nan
    2415             :     },
    2416             :     {
    2417             :         "native",
    2418             :         g_result_keyword_native
    2419             :     },
    2420             :     {
    2421             :         "new",
    2422             :         g_result_keyword_new
    2423             :     },
    2424             :     {
    2425             :         "null",
    2426             :         g_result_keyword_null
    2427             :     },
    2428             :     {
    2429             :         "package",
    2430             :         g_result_keyword_package
    2431             :     },
    2432             :     {
    2433             :         "private",
    2434             :         g_result_keyword_private
    2435             :     },
    2436             :     {
    2437             :         "protected",
    2438             :         g_result_keyword_protected
    2439             :     },
    2440             :     {
    2441             :         "public",
    2442             :         g_result_keyword_public
    2443             :     },
    2444             :     {
    2445             :         "require",
    2446             :         g_result_keyword_require
    2447             :     },
    2448             :     {
    2449             :         "return",
    2450             :         g_result_keyword_return
    2451             :     },
    2452             :     {
    2453             :         "short",
    2454             :         g_result_keyword_short
    2455             :     },
    2456             :     {
    2457             :         "static",
    2458             :         g_result_keyword_static
    2459             :     },
    2460             :     {
    2461             :         "super",
    2462             :         g_result_keyword_super
    2463             :     },
    2464             :     {
    2465             :         "switch",
    2466             :         g_result_keyword_switch
    2467             :     },
    2468             :     {
    2469             :         "synchronized",
    2470             :         g_result_keyword_synchronized
    2471             :     },
    2472             :     {
    2473             :         "then",
    2474             :         g_result_keyword_then
    2475             :     },
    2476             :     {
    2477             :         "this",
    2478             :         g_result_keyword_this
    2479             :     },
    2480             :     {
    2481             :         "throw",
    2482             :         g_result_keyword_throw
    2483             :     },
    2484             :     {
    2485             :         "throws",
    2486             :         g_result_keyword_throws
    2487             :     },
    2488             :     {
    2489             :         "transient",
    2490             :         g_result_keyword_transient
    2491             :     },
    2492             :     {
    2493             :         "true",
    2494             :         g_result_keyword_true
    2495             :     },
    2496             :     {
    2497             :         "try",
    2498             :         g_result_keyword_try
    2499             :     },
    2500             :     {
    2501             :         "typeof",
    2502             :         g_result_keyword_typeof
    2503             :     },
    2504             :     {
    2505             :         "undefined",
    2506             :         g_result_keyword_undefined
    2507             :     },
    2508             :     {
    2509             :         "use",
    2510             :         g_result_keyword_use
    2511             :     },
    2512             :     {
    2513             :         "var",
    2514             :         g_result_keyword_var
    2515             :     },
    2516             :     {
    2517             :         "void",
    2518             :         g_result_keyword_void
    2519             :     },
    2520             :     {
    2521             :         "volatile",
    2522             :         g_result_keyword_volatile
    2523             :     },
    2524             :     {
    2525             :         "while",
    2526             :         g_result_keyword_while
    2527             :     },
    2528             :     {
    2529             :         "with",
    2530             :         g_result_keyword_with
    2531             :     },
    2532             :     {
    2533             :         "yield",
    2534             :         g_result_keyword_yield
    2535             :     },
    2536             :     {
    2537             :         "__FILE__",
    2538             :         g_result_keyword_file
    2539             :     },
    2540             :     {
    2541             :         "__LINE__",
    2542             :         g_result_keyword_line
    2543             :     },
    2544             : };
    2545             : std::size_t const g_tokens_size(sizeof(g_tokens) / sizeof(g_tokens[0]));
    2546             : 
    2547             : as2js::option_t g_options[] =
    2548             : {
    2549             :     as2js::option_t::OPTION_ALLOW_WITH,
    2550             :     as2js::option_t::OPTION_COVERAGE,
    2551             :     as2js::option_t::OPTION_DEBUG,
    2552             :     as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES,
    2553             :     as2js::option_t::OPTION_EXTENDED_OPERATORS,
    2554             :     as2js::option_t::OPTION_EXTENDED_STATEMENTS,
    2555             :     as2js::option_t::OPTION_JSON,
    2556             :     as2js::option_t::OPTION_OCTAL,
    2557             :     as2js::option_t::OPTION_STRICT,
    2558             :     as2js::option_t::OPTION_TRACE,
    2559             :     as2js::option_t::OPTION_UNSAFE_MATH
    2560             : };
    2561             : std::size_t const g_options_size(sizeof(g_options) / sizeof(g_options[0]));
    2562             : 
    2563             : 
    2564         256 : std::string to_octal_string(std::int32_t v)
    2565             : {
    2566         256 :     std::stringstream s;
    2567         256 :     s << std::oct << v;
    2568         512 :     return s.str();
    2569         256 : }
    2570             : 
    2571             : 
    2572     1175808 : std::string to_hex_string(std::int32_t v, int width)
    2573             : {
    2574     1175808 :     std::stringstream s;
    2575     1175808 :     s << std::setfill('0') << std::setw(width) << std::hex << v;
    2576     2351616 :     return s.str();
    2577     1175808 : }
    2578             : 
    2579             : 
    2580             : 
    2581             : }
    2582             : // no name namespace
    2583             : 
    2584             : 
    2585             : 
    2586             : 
    2587           3 : CATCH_TEST_CASE("lexer_invalid_pointers", "[lexer]")
    2588             : {
    2589           3 :     CATCH_START_SECTION("lexer_invalid_pointers: invalid options")
    2590             :     {
    2591           2 :         std::string str("program");
    2592           1 :         as2js::input_stream<std::stringstream>::pointer_t in(std::make_shared<as2js::input_stream<std::stringstream>>());
    2593           1 :         *in << str;
    2594           6 :         CATCH_REQUIRE_THROWS_MATCHES(
    2595             :               new as2js::lexer(in, nullptr)
    2596             :             , as2js::invalid_data
    2597             :             , Catch::Matchers::ExceptionMessage(
    2598             :                       "as2js_exception: the 'options' pointer cannot be null in the lexer() constructor."));
    2599           1 :     }
    2600           3 :     CATCH_END_SECTION()
    2601             : 
    2602           3 :     CATCH_START_SECTION("lexer_invalid_pointers: invalid input")
    2603             :     {
    2604           1 :         as2js::options::pointer_t options(new as2js::options);
    2605           6 :         CATCH_REQUIRE_THROWS_MATCHES(
    2606             :               new as2js::lexer(nullptr, options)
    2607             :             , as2js::invalid_data
    2608             :             , Catch::Matchers::ExceptionMessage(
    2609             :                       "as2js_exception: the 'input' stream is already in error in the lexer() constructor."));
    2610           1 :     }
    2611           3 :     CATCH_END_SECTION()
    2612             : 
    2613           3 :     CATCH_START_SECTION("lexer_invalid_pointers: invalid options and input")
    2614             :     {
    2615           6 :         CATCH_REQUIRE_THROWS_MATCHES(
    2616             :               new as2js::lexer(nullptr, nullptr)
    2617             :             , as2js::invalid_data
    2618             :             , Catch::Matchers::ExceptionMessage(
    2619             :                       "as2js_exception: the 'input' stream is already in error in the lexer() constructor."));
    2620             :     }
    2621           3 :     CATCH_END_SECTION()
    2622           3 : }
    2623             : 
    2624             : 
    2625             : 
    2626           1 : CATCH_TEST_CASE("lexer_all_options", "[lexer]")
    2627             : {
    2628           1 :     CATCH_START_SECTION("lexer_all_options: verify 100% of the options combos (use --verbose to see dots while processing)")
    2629             :     {
    2630         184 :         for(std::size_t idx(0); idx < g_tokens_size; ++idx)
    2631             :         {
    2632         183 :             if(SNAP_CATCH2_NAMESPACE::g_verbose()
    2633         183 :             && (idx % 5) == 0)
    2634             :             {
    2635           0 :                 std::cout << "." << std::flush;
    2636             :             }
    2637             : 
    2638             :             // this represents 2^(# of options) which right now is 2048
    2639      374967 :             for(std::size_t opt(0); opt < (1 << g_options_size); ++opt)
    2640             :             {
    2641      374784 :                 as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    2642      374784 :                 *input << g_tokens[idx].f_input;
    2643      374784 :                 std::map<as2js::option_t, bool> option_map;
    2644             : 
    2645      374784 :                 as2js::options::pointer_t options(std::make_shared<as2js::options>());
    2646     4497408 :                 for(size_t o(0); o < g_options_size; ++o)
    2647             :                 {
    2648     4122624 :                     as2js::option_t option(g_options[o]);
    2649     4122624 :                     option_map[option] = (opt & (1 << o)) != 0;
    2650     4122624 :                     if(option_map[option])
    2651             :                     {
    2652     2061312 :                         options->set_option(g_options[o], 1);
    2653             :                     }
    2654             :                 }
    2655             : 
    2656             :                 // select the result depending on the options currently selected
    2657             :                 //
    2658     1124352 :                 as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    2659      374784 :                 CATCH_REQUIRE(lexer->get_input() == input);
    2660      374784 :                 lexer_test_callback tc;
    2661      374784 :                 tc.f_working_on = g_tokens[idx].f_input;
    2662      374784 :                 if(g_tokens[idx].f_expected_message != nullptr)
    2663             :                 {
    2664        6144 :                     tc.f_expected_message = g_tokens[idx].f_expected_message;
    2665             :                 }
    2666             : //std::cerr << "--- testing with [" << g_tokens[idx].f_input << "]\n";
    2667      374784 :                 as2js::node::pointer_t token(lexer->get_next_token(true));
    2668      374784 :                 for(result_t const *results(g_tokens[idx].f_results);; ++results)
    2669             :                 {
    2670             :                     // if this assert fails then the test data has a problem
    2671             :                     // (i.e. no entry matched.)
    2672             :                     //
    2673      377856 :                     CATCH_REQUIRE(results->f_token != as2js::node_t::NODE_UNKNOWN);
    2674             : 
    2675      377856 :                     bool found(true);
    2676             : 
    2677             :                     // a nullptr means we match
    2678             :                     //
    2679      377856 :                     if(results->f_options != nullptr)
    2680             :                     {
    2681        9216 :                         for(option_t const *required_options(results->f_options);
    2682        9216 :                                             required_options->f_option != as2js::option_t::OPTION_max;
    2683             :                                             ++required_options)
    2684             :                         {
    2685        6144 :                             if(!option_map[required_options->f_option])
    2686             :                             {
    2687             :                                 // flag was not set so that result is not a
    2688             :                                 // match; ignore
    2689             :                                 //
    2690        3072 :                                 found = false;
    2691        3072 :                                 break;
    2692             :                             }
    2693             :                         }
    2694             :                     }
    2695      377856 :                     if(found)
    2696             :                     {
    2697             : //std::cerr << "\n" << opt << " @ Working on " << *token << " -> from input: ["
    2698             : //                << g_tokens[idx].f_input << "]\n";;
    2699             : 
    2700             :                         // got a match of all the special options or the entry
    2701             :                         // with a nullptr was reached, use this entry to test
    2702             :                         // the result validity
    2703      374784 :                         CATCH_REQUIRE(token->get_type() == results->f_token);
    2704             : 
    2705             :                         // no children
    2706      374784 :                         CATCH_REQUIRE(token->get_children_size() == 0);
    2707             : 
    2708             :                         // no links
    2709      374784 :                         CATCH_REQUIRE(!token->get_instance());
    2710      374784 :                         CATCH_REQUIRE(!token->get_type_node());
    2711      374784 :                         CATCH_REQUIRE(!token->get_attribute_node());
    2712      374784 :                         CATCH_REQUIRE(!token->get_goto_exit());
    2713      374784 :                         CATCH_REQUIRE(!token->get_goto_enter());
    2714             : 
    2715             :                         // no variables
    2716      374784 :                         CATCH_REQUIRE(token->get_variable_size() == 0);
    2717             : 
    2718             :                         // no parent
    2719      374784 :                         CATCH_REQUIRE(!token->get_parent());
    2720             : 
    2721             :                         // no parameters
    2722      374784 :                         CATCH_REQUIRE(token->get_param_size() == 0);
    2723             : 
    2724             :                         // not locked
    2725      374784 :                         CATCH_REQUIRE(!token->is_locked());
    2726             : 
    2727             :                         // default switch operator
    2728      374784 :                         if(token->get_type() == as2js::node_t::NODE_SWITCH)
    2729             :                         {
    2730        2048 :                             CATCH_REQUIRE(token->get_switch_operator() == as2js::node_t::NODE_UNKNOWN);
    2731             :                         }
    2732             : 
    2733             :                         // no flags
    2734             :                         // TODO: we need to know whether the flag is supported by the current node type
    2735             :                         //for(as2js::node::flag_t flag(as2js::node::flag_t::NODE_CATCH_FLAG_TYPED);
    2736             :                         //           flag < as2js::node::flag_t::NODE_FLAG_max;
    2737             :                         //           flag = static_cast<as2js::node::flag_t>(static_cast<int>(flag) + 1))
    2738             :                         //{
    2739             :                         //    CATCH_REQUIRE(!token->get_flag(flag));
    2740             :                         //}
    2741             : 
    2742             :                         // no attributes
    2743      374784 :                         if(token->get_type() != as2js::node_t::NODE_PROGRAM)
    2744             :                         {
    2745      374784 :                             for(as2js::attribute_t attr(as2js::attribute_t::NODE_ATTR_PUBLIC);
    2746    11243520 :                                             attr < as2js::attribute_t::NODE_ATTR_max;
    2747    10868736 :                                             attr = static_cast<as2js::attribute_t>(static_cast<int>(attr) + 1))
    2748             :                             {
    2749    10868736 :                                 switch(attr)
    2750             :                                 {
    2751      374784 :                                 case as2js::attribute_t::NODE_ATTR_TYPE:
    2752      374784 :                                     switch(token->get_type())
    2753             :                                     {
    2754      235520 :                                     case as2js::node_t::NODE_ADD:
    2755             :                                     case as2js::node_t::NODE_ARRAY:
    2756             :                                     case as2js::node_t::NODE_ARRAY_LITERAL:
    2757             :                                     case as2js::node_t::NODE_AS:
    2758             :                                     case as2js::node_t::NODE_ASSIGNMENT:
    2759             :                                     case as2js::node_t::NODE_ASSIGNMENT_ADD:
    2760             :                                     case as2js::node_t::NODE_ASSIGNMENT_BITWISE_AND:
    2761             :                                     case as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR:
    2762             :                                     case as2js::node_t::NODE_ASSIGNMENT_BITWISE_XOR:
    2763             :                                     case as2js::node_t::NODE_ASSIGNMENT_DIVIDE:
    2764             :                                     case as2js::node_t::NODE_ASSIGNMENT_LOGICAL_AND:
    2765             :                                     case as2js::node_t::NODE_ASSIGNMENT_LOGICAL_OR:
    2766             :                                     case as2js::node_t::NODE_ASSIGNMENT_LOGICAL_XOR:
    2767             :                                     case as2js::node_t::NODE_ASSIGNMENT_MAXIMUM:
    2768             :                                     case as2js::node_t::NODE_ASSIGNMENT_MINIMUM:
    2769             :                                     case as2js::node_t::NODE_ASSIGNMENT_MODULO:
    2770             :                                     case as2js::node_t::NODE_ASSIGNMENT_MULTIPLY:
    2771             :                                     case as2js::node_t::NODE_ASSIGNMENT_POWER:
    2772             :                                     case as2js::node_t::NODE_ASSIGNMENT_ROTATE_LEFT:
    2773             :                                     case as2js::node_t::NODE_ASSIGNMENT_ROTATE_RIGHT:
    2774             :                                     case as2js::node_t::NODE_ASSIGNMENT_SHIFT_LEFT:
    2775             :                                     case as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT:
    2776             :                                     case as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT_UNSIGNED:
    2777             :                                     case as2js::node_t::NODE_ASSIGNMENT_SUBTRACT:
    2778             :                                     case as2js::node_t::NODE_BITWISE_AND:
    2779             :                                     case as2js::node_t::NODE_BITWISE_NOT:
    2780             :                                     case as2js::node_t::NODE_BITWISE_OR:
    2781             :                                     case as2js::node_t::NODE_BITWISE_XOR:
    2782             :                                     case as2js::node_t::NODE_CALL:
    2783             :                                     case as2js::node_t::NODE_CONDITIONAL:
    2784             :                                     case as2js::node_t::NODE_DECREMENT:
    2785             :                                     case as2js::node_t::NODE_DELETE:
    2786             :                                     case as2js::node_t::NODE_DIVIDE:
    2787             :                                     case as2js::node_t::NODE_EQUAL:
    2788             :                                     case as2js::node_t::NODE_FALSE:
    2789             :                                     case as2js::node_t::NODE_FLOATING_POINT:
    2790             :                                     case as2js::node_t::NODE_FUNCTION:
    2791             :                                     case as2js::node_t::NODE_GREATER:
    2792             :                                     case as2js::node_t::NODE_GREATER_EQUAL:
    2793             :                                     case as2js::node_t::NODE_IDENTIFIER:
    2794             :                                     case as2js::node_t::NODE_IN:
    2795             :                                     case as2js::node_t::NODE_INCREMENT:
    2796             :                                     case as2js::node_t::NODE_INSTANCEOF:
    2797             :                                     case as2js::node_t::NODE_INTEGER:
    2798             :                                     case as2js::node_t::NODE_IS:
    2799             :                                     case as2js::node_t::NODE_LESS:
    2800             :                                     case as2js::node_t::NODE_LESS_EQUAL:
    2801             :                                     case as2js::node_t::NODE_LIST:
    2802             :                                     case as2js::node_t::NODE_LOGICAL_AND:
    2803             :                                     case as2js::node_t::NODE_LOGICAL_NOT:
    2804             :                                     case as2js::node_t::NODE_LOGICAL_OR:
    2805             :                                     case as2js::node_t::NODE_LOGICAL_XOR:
    2806             :                                     case as2js::node_t::NODE_MATCH:
    2807             :                                     case as2js::node_t::NODE_MAXIMUM:
    2808             :                                     case as2js::node_t::NODE_MEMBER:
    2809             :                                     case as2js::node_t::NODE_MINIMUM:
    2810             :                                     case as2js::node_t::NODE_MODULO:
    2811             :                                     case as2js::node_t::NODE_MULTIPLY:
    2812             :                                     case as2js::node_t::NODE_NAME:
    2813             :                                     case as2js::node_t::NODE_NEW:
    2814             :                                     case as2js::node_t::NODE_NOT_EQUAL:
    2815             :                                     case as2js::node_t::NODE_NULL:
    2816             :                                     case as2js::node_t::NODE_OBJECT_LITERAL:
    2817             :                                     case as2js::node_t::NODE_POST_DECREMENT:
    2818             :                                     case as2js::node_t::NODE_POST_INCREMENT:
    2819             :                                     case as2js::node_t::NODE_POWER:
    2820             :                                     case as2js::node_t::NODE_PRIVATE:
    2821             :                                     case as2js::node_t::NODE_PUBLIC:
    2822             :                                     case as2js::node_t::NODE_RANGE:
    2823             :                                     case as2js::node_t::NODE_ROTATE_LEFT:
    2824             :                                     case as2js::node_t::NODE_ROTATE_RIGHT:
    2825             :                                     case as2js::node_t::NODE_SCOPE:
    2826             :                                     case as2js::node_t::NODE_SHIFT_LEFT:
    2827             :                                     case as2js::node_t::NODE_SHIFT_RIGHT:
    2828             :                                     case as2js::node_t::NODE_SHIFT_RIGHT_UNSIGNED:
    2829             :                                     case as2js::node_t::NODE_STRICTLY_EQUAL:
    2830             :                                     case as2js::node_t::NODE_STRICTLY_NOT_EQUAL:
    2831             :                                     case as2js::node_t::NODE_STRING:
    2832             :                                     case as2js::node_t::NODE_SUBTRACT:
    2833             :                                     case as2js::node_t::NODE_SUPER:
    2834             :                                     case as2js::node_t::NODE_THIS:
    2835             :                                     case as2js::node_t::NODE_TRUE:
    2836             :                                     case as2js::node_t::NODE_TYPEOF:
    2837             :                                     case as2js::node_t::NODE_UNDEFINED:
    2838             :                                     case as2js::node_t::NODE_VIDENTIFIER:
    2839             :                                     case as2js::node_t::NODE_VOID:
    2840      235520 :                                         CATCH_REQUIRE(!token->get_attribute(attr));
    2841      235520 :                                         break;
    2842             : 
    2843      139264 :                                     default:
    2844             :                                         // any other type and you get an exception
    2845      139264 :                                         CATCH_REQUIRE_THROWS_MATCHES(
    2846             :                                               token->get_attribute(attr)
    2847             :                                             , as2js::internal_error
    2848             :                                             , Catch::Matchers::ExceptionMessage(
    2849             :                                                       "internal_error: node \""
    2850             :                                                     + std::string(token->get_type_name())
    2851             :                                                     + "\" does not like attribute \""
    2852             :                                                     + as2js::node::attribute_to_string(attr)
    2853             :                                                     + "\" in node::verify_attribute()."));
    2854             :                                         break;
    2855             : 
    2856             :                                     }
    2857      374784 :                                     break;
    2858             : 
    2859    10493952 :                                 default:
    2860    10493952 :                                     CATCH_REQUIRE(!token->get_attribute(attr));
    2861    10493952 :                                     break;
    2862             : 
    2863             :                                 }
    2864             :                             }
    2865             :                         }
    2866             : 
    2867      374784 :                         if(results->f_check_value == CHECK_VALUE_INTEGER)
    2868             :                         {
    2869             : //std::cerr << "int " << token->get_integer().get() << " vs " << results->f_integer;
    2870       34816 :                             CATCH_REQUIRE(token->get_integer().get() == results->f_integer);
    2871             :                         }
    2872             :                         else
    2873             :                         {
    2874      339968 :                             CATCH_REQUIRE_THROWS_MATCHES(
    2875             :                                   token->get_integer().get()
    2876             :                                 , as2js::internal_error
    2877             :                                 , Catch::Matchers::ExceptionMessage(
    2878             :                                           "internal_error: get_integer() called with a non-integer node type."));
    2879             :                         }
    2880             : 
    2881             : #pragma GCC diagnostic push
    2882             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    2883      374784 :                         if(results->f_check_value == CHECK_VALUE_FLOATING_POINT)
    2884             :                         {
    2885       32768 :                             if(std::isnan(results->f_floating_point))
    2886             :                             {
    2887        4096 :                                 CATCH_REQUIRE(token->get_floating_point().is_nan());
    2888             :                             }
    2889             :                             else
    2890             :                             {
    2891       28672 :                                 CATCH_REQUIRE(token->get_floating_point().get() == results->f_floating_point);
    2892             :                             }
    2893             :                         }
    2894             :                         else
    2895             :                         {
    2896      342016 :                             CATCH_REQUIRE_THROWS_MATCHES(
    2897             :                                   token->get_floating_point().get()
    2898             :                                 , as2js::internal_error
    2899             :                                 , Catch::Matchers::ExceptionMessage(
    2900             :                                           "internal_error: get_floating_point() called with a non-floating point node type."));
    2901             :                         }
    2902             : #pragma GCC diagnostic pop
    2903             : 
    2904      374784 :                         if(results->f_check_value == CHECK_VALUE_STRING)
    2905             :                         {
    2906             : //std::cerr << "  --> [" << token->get_string() << "]\n";
    2907       38912 :                             CATCH_REQUIRE(token->get_string() == results->f_string);
    2908             :                         }
    2909             :                         else
    2910             :                         {
    2911      335872 :                             CATCH_REQUIRE_THROWS_MATCHES(
    2912             :                                   token->get_string()
    2913             :                                 , as2js::internal_error
    2914             :                                 , Catch::Matchers::ExceptionMessage(
    2915             :                                           "internal_error: get_string() called with non-string node type: \""
    2916             :                                         + std::string(token->get_type_name())
    2917             :                                         + "\"."));
    2918             :                         }
    2919             : 
    2920      374784 :                         if(results->f_check_value == CHECK_VALUE_BOOLEAN)
    2921             :                         {
    2922        4096 :                             CATCH_REQUIRE(token->get_boolean() == results->f_boolean);
    2923             :                         }
    2924             :                         else
    2925             :                         {
    2926      370688 :                             CATCH_REQUIRE_THROWS_MATCHES(
    2927             :                                   token->get_boolean()
    2928             :                                 , as2js::internal_error
    2929             :                                 , Catch::Matchers::ExceptionMessage(
    2930             :                                           "internal_error: get_boolean() called with a non-Boolean node type."));
    2931             :                         }
    2932             : 
    2933             :                         // exit the result loop, only one result is
    2934             :                         // expected to match
    2935             :                         //
    2936      374784 :                         break;
    2937             :                     }
    2938        3072 :                 }
    2939      374784 :             }
    2940             :         }
    2941           1 :         if(SNAP_CATCH2_NAMESPACE::g_verbose())
    2942             :         {
    2943           0 :             std::cout << std::endl;
    2944             :         }
    2945             :     }
    2946           1 :     CATCH_END_SECTION()
    2947           1 : }
    2948             : 
    2949             : 
    2950           3 : CATCH_TEST_CASE("lexer_valid_strings", "[lexer]")
    2951             : {
    2952             :     // we have a few things to check in strings:
    2953             :     //
    2954             :     //    quotes are ' or " -- tested in test_tokens()
    2955             :     //
    2956             :     //    characters can be escaped with \, unknown backslashes
    2957             :     //    sequences must generate errors -- known letter sequences tested
    2958             :     //    in test_tokens(); those with errors are tested in the next
    2959             :     //    test below
    2960             :     //
    2961             :     //    strings can be continuated on multiple lines
    2962             :     //
    2963             : 
    2964           3 :     CATCH_START_SECTION("lexer_valid_strings: check quotes with '\\0'")
    2965             :     {
    2966          11 :         for(int idx(0); idx < 10; ++idx)
    2967             :         {
    2968          10 :             std::string str;
    2969          10 :             char quote(rand() & 1 ? '"' : '\'');
    2970          10 :             str += quote;
    2971          10 :             str += '\\';
    2972          10 :             str += '0';
    2973          10 :             str += quote;
    2974          10 :             as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    2975          10 :             *input << str;
    2976          10 :             as2js::options::pointer_t options(new as2js::options);
    2977          30 :             as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    2978          10 :             CATCH_REQUIRE(lexer->get_input() == input);
    2979          10 :             as2js::node::pointer_t token(lexer->get_next_token(true));
    2980             : //std::cerr << "token = " << *token << "\n";
    2981          10 :             CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    2982          10 :             CATCH_REQUIRE(token->get_children_size() == 0);
    2983          10 :             std::string expected;
    2984          10 :             expected += '\0';
    2985          10 :             CATCH_REQUIRE(token->get_string() == expected);
    2986          10 :             token = lexer->get_next_token(true);
    2987          10 :             CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_EOF);
    2988          10 :         }
    2989             :     }
    2990           3 :     CATCH_END_SECTION()
    2991             : 
    2992           3 :     CATCH_START_SECTION("lexer_valid_strings: check all characters (use --verbose to see dots while processing)")
    2993             :     {
    2994             :         // all valid escape sequences, with Octal, Hexa (x), Basic Unicode (u),
    2995             :         // and Extended Unicode (U)
    2996             :         //
    2997     1114113 :         for(char32_t c(0); c < 0x110000; ++c)
    2998             :         {
    2999     1114112 :             if(SNAP_CATCH2_NAMESPACE::g_verbose()
    3000     1114112 :             && c % 50000 == 0)
    3001             :             {
    3002           0 :                 std::cout << "." << std::flush;
    3003             :             }
    3004     1114112 :             if(c >= 0xD800 && c <= 0xDFFF)
    3005             :             {
    3006             :                 // avoid surrogate by themselves
    3007        2048 :                 continue;
    3008             :             }
    3009             : 
    3010     1112064 :             char const quote(rand() & 1 ? '"' : '\'');
    3011     1112064 :             if(c < 0x100)
    3012             :             {
    3013             :                 // for octal we already test with/without the option so no need here
    3014             :                 {
    3015         256 :                     std::string str;
    3016         256 :                     str += "// comment with ";
    3017         256 :                     switch(c)
    3018             :                     {
    3019           2 :                     case '\r':
    3020             :                     case '\n':
    3021             :                     case 0x2028:    // not possible here (c < 0x0100)
    3022             :                     case 0x2029:    // not possible here (c < 0x0100)
    3023           2 :                         str += '?'; // terminators end a comment in this case
    3024           2 :                         break;
    3025             : 
    3026         254 :                     default:
    3027         254 :                         str += c;
    3028         254 :                         break;
    3029             : 
    3030             :                     }
    3031         256 :                     str += " character!";
    3032         256 :                     switch(rand() % 5)
    3033             :                     {
    3034          49 :                     case 0:
    3035          49 :                         str += '\r';
    3036          49 :                         break;
    3037             : 
    3038          52 :                     case 1:
    3039          52 :                         str += '\n';
    3040          52 :                         break;
    3041             : 
    3042          51 :                     case 2:
    3043          51 :                         str += '\r';
    3044          51 :                         str += '\n';
    3045          51 :                         break;
    3046             : 
    3047          51 :                     case 3:
    3048          51 :                         str += static_cast<char32_t>(0x2028);
    3049          51 :                         break;
    3050             : 
    3051          53 :                     case 4:
    3052          53 :                         str += static_cast<char32_t>(0x2029);
    3053          53 :                         break;
    3054             : 
    3055             :                     }
    3056         256 :                     str += quote;
    3057         256 :                     str += '\\';
    3058         256 :                     str += to_octal_string(c);
    3059         256 :                     str += quote;
    3060         512 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3061         256 :                     *input << str;
    3062         512 :                     as2js::options::pointer_t options(new as2js::options);
    3063         256 :                     options->set_option(as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES, 1);
    3064        1024 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3065         256 :                     CATCH_REQUIRE(lexer->get_input() == input);
    3066         512 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    3067             : //std::cerr << "token = " << *token << "\n";
    3068         256 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3069         256 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    3070         512 :                     std::string expected;
    3071         256 :                     expected += libutf8::to_u8string(c);
    3072         256 :                     CATCH_REQUIRE(token->get_string() == expected);
    3073         256 :                     token = lexer->get_next_token(true);
    3074         256 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_EOF);
    3075         256 :                 }
    3076             : 
    3077             :                 {
    3078         256 :                     std::string str;
    3079         256 :                     str += quote;
    3080         256 :                     str += '\\';
    3081         256 :                     str += rand() & 1 ? 'x' : 'X';
    3082         256 :                     str += to_hex_string(c, 2);
    3083         256 :                     str += quote;
    3084         256 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3085         256 :                     *input << str;
    3086         256 :                     as2js::options::pointer_t options(new as2js::options);
    3087         256 :                     options->set_option(as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES, 1);
    3088         768 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3089         256 :                     CATCH_REQUIRE(lexer->get_input() == input);
    3090         256 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    3091         256 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3092         256 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    3093         256 :                     std::string expected;
    3094         256 :                     expected += libutf8::to_u8string(c);
    3095         256 :                     CATCH_REQUIRE(token->get_string() == expected);
    3096         256 :                     token = lexer->get_next_token(true);
    3097         256 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_EOF);
    3098         256 :                 }
    3099             :             }
    3100     1112064 :             if(c < 0x10000)
    3101             :             {
    3102       63488 :                 std::string str;
    3103       63488 :                 str += "/* long comment ";
    3104             :                 // make sure to include the character we are testing in
    3105             :                 // the string
    3106       63488 :                 if(c == '\0')
    3107             :                 {
    3108             :                     // not too sure right now why '\0' does not work in a
    3109             :                     // comment...
    3110           1 :                     str += '^';
    3111           1 :                     str += '@';
    3112             :                 }
    3113             :                 else
    3114             :                 {
    3115       63487 :                     str += libutf8::to_u8string(c);
    3116             :                 }
    3117       63488 :                 char32_t const previous(c);
    3118       63488 :                 int line_length(rand() % 30 + 50);
    3119    16316416 :                 for(int k(0); k < 256; ++k)
    3120             :                 {
    3121    16252928 :                     if(k % line_length == line_length - 1)
    3122             :                     {
    3123      226413 :                         switch(rand() % 5)
    3124             :                         {
    3125       45578 :                         case 0:
    3126       45578 :                             str += '\r';
    3127       45578 :                             break;
    3128             : 
    3129       45050 :                         case 1:
    3130       45050 :                             str += '\n';
    3131       45050 :                             break;
    3132             : 
    3133       45465 :                         case 2:
    3134       45465 :                             str += '\r';
    3135       45465 :                             str += '\n';
    3136       45465 :                             break;
    3137             : 
    3138       45213 :                         case 3:
    3139       45213 :                             str += libutf8::to_u8string(static_cast<char32_t>(0x2028));
    3140       45213 :                             break;
    3141             : 
    3142       45107 :                         case 4:
    3143       45107 :                             str += libutf8::to_u8string(static_cast<char32_t>(0x2029));
    3144       45107 :                             break;
    3145             : 
    3146             :                         }
    3147             :                     }
    3148             :                     char32_t cc;
    3149             :                     do
    3150             :                     {
    3151    30652809 :                         cc = ((rand() << 16) ^ rand()) & 0x1FFFFF;
    3152             :                     }
    3153             :                     while(cc > 0x10FFFF
    3154    16282853 :                        || cc == '\0'
    3155    16282842 :                        || (cc >= 0xD800 && cc <= 0xDFFF)
    3156    46905737 :                        || (cc == '/' && previous == '*'));
    3157    16252928 :                     str += libutf8::to_u8string(cc);
    3158             :                 }
    3159       63488 :                 str += "! */";
    3160       63488 :                 str += libutf8::to_u8string(static_cast<char32_t>(0x2028));
    3161       63488 :                 str += quote;
    3162       63488 :                 str += '\\';
    3163       63488 :                 str += 'u';
    3164       63488 :                 str += to_hex_string(c, 4);
    3165       63488 :                 str += quote;
    3166      126976 :                 as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3167       63488 :                 *input << str;
    3168      126976 :                 as2js::options::pointer_t options(new as2js::options);
    3169       63488 :                 options->set_option(as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES, 1);
    3170      253952 :                 as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3171       63488 :                 CATCH_REQUIRE(lexer->get_input() == input);
    3172      126976 :                 as2js::node::pointer_t token(lexer->get_next_token(true));
    3173       63488 :                 CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3174       63488 :                 CATCH_REQUIRE(token->get_children_size() == 0);
    3175      126976 :                 std::string expected;
    3176       63488 :                 expected += libutf8::to_u8string(c);
    3177       63488 :                 CATCH_REQUIRE(token->get_string() == expected);
    3178       63488 :                 token = lexer->get_next_token(true);
    3179       63488 :                 CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_EOF);
    3180       63488 :             }
    3181             : 
    3182             :             // if(c < 0x110000) -- all characters
    3183             :             {
    3184     1112064 :                 std::string str;
    3185     1112064 :                 str += "/* long comment with multi-asterisks ";
    3186     1112064 :                 std::size_t const max_asterisk(rand() % 10 + 1);
    3187     7231771 :                 for(std::size_t a(0); a < max_asterisk; ++a)
    3188             :                 {
    3189     6119707 :                     str += '*';
    3190             :                 }
    3191     1112064 :                 str += '/';
    3192     1112064 :                 str += quote;
    3193     1112064 :                 str += '\\';
    3194     1112064 :                 str += 'U';
    3195     1112064 :                 str += to_hex_string(c, 6);
    3196     1112064 :                 str += quote;
    3197     1112064 :                 as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3198     1112064 :                 *input << str;
    3199     1112064 :                 as2js::options::pointer_t options(new as2js::options);
    3200     1112064 :                 options->set_option(as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES, 1);
    3201     3336192 :                 as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3202     1112064 :                 CATCH_REQUIRE(lexer->get_input() == input);
    3203     1112064 :                 as2js::node::pointer_t token(lexer->get_next_token(true));
    3204     1112064 :                 CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3205     1112064 :                 CATCH_REQUIRE(token->get_children_size() == 0);
    3206     1112064 :                 std::string expected;
    3207     1112064 :                 expected += libutf8::to_u8string(c);
    3208     1112064 :                 CATCH_REQUIRE(token->get_string() == expected);
    3209     1112064 :                 token = lexer->get_next_token(true);
    3210     1112064 :                 CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_EOF);
    3211     1112064 :             }
    3212             : 
    3213             :             // just a few characters cannot really make it as is in a string,
    3214             :             // everything else should work like a charm
    3215             :             //
    3216     1112064 :             switch(c)
    3217             :             {
    3218           6 :             case '\0': // this should probably work but not at this time...
    3219             :             case '\n':
    3220             :             case '\r':
    3221             :             case 0x2028:
    3222             :             case 0x2029:
    3223             :             case '\\': // already tested in the previous loop
    3224           6 :                 break;
    3225             : 
    3226     1112058 :             default:
    3227     1112058 :                 if(c != static_cast<char32_t>(quote))
    3228             :                 {
    3229     1112057 :                     std::string str;
    3230     1112057 :                     str += quote;
    3231     1112057 :                     str += libutf8::to_u8string(c);
    3232     1112057 :                     str += quote;
    3233     1112057 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3234     1112057 :                     *input << str;
    3235     1112057 :                     as2js::options::pointer_t options(new as2js::options);
    3236     3336171 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3237     1112057 :                     CATCH_REQUIRE(lexer->get_input() == input);
    3238     1112057 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    3239     1112057 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3240     1112057 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    3241     1112057 :                     std::string expected;
    3242     1112057 :                     expected += libutf8::to_u8string(c);
    3243     1112057 :                     CATCH_REQUIRE(token->get_string() == expected);
    3244     1112057 :                     token = lexer->get_next_token(true);
    3245     1112057 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_EOF);
    3246     1112057 :                 }
    3247     1112058 :                 break;
    3248             : 
    3249             :             }
    3250             :         }
    3251           1 :         if(SNAP_CATCH2_NAMESPACE::g_verbose())
    3252             :         {
    3253           0 :             std::cout << std::endl;
    3254             :         }
    3255             :     }
    3256           3 :     CATCH_END_SECTION()
    3257             : 
    3258           3 :     CATCH_START_SECTION("lexer_valid_strings: line terminator inside strings")
    3259             :     {
    3260           1 :         int tested_all(0);
    3261         101 :         for(std::size_t idx(0); idx < 100 || tested_all != 0x1F; ++idx)
    3262             :         {
    3263         100 :             std::string str, expected;
    3264         100 :             str += '\'';
    3265         100 :             std::size_t const max_chars1(rand() % 10 + 2);
    3266         742 :             for(std::size_t j(0); j < max_chars1; ++j)
    3267             :             {
    3268         642 :                 char32_t const c((rand() % 26) + 'A');
    3269         642 :                 str += libutf8::to_u8string(c);
    3270         642 :                 expected += libutf8::to_u8string(c);
    3271             :             }
    3272         100 :             str += '\\';
    3273         100 :             int page_line(1);
    3274         100 :             int paragraph(1);
    3275         100 :             int line(1);
    3276         100 :             switch(rand() % 5)
    3277             :             {
    3278          19 :             case 0: // carriage return + new line
    3279          19 :                 str += '\r';
    3280          19 :                 tested_all |= 0x01;
    3281          19 :                 ++page_line;
    3282          19 :                 ++line;
    3283          19 :                 break;
    3284             : 
    3285          20 :             case 1: // carriage return + new line
    3286          20 :                 str += '\r';
    3287          20 :                 str += '\n';
    3288          20 :                 tested_all |= 0x02;
    3289          20 :                 ++page_line;
    3290          20 :                 ++line;
    3291          20 :                 break;
    3292             : 
    3293          18 :             case 2: // new line
    3294          18 :                 str += '\n';
    3295          18 :                 tested_all |= 0x04;
    3296          18 :                 ++page_line;
    3297          18 :                 ++line;
    3298          18 :                 break;
    3299             : 
    3300          23 :             case 3: // line separator
    3301          23 :                 str += libutf8::to_u8string(static_cast<char32_t>(0x2028));
    3302          23 :                 tested_all |= 0x08;
    3303          23 :                 ++page_line;
    3304          23 :                 ++line;
    3305          23 :                 break;
    3306             : 
    3307          20 :             case 4: // paragraph separator
    3308          20 :                 str += libutf8::to_u8string(static_cast<char32_t>(0x2029));
    3309          20 :                 tested_all |= 0x10;
    3310          20 :                 ++paragraph;
    3311          20 :                 break;
    3312             : 
    3313             :             }
    3314         100 :             std::size_t const max_chars2(rand() % 10 + 2);
    3315         770 :             for(std::size_t j(0); j < max_chars2; ++j)
    3316             :             {
    3317         670 :                 char32_t const c((rand() % 26) + 'A');
    3318         670 :                 str += libutf8::to_u8string(c);
    3319         670 :                 expected += libutf8::to_u8string(c);
    3320             :             }
    3321         100 :             str += '\'';
    3322         100 :             str += '\n';
    3323             : 
    3324             : //std::cerr << "--- str is [";
    3325             : //for(auto const & c : str)
    3326             : //{
    3327             : //    if(c < ' ')
    3328             : //    {
    3329             : //        std::cerr << '^' << static_cast<char>(c + 0x40);
    3330             : //    }
    3331             : //    else
    3332             : //    {
    3333             : //        std::cerr << c;
    3334             : //    }
    3335             : //}
    3336             : //std::cerr << "]\n";
    3337             : 
    3338             : // our seed was: 1672294545
    3339             : 
    3340             :             // now see that it works as expected
    3341             :             {
    3342         100 :                 as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3343         100 :                 *input << str;
    3344         100 :                 as2js::options::pointer_t options(new as2js::options);
    3345         300 :                 as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3346         100 :                 CATCH_REQUIRE(lexer->get_input() == input);
    3347         100 :                 as2js::node::pointer_t token(lexer->get_next_token(true));
    3348         100 :                 CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3349         100 :                 CATCH_REQUIRE(token->get_children_size() == 0);
    3350         100 :                 CATCH_REQUIRE(token->get_string() == expected);
    3351             : 
    3352         100 :                 as2js::position const& node_pos(token->get_position());
    3353         100 :                 CATCH_REQUIRE(node_pos.get_page() == 1);
    3354         100 :                 CATCH_REQUIRE(node_pos.get_page_line() == page_line);
    3355         100 :                 CATCH_REQUIRE(node_pos.get_paragraph() == paragraph);
    3356         100 :                 CATCH_REQUIRE(node_pos.get_line() == line);
    3357             : 
    3358         100 :                 as2js::position const& input_pos(input->get_position());
    3359         100 :                 CATCH_REQUIRE(input_pos.get_page() == 1);
    3360         100 :                 CATCH_REQUIRE(input_pos.get_page_line() == page_line);
    3361         100 :                 CATCH_REQUIRE(input_pos.get_paragraph() == paragraph);
    3362         100 :                 CATCH_REQUIRE(input_pos.get_line() == line);
    3363             : 
    3364             :                 // create a new node which has to give us the same position
    3365             :                 // as the last node we were given
    3366         100 :                 as2js::node_t new_node_type(static_cast<as2js::node_t>(rand() % (static_cast<int>(as2js::node_t::NODE_max) - static_cast<int>(as2js::node_t::NODE_other) - 1) + static_cast<int>(as2js::node_t::NODE_other) + 1));
    3367             : //std::cerr << "new node type = " << static_cast<int>(new_node_type) << "\n";
    3368         100 :                 as2js::node::pointer_t new_node(lexer->get_new_node(new_node_type));
    3369         100 :                 CATCH_REQUIRE(new_node->get_type() == new_node_type);
    3370         100 :                 as2js::position const& new_node_pos(new_node->get_position());
    3371         100 :                 CATCH_REQUIRE(new_node_pos.get_page() == 1);
    3372         100 :                 CATCH_REQUIRE(new_node_pos.get_page_line() == page_line);
    3373         100 :                 CATCH_REQUIRE(new_node_pos.get_paragraph() == paragraph);
    3374         100 :                 CATCH_REQUIRE(new_node_pos.get_line() == line);
    3375             : 
    3376             :                 // make sure there is nothing more after the string
    3377             :                 // (the \n is skipped silently)
    3378         100 :                 token = lexer->get_next_token(true);
    3379         100 :                 CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_EOF);
    3380             : 
    3381         100 :                 as2js::position const& final_pos(input->get_position());
    3382         100 :                 CATCH_REQUIRE(final_pos.get_page() == 1);
    3383         100 :                 CATCH_REQUIRE(input_pos.get_page_line() == page_line + 1);
    3384         100 :                 CATCH_REQUIRE(input_pos.get_paragraph() == paragraph);
    3385         100 :                 CATCH_REQUIRE(input_pos.get_line() == line + 1);
    3386         100 :             }
    3387         100 :         }
    3388             :     }
    3389           3 :     CATCH_END_SECTION()
    3390           3 : }
    3391             : 
    3392             : 
    3393           4 : CATCH_TEST_CASE("lexer_invalid_strings", "[lexer]")
    3394             : {
    3395           4 :     CATCH_START_SECTION("lexer_invalid_strings: unterminated string")
    3396             :     {
    3397           2 :         std::string str("\"unterminated"); // double quote
    3398             : 
    3399           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3400           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3401           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_UNTERMINATED_STRING;
    3402           1 :         expected.f_pos.set_filename("unknown-file");
    3403           1 :         expected.f_pos.set_function("unknown-func");
    3404           1 :         expected.f_message = "the last string was not closed before the end of the input was reached.";
    3405             : 
    3406           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3407           1 :         tc.f_expected.push_back(expected);
    3408             : 
    3409             :         // if we do not turn on the OPTION_EXTENDED_ESCAPE_SEQUENCES then
    3410             :         // we get an error with the \U... syntax
    3411           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3412           1 :         *input << str;
    3413           1 :         as2js::options::pointer_t options(new as2js::options);
    3414           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3415           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3416           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3417           1 :         tc.got_called();
    3418           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3419           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3420           1 :         CATCH_REQUIRE(token->get_string() == "unterminated");
    3421           1 :     }
    3422           4 :     CATCH_END_SECTION()
    3423             : 
    3424           4 :     CATCH_START_SECTION("lexer_invalid_strings: unterminated")
    3425             :     {
    3426           2 :         std::string str("'unterminated"); // single quote
    3427             : 
    3428           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3429           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3430           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_UNTERMINATED_STRING;
    3431           1 :         expected.f_pos.set_filename("unknown-file");
    3432           1 :         expected.f_pos.set_function("unknown-func");
    3433           1 :         expected.f_message = "the last string was not closed before the end of the input was reached.";
    3434             : 
    3435           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3436           1 :         tc.f_expected.push_back(expected);
    3437             : 
    3438             :         // if we do not turn on the OPTION_EXTENDED_ESCAPE_SEQUENCES then
    3439             :         // we get an error with the \U... syntax
    3440           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3441           1 :         *input << str;
    3442           1 :         as2js::options::pointer_t options(new as2js::options);
    3443           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3444           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3445           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3446           1 :         tc.got_called();
    3447           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3448           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3449           1 :         CATCH_REQUIRE(token->get_string() == "unterminated");
    3450           1 :     }
    3451           4 :     CATCH_END_SECTION()
    3452             : 
    3453           4 :     CATCH_START_SECTION("lexer_invalid_strings: unexpected newline")
    3454             :     {
    3455          11 :         for(int idx(0); idx < 10; ++idx)
    3456             :         {
    3457             :             // unterminated if it includes a a newline
    3458          10 :             std::string str;
    3459          10 :             str += idx & 1 ? '"' : '\'';
    3460          10 :             str += "unter";
    3461             : 
    3462          10 :             SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3463          10 :             expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3464          10 :             expected.f_error_code = as2js::err_code_t::AS_ERR_UNTERMINATED_STRING;
    3465          10 :             expected.f_pos.set_filename("unknown-file");
    3466          10 :             expected.f_pos.set_function("unknown-func");
    3467             : 
    3468             :             // terminator
    3469          10 :             switch(idx / 2)
    3470             :             {
    3471           2 :             case 0:
    3472           2 :                 str += '\r';
    3473           2 :                 expected.f_pos.new_line();
    3474           2 :                 break;
    3475             : 
    3476           2 :             case 1:
    3477           2 :                 str += '\n';
    3478           2 :                 expected.f_pos.new_line();
    3479           2 :                 break;
    3480             : 
    3481           2 :             case 2:
    3482           2 :                 str += '\r';
    3483           2 :                 str += '\n';
    3484           2 :                 expected.f_pos.new_line();
    3485           2 :                 break;
    3486             : 
    3487           2 :             case 3:
    3488           2 :                 str += libutf8::to_u8string(static_cast<char32_t>(0x2028));
    3489           2 :                 expected.f_pos.new_line();
    3490           2 :                 break;
    3491             : 
    3492           2 :             case 4:
    3493           2 :                 str += libutf8::to_u8string(static_cast<char32_t>(0x2029));
    3494           2 :                 expected.f_pos.new_paragraph();
    3495           2 :                 break;
    3496             : 
    3497             :             }
    3498             : 
    3499          10 :             str += "minated";
    3500             : 
    3501          10 :             expected.f_message = "a string cannot include a line terminator.";
    3502             : 
    3503          20 :             SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3504          10 :             tc.f_expected.push_back(expected);
    3505             : 
    3506             :             // if we do not turn on the OPTION_EXTENDED_ESCAPE_SEQUENCES then
    3507             :             // we get an error with the \U... syntax
    3508          20 :             as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3509          10 :             *input << str;
    3510          20 :             as2js::options::pointer_t options(new as2js::options);
    3511          40 :             as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3512          10 :             CATCH_REQUIRE(lexer->get_input() == input);
    3513          20 :             as2js::node::pointer_t token(lexer->get_next_token(true));
    3514          10 :             tc.got_called();
    3515          10 :             CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3516          10 :             CATCH_REQUIRE(token->get_children_size() == 0);
    3517          10 :             CATCH_REQUIRE(token->get_string() == "unter");
    3518             : 
    3519          20 :             as2js::node::pointer_t identifier(lexer->get_next_token(true));
    3520          10 :             CATCH_REQUIRE(identifier->get_type() == as2js::node_t::NODE_IDENTIFIER);
    3521          10 :             CATCH_REQUIRE(identifier->get_children_size() == 0);
    3522          10 :             CATCH_REQUIRE(identifier->get_string() == "minated");
    3523             : 
    3524          20 :             as2js::node::pointer_t end(lexer->get_next_token(true));
    3525          10 :             CATCH_REQUIRE(end->get_type() == as2js::node_t::NODE_EOF);
    3526          10 :         }
    3527             :     }
    3528           4 :     CATCH_END_SECTION()
    3529             : 
    3530           4 :     CATCH_START_SECTION("lexer_invalid_strings: invalid escape sequences (use --verbose to see dots while processing)")
    3531             :     {
    3532             :         // now test all the characters that are not acceptable right after
    3533             :         // a blackslash (invalid escape sequences)
    3534             :         //
    3535     1114113 :         for(char32_t c(0); c < 0x110000; ++c)
    3536             :         {
    3537     1114112 :             if(SNAP_CATCH2_NAMESPACE::g_verbose()
    3538     1114112 :             && c % 30000 == 0)
    3539             :             {
    3540           0 :                 std::cout << "." << std::flush;
    3541             :             }
    3542     1114112 :             if(c >= 0xD800 && c <= 0xDFFF)
    3543             :             {
    3544             :                 // avoid surrogate by themselves
    3545        2048 :                 continue;
    3546             :             }
    3547     1112064 :             switch(c)
    3548             :             {
    3549          19 :             case '0':
    3550             :             case 'b':
    3551             :             case 'e':
    3552             :             case 'f':
    3553             :             case 'n':
    3554             :             case 'r':
    3555             :             case 'u':
    3556             :             case 't':
    3557             :             case 'v':
    3558             :             case 'x':
    3559             :             case 'X':
    3560             :             case '\'':
    3561             :             case '"':
    3562             :             case '`':
    3563             :             case '\\':
    3564             :             case '\r': // terminator within the string create "problems" in this test
    3565             :             case '\n':
    3566             :             case 0x2028:
    3567             :             case 0x2029:
    3568             :                 // these are valid escape sequences
    3569          19 :                 break;
    3570             : 
    3571     1112045 :             default:
    3572             :                 {
    3573     1112045 :                     std::string str;
    3574     1112045 :                     str += '"';
    3575     1112045 :                     str += '\\';
    3576     1112045 :                     str += libutf8::to_u8string(c);
    3577     1112045 :                     str += '8';
    3578     1112045 :                     str += '9';
    3579     1112045 :                     str += 'A';
    3580     1112045 :                     str += 'B';
    3581     1112045 :                     str += 'C';
    3582     1112045 :                     str += 'D';
    3583     1112045 :                     str += 'E';
    3584     1112045 :                     str += 'F';
    3585     1112045 :                     str += '"';
    3586             : 
    3587     1112045 :                     SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3588     1112045 :                     expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3589     1112045 :                     expected.f_error_code = as2js::err_code_t::AS_ERR_UNKNOWN_ESCAPE_SEQUENCE;
    3590     1112045 :                     expected.f_pos.set_filename("unknown-file");
    3591     1112045 :                     expected.f_pos.set_function("unknown-func");
    3592     1112045 :                     if(c > ' ' && c < 0x7F)
    3593             :                     {
    3594          79 :                         expected.f_message = "unknown escape letter \"";
    3595          79 :                         expected.f_message += static_cast<char>(c);
    3596          79 :                         expected.f_message += "\"";
    3597             :                     }
    3598             :                     else
    3599             :                     {
    3600     1111966 :                         std::stringstream ss;
    3601     1111966 :                         ss << "unknown escape letter \"\\U"
    3602     1111966 :                            << std::hex
    3603             :                            << std::setw(6)
    3604     1111966 :                            << std::setfill('0')
    3605             :                            << static_cast<std::int32_t>(c)
    3606     1111966 :                            << "\"";
    3607     1111966 :                         expected.f_message = ss.str();
    3608     1111966 :                     }
    3609             : 
    3610             :                     switch(c)
    3611             :                     {
    3612           1 :                     case '\f':
    3613           1 :                         expected.f_pos.new_page();
    3614           1 :                         break;
    3615             : 
    3616             :                     // 0x2028 and 0x2029 cannot happen here since we caught them
    3617             :                     // earlier (see previous switch level)
    3618             :                     //case 0x2028:
    3619             :                     //    expected.f_pos.new_line();
    3620             :                     //    break;
    3621             :                     //
    3622             :                     //case 0x2029:
    3623             :                     //    expected.f_pos.new_paragraph();
    3624             :                     //    break;
    3625             : 
    3626             :                     }
    3627     2224090 :                     SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3628     1112045 :                     tc.f_expected.push_back(expected);
    3629             : 
    3630             :                     // if we do not turn on the OPTION_EXTENDED_ESCAPE_SEQUENCES then
    3631             :                     // we get an error with the \U... syntax
    3632     2224090 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3633     1112045 :                     *input << str;
    3634     2224090 :                     as2js::options::pointer_t options(new as2js::options);
    3635     4448180 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3636     1112045 :                     CATCH_REQUIRE(lexer->get_input() == input);
    3637     2224090 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    3638     1112045 :                     tc.got_called();
    3639     1112045 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_STRING);
    3640     1112045 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    3641     1112045 :                     CATCH_REQUIRE(token->get_string() == "?89ABCDEF");
    3642             : 
    3643             : //std::cerr << std::hex << c << " -> " << *token << "\n";
    3644     1112045 :                 }
    3645             :                 break;
    3646             : 
    3647             :             }
    3648             :         }
    3649           1 :         if(SNAP_CATCH2_NAMESPACE::g_verbose())
    3650             :         {
    3651           0 :             std::cout << std::endl;
    3652             :         }
    3653             :     }
    3654           4 :     CATCH_END_SECTION()
    3655           4 : }
    3656             : 
    3657             : 
    3658          11 : CATCH_TEST_CASE("lexer_invalid_numbers", "[lexer]")
    3659             : {
    3660          11 :     CATCH_START_SECTION("lexer_invalid_numbers: bad hexadecimal introducer (lowercase)")
    3661             :     {
    3662             :         // 0x, 0X, 0b, 0B by themsevles are not valid numbers
    3663             :         //
    3664           1 :         std::string str;
    3665           1 :         str += '0';
    3666           1 :         str += 'x'; // lowercase
    3667             : 
    3668           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3669           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3670           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3671           1 :         expected.f_pos.set_filename("unknown-file");
    3672           1 :         expected.f_pos.set_function("unknown-func");
    3673           1 :         expected.f_message = "invalid hexadecimal number, at least one digit is required.";
    3674             : 
    3675           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3676           1 :         tc.f_expected.push_back(expected);
    3677             : 
    3678           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3679           1 :         *input << str;
    3680           1 :         as2js::options::pointer_t options(new as2js::options);
    3681           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3682           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3683           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3684           1 :         tc.got_called();
    3685           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    3686           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3687           1 :         CATCH_REQUIRE(token->get_integer().get() == -1);
    3688           1 :     }
    3689          11 :     CATCH_END_SECTION()
    3690             : 
    3691          11 :     CATCH_START_SECTION("lexer_invalid_numbers: bad hexadecimal introducer (uppercase)")
    3692             :     {
    3693           1 :         std::string str;
    3694           1 :         str += '0';
    3695           1 :         str += 'X'; // uppercase
    3696             : 
    3697           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3698           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3699           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3700           1 :         expected.f_pos.set_filename("unknown-file");
    3701           1 :         expected.f_pos.set_function("unknown-func");
    3702           1 :         expected.f_message = "invalid hexadecimal number, at least one digit is required.";
    3703             : 
    3704           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3705           1 :         tc.f_expected.push_back(expected);
    3706             : 
    3707           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3708           1 :         *input << str;
    3709           1 :         as2js::options::pointer_t options(new as2js::options);
    3710           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3711           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3712           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3713           1 :         tc.got_called();
    3714           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    3715           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3716           1 :         CATCH_REQUIRE(token->get_integer().get() == -1);
    3717           1 :     }
    3718          11 :     CATCH_END_SECTION()
    3719             : 
    3720          11 :     CATCH_START_SECTION("lexer_invalid_numbers: bad binary introducer (lowercase)")
    3721             :     {
    3722           1 :         std::string str;
    3723           1 :         str += '0';
    3724           1 :         str += 'b'; // lowercase
    3725             : 
    3726           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3727           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3728           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3729           1 :         expected.f_pos.set_filename("unknown-file");
    3730           1 :         expected.f_pos.set_function("unknown-func");
    3731           1 :         expected.f_message = "invalid binary number, at least one digit is required.";
    3732             : 
    3733           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3734           1 :         tc.f_expected.push_back(expected);
    3735             : 
    3736           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3737           1 :         *input << str;
    3738           1 :         as2js::options::pointer_t options(new as2js::options);
    3739           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3740           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3741           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3742           1 :         tc.got_called();
    3743           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    3744           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3745           1 :         CATCH_REQUIRE(token->get_integer().get() == -1);
    3746           1 :     }
    3747          11 :     CATCH_END_SECTION()
    3748             : 
    3749          11 :     CATCH_START_SECTION("lexer_invalid_numbers: bad binary introducer (uppercase)")
    3750             :     {
    3751           1 :         std::string str;
    3752           1 :         str += '0';
    3753           1 :         str += 'B'; // uppercase
    3754             : 
    3755           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3756           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3757           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3758           1 :         expected.f_pos.set_filename("unknown-file");
    3759           1 :         expected.f_pos.set_function("unknown-func");
    3760           1 :         expected.f_message = "invalid binary number, at least one digit is required.";
    3761             : 
    3762           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3763           1 :         tc.f_expected.push_back(expected);
    3764             : 
    3765           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3766           1 :         *input << str;
    3767           1 :         as2js::options::pointer_t options(new as2js::options);
    3768           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3769           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3770           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3771           1 :         tc.got_called();
    3772           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    3773           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3774           1 :         CATCH_REQUIRE(token->get_integer().get() == -1);
    3775           1 :     }
    3776          11 :     CATCH_END_SECTION()
    3777             : 
    3778          11 :     CATCH_START_SECTION("lexer_invalid_numbers: suffixes not available (7pm)")
    3779             :     {
    3780             :         // numbers cannot be followed by letters
    3781             :         // (a space is required)
    3782             :         //
    3783           2 :         std::string str("7pm");
    3784             : 
    3785           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3786           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3787           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3788           1 :         expected.f_pos.set_filename("unknown-file");
    3789           1 :         expected.f_pos.set_function("unknown-func");
    3790           1 :         expected.f_message = "unexpected letter (\"p\") after an integer.";
    3791             : 
    3792           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3793           1 :         tc.f_expected.push_back(expected);
    3794             : 
    3795           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3796           1 :         *input << str;
    3797           1 :         as2js::options::pointer_t options(new as2js::options);
    3798           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3799           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3800           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3801           1 :         tc.got_called();
    3802           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    3803           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3804           1 :         CATCH_REQUIRE(token->get_integer().get() == -1);
    3805           1 :     }
    3806          11 :     CATCH_END_SECTION()
    3807             : 
    3808          11 :     CATCH_START_SECTION("lexer_invalid_numbers: suffixes not available (6em)")
    3809             :     {
    3810           2 :         std::string str("6em");
    3811             : 
    3812           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3813           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3814           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3815           1 :         expected.f_pos.set_filename("unknown-file");
    3816           1 :         expected.f_pos.set_function("unknown-func");
    3817           1 :         expected.f_message = "unexpected letter (\"m\") after an integer.";
    3818             : 
    3819           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3820           1 :         tc.f_expected.push_back(expected);
    3821             : 
    3822           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3823           1 :         *input << str;
    3824           1 :         as2js::options::pointer_t options(new as2js::options);
    3825           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3826           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3827           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3828           1 :         tc.got_called();
    3829           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    3830           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3831           1 :         CATCH_REQUIRE(token->get_integer().get() == -1);
    3832           1 :     }
    3833          11 :     CATCH_END_SECTION()
    3834             : 
    3835          11 :     CATCH_START_SECTION("lexer_invalid_numbers: suffixes not available (3.5in)")
    3836             :     {
    3837           2 :         std::string str("3.5in");
    3838             : 
    3839           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3840           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3841           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3842           1 :         expected.f_pos.set_filename("unknown-file");
    3843           1 :         expected.f_pos.set_function("unknown-func");
    3844           1 :         expected.f_message = "unexpected letter (\"i\") after a floating point number.";
    3845             : 
    3846           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3847           1 :         tc.f_expected.push_back(expected);
    3848             : 
    3849           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3850           1 :         *input << str;
    3851           1 :         as2js::options::pointer_t options(new as2js::options);
    3852           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3853           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3854           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3855           1 :         tc.got_called();
    3856           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_FLOATING_POINT);
    3857           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3858             : #pragma GCC diagnostic push
    3859             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    3860           1 :         CATCH_REQUIRE(token->get_floating_point().get() == -1.0);
    3861             : #pragma GCC diagnostic pop
    3862           1 :     }
    3863          11 :     CATCH_END_SECTION()
    3864             : 
    3865          11 :     CATCH_START_SECTION("lexer_invalid_numbers: suffixes not available (10.1em)")
    3866             :     {
    3867           2 :         std::string str("10.1em");
    3868             : 
    3869           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3870           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3871           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3872           1 :         expected.f_pos.set_filename("unknown-file");
    3873           1 :         expected.f_pos.set_function("unknown-func");
    3874             :         // TODO: determine why the 'e' is the culprit in this case but not in
    3875             :         //       an integer... I think the 'e' is probably correct and the
    3876             :         //       integer error is wrong/unexpected (one too far)
    3877             :         //
    3878           1 :         expected.f_message = "unexpected letter (\"e\") after a floating point number.";
    3879             : 
    3880           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3881           1 :         tc.f_expected.push_back(expected);
    3882             : 
    3883           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3884           1 :         *input << str;
    3885           1 :         as2js::options::pointer_t options(new as2js::options);
    3886           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3887           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3888           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3889           1 :         tc.got_called();
    3890           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_FLOATING_POINT);
    3891           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3892             : #pragma GCC diagnostic push
    3893             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    3894           1 :         CATCH_REQUIRE(token->get_floating_point().get() == -1.0);
    3895             : #pragma GCC diagnostic pop
    3896           1 :     }
    3897          11 :     CATCH_END_SECTION()
    3898             : 
    3899          11 :     CATCH_START_SECTION("lexer_invalid_numbers: suffixes not available (9.1e+j)")
    3900             :     {
    3901           2 :         std::string str("9.1e+j");
    3902             : 
    3903           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3904           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3905           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3906           1 :         expected.f_pos.set_filename("unknown-file");
    3907           1 :         expected.f_pos.set_function("unknown-func");
    3908           1 :         expected.f_message = "unexpected letter (\"j\") after a floating point number.";
    3909             : 
    3910           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3911           1 :         tc.f_expected.push_back(expected);
    3912             : 
    3913           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3914           1 :         *input << str;
    3915           1 :         as2js::options::pointer_t options(new as2js::options);
    3916           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3917           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3918           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3919           1 :         tc.got_called();
    3920           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_FLOATING_POINT);
    3921           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3922             : #pragma GCC diagnostic push
    3923             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    3924           1 :         CATCH_REQUIRE(token->get_floating_point().get() == -1.0);
    3925             : #pragma GCC diagnostic pop
    3926           1 :     }
    3927          11 :     CATCH_END_SECTION()
    3928             : 
    3929          11 :     CATCH_START_SECTION("lexer_invalid_numbers: suffixes not available (9.1e-k)")
    3930             :     {
    3931           2 :         std::string str("9.1e-k");
    3932             : 
    3933           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3934           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3935           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3936           1 :         expected.f_pos.set_filename("unknown-file");
    3937           1 :         expected.f_pos.set_function("unknown-func");
    3938           1 :         expected.f_message = "unexpected letter (\"k\") after a floating point number.";
    3939             : 
    3940           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3941           1 :         tc.f_expected.push_back(expected);
    3942             : 
    3943           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3944           1 :         *input << str;
    3945           1 :         as2js::options::pointer_t options(new as2js::options);
    3946           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3947           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3948           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3949           1 :         tc.got_called();
    3950           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_FLOATING_POINT);
    3951           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3952             : #pragma GCC diagnostic push
    3953             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    3954           1 :         CATCH_REQUIRE(token->get_floating_point().get() == -1.0);
    3955             : #pragma GCC diagnostic pop
    3956           1 :     }
    3957          11 :     CATCH_END_SECTION()
    3958             : 
    3959          11 :     CATCH_START_SECTION("lexer_invalid_numbers: suffixes not available (91e+j)")
    3960             :     {
    3961           2 :         std::string str("91e+j");
    3962             : 
    3963           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    3964           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    3965           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_INVALID_NUMBER;
    3966           1 :         expected.f_pos.set_filename("unknown-file");
    3967           1 :         expected.f_pos.set_function("unknown-func");
    3968           1 :         expected.f_message = "unexpected letter (\"+\") after an integer.";
    3969             : 
    3970           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    3971           1 :         tc.f_expected.push_back(expected);
    3972             : 
    3973           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    3974           1 :         *input << str;
    3975           1 :         as2js::options::pointer_t options(new as2js::options);
    3976           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    3977           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    3978           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    3979           1 :         tc.got_called();
    3980           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    3981           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    3982           1 :         CATCH_REQUIRE(token->get_integer().get() == -1);
    3983           1 :     }
    3984          11 :     CATCH_END_SECTION()
    3985          11 : }
    3986             : 
    3987             : 
    3988             : 
    3989             : 
    3990             : // we test directly against the Unicode implementation
    3991             : // of the Operating System (Unicode 6.x at time of
    3992             : // writing.)
    3993             : //
    3994     1112030 : bool is_identifier_char(int32_t const c, bool const first)
    3995             : {
    3996             :     // rather strange special case (C had that one too way back)
    3997     1112030 :     if(c == '$')
    3998             :     {
    3999           1 :         return true;
    4000             :     }
    4001             : 
    4002             :     // digits are not accepted as first chars
    4003             :     // (we have to test here because it would always
    4004             :     // be true otherwise)
    4005     1112029 :     if(c >= '0' && c <= '9')
    4006             :     {
    4007          10 :         return !first;
    4008             :     }
    4009             : 
    4010             :     // special cases in JavaScript identifiers
    4011     1112019 :     if(c == 0x200C    // ZWNJ
    4012     1112018 :     || c == 0x200D)   // ZWJ
    4013             :     {
    4014           2 :         return true;
    4015             :     }
    4016             : 
    4017     1112017 :     switch(u_charType(static_cast<UChar32>(c)))
    4018             :     {
    4019      135047 :     case U_UPPERCASE_LETTER:
    4020             :     case U_LOWERCASE_LETTER:
    4021             :     case U_TITLECASE_LETTER:
    4022             :     case U_MODIFIER_LETTER:
    4023             :     case U_OTHER_LETTER:
    4024             :     case U_LETTER_NUMBER:
    4025             :     case U_NON_SPACING_MARK:
    4026             :     case U_COMBINING_SPACING_MARK:
    4027             :     case U_DECIMAL_DIGIT_NUMBER:
    4028             :     case U_CONNECTOR_PUNCTUATION:
    4029      135047 :         return true;
    4030             : 
    4031      976970 :     default:
    4032      976970 :         return false;
    4033             : 
    4034             :     }
    4035             : }
    4036             : 
    4037             : 
    4038           1 : CATCH_TEST_CASE("lexer_identifiers", "[lexer]")
    4039             : {
    4040           1 :     CATCH_START_SECTION("lexer_identifiers: test all possible character as identifier (use --verbose to see dots while processing)")
    4041             :     {
    4042             :         // identifiers can include all sorts of letters and can use escape
    4043             :         // sequences to add a character otherwise rather difficult to type
    4044             :         //
    4045     1114113 :         for(char32_t c(0); c < 0x110000; ++c)
    4046             :         {
    4047     1114112 :             if(SNAP_CATCH2_NAMESPACE::g_verbose()
    4048     1114112 :             && c % 50000 == 0)
    4049             :             {
    4050           0 :                 std::cout << "." << std::flush;
    4051             :             }
    4052             : 
    4053     1114112 :             if((c >= 0xD800 && c <= 0xDFFF)
    4054     1112064 :             || (c & 0xFFFF) >= 0xFFFE)
    4055             :             {
    4056             :                 // skip plain surrogates
    4057             :                 // and known invalid characters
    4058        2082 :                 continue;
    4059             :             }
    4060             : 
    4061     1112030 :             if(is_identifier_char(c, true))
    4062             :             {
    4063             : //std::cerr << "Next letter " << std::hex << c << "\n";
    4064             :                 // one letter
    4065             :                 {
    4066      135050 :                     std::string str;
    4067      135050 :                     str += libutf8::to_u8string(c);
    4068             : 
    4069      135050 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4070      135050 :                     *input << str;
    4071      135050 :                     as2js::options::pointer_t options(new as2js::options);
    4072      405150 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4073      135050 :                     CATCH_REQUIRE(lexer->get_input() == input);
    4074      135050 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    4075             : //std::cerr << *token;
    4076      135050 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4077      135050 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    4078      135050 :                     std::string expected;
    4079      135050 :                     expected += libutf8::to_u8string(c);
    4080      135050 :                     CATCH_REQUIRE(token->get_string() == expected);
    4081      135050 :                 }
    4082             : 
    4083             :                 // two letters
    4084             :                 {
    4085      135050 :                     std::string str;
    4086      135050 :                     str += libutf8::to_u8string(c);
    4087      135050 :                     str += 'x';
    4088             : 
    4089      135050 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4090      135050 :                     *input << str;
    4091      135050 :                     as2js::options::pointer_t options(new as2js::options);
    4092      405150 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4093      135050 :                     CATCH_REQUIRE(lexer->get_input() == input);
    4094      135050 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    4095      135050 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4096      135050 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    4097      135050 :                     std::string expected;
    4098      135050 :                     expected += libutf8::to_u8string(c);
    4099      135050 :                     expected += 'x';
    4100      135050 :                     CATCH_REQUIRE(token->get_string() == expected);
    4101      135050 :                 }
    4102             : 
    4103             :                 // use escape sequence instead:
    4104             :                 {
    4105      135050 :                     std::stringstream ss;
    4106      135050 :                     ss << "not_at_the_start";
    4107      135050 :                     if(c < 0x100 && rand() % 3 == 0)
    4108             :                     {
    4109          40 :                         ss << "\\x" << std::hex << static_cast<std::uint32_t>(c);
    4110             :                     }
    4111      135010 :                     else if(c < 0x10000 && rand() % 3 == 0)
    4112             :                     {
    4113       16937 :                         ss << "\\u" << std::hex << std::setfill('0') << std::setw(4) << static_cast<std::uint32_t>(c);
    4114             :                     }
    4115             :                     else
    4116             :                     {
    4117      118073 :                         ss << "\\U" << std::hex << std::setfill('0') << std::setw(6) << static_cast<std::uint32_t>(c);
    4118             :                     }
    4119      135050 :                     ss << "$"; // end with a dollar for fun
    4120             : 
    4121      135050 :                     std::string str(ss.str());
    4122             : 
    4123      135050 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4124      135050 :                     *input << str;
    4125      135050 :                     as2js::options::pointer_t options(new as2js::options);
    4126      135050 :                     options->set_option(as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES, 1);
    4127      405150 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4128      135050 :                     CATCH_REQUIRE(lexer->get_input() == input);
    4129      135050 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    4130      135050 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4131      135050 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    4132      135050 :                     std::string expected;
    4133      135050 :                     expected += "not_at_the_start";
    4134      135050 :                     expected += libutf8::to_u8string(c);
    4135      135050 :                     expected += '$';
    4136      135050 :                     CATCH_REQUIRE(token->get_string() == expected);
    4137      135050 :                 }
    4138             :                 {
    4139      135050 :                     std::stringstream ss;
    4140      135050 :                     if(c < 0x100 && rand() % 3 == 0)
    4141             :                     {
    4142          43 :                         ss << "\\x" << std::hex << static_cast<std::uint32_t>(c);
    4143             :                     }
    4144      135007 :                     else if(c < 0x10000 && rand() % 3 == 0)
    4145             :                     {
    4146       17082 :                         ss << "\\u" << std::hex << std::setfill('0') << std::setw(4) << static_cast<std::uint32_t>(c);
    4147             :                     }
    4148             :                     else
    4149             :                     {
    4150      117925 :                         ss << "\\U" << std::hex << std::setfill('0') << std::setw(6) << static_cast<std::uint32_t>(c);
    4151             :                     }
    4152      135050 :                     ss << "_"; // end with an underscore
    4153             : 
    4154      135050 :                     std::string str(ss.str());
    4155             : 
    4156      135050 :                     as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4157      135050 :                     *input << str;
    4158      135050 :                     as2js::options::pointer_t options(new as2js::options);
    4159      135050 :                     options->set_option(as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES, 1);
    4160      405150 :                     as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4161      135050 :                     CATCH_REQUIRE(lexer->get_input() == input);
    4162      135050 :                     as2js::node::pointer_t token(lexer->get_next_token(true));
    4163      135050 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4164      135050 :                     CATCH_REQUIRE(token->get_children_size() == 0);
    4165      135050 :                     std::string expected;
    4166      135050 :                     expected += libutf8::to_u8string(c);
    4167      135050 :                     expected += '_';
    4168             : //std::cerr << *token << " expected [" << expected << "]\n";
    4169      135050 :                     CATCH_REQUIRE(token->get_string() == expected);
    4170      135050 :                 }
    4171             :             }
    4172             :         }
    4173           1 :         if(SNAP_CATCH2_NAMESPACE::g_verbose())
    4174             :         {
    4175           0 :             std::cout << std::endl;
    4176             :         }
    4177             :     }
    4178           1 :     CATCH_END_SECTION()
    4179           1 : }
    4180             : 
    4181             : 
    4182           5 : CATCH_TEST_CASE("lexer_invalid_input", "[lexer]")
    4183             : {
    4184           5 :     CATCH_START_SECTION("lexer_invalid_input: punctuation (0x2FFF)")
    4185             :     {
    4186           1 :         std::string str;
    4187           1 :         str += libutf8::to_u8string(static_cast<char32_t>(0x2FFF));
    4188           1 :         str += "wrong_again";
    4189             : 
    4190           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    4191           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    4192           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_UNEXPECTED_PUNCTUATION;
    4193           1 :         expected.f_pos.set_filename("unknown-file");
    4194           1 :         expected.f_pos.set_function("unknown-func");
    4195           1 :         expected.f_message = "unexpected punctuation \"\\U002fff\"";
    4196             : 
    4197           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    4198           1 :         tc.f_expected.push_back(expected);
    4199             : 
    4200           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4201           1 :         *input << str;
    4202           1 :         as2js::options::pointer_t options(new as2js::options);
    4203           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4204           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    4205           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    4206             : //std::cerr << *token;
    4207           1 :         tc.got_called();
    4208           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4209           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    4210           1 :         std::string expected_identifier;
    4211           1 :         expected_identifier += "wrong_again";
    4212           1 :         CATCH_REQUIRE(token->get_string() == expected_identifier);
    4213           1 :     }
    4214           5 :     CATCH_END_SECTION()
    4215             : 
    4216           5 :     CATCH_START_SECTION("lexer_invalid_input: punctuation (@)")
    4217             :     {
    4218           2 :         std::string str("@oops");
    4219             : 
    4220           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    4221           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    4222           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_UNEXPECTED_PUNCTUATION;
    4223           1 :         expected.f_pos.set_filename("unknown-file");
    4224           1 :         expected.f_pos.set_function("unknown-func");
    4225           1 :         expected.f_message = "unexpected punctuation \"@\"";
    4226             : 
    4227           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    4228           1 :         tc.f_expected.push_back(expected);
    4229             : 
    4230           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4231           1 :         *input << str;
    4232           1 :         as2js::options::pointer_t options(new as2js::options);
    4233           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4234           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    4235           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    4236           1 :         tc.got_called();
    4237             : //std::cerr << *token;
    4238           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4239           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    4240           1 :         std::string expected_identifier;
    4241           1 :         expected_identifier += "oops";
    4242           1 :         CATCH_REQUIRE(token->get_string() == expected_identifier);
    4243           1 :     }
    4244           5 :     CATCH_END_SECTION()
    4245             : 
    4246           5 :     CATCH_START_SECTION("lexer_invalid_input: punctuation (#)")
    4247             :     {
    4248           2 :         std::string str("#re_oops");
    4249             : 
    4250           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    4251           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    4252           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_UNEXPECTED_PUNCTUATION;
    4253           1 :         expected.f_pos.set_filename("unknown-file");
    4254           1 :         expected.f_pos.set_function("unknown-func");
    4255           1 :         expected.f_message = "unexpected punctuation \"#\"";
    4256             : 
    4257           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    4258           1 :         tc.f_expected.push_back(expected);
    4259             : 
    4260           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4261           1 :         *input << str;
    4262           1 :         as2js::options::pointer_t options(new as2js::options);
    4263           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4264           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    4265           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    4266           1 :         tc.got_called();
    4267             : //std::cerr << *token;
    4268           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4269           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    4270           1 :         std::string expected_identifier;
    4271           1 :         expected_identifier += "re_oops";
    4272           1 :         CATCH_REQUIRE(token->get_string() == expected_identifier);
    4273           1 :     }
    4274           5 :     CATCH_END_SECTION()
    4275             : 
    4276           5 :     CATCH_START_SECTION("lexer_invalid_input: unknown escape letter (0x2028)")
    4277             :     {
    4278           1 :         std::string str;
    4279           1 :         str += '\\';
    4280           1 :         str += libutf8::to_u8string(static_cast<char32_t>(0x2028));
    4281           1 :         str += "no_continuation";
    4282             : 
    4283           1 :         SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    4284           1 :         expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    4285           1 :         expected.f_error_code = as2js::err_code_t::AS_ERR_UNKNOWN_ESCAPE_SEQUENCE;
    4286           1 :         expected.f_pos.set_filename("unknown-file");
    4287           1 :         expected.f_pos.set_function("unknown-func");
    4288           1 :         expected.f_pos.new_line();
    4289           1 :         expected.f_message = "unknown escape letter \"\\U002028\"";
    4290             : 
    4291           1 :         SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    4292           1 :         tc.f_expected.push_back(expected);
    4293             : 
    4294           1 :         as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4295           1 :         *input << str;
    4296           1 :         as2js::options::pointer_t options(new as2js::options);
    4297           3 :         as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4298           1 :         CATCH_REQUIRE(lexer->get_input() == input);
    4299           1 :         as2js::node::pointer_t token(lexer->get_next_token(true));
    4300             : //std::cerr << *token;
    4301           1 :         tc.got_called();
    4302           1 :         CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4303           1 :         CATCH_REQUIRE(token->get_children_size() == 0);
    4304           1 :         std::string expected_identifier;
    4305           1 :         expected_identifier += "no_continuation";
    4306           1 :         CATCH_REQUIRE(token->get_string() == expected_identifier);
    4307           1 :     }
    4308           5 :     CATCH_END_SECTION()
    4309             : 
    4310           5 :     CATCH_START_SECTION("lexer_invalid_input: surrogates in utf8")
    4311             :     {
    4312        2051 :         for(int idx(0xD800 - 2); idx < 0xE000; ++idx)
    4313             :         {
    4314        2050 :             std::string str;
    4315        2050 :             char32_t character(idx == 0xD800 - 2 ? 0xFFFE : (idx == 0xD800 - 1 ? 0xFFFF : idx));
    4316             :             //str += libutf8::to_u8string(character); -- these are not valid characters so libutf8 throws here...
    4317        2050 :             str += 0xE0 + (character >> 12);
    4318        2050 :             str += 0x80 + ((character >> 6) & 0x3F);
    4319        2050 :             str += 0x80 + (character & 0x3F);
    4320        2050 :             str += "invalid";
    4321             : 
    4322        2050 :             SNAP_CATCH2_NAMESPACE::test_callback::expected_t expected;
    4323        2050 :             expected.f_message_level = as2js::message_level_t::MESSAGE_LEVEL_ERROR;
    4324        2050 :             expected.f_error_code = as2js::err_code_t::AS_ERR_UNEXPECTED_PUNCTUATION;
    4325        2050 :             expected.f_pos.set_filename("unknown-file");
    4326        2050 :             expected.f_pos.set_function("unknown-func");
    4327        2050 :             switch(character)
    4328             :             {
    4329           1 :             case 0xFFFE:
    4330           1 :                 expected.f_message = "invalid character \"\\U00fffe\" found as is in the input stream.";
    4331           1 :                 break;
    4332             : 
    4333           1 :             case 0xFFFF:
    4334           1 :                 expected.f_message = "invalid character \"\\U00ffff\" found as is in the input stream.";
    4335           1 :                 break;
    4336             : 
    4337        2048 :             default:
    4338        4096 :                 std::stringstream ss;
    4339        2048 :                 ss << std::hex
    4340        2048 :                    << "\\x"
    4341        2048 :                    << static_cast<std::uint32_t>(static_cast<std::uint8_t>(str[0]))
    4342        2048 :                    << " \\x"
    4343        2048 :                    << static_cast<std::uint32_t>(static_cast<std::uint8_t>(str[1]))
    4344        2048 :                    << " \\x"
    4345        2048 :                    << static_cast<std::uint32_t>(static_cast<std::uint8_t>(str[2]));
    4346        2048 :                 expected.f_message = "unrecognized UTF-8 character encoding (" + ss.str() + ") found in input stream.";
    4347        2048 :                 break;
    4348             : 
    4349             :             }
    4350             : 
    4351        4100 :             SNAP_CATCH2_NAMESPACE::test_callback tc(false);
    4352        2050 :             tc.f_expected.push_back(expected);
    4353             : 
    4354        4100 :             as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    4355        2050 :             *input << str;
    4356        4100 :             as2js::options::pointer_t options(new as2js::options);
    4357        8200 :             as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    4358        2050 :             CATCH_REQUIRE(lexer->get_input() == input);
    4359        4100 :             as2js::node::pointer_t token(lexer->get_next_token(true));
    4360             : //std::cerr << *token;
    4361        2050 :             tc.got_called();
    4362        2050 :             CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    4363        2050 :             CATCH_REQUIRE(token->get_children_size() == 0);
    4364        4100 :             std::string expected_identifier;
    4365        2050 :             expected_identifier += "invalid";
    4366        2050 :             CATCH_REQUIRE(token->get_string() == expected_identifier);
    4367        2050 :         }
    4368             :     }
    4369           5 :     CATCH_END_SECTION()
    4370           5 : }
    4371             : 
    4372             : 
    4373             : namespace
    4374             : {
    4375             : 
    4376             : char const g_mixed_tokens_one[] =
    4377             :     /* LINE 1 */    "This is a 'long list' __LINE__ of tokens\n"
    4378             :     /* LINE 2 */    "so we can __LINE__ better test that\n"
    4379             :     /* LINE 3 */    "the lexer works as __LINE__ expected.\n"
    4380             : 
    4381             :     //
    4382             :     // All operators (in order found in node.h):
    4383             :     //   + = & ~ | ^ } ) ] : , ? / > < ! % * { ( [ . ; -
    4384             :     //   += &= |= ^= /= &&= ||= ^^= >?= <?= %= *= **= <%= >%= <<= >>= >>>= -=
    4385             :     //   () <=> --x == >= ++x <= && || ^^ ~= >? <? != ~! x++ x-- ** <% >% << >> >>> ~~ === !==
    4386             :     //
    4387             :                     // all operators should work the same with and without spaces
    4388             :     /* LINE 4 */    "var a = __LINE__ + 1000 * 34 / 2 << 3 % 5.01;\n"
    4389             :     /* LINE 5 */    "var a=__LINE__+1000*34/2<<3%5.01;\n"
    4390             :     /* LINE 6 */    "use octal(1); var $ &= - __LINE__ += 0b1111101000 *= 0x22 /= 02 <<= 03 %= 5.01;\n"
    4391             :     /* LINE 7 */    "var $&=-__LINE__+=0b1111101000*=0x22/=02<<=03%=5.01;\n"
    4392             :     /* LINE 8 */    "var _$_ |= ~ __LINE__ ^ 0b1010101010 & 0x10201 - 02 >> 03710 ? 5.01 : 6.02;\n"
    4393             :     /* LINE 9 */    "var _$_|=~__LINE__^0b1010101010&0x10201-02>>03710?5.01:6.02;\n"
    4394             :     /* LINE 10 */   "use extended_operators(1); var $_ **= ! __LINE__ ^= 0b1010101010 ~= 0x10201 -= 02 >>= 03710 ~~ 5.01;\n"
    4395             :     /* LINE 11 */   "var $_**=!__LINE__^=0b1010101010~=0x10201-=02>>=03710~~5.01;\n"
    4396             :     /* LINE 12 */   "var f_field <?= $ . foo(__LINE__, a ++ >? $) ^ $_ [ 0b1111111111 ] ** 0xFF10201000 >>> 0112 ^^ 3710 == 5.01;\n"
    4397             :     /* LINE 13 */   "var f_field<?=$.foo(__LINE__,a++>?$)^$_[0b1111111111]**0xFF10201000>>>0112^^3710==5.01;\n"
    4398             :     /* LINE 14 */   "{ var f_field >?= \xEF\xBC\x91 . foo ( __LINE__, -- a <? $ ) != $_ [ 0b11111011111 ] <=> 0xFF10201000 >>>= 0112 ^^= 3710 === 5.01; }\n"
    4399             :     /* LINE 15 */   "{var f_field>?=\xEF\xBC\x91.foo(__LINE__,--a<?$)!=$_[0b11111011111]<=>0xFF10201000>>>=0112^^=3710===5.01;}\n"
    4400             :     /* LINE 16 */   "var b &&= __LINE__ && 1000 || 34 <% 2 >% 3 !== 5.01 , a --;\n"
    4401             :     /* LINE 17 */   "var b&&=__LINE__&&1000||34<%2>%3!==5.01,a--;\n"
    4402             :     /* LINE 18 */   "var c ||= __LINE__ <= 1000 >= 34 <%= 2 >%= 3 !== 5.01 , ++ a;\n"
    4403             :     /* LINE 19 */   "var c||=__LINE__<=1000>=34<%=2>%=3!==5.01,++a;\n"
    4404             :     /* LINE 20 */   "var c |= __LINE__ | 1000 > 34 < 2 ~! 3 .. 5 . length;\n"
    4405             :     /* LINE 21 */   "var c|=__LINE__|1000>34<2~!3..5.length;\n"
    4406             : 
    4407             :     /* LINE 22 */   "abstract function long_shot(a: String, b: Number, c: double, ...);\n"
    4408             :     /* LINE 23 */   "use extended_operators(2); var q = 91.e+j;\n"
    4409             : ;
    4410             : 
    4411             : result_t const g_mixed_results_one[] =
    4412             : {
    4413             :     // LINE 1 --    "This is a 'long list' __LINE__ of tokens\n"
    4414             :     {
    4415             :         as2js::node_t::NODE_IDENTIFIER,
    4416             :         CHECK_VALUE_STRING, 0, 0.0, "This", false,
    4417             :         nullptr,
    4418             :     },
    4419             :     {
    4420             :         as2js::node_t::NODE_IS,
    4421             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4422             :         nullptr,
    4423             :     },
    4424             :     {
    4425             :         as2js::node_t::NODE_IDENTIFIER,
    4426             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    4427             :         nullptr,
    4428             :     },
    4429             :     {
    4430             :         as2js::node_t::NODE_STRING,
    4431             :         CHECK_VALUE_STRING, 0, 0.0, "long list", false,
    4432             :         nullptr,
    4433             :     },
    4434             :     {
    4435             :         as2js::node_t::NODE_INTEGER,
    4436             :         CHECK_VALUE_INTEGER, 1, 0.0, "of", false,
    4437             :         nullptr,
    4438             :     },
    4439             :     {
    4440             :         as2js::node_t::NODE_IDENTIFIER,
    4441             :         CHECK_VALUE_STRING, 0, 0.0, "of", false,
    4442             :         nullptr,
    4443             :     },
    4444             :     {
    4445             :         as2js::node_t::NODE_IDENTIFIER,
    4446             :         CHECK_VALUE_STRING, 0, 0.0, "tokens", false,
    4447             :         nullptr,
    4448             :     },
    4449             : 
    4450             :     // LINE 2 --    "so we can __LINE__ better test that\n"
    4451             :     {
    4452             :         as2js::node_t::NODE_IDENTIFIER,
    4453             :         CHECK_VALUE_STRING, 0, 0.0, "so", false,
    4454             :         nullptr,
    4455             :     },
    4456             :     {
    4457             :         as2js::node_t::NODE_IDENTIFIER,
    4458             :         CHECK_VALUE_STRING, 0, 0.0, "we", false,
    4459             :         nullptr,
    4460             :     },
    4461             :     {
    4462             :         as2js::node_t::NODE_IDENTIFIER,
    4463             :         CHECK_VALUE_STRING, 0, 0.0, "can", false,
    4464             :         nullptr,
    4465             :     },
    4466             :     {
    4467             :         as2js::node_t::NODE_INTEGER,
    4468             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    4469             :         nullptr,
    4470             :     },
    4471             :     {
    4472             :         as2js::node_t::NODE_IDENTIFIER,
    4473             :         CHECK_VALUE_STRING, 0, 0.0, "better", false,
    4474             :         nullptr,
    4475             :     },
    4476             :     {
    4477             :         as2js::node_t::NODE_IDENTIFIER,
    4478             :         CHECK_VALUE_STRING, 0, 0.0, "test", false,
    4479             :         nullptr,
    4480             :     },
    4481             :     {
    4482             :         as2js::node_t::NODE_IDENTIFIER,
    4483             :         CHECK_VALUE_STRING, 0, 0.0, "that", false,
    4484             :         nullptr,
    4485             :     },
    4486             : 
    4487             :     // LINE 3 --    "the lexer works as __LINE__ expected.\n"
    4488             :     {
    4489             :         as2js::node_t::NODE_IDENTIFIER,
    4490             :         CHECK_VALUE_STRING, 0, 0.0, "the", false,
    4491             :         nullptr,
    4492             :     },
    4493             :     {
    4494             :         as2js::node_t::NODE_IDENTIFIER,
    4495             :         CHECK_VALUE_STRING, 0, 0.0, "lexer", false,
    4496             :         nullptr,
    4497             :     },
    4498             :     {
    4499             :         as2js::node_t::NODE_IDENTIFIER,
    4500             :         CHECK_VALUE_STRING, 0, 0.0, "works", false,
    4501             :         nullptr,
    4502             :     },
    4503             :     {
    4504             :         as2js::node_t::NODE_AS,
    4505             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4506             :         nullptr,
    4507             :     },
    4508             :     {
    4509             :         as2js::node_t::NODE_INTEGER,
    4510             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    4511             :         nullptr,
    4512             :     },
    4513             :     {
    4514             :         as2js::node_t::NODE_IDENTIFIER,
    4515             :         CHECK_VALUE_STRING, 0, 0.0, "expected", false,
    4516             :         nullptr,
    4517             :     },
    4518             :     {
    4519             :         as2js::node_t::NODE_MEMBER,
    4520             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4521             :         nullptr,
    4522             :     },
    4523             : 
    4524             :     // LINE 4 --    "var a = __LINE__ + 1000 * 34 / 2 << 3 % 5.01;\n"
    4525             :     {
    4526             :         as2js::node_t::NODE_VAR,
    4527             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4528             :         nullptr,
    4529             :     },
    4530             :     {
    4531             :         as2js::node_t::NODE_IDENTIFIER,
    4532             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    4533             :         nullptr,
    4534             :     },
    4535             :     {
    4536             :         as2js::node_t::NODE_ASSIGNMENT,
    4537             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4538             :         nullptr,
    4539             :     },
    4540             :     {
    4541             :         as2js::node_t::NODE_INTEGER,
    4542             :         CHECK_VALUE_INTEGER, 4, 0.0, "", false,
    4543             :         nullptr,
    4544             :     },
    4545             :     {
    4546             :         as2js::node_t::NODE_ADD,
    4547             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4548             :         nullptr,
    4549             :     },
    4550             :     {
    4551             :         as2js::node_t::NODE_INTEGER,
    4552             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    4553             :         nullptr,
    4554             :     },
    4555             :     {
    4556             :         as2js::node_t::NODE_MULTIPLY,
    4557             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4558             :         nullptr,
    4559             :     },
    4560             :     {
    4561             :         as2js::node_t::NODE_INTEGER,
    4562             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    4563             :         nullptr,
    4564             :     },
    4565             :     {
    4566             :         as2js::node_t::NODE_DIVIDE,
    4567             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4568             :         nullptr,
    4569             :     },
    4570             :     {
    4571             :         as2js::node_t::NODE_INTEGER,
    4572             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    4573             :         nullptr,
    4574             :     },
    4575             :     {
    4576             :         as2js::node_t::NODE_SHIFT_LEFT,
    4577             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4578             :         nullptr,
    4579             :     },
    4580             :     {
    4581             :         as2js::node_t::NODE_INTEGER,
    4582             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    4583             :         nullptr,
    4584             :     },
    4585             :     {
    4586             :         as2js::node_t::NODE_MODULO,
    4587             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4588             :         nullptr,
    4589             :     },
    4590             :     {
    4591             :         as2js::node_t::NODE_FLOATING_POINT,
    4592             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    4593             :         nullptr,
    4594             :     },
    4595             :     {
    4596             :         as2js::node_t::NODE_SEMICOLON,
    4597             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4598             :         nullptr,
    4599             :     },
    4600             : 
    4601             :     // LINE 5 --    "var a=__LINE__+1000*34/2<<3%5.01;\n"
    4602             :     {
    4603             :         as2js::node_t::NODE_VAR,
    4604             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4605             :         nullptr,
    4606             :     },
    4607             :     {
    4608             :         as2js::node_t::NODE_IDENTIFIER,
    4609             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    4610             :         nullptr,
    4611             :     },
    4612             :     {
    4613             :         as2js::node_t::NODE_ASSIGNMENT,
    4614             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4615             :         nullptr,
    4616             :     },
    4617             :     {
    4618             :         as2js::node_t::NODE_INTEGER,
    4619             :         CHECK_VALUE_INTEGER, 5, 0.0, "", false,
    4620             :         nullptr,
    4621             :     },
    4622             :     {
    4623             :         as2js::node_t::NODE_ADD,
    4624             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4625             :         nullptr,
    4626             :     },
    4627             :     {
    4628             :         as2js::node_t::NODE_INTEGER,
    4629             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    4630             :         nullptr,
    4631             :     },
    4632             :     {
    4633             :         as2js::node_t::NODE_MULTIPLY,
    4634             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4635             :         nullptr,
    4636             :     },
    4637             :     {
    4638             :         as2js::node_t::NODE_INTEGER,
    4639             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    4640             :         nullptr,
    4641             :     },
    4642             :     {
    4643             :         as2js::node_t::NODE_DIVIDE,
    4644             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4645             :         nullptr,
    4646             :     },
    4647             :     {
    4648             :         as2js::node_t::NODE_INTEGER,
    4649             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    4650             :         nullptr,
    4651             :     },
    4652             :     {
    4653             :         as2js::node_t::NODE_SHIFT_LEFT,
    4654             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4655             :         nullptr,
    4656             :     },
    4657             :     {
    4658             :         as2js::node_t::NODE_INTEGER,
    4659             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    4660             :         nullptr,
    4661             :     },
    4662             :     {
    4663             :         as2js::node_t::NODE_MODULO,
    4664             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4665             :         nullptr,
    4666             :     },
    4667             :     {
    4668             :         as2js::node_t::NODE_FLOATING_POINT,
    4669             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    4670             :         nullptr,
    4671             :     },
    4672             :     {
    4673             :         as2js::node_t::NODE_SEMICOLON,
    4674             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4675             :         nullptr,
    4676             :     },
    4677             : 
    4678             :     // LINE 6 --    "use octal(1); var $ &= - __LINE__ += 0b1111101000 *= 0x22 /= 2 <<= 3 %= 5.01;\n"
    4679             :     {
    4680             :         as2js::node_t::NODE_VAR,
    4681             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4682             :         nullptr,
    4683             :     },
    4684             :     {
    4685             :         as2js::node_t::NODE_IDENTIFIER,
    4686             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    4687             :         nullptr,
    4688             :     },
    4689             :     {
    4690             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_AND,
    4691             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4692             :         nullptr,
    4693             :     },
    4694             :     {
    4695             :         as2js::node_t::NODE_SUBTRACT,
    4696             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4697             :         nullptr,
    4698             :     },
    4699             :     {
    4700             :         as2js::node_t::NODE_INTEGER,
    4701             :         CHECK_VALUE_INTEGER, 6, 0.0, "", false,
    4702             :         nullptr,
    4703             :     },
    4704             :     {
    4705             :         as2js::node_t::NODE_ASSIGNMENT_ADD,
    4706             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4707             :         nullptr,
    4708             :     },
    4709             :     {
    4710             :         as2js::node_t::NODE_INTEGER,
    4711             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    4712             :         nullptr,
    4713             :     },
    4714             :     {
    4715             :         as2js::node_t::NODE_ASSIGNMENT_MULTIPLY,
    4716             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4717             :         nullptr,
    4718             :     },
    4719             :     {
    4720             :         as2js::node_t::NODE_INTEGER,
    4721             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    4722             :         nullptr,
    4723             :     },
    4724             :     {
    4725             :         as2js::node_t::NODE_ASSIGNMENT_DIVIDE,
    4726             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4727             :         nullptr,
    4728             :     },
    4729             :     {
    4730             :         as2js::node_t::NODE_INTEGER,
    4731             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    4732             :         nullptr,
    4733             :     },
    4734             :     {
    4735             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_LEFT,
    4736             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4737             :         nullptr,
    4738             :     },
    4739             :     {
    4740             :         as2js::node_t::NODE_INTEGER,
    4741             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    4742             :         nullptr,
    4743             :     },
    4744             :     {
    4745             :         as2js::node_t::NODE_ASSIGNMENT_MODULO,
    4746             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4747             :         nullptr,
    4748             :     },
    4749             :     {
    4750             :         as2js::node_t::NODE_FLOATING_POINT,
    4751             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    4752             :         nullptr,
    4753             :     },
    4754             :     {
    4755             :         as2js::node_t::NODE_SEMICOLON,
    4756             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4757             :         nullptr,
    4758             :     },
    4759             : 
    4760             :     // LINE 7 --    "var $&=-__LINE__+=1000*=34/=2<<=3%=5.01;\n"
    4761             :     {
    4762             :         as2js::node_t::NODE_VAR,
    4763             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4764             :         nullptr,
    4765             :     },
    4766             :     {
    4767             :         as2js::node_t::NODE_IDENTIFIER,
    4768             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    4769             :         nullptr,
    4770             :     },
    4771             :     {
    4772             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_AND,
    4773             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4774             :         nullptr,
    4775             :     },
    4776             :     {
    4777             :         as2js::node_t::NODE_SUBTRACT,
    4778             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4779             :         nullptr,
    4780             :     },
    4781             :     {
    4782             :         as2js::node_t::NODE_INTEGER,
    4783             :         CHECK_VALUE_INTEGER, 7, 0.0, "", false,
    4784             :         nullptr,
    4785             :     },
    4786             :     {
    4787             :         as2js::node_t::NODE_ASSIGNMENT_ADD,
    4788             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4789             :         nullptr,
    4790             :     },
    4791             :     {
    4792             :         as2js::node_t::NODE_INTEGER,
    4793             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    4794             :         nullptr,
    4795             :     },
    4796             :     {
    4797             :         as2js::node_t::NODE_ASSIGNMENT_MULTIPLY,
    4798             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4799             :         nullptr,
    4800             :     },
    4801             :     {
    4802             :         as2js::node_t::NODE_INTEGER,
    4803             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    4804             :         nullptr,
    4805             :     },
    4806             :     {
    4807             :         as2js::node_t::NODE_ASSIGNMENT_DIVIDE,
    4808             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4809             :         nullptr,
    4810             :     },
    4811             :     {
    4812             :         as2js::node_t::NODE_INTEGER,
    4813             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    4814             :         nullptr,
    4815             :     },
    4816             :     {
    4817             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_LEFT,
    4818             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4819             :         nullptr,
    4820             :     },
    4821             :     {
    4822             :         as2js::node_t::NODE_INTEGER,
    4823             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    4824             :         nullptr,
    4825             :     },
    4826             :     {
    4827             :         as2js::node_t::NODE_ASSIGNMENT_MODULO,
    4828             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4829             :         nullptr,
    4830             :     },
    4831             :     {
    4832             :         as2js::node_t::NODE_FLOATING_POINT,
    4833             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    4834             :         nullptr,
    4835             :     },
    4836             :     {
    4837             :         as2js::node_t::NODE_SEMICOLON,
    4838             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4839             :         nullptr,
    4840             :     },
    4841             : 
    4842             :     // LINE 8 --    "var _$_ |= ~ __LINE__ ^ 0b1010101010 & 0x10201 - 02 >> 03710 ? 5.01 : 6.02;\n"
    4843             :     {
    4844             :         as2js::node_t::NODE_VAR,
    4845             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4846             :         nullptr,
    4847             :     },
    4848             :     {
    4849             :         as2js::node_t::NODE_IDENTIFIER,
    4850             :         CHECK_VALUE_STRING, 0, 0.0, "_$_", false,
    4851             :         nullptr,
    4852             :     },
    4853             :     {
    4854             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR,
    4855             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4856             :         nullptr,
    4857             :     },
    4858             :     {
    4859             :         as2js::node_t::NODE_BITWISE_NOT,
    4860             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4861             :         nullptr,
    4862             :     },
    4863             :     {
    4864             :         as2js::node_t::NODE_INTEGER,
    4865             :         CHECK_VALUE_INTEGER, 8, 0.0, "", false,
    4866             :         nullptr,
    4867             :     },
    4868             :     {
    4869             :         as2js::node_t::NODE_BITWISE_XOR,
    4870             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4871             :         nullptr,
    4872             :     },
    4873             :     {
    4874             :         as2js::node_t::NODE_INTEGER,
    4875             :         CHECK_VALUE_INTEGER, 682, 0.0, "", false,
    4876             :         nullptr,
    4877             :     },
    4878             :     {
    4879             :         as2js::node_t::NODE_BITWISE_AND,
    4880             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4881             :         nullptr,
    4882             :     },
    4883             :     {
    4884             :         as2js::node_t::NODE_INTEGER,
    4885             :         CHECK_VALUE_INTEGER, 66049, 0.0, "", false,
    4886             :         nullptr,
    4887             :     },
    4888             :     {
    4889             :         as2js::node_t::NODE_SUBTRACT,
    4890             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4891             :         nullptr,
    4892             :     },
    4893             :     {
    4894             :         as2js::node_t::NODE_INTEGER,
    4895             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    4896             :         nullptr,
    4897             :     },
    4898             :     {
    4899             :         as2js::node_t::NODE_SHIFT_RIGHT,
    4900             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4901             :         nullptr,
    4902             :     },
    4903             :     {
    4904             :         as2js::node_t::NODE_INTEGER,
    4905             :         CHECK_VALUE_INTEGER, 1992, 0.0, "", false,
    4906             :         nullptr,
    4907             :     },
    4908             :     {
    4909             :         as2js::node_t::NODE_CONDITIONAL,
    4910             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4911             :         nullptr,
    4912             :     },
    4913             :     {
    4914             :         as2js::node_t::NODE_FLOATING_POINT,
    4915             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    4916             :         nullptr,
    4917             :     },
    4918             :     {
    4919             :         as2js::node_t::NODE_COLON,
    4920             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4921             :         nullptr,
    4922             :     },
    4923             :     {
    4924             :         as2js::node_t::NODE_FLOATING_POINT,
    4925             :         CHECK_VALUE_FLOATING_POINT, 0, 6.02, "", false,
    4926             :         nullptr,
    4927             :     },
    4928             :     {
    4929             :         as2js::node_t::NODE_SEMICOLON,
    4930             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4931             :         nullptr,
    4932             :     },
    4933             : 
    4934             :     // LINE 9 --    "var _$_|=~__LINE__^0b1010101010&0x10201-02>>03710?5.01:6.02;\n"
    4935             :     {
    4936             :         as2js::node_t::NODE_VAR,
    4937             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4938             :         nullptr,
    4939             :     },
    4940             :     {
    4941             :         as2js::node_t::NODE_IDENTIFIER,
    4942             :         CHECK_VALUE_STRING, 0, 0.0, "_$_", false,
    4943             :         nullptr,
    4944             :     },
    4945             :     {
    4946             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR,
    4947             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4948             :         nullptr,
    4949             :     },
    4950             :     {
    4951             :         as2js::node_t::NODE_BITWISE_NOT,
    4952             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4953             :         nullptr,
    4954             :     },
    4955             :     {
    4956             :         as2js::node_t::NODE_INTEGER,
    4957             :         CHECK_VALUE_INTEGER, 9, 0.0, "", false,
    4958             :         nullptr,
    4959             :     },
    4960             :     {
    4961             :         as2js::node_t::NODE_BITWISE_XOR,
    4962             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4963             :         nullptr,
    4964             :     },
    4965             :     {
    4966             :         as2js::node_t::NODE_INTEGER,
    4967             :         CHECK_VALUE_INTEGER, 682, 0.0, "", false,
    4968             :         nullptr,
    4969             :     },
    4970             :     {
    4971             :         as2js::node_t::NODE_BITWISE_AND,
    4972             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4973             :         nullptr,
    4974             :     },
    4975             :     {
    4976             :         as2js::node_t::NODE_INTEGER,
    4977             :         CHECK_VALUE_INTEGER, 66049, 0.0, "", false,
    4978             :         nullptr,
    4979             :     },
    4980             :     {
    4981             :         as2js::node_t::NODE_SUBTRACT,
    4982             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4983             :         nullptr,
    4984             :     },
    4985             :     {
    4986             :         as2js::node_t::NODE_INTEGER,
    4987             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    4988             :         nullptr,
    4989             :     },
    4990             :     {
    4991             :         as2js::node_t::NODE_SHIFT_RIGHT,
    4992             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    4993             :         nullptr,
    4994             :     },
    4995             :     {
    4996             :         as2js::node_t::NODE_INTEGER,
    4997             :         CHECK_VALUE_INTEGER, 1992, 0.0, "", false,
    4998             :         nullptr,
    4999             :     },
    5000             :     {
    5001             :         as2js::node_t::NODE_CONDITIONAL,
    5002             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5003             :         nullptr,
    5004             :     },
    5005             :     {
    5006             :         as2js::node_t::NODE_FLOATING_POINT,
    5007             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5008             :         nullptr,
    5009             :     },
    5010             :     {
    5011             :         as2js::node_t::NODE_COLON,
    5012             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5013             :         nullptr,
    5014             :     },
    5015             :     {
    5016             :         as2js::node_t::NODE_FLOATING_POINT,
    5017             :         CHECK_VALUE_FLOATING_POINT, 0, 6.02, "", false,
    5018             :         nullptr,
    5019             :     },
    5020             :     {
    5021             :         as2js::node_t::NODE_SEMICOLON,
    5022             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5023             :         nullptr,
    5024             :     },
    5025             : 
    5026             :     // LINE 10 --   "use extended_operators(1); var $_ **= ! __LINE__ ^= 0b1010101010 ~= 0x10201 -= 02 >>= 03710 ~~ 5.01;\n"
    5027             :     {
    5028             :         as2js::node_t::NODE_VAR,
    5029             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5030             :         nullptr,
    5031             :     },
    5032             :     {
    5033             :         as2js::node_t::NODE_IDENTIFIER,
    5034             :         CHECK_VALUE_STRING, 0, 0.0, "$_", false,
    5035             :         nullptr,
    5036             :     },
    5037             :     {
    5038             :         as2js::node_t::NODE_ASSIGNMENT_POWER,
    5039             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5040             :         nullptr,
    5041             :     },
    5042             :     {
    5043             :         as2js::node_t::NODE_LOGICAL_NOT,
    5044             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5045             :         nullptr,
    5046             :     },
    5047             :     {
    5048             :         as2js::node_t::NODE_INTEGER,
    5049             :         CHECK_VALUE_INTEGER, 10, 0.0, "", false,
    5050             :         nullptr,
    5051             :     },
    5052             :     {
    5053             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_XOR,
    5054             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5055             :         nullptr,
    5056             :     },
    5057             :     {
    5058             :         as2js::node_t::NODE_INTEGER,
    5059             :         CHECK_VALUE_INTEGER, 682, 0.0, "", false,
    5060             :         nullptr,
    5061             :     },
    5062             :     {
    5063             :         as2js::node_t::NODE_MATCH,
    5064             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5065             :         nullptr,
    5066             :     },
    5067             :     {
    5068             :         as2js::node_t::NODE_INTEGER,
    5069             :         CHECK_VALUE_INTEGER, 66049, 0.0, "", false,
    5070             :         nullptr,
    5071             :     },
    5072             :     {
    5073             :         as2js::node_t::NODE_ASSIGNMENT_SUBTRACT,
    5074             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5075             :         nullptr,
    5076             :     },
    5077             :     {
    5078             :         as2js::node_t::NODE_INTEGER,
    5079             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    5080             :         nullptr,
    5081             :     },
    5082             :     {
    5083             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT,
    5084             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5085             :         nullptr,
    5086             :     },
    5087             :     {
    5088             :         as2js::node_t::NODE_INTEGER,
    5089             :         CHECK_VALUE_INTEGER, 1992, 0.0, "", false,
    5090             :         nullptr,
    5091             :     },
    5092             :     {
    5093             :         as2js::node_t::NODE_SMART_MATCH,
    5094             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5095             :         nullptr,
    5096             :     },
    5097             :     {
    5098             :         as2js::node_t::NODE_FLOATING_POINT,
    5099             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5100             :         nullptr,
    5101             :     },
    5102             :     {
    5103             :         as2js::node_t::NODE_SEMICOLON,
    5104             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5105             :         nullptr,
    5106             :     },
    5107             : 
    5108             :     // LINE 11 --   "var $_**=!__LINE__^=0b1010101010~=0x10201-=02>>=03710~~5.01;\n"
    5109             :     {
    5110             :         as2js::node_t::NODE_VAR,
    5111             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5112             :         nullptr,
    5113             :     },
    5114             :     {
    5115             :         as2js::node_t::NODE_IDENTIFIER,
    5116             :         CHECK_VALUE_STRING, 0, 0.0, "$_", false,
    5117             :         nullptr,
    5118             :     },
    5119             :     {
    5120             :         as2js::node_t::NODE_ASSIGNMENT_POWER,
    5121             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5122             :         nullptr,
    5123             :     },
    5124             :     {
    5125             :         as2js::node_t::NODE_LOGICAL_NOT,
    5126             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5127             :         nullptr,
    5128             :     },
    5129             :     {
    5130             :         as2js::node_t::NODE_INTEGER,
    5131             :         CHECK_VALUE_INTEGER, 11, 0.0, "", false,
    5132             :         nullptr,
    5133             :     },
    5134             :     {
    5135             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_XOR,
    5136             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5137             :         nullptr,
    5138             :     },
    5139             :     {
    5140             :         as2js::node_t::NODE_INTEGER,
    5141             :         CHECK_VALUE_INTEGER, 682, 0.0, "", false,
    5142             :         nullptr,
    5143             :     },
    5144             :     {
    5145             :         as2js::node_t::NODE_MATCH,
    5146             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5147             :         nullptr,
    5148             :     },
    5149             :     {
    5150             :         as2js::node_t::NODE_INTEGER,
    5151             :         CHECK_VALUE_INTEGER, 66049, 0.0, "", false,
    5152             :         nullptr,
    5153             :     },
    5154             :     {
    5155             :         as2js::node_t::NODE_ASSIGNMENT_SUBTRACT,
    5156             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5157             :         nullptr,
    5158             :     },
    5159             :     {
    5160             :         as2js::node_t::NODE_INTEGER,
    5161             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    5162             :         nullptr,
    5163             :     },
    5164             :     {
    5165             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT,
    5166             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5167             :         nullptr,
    5168             :     },
    5169             :     {
    5170             :         as2js::node_t::NODE_INTEGER,
    5171             :         CHECK_VALUE_INTEGER, 1992, 0.0, "", false,
    5172             :         nullptr,
    5173             :     },
    5174             :     {
    5175             :         as2js::node_t::NODE_SMART_MATCH,
    5176             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5177             :         nullptr,
    5178             :     },
    5179             :     {
    5180             :         as2js::node_t::NODE_FLOATING_POINT,
    5181             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5182             :         nullptr,
    5183             :     },
    5184             :     {
    5185             :         as2js::node_t::NODE_SEMICOLON,
    5186             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5187             :         nullptr,
    5188             :     },
    5189             : 
    5190             :     // LINE 12 --   "var f_field <?= $.foo(__LINE__, a >? $) ^ $_ [ 0b1111111111 ] ** 0xFF10201000 >>> 0112 ^^ 3710 == 5.01;\n"
    5191             :     {
    5192             :         as2js::node_t::NODE_VAR,
    5193             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5194             :         nullptr,
    5195             :     },
    5196             :     {
    5197             :         as2js::node_t::NODE_IDENTIFIER,
    5198             :         CHECK_VALUE_STRING, 0, 0.0, "f_field", false,
    5199             :         nullptr,
    5200             :     },
    5201             :     {
    5202             :         as2js::node_t::NODE_ASSIGNMENT_MINIMUM,
    5203             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5204             :         nullptr,
    5205             :     },
    5206             :     {
    5207             :         as2js::node_t::NODE_IDENTIFIER,
    5208             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    5209             :         nullptr,
    5210             :     },
    5211             :     {
    5212             :         as2js::node_t::NODE_MEMBER,
    5213             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5214             :         nullptr,
    5215             :     },
    5216             :     {
    5217             :         as2js::node_t::NODE_IDENTIFIER,
    5218             :         CHECK_VALUE_STRING, 0, 0.0, "foo", false,
    5219             :         nullptr,
    5220             :     },
    5221             :     {
    5222             :         as2js::node_t::NODE_OPEN_PARENTHESIS,
    5223             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5224             :         nullptr,
    5225             :     },
    5226             :     {
    5227             :         as2js::node_t::NODE_INTEGER,
    5228             :         CHECK_VALUE_INTEGER, 12, 0.0, "", false,
    5229             :         nullptr,
    5230             :     },
    5231             :     {
    5232             :         as2js::node_t::NODE_COMMA,
    5233             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5234             :         nullptr,
    5235             :     },
    5236             :     {
    5237             :         as2js::node_t::NODE_IDENTIFIER,
    5238             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    5239             :         nullptr,
    5240             :     },
    5241             :     {
    5242             :         as2js::node_t::NODE_INCREMENT,
    5243             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5244             :         nullptr,
    5245             :     },
    5246             :     {
    5247             :         as2js::node_t::NODE_MAXIMUM,
    5248             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5249             :         nullptr,
    5250             :     },
    5251             :     {
    5252             :         as2js::node_t::NODE_IDENTIFIER,
    5253             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    5254             :         nullptr,
    5255             :     },
    5256             :     {
    5257             :         as2js::node_t::NODE_CLOSE_PARENTHESIS,
    5258             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5259             :         nullptr,
    5260             :     },
    5261             :     {
    5262             :         as2js::node_t::NODE_BITWISE_XOR,
    5263             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5264             :         nullptr,
    5265             :     },
    5266             :     {
    5267             :         as2js::node_t::NODE_IDENTIFIER,
    5268             :         CHECK_VALUE_STRING, 0, 0.0, "$_", false,
    5269             :         nullptr,
    5270             :     },
    5271             :     {
    5272             :         as2js::node_t::NODE_OPEN_SQUARE_BRACKET,
    5273             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5274             :         nullptr,
    5275             :     },
    5276             :     {
    5277             :         as2js::node_t::NODE_INTEGER,
    5278             :         CHECK_VALUE_INTEGER, 1023, 0.0, "", false,
    5279             :         nullptr,
    5280             :     },
    5281             :     {
    5282             :         as2js::node_t::NODE_CLOSE_SQUARE_BRACKET,
    5283             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5284             :         nullptr,
    5285             :     },
    5286             :     {
    5287             :         as2js::node_t::NODE_POWER,
    5288             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5289             :         nullptr,
    5290             :     },
    5291             :     {
    5292             :         as2js::node_t::NODE_INTEGER,
    5293             :         CHECK_VALUE_INTEGER, 1095487197184, 0.0, "", false,
    5294             :         nullptr,
    5295             :     },
    5296             :     {
    5297             :         as2js::node_t::NODE_SHIFT_RIGHT_UNSIGNED,
    5298             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5299             :         nullptr,
    5300             :     },
    5301             :     {
    5302             :         as2js::node_t::NODE_INTEGER,
    5303             :         CHECK_VALUE_INTEGER, 74, 0.0, "", false,
    5304             :         nullptr,
    5305             :     },
    5306             :     {
    5307             :         as2js::node_t::NODE_LOGICAL_XOR,
    5308             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5309             :         nullptr,
    5310             :     },
    5311             :     {
    5312             :         as2js::node_t::NODE_INTEGER,
    5313             :         CHECK_VALUE_INTEGER, 3710, 0.0, "", false,
    5314             :         nullptr,
    5315             :     },
    5316             :     {
    5317             :         as2js::node_t::NODE_EQUAL,
    5318             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5319             :         nullptr,
    5320             :     },
    5321             :     {
    5322             :         as2js::node_t::NODE_FLOATING_POINT,
    5323             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5324             :         nullptr,
    5325             :     },
    5326             :     {
    5327             :         as2js::node_t::NODE_SEMICOLON,
    5328             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5329             :         nullptr,
    5330             :     },
    5331             : 
    5332             :     // LINE 13 --   "var f_field<?=$.foo(__LINE__,a>?$)^$_[0b1111111111]**0xFF10201000>>>0112^^3710==5.01;\n"
    5333             :     {
    5334             :         as2js::node_t::NODE_VAR,
    5335             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5336             :         nullptr,
    5337             :     },
    5338             :     {
    5339             :         as2js::node_t::NODE_IDENTIFIER,
    5340             :         CHECK_VALUE_STRING, 0, 0.0, "f_field", false,
    5341             :         nullptr,
    5342             :     },
    5343             :     {
    5344             :         as2js::node_t::NODE_ASSIGNMENT_MINIMUM,
    5345             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5346             :         nullptr,
    5347             :     },
    5348             :     {
    5349             :         as2js::node_t::NODE_IDENTIFIER,
    5350             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    5351             :         nullptr,
    5352             :     },
    5353             :     {
    5354             :         as2js::node_t::NODE_MEMBER,
    5355             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5356             :         nullptr,
    5357             :     },
    5358             :     {
    5359             :         as2js::node_t::NODE_IDENTIFIER,
    5360             :         CHECK_VALUE_STRING, 0, 0.0, "foo", false,
    5361             :         nullptr,
    5362             :     },
    5363             :     {
    5364             :         as2js::node_t::NODE_OPEN_PARENTHESIS,
    5365             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5366             :         nullptr,
    5367             :     },
    5368             :     {
    5369             :         as2js::node_t::NODE_INTEGER,
    5370             :         CHECK_VALUE_INTEGER, 13, 0.0, "", false,
    5371             :         nullptr,
    5372             :     },
    5373             :     {
    5374             :         as2js::node_t::NODE_COMMA,
    5375             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5376             :         nullptr,
    5377             :     },
    5378             :     {
    5379             :         as2js::node_t::NODE_IDENTIFIER,
    5380             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    5381             :         nullptr,
    5382             :     },
    5383             :     {
    5384             :         as2js::node_t::NODE_INCREMENT,
    5385             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5386             :         nullptr,
    5387             :     },
    5388             :     {
    5389             :         as2js::node_t::NODE_MAXIMUM,
    5390             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5391             :         nullptr,
    5392             :     },
    5393             :     {
    5394             :         as2js::node_t::NODE_IDENTIFIER,
    5395             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    5396             :         nullptr,
    5397             :     },
    5398             :     {
    5399             :         as2js::node_t::NODE_CLOSE_PARENTHESIS,
    5400             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5401             :         nullptr,
    5402             :     },
    5403             :     {
    5404             :         as2js::node_t::NODE_BITWISE_XOR,
    5405             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5406             :         nullptr,
    5407             :     },
    5408             :     {
    5409             :         as2js::node_t::NODE_IDENTIFIER,
    5410             :         CHECK_VALUE_STRING, 0, 0.0, "$_", false,
    5411             :         nullptr,
    5412             :     },
    5413             :     {
    5414             :         as2js::node_t::NODE_OPEN_SQUARE_BRACKET,
    5415             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5416             :         nullptr,
    5417             :     },
    5418             :     {
    5419             :         as2js::node_t::NODE_INTEGER,
    5420             :         CHECK_VALUE_INTEGER, 1023, 0.0, "", false,
    5421             :         nullptr,
    5422             :     },
    5423             :     {
    5424             :         as2js::node_t::NODE_CLOSE_SQUARE_BRACKET,
    5425             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5426             :         nullptr,
    5427             :     },
    5428             :     {
    5429             :         as2js::node_t::NODE_POWER,
    5430             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5431             :         nullptr,
    5432             :     },
    5433             :     {
    5434             :         as2js::node_t::NODE_INTEGER,
    5435             :         CHECK_VALUE_INTEGER, 1095487197184, 0.0, "", false,
    5436             :         nullptr,
    5437             :     },
    5438             :     {
    5439             :         as2js::node_t::NODE_SHIFT_RIGHT_UNSIGNED,
    5440             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5441             :         nullptr,
    5442             :     },
    5443             :     {
    5444             :         as2js::node_t::NODE_INTEGER,
    5445             :         CHECK_VALUE_INTEGER, 74, 0.0, "", false,
    5446             :         nullptr,
    5447             :     },
    5448             :     {
    5449             :         as2js::node_t::NODE_LOGICAL_XOR,
    5450             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5451             :         nullptr,
    5452             :     },
    5453             :     {
    5454             :         as2js::node_t::NODE_INTEGER,
    5455             :         CHECK_VALUE_INTEGER, 3710, 0.0, "", false,
    5456             :         nullptr,
    5457             :     },
    5458             :     {
    5459             :         as2js::node_t::NODE_EQUAL,
    5460             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5461             :         nullptr,
    5462             :     },
    5463             :     {
    5464             :         as2js::node_t::NODE_FLOATING_POINT,
    5465             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5466             :         nullptr,
    5467             :     },
    5468             :     {
    5469             :         as2js::node_t::NODE_SEMICOLON,
    5470             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5471             :         nullptr,
    5472             :     },
    5473             : 
    5474             :     // LINE 14 --   "{ var f_field >?= \xFF11.foo(__LINE__, --a <? $) != $_ [ 0b11111011111 ] <=> 0xFF10201000 >>>= 0112 ^^ 3710 == 5.01; }\n"
    5475             :     {
    5476             :         as2js::node_t::NODE_OPEN_CURVLY_BRACKET,
    5477             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5478             :         nullptr,
    5479             :     },
    5480             :     {
    5481             :         as2js::node_t::NODE_VAR,
    5482             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5483             :         nullptr,
    5484             :     },
    5485             :     {
    5486             :         as2js::node_t::NODE_IDENTIFIER,
    5487             :         CHECK_VALUE_STRING, 0, 0.0, "f_field", false,
    5488             :         nullptr,
    5489             :     },
    5490             :     {
    5491             :         as2js::node_t::NODE_ASSIGNMENT_MAXIMUM,
    5492             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5493             :         nullptr,
    5494             :     },
    5495             :     {
    5496             :         as2js::node_t::NODE_IDENTIFIER,
    5497             :         CHECK_VALUE_STRING, 0, 0.0, "\xEF\xBC\x91", false, // char 0xFF11
    5498             :         nullptr,
    5499             :     },
    5500             :     {
    5501             :         as2js::node_t::NODE_MEMBER,
    5502             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5503             :         nullptr,
    5504             :     },
    5505             :     {
    5506             :         as2js::node_t::NODE_IDENTIFIER,
    5507             :         CHECK_VALUE_STRING, 0, 0.0, "foo", false,
    5508             :         nullptr,
    5509             :     },
    5510             :     {
    5511             :         as2js::node_t::NODE_OPEN_PARENTHESIS,
    5512             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5513             :         nullptr,
    5514             :     },
    5515             :     {
    5516             :         as2js::node_t::NODE_INTEGER,
    5517             :         CHECK_VALUE_INTEGER, 14, 0.0, "", false,
    5518             :         nullptr,
    5519             :     },
    5520             :     {
    5521             :         as2js::node_t::NODE_COMMA,
    5522             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5523             :         nullptr,
    5524             :     },
    5525             :     {
    5526             :         as2js::node_t::NODE_DECREMENT,
    5527             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5528             :         nullptr,
    5529             :     },
    5530             :     {
    5531             :         as2js::node_t::NODE_IDENTIFIER,
    5532             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    5533             :         nullptr,
    5534             :     },
    5535             :     {
    5536             :         as2js::node_t::NODE_MINIMUM,
    5537             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5538             :         nullptr,
    5539             :     },
    5540             :     {
    5541             :         as2js::node_t::NODE_IDENTIFIER,
    5542             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    5543             :         nullptr,
    5544             :     },
    5545             :     {
    5546             :         as2js::node_t::NODE_CLOSE_PARENTHESIS,
    5547             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5548             :         nullptr,
    5549             :     },
    5550             :     {
    5551             :         as2js::node_t::NODE_NOT_EQUAL,
    5552             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5553             :         nullptr,
    5554             :     },
    5555             :     {
    5556             :         as2js::node_t::NODE_IDENTIFIER,
    5557             :         CHECK_VALUE_STRING, 0, 0.0, "$_", false,
    5558             :         nullptr,
    5559             :     },
    5560             :     {
    5561             :         as2js::node_t::NODE_OPEN_SQUARE_BRACKET,
    5562             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5563             :         nullptr,
    5564             :     },
    5565             :     {
    5566             :         as2js::node_t::NODE_INTEGER,
    5567             :         CHECK_VALUE_INTEGER, 2015, 0.0, "", false,
    5568             :         nullptr,
    5569             :     },
    5570             :     {
    5571             :         as2js::node_t::NODE_CLOSE_SQUARE_BRACKET,
    5572             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5573             :         nullptr,
    5574             :     },
    5575             :     {
    5576             :         as2js::node_t::NODE_COMPARE,
    5577             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5578             :         nullptr,
    5579             :     },
    5580             :     {
    5581             :         as2js::node_t::NODE_INTEGER,
    5582             :         CHECK_VALUE_INTEGER, 1095487197184, 0.0, "", false,
    5583             :         nullptr,
    5584             :     },
    5585             :     {
    5586             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT_UNSIGNED,
    5587             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5588             :         nullptr,
    5589             :     },
    5590             :     {
    5591             :         as2js::node_t::NODE_INTEGER,
    5592             :         CHECK_VALUE_INTEGER, 74, 0.0, "", false,
    5593             :         nullptr,
    5594             :     },
    5595             :     {
    5596             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_XOR,
    5597             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5598             :         nullptr,
    5599             :     },
    5600             :     {
    5601             :         as2js::node_t::NODE_INTEGER,
    5602             :         CHECK_VALUE_INTEGER, 3710, 0.0, "", false,
    5603             :         nullptr,
    5604             :     },
    5605             :     {
    5606             :         as2js::node_t::NODE_STRICTLY_EQUAL,
    5607             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5608             :         nullptr,
    5609             :     },
    5610             :     {
    5611             :         as2js::node_t::NODE_FLOATING_POINT,
    5612             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5613             :         nullptr,
    5614             :     },
    5615             :     {
    5616             :         as2js::node_t::NODE_SEMICOLON,
    5617             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5618             :         nullptr,
    5619             :     },
    5620             :     {
    5621             :         as2js::node_t::NODE_CLOSE_CURVLY_BRACKET,
    5622             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5623             :         nullptr,
    5624             :     },
    5625             : 
    5626             :     // LINE 15 --   "{var f_field>?=\xFF11.foo(__LINE__,--a<?$)!=$_[0b11111011111]<=>0xFF10201000>>>=0112^^=3710===5.01;}\n"
    5627             :     {
    5628             :         as2js::node_t::NODE_OPEN_CURVLY_BRACKET,
    5629             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5630             :         nullptr,
    5631             :     },
    5632             :     {
    5633             :         as2js::node_t::NODE_VAR,
    5634             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5635             :         nullptr,
    5636             :     },
    5637             :     {
    5638             :         as2js::node_t::NODE_IDENTIFIER,
    5639             :         CHECK_VALUE_STRING, 0, 0.0, "f_field", false,
    5640             :         nullptr,
    5641             :     },
    5642             :     {
    5643             :         as2js::node_t::NODE_ASSIGNMENT_MAXIMUM,
    5644             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5645             :         nullptr,
    5646             :     },
    5647             :     {
    5648             :         as2js::node_t::NODE_IDENTIFIER,
    5649             :         CHECK_VALUE_STRING, 0, 0.0, "\xEF\xBC\x91", false, // char 0xFF11
    5650             :         nullptr,
    5651             :     },
    5652             :     {
    5653             :         as2js::node_t::NODE_MEMBER,
    5654             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5655             :         nullptr,
    5656             :     },
    5657             :     {
    5658             :         as2js::node_t::NODE_IDENTIFIER,
    5659             :         CHECK_VALUE_STRING, 0, 0.0, "foo", false,
    5660             :         nullptr,
    5661             :     },
    5662             :     {
    5663             :         as2js::node_t::NODE_OPEN_PARENTHESIS,
    5664             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5665             :         nullptr,
    5666             :     },
    5667             :     {
    5668             :         as2js::node_t::NODE_INTEGER,
    5669             :         CHECK_VALUE_INTEGER, 15, 0.0, "", false,
    5670             :         nullptr,
    5671             :     },
    5672             :     {
    5673             :         as2js::node_t::NODE_COMMA,
    5674             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5675             :         nullptr,
    5676             :     },
    5677             :     {
    5678             :         as2js::node_t::NODE_DECREMENT,
    5679             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5680             :         nullptr,
    5681             :     },
    5682             :     {
    5683             :         as2js::node_t::NODE_IDENTIFIER,
    5684             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    5685             :         nullptr,
    5686             :     },
    5687             :     {
    5688             :         as2js::node_t::NODE_MINIMUM,
    5689             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5690             :         nullptr,
    5691             :     },
    5692             :     {
    5693             :         as2js::node_t::NODE_IDENTIFIER,
    5694             :         CHECK_VALUE_STRING, 0, 0.0, "$", false,
    5695             :         nullptr,
    5696             :     },
    5697             :     {
    5698             :         as2js::node_t::NODE_CLOSE_PARENTHESIS,
    5699             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5700             :         nullptr,
    5701             :     },
    5702             :     {
    5703             :         as2js::node_t::NODE_NOT_EQUAL,
    5704             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5705             :         nullptr,
    5706             :     },
    5707             :     {
    5708             :         as2js::node_t::NODE_IDENTIFIER,
    5709             :         CHECK_VALUE_STRING, 0, 0.0, "$_", false,
    5710             :         nullptr,
    5711             :     },
    5712             :     {
    5713             :         as2js::node_t::NODE_OPEN_SQUARE_BRACKET,
    5714             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5715             :         nullptr,
    5716             :     },
    5717             :     {
    5718             :         as2js::node_t::NODE_INTEGER,
    5719             :         CHECK_VALUE_INTEGER, 2015, 0.0, "", false,
    5720             :         nullptr,
    5721             :     },
    5722             :     {
    5723             :         as2js::node_t::NODE_CLOSE_SQUARE_BRACKET,
    5724             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5725             :         nullptr,
    5726             :     },
    5727             :     {
    5728             :         as2js::node_t::NODE_COMPARE,
    5729             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5730             :         nullptr,
    5731             :     },
    5732             :     {
    5733             :         as2js::node_t::NODE_INTEGER,
    5734             :         CHECK_VALUE_INTEGER, 1095487197184, 0.0, "", false,
    5735             :         nullptr,
    5736             :     },
    5737             :     {
    5738             :         as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT_UNSIGNED,
    5739             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5740             :         nullptr,
    5741             :     },
    5742             :     {
    5743             :         as2js::node_t::NODE_INTEGER,
    5744             :         CHECK_VALUE_INTEGER, 74, 0.0, "", false,
    5745             :         nullptr,
    5746             :     },
    5747             :     {
    5748             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_XOR,
    5749             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5750             :         nullptr,
    5751             :     },
    5752             :     {
    5753             :         as2js::node_t::NODE_INTEGER,
    5754             :         CHECK_VALUE_INTEGER, 3710, 0.0, "", false,
    5755             :         nullptr,
    5756             :     },
    5757             :     {
    5758             :         as2js::node_t::NODE_STRICTLY_EQUAL,
    5759             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5760             :         nullptr,
    5761             :     },
    5762             :     {
    5763             :         as2js::node_t::NODE_FLOATING_POINT,
    5764             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5765             :         nullptr,
    5766             :     },
    5767             :     {
    5768             :         as2js::node_t::NODE_SEMICOLON,
    5769             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5770             :         nullptr,
    5771             :     },
    5772             :     {
    5773             :         as2js::node_t::NODE_CLOSE_CURVLY_BRACKET,
    5774             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5775             :         nullptr,
    5776             :     },
    5777             : 
    5778             :     // LINE 16 --   "var b &&= __LINE__ && 1000 || 34 <% 2 >% 3 !== 5.01 , a --;\n"
    5779             :     {
    5780             :         as2js::node_t::NODE_VAR,
    5781             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5782             :         nullptr,
    5783             :     },
    5784             :     {
    5785             :         as2js::node_t::NODE_IDENTIFIER,
    5786             :         CHECK_VALUE_STRING, 0, 0.0, "b", false,
    5787             :         nullptr,
    5788             :     },
    5789             :     {
    5790             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_AND,
    5791             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5792             :         nullptr,
    5793             :     },
    5794             :     {
    5795             :         as2js::node_t::NODE_INTEGER,
    5796             :         CHECK_VALUE_INTEGER, 16, 0.0, "", false,
    5797             :         nullptr,
    5798             :     },
    5799             :     {
    5800             :         as2js::node_t::NODE_LOGICAL_AND,
    5801             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5802             :         nullptr,
    5803             :     },
    5804             :     {
    5805             :         as2js::node_t::NODE_INTEGER,
    5806             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    5807             :         nullptr,
    5808             :     },
    5809             :     {
    5810             :         as2js::node_t::NODE_LOGICAL_OR,
    5811             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5812             :         nullptr,
    5813             :     },
    5814             :     {
    5815             :         as2js::node_t::NODE_INTEGER,
    5816             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    5817             :         nullptr,
    5818             :     },
    5819             :     {
    5820             :         as2js::node_t::NODE_ROTATE_LEFT,
    5821             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5822             :         nullptr,
    5823             :     },
    5824             :     {
    5825             :         as2js::node_t::NODE_INTEGER,
    5826             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    5827             :         nullptr,
    5828             :     },
    5829             :     {
    5830             :         as2js::node_t::NODE_ROTATE_RIGHT,
    5831             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5832             :         nullptr,
    5833             :     },
    5834             :     {
    5835             :         as2js::node_t::NODE_INTEGER,
    5836             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    5837             :         nullptr,
    5838             :     },
    5839             :     {
    5840             :         as2js::node_t::NODE_STRICTLY_NOT_EQUAL,
    5841             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5842             :         nullptr,
    5843             :     },
    5844             :     {
    5845             :         as2js::node_t::NODE_FLOATING_POINT,
    5846             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5847             :         nullptr,
    5848             :     },
    5849             :     {
    5850             :         as2js::node_t::NODE_COMMA,
    5851             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5852             :         nullptr,
    5853             :     },
    5854             :     {
    5855             :         as2js::node_t::NODE_IDENTIFIER,
    5856             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    5857             :         nullptr,
    5858             :     },
    5859             :     {
    5860             :         as2js::node_t::NODE_DECREMENT,
    5861             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5862             :         nullptr,
    5863             :     },
    5864             :     {
    5865             :         as2js::node_t::NODE_SEMICOLON,
    5866             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5867             :         nullptr,
    5868             :     },
    5869             : 
    5870             :     // LINE 17 --   "var b&&=__LINE__&&1000||34<%2>%3!==5.01,a--;\n"
    5871             :     {
    5872             :         as2js::node_t::NODE_VAR,
    5873             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5874             :         nullptr,
    5875             :     },
    5876             :     {
    5877             :         as2js::node_t::NODE_IDENTIFIER,
    5878             :         CHECK_VALUE_STRING, 0, 0.0, "b", false,
    5879             :         nullptr,
    5880             :     },
    5881             :     {
    5882             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_AND,
    5883             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5884             :         nullptr,
    5885             :     },
    5886             :     {
    5887             :         as2js::node_t::NODE_INTEGER,
    5888             :         CHECK_VALUE_INTEGER, 17, 0.0, "", false,
    5889             :         nullptr,
    5890             :     },
    5891             :     {
    5892             :         as2js::node_t::NODE_LOGICAL_AND,
    5893             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5894             :         nullptr,
    5895             :     },
    5896             :     {
    5897             :         as2js::node_t::NODE_INTEGER,
    5898             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    5899             :         nullptr,
    5900             :     },
    5901             :     {
    5902             :         as2js::node_t::NODE_LOGICAL_OR,
    5903             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5904             :         nullptr,
    5905             :     },
    5906             :     {
    5907             :         as2js::node_t::NODE_INTEGER,
    5908             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    5909             :         nullptr,
    5910             :     },
    5911             :     {
    5912             :         as2js::node_t::NODE_ROTATE_LEFT,
    5913             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5914             :         nullptr,
    5915             :     },
    5916             :     {
    5917             :         as2js::node_t::NODE_INTEGER,
    5918             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    5919             :         nullptr,
    5920             :     },
    5921             :     {
    5922             :         as2js::node_t::NODE_ROTATE_RIGHT,
    5923             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5924             :         nullptr,
    5925             :     },
    5926             :     {
    5927             :         as2js::node_t::NODE_INTEGER,
    5928             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    5929             :         nullptr,
    5930             :     },
    5931             :     {
    5932             :         as2js::node_t::NODE_STRICTLY_NOT_EQUAL,
    5933             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5934             :         nullptr,
    5935             :     },
    5936             :     {
    5937             :         as2js::node_t::NODE_FLOATING_POINT,
    5938             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    5939             :         nullptr,
    5940             :     },
    5941             :     {
    5942             :         as2js::node_t::NODE_COMMA,
    5943             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5944             :         nullptr,
    5945             :     },
    5946             :     {
    5947             :         as2js::node_t::NODE_IDENTIFIER,
    5948             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    5949             :         nullptr,
    5950             :     },
    5951             :     {
    5952             :         as2js::node_t::NODE_DECREMENT,
    5953             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5954             :         nullptr,
    5955             :     },
    5956             :     {
    5957             :         as2js::node_t::NODE_SEMICOLON,
    5958             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5959             :         nullptr,
    5960             :     },
    5961             : 
    5962             :     // LINE 18 --   "var c ||= __LINE__ <= 1000 >= 34 <%= 2 >%= 3 !== 5.01 , ++ a;\n"
    5963             :     {
    5964             :         as2js::node_t::NODE_VAR,
    5965             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5966             :         nullptr,
    5967             :     },
    5968             :     {
    5969             :         as2js::node_t::NODE_IDENTIFIER,
    5970             :         CHECK_VALUE_STRING, 0, 0.0, "c", false,
    5971             :         nullptr,
    5972             :     },
    5973             :     {
    5974             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_OR,
    5975             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5976             :         nullptr,
    5977             :     },
    5978             :     {
    5979             :         as2js::node_t::NODE_INTEGER,
    5980             :         CHECK_VALUE_INTEGER, 18, 0.0, "", false,
    5981             :         nullptr,
    5982             :     },
    5983             :     {
    5984             :         as2js::node_t::NODE_LESS_EQUAL,
    5985             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5986             :         nullptr,
    5987             :     },
    5988             :     {
    5989             :         as2js::node_t::NODE_INTEGER,
    5990             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    5991             :         nullptr,
    5992             :     },
    5993             :     {
    5994             :         as2js::node_t::NODE_GREATER_EQUAL,
    5995             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    5996             :         nullptr,
    5997             :     },
    5998             :     {
    5999             :         as2js::node_t::NODE_INTEGER,
    6000             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    6001             :         nullptr,
    6002             :     },
    6003             :     {
    6004             :         as2js::node_t::NODE_ASSIGNMENT_ROTATE_LEFT,
    6005             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6006             :         nullptr,
    6007             :     },
    6008             :     {
    6009             :         as2js::node_t::NODE_INTEGER,
    6010             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    6011             :         nullptr,
    6012             :     },
    6013             :     {
    6014             :         as2js::node_t::NODE_ASSIGNMENT_ROTATE_RIGHT,
    6015             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6016             :         nullptr,
    6017             :     },
    6018             :     {
    6019             :         as2js::node_t::NODE_INTEGER,
    6020             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    6021             :         nullptr,
    6022             :     },
    6023             :     {
    6024             :         as2js::node_t::NODE_STRICTLY_NOT_EQUAL,
    6025             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6026             :         nullptr,
    6027             :     },
    6028             :     {
    6029             :         as2js::node_t::NODE_FLOATING_POINT,
    6030             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    6031             :         nullptr,
    6032             :     },
    6033             :     {
    6034             :         as2js::node_t::NODE_COMMA,
    6035             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6036             :         nullptr,
    6037             :     },
    6038             :     {
    6039             :         as2js::node_t::NODE_INCREMENT,
    6040             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6041             :         nullptr,
    6042             :     },
    6043             :     {
    6044             :         as2js::node_t::NODE_IDENTIFIER,
    6045             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    6046             :         nullptr,
    6047             :     },
    6048             :     {
    6049             :         as2js::node_t::NODE_SEMICOLON,
    6050             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6051             :         nullptr,
    6052             :     },
    6053             : 
    6054             :     // LINE 19 --   "var c||=__LINE__<=1000>=34<%=2>%=3!==5.01,++a;\n"
    6055             :     {
    6056             :         as2js::node_t::NODE_VAR,
    6057             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6058             :         nullptr,
    6059             :     },
    6060             :     {
    6061             :         as2js::node_t::NODE_IDENTIFIER,
    6062             :         CHECK_VALUE_STRING, 0, 0.0, "c", false,
    6063             :         nullptr,
    6064             :     },
    6065             :     {
    6066             :         as2js::node_t::NODE_ASSIGNMENT_LOGICAL_OR,
    6067             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6068             :         nullptr,
    6069             :     },
    6070             :     {
    6071             :         as2js::node_t::NODE_INTEGER,
    6072             :         CHECK_VALUE_INTEGER, 19, 0.0, "", false,
    6073             :         nullptr,
    6074             :     },
    6075             :     {
    6076             :         as2js::node_t::NODE_LESS_EQUAL,
    6077             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6078             :         nullptr,
    6079             :     },
    6080             :     {
    6081             :         as2js::node_t::NODE_INTEGER,
    6082             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    6083             :         nullptr,
    6084             :     },
    6085             :     {
    6086             :         as2js::node_t::NODE_GREATER_EQUAL,
    6087             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6088             :         nullptr,
    6089             :     },
    6090             :     {
    6091             :         as2js::node_t::NODE_INTEGER,
    6092             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    6093             :         nullptr,
    6094             :     },
    6095             :     {
    6096             :         as2js::node_t::NODE_ASSIGNMENT_ROTATE_LEFT,
    6097             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6098             :         nullptr,
    6099             :     },
    6100             :     {
    6101             :         as2js::node_t::NODE_INTEGER,
    6102             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    6103             :         nullptr,
    6104             :     },
    6105             :     {
    6106             :         as2js::node_t::NODE_ASSIGNMENT_ROTATE_RIGHT,
    6107             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6108             :         nullptr,
    6109             :     },
    6110             :     {
    6111             :         as2js::node_t::NODE_INTEGER,
    6112             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    6113             :         nullptr,
    6114             :     },
    6115             :     {
    6116             :         as2js::node_t::NODE_STRICTLY_NOT_EQUAL,
    6117             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6118             :         nullptr,
    6119             :     },
    6120             :     {
    6121             :         as2js::node_t::NODE_FLOATING_POINT,
    6122             :         CHECK_VALUE_FLOATING_POINT, 0, 5.01, "", false,
    6123             :         nullptr,
    6124             :     },
    6125             :     {
    6126             :         as2js::node_t::NODE_COMMA,
    6127             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6128             :         nullptr,
    6129             :     },
    6130             :     {
    6131             :         as2js::node_t::NODE_INCREMENT,
    6132             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6133             :         nullptr,
    6134             :     },
    6135             :     {
    6136             :         as2js::node_t::NODE_IDENTIFIER,
    6137             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    6138             :         nullptr,
    6139             :     },
    6140             :     {
    6141             :         as2js::node_t::NODE_SEMICOLON,
    6142             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6143             :         nullptr,
    6144             :     },
    6145             : 
    6146             :     // LINE 20 --   "var c |= __LINE__ | 1000 > 34 < 2 ~! 3 .. 5 . length;\n"
    6147             :     {
    6148             :         as2js::node_t::NODE_VAR,
    6149             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6150             :         nullptr,
    6151             :     },
    6152             :     {
    6153             :         as2js::node_t::NODE_IDENTIFIER,
    6154             :         CHECK_VALUE_STRING, 0, 0.0, "c", false,
    6155             :         nullptr,
    6156             :     },
    6157             :     {
    6158             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR,
    6159             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6160             :         nullptr,
    6161             :     },
    6162             :     {
    6163             :         as2js::node_t::NODE_INTEGER,
    6164             :         CHECK_VALUE_INTEGER, 20, 0.0, "", false,
    6165             :         nullptr,
    6166             :     },
    6167             :     {
    6168             :         as2js::node_t::NODE_BITWISE_OR,
    6169             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6170             :         nullptr,
    6171             :     },
    6172             :     {
    6173             :         as2js::node_t::NODE_INTEGER,
    6174             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    6175             :         nullptr,
    6176             :     },
    6177             :     {
    6178             :         as2js::node_t::NODE_GREATER,
    6179             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6180             :         nullptr,
    6181             :     },
    6182             :     {
    6183             :         as2js::node_t::NODE_INTEGER,
    6184             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    6185             :         nullptr,
    6186             :     },
    6187             :     {
    6188             :         as2js::node_t::NODE_LESS,
    6189             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6190             :         nullptr,
    6191             :     },
    6192             :     {
    6193             :         as2js::node_t::NODE_INTEGER,
    6194             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    6195             :         nullptr,
    6196             :     },
    6197             :     {
    6198             :         as2js::node_t::NODE_NOT_MATCH,
    6199             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6200             :         nullptr,
    6201             :     },
    6202             :     {
    6203             :         as2js::node_t::NODE_INTEGER,
    6204             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    6205             :         nullptr,
    6206             :     },
    6207             :     {
    6208             :         as2js::node_t::NODE_RANGE,
    6209             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6210             :         nullptr,
    6211             :     },
    6212             :     {
    6213             :         as2js::node_t::NODE_INTEGER,
    6214             :         CHECK_VALUE_INTEGER, 5, 0.0, "", false,
    6215             :         nullptr,
    6216             :     },
    6217             :     {
    6218             :         as2js::node_t::NODE_MEMBER,
    6219             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6220             :         nullptr,
    6221             :     },
    6222             :     {
    6223             :         as2js::node_t::NODE_IDENTIFIER,
    6224             :         CHECK_VALUE_STRING, 0, 0.0, "length", false,
    6225             :         nullptr,
    6226             :     },
    6227             :     {
    6228             :         as2js::node_t::NODE_SEMICOLON,
    6229             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6230             :         nullptr,
    6231             :     },
    6232             : 
    6233             :     // LINE 21 --   "var c|=__LINE__|1000>34<2~!3..5.length;\n"
    6234             :     {
    6235             :         as2js::node_t::NODE_VAR,
    6236             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6237             :         nullptr,
    6238             :     },
    6239             :     {
    6240             :         as2js::node_t::NODE_IDENTIFIER,
    6241             :         CHECK_VALUE_STRING, 0, 0.0, "c", false,
    6242             :         nullptr,
    6243             :     },
    6244             :     {
    6245             :         as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR,
    6246             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6247             :         nullptr,
    6248             :     },
    6249             :     {
    6250             :         as2js::node_t::NODE_INTEGER,
    6251             :         CHECK_VALUE_INTEGER, 21, 0.0, "", false,
    6252             :         nullptr,
    6253             :     },
    6254             :     {
    6255             :         as2js::node_t::NODE_BITWISE_OR,
    6256             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6257             :         nullptr,
    6258             :     },
    6259             :     {
    6260             :         as2js::node_t::NODE_INTEGER,
    6261             :         CHECK_VALUE_INTEGER, 1000, 0.0, "", false,
    6262             :         nullptr,
    6263             :     },
    6264             :     {
    6265             :         as2js::node_t::NODE_GREATER,
    6266             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6267             :         nullptr,
    6268             :     },
    6269             :     {
    6270             :         as2js::node_t::NODE_INTEGER,
    6271             :         CHECK_VALUE_INTEGER, 34, 0.0, "", false,
    6272             :         nullptr,
    6273             :     },
    6274             :     {
    6275             :         as2js::node_t::NODE_LESS,
    6276             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6277             :         nullptr,
    6278             :     },
    6279             :     {
    6280             :         as2js::node_t::NODE_INTEGER,
    6281             :         CHECK_VALUE_INTEGER, 2, 0.0, "", false,
    6282             :         nullptr,
    6283             :     },
    6284             :     {
    6285             :         as2js::node_t::NODE_NOT_MATCH,
    6286             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6287             :         nullptr,
    6288             :     },
    6289             :     {
    6290             :         as2js::node_t::NODE_INTEGER,
    6291             :         CHECK_VALUE_INTEGER, 3, 0.0, "", false,
    6292             :         nullptr,
    6293             :     },
    6294             :     {
    6295             :         as2js::node_t::NODE_RANGE,
    6296             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6297             :         nullptr,
    6298             :     },
    6299             :     {
    6300             :         as2js::node_t::NODE_INTEGER,
    6301             :         CHECK_VALUE_INTEGER, 5, 0.0, "", false,
    6302             :         nullptr,
    6303             :     },
    6304             :     {
    6305             :         as2js::node_t::NODE_MEMBER,
    6306             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6307             :         nullptr,
    6308             :     },
    6309             :     {
    6310             :         as2js::node_t::NODE_IDENTIFIER,
    6311             :         CHECK_VALUE_STRING, 0, 0.0, "length", false,
    6312             :         nullptr,
    6313             :     },
    6314             :     {
    6315             :         as2js::node_t::NODE_SEMICOLON,
    6316             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6317             :         nullptr,
    6318             :     },
    6319             : 
    6320             :     // LINE 22 --   "abstract function long_shot(a: String, b: Number, c: double, ...);\n"
    6321             :     {
    6322             :         as2js::node_t::NODE_ABSTRACT,
    6323             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6324             :         nullptr,
    6325             :     },
    6326             :     {
    6327             :         as2js::node_t::NODE_FUNCTION,
    6328             :         CHECK_VALUE_STRING, 0, 0.0, "", false,
    6329             :         nullptr,
    6330             :     },
    6331             :     {
    6332             :         as2js::node_t::NODE_IDENTIFIER,
    6333             :         CHECK_VALUE_STRING, 0, 0.0, "long_shot", false,
    6334             :         nullptr,
    6335             :     },
    6336             :     {
    6337             :         as2js::node_t::NODE_OPEN_PARENTHESIS,
    6338             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6339             :         nullptr,
    6340             :     },
    6341             :     {
    6342             :         as2js::node_t::NODE_IDENTIFIER,
    6343             :         CHECK_VALUE_STRING, 0, 0.0, "a", false,
    6344             :         nullptr,
    6345             :     },
    6346             :     {
    6347             :         as2js::node_t::NODE_COLON,
    6348             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6349             :         nullptr,
    6350             :     },
    6351             :     {
    6352             :         as2js::node_t::NODE_IDENTIFIER,
    6353             :         CHECK_VALUE_STRING, 0, 0.0, "String", false,
    6354             :         nullptr,
    6355             :     },
    6356             :     {
    6357             :         as2js::node_t::NODE_COMMA,
    6358             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6359             :         nullptr,
    6360             :     },
    6361             :     {
    6362             :         as2js::node_t::NODE_IDENTIFIER,
    6363             :         CHECK_VALUE_STRING, 0, 0.0, "b", false,
    6364             :         nullptr,
    6365             :     },
    6366             :     {
    6367             :         as2js::node_t::NODE_COLON,
    6368             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6369             :         nullptr,
    6370             :     },
    6371             :     {
    6372             :         as2js::node_t::NODE_IDENTIFIER,
    6373             :         CHECK_VALUE_STRING, 0, 0.0, "Number", false,
    6374             :         nullptr,
    6375             :     },
    6376             :     {
    6377             :         as2js::node_t::NODE_COMMA,
    6378             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6379             :         nullptr,
    6380             :     },
    6381             :     {
    6382             :         as2js::node_t::NODE_IDENTIFIER,
    6383             :         CHECK_VALUE_STRING, 0, 0.0, "c", false,
    6384             :         nullptr,
    6385             :     },
    6386             :     {
    6387             :         as2js::node_t::NODE_COLON,
    6388             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6389             :         nullptr,
    6390             :     },
    6391             :     {
    6392             :         as2js::node_t::NODE_DOUBLE,
    6393             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6394             :         nullptr,
    6395             :     },
    6396             :     {
    6397             :         as2js::node_t::NODE_COMMA,
    6398             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6399             :         nullptr,
    6400             :     },
    6401             :     {
    6402             :         as2js::node_t::NODE_REST,
    6403             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6404             :         nullptr,
    6405             :     },
    6406             :     {
    6407             :         as2js::node_t::NODE_CLOSE_PARENTHESIS,
    6408             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6409             :         nullptr,
    6410             :     },
    6411             :     {
    6412             :         as2js::node_t::NODE_SEMICOLON,
    6413             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6414             :         nullptr,
    6415             :     },
    6416             : 
    6417             :     // LINE 23 --   "use extended_operators(2); var q = 91.e+j;\n"
    6418             :     {
    6419             :         as2js::node_t::NODE_VAR,
    6420             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6421             :         nullptr,
    6422             :     },
    6423             :     {
    6424             :         as2js::node_t::NODE_IDENTIFIER,
    6425             :         CHECK_VALUE_STRING, 0, 0.0, "q", false,
    6426             :         nullptr,
    6427             :     },
    6428             :     {
    6429             :         as2js::node_t::NODE_ASSIGNMENT,
    6430             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6431             :         nullptr,
    6432             :     },
    6433             :     {
    6434             :         as2js::node_t::NODE_INTEGER,
    6435             :         CHECK_VALUE_INTEGER, 91, 0.0, "", false,
    6436             :         nullptr,
    6437             :     },
    6438             :     {
    6439             :         as2js::node_t::NODE_MEMBER,
    6440             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6441             :         nullptr,
    6442             :     },
    6443             :     {
    6444             :         as2js::node_t::NODE_IDENTIFIER,
    6445             :         CHECK_VALUE_STRING, 0, 0.0, "e", false,
    6446             :         nullptr,
    6447             :     },
    6448             :     {
    6449             :         as2js::node_t::NODE_ADD,
    6450             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6451             :         nullptr,
    6452             :     },
    6453             :     {
    6454             :         as2js::node_t::NODE_IDENTIFIER,
    6455             :         CHECK_VALUE_STRING, 0, 0.0, "j", false,
    6456             :         nullptr,
    6457             :     },
    6458             :     {
    6459             :         as2js::node_t::NODE_SEMICOLON,
    6460             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6461             :         nullptr,
    6462             :     },
    6463             : 
    6464             :     // Test over
    6465             :     {
    6466             :         as2js::node_t::NODE_EOF,
    6467             :         CHECK_VALUE_IGNORE, 0, 0.0, "", false,
    6468             :         nullptr,
    6469             :     },
    6470             :     {}
    6471             : };
    6472             : 
    6473             : token_t const g_mixed_tokens[] =
    6474             : {
    6475             :     { g_mixed_tokens_one, g_mixed_results_one }
    6476             : };
    6477             : size_t const g_mixed_tokens_size = sizeof(g_mixed_tokens) / sizeof(g_mixed_tokens[0]);
    6478             : 
    6479             : }
    6480             : // no name namespace
    6481             : 
    6482             : 
    6483           1 : CATCH_TEST_CASE("lexer_mixed_tokens", "[lexer][token]")
    6484             : {
    6485           1 :     CATCH_START_SECTION("lexer_mixed_tokens: mixed tokens")
    6486             :     {
    6487           2 :         for(std::size_t idx(0); idx < g_mixed_tokens_size; ++idx)
    6488             :         {
    6489             : //std::cerr << "IN:{" << g_mixed_tokens[idx].f_input << "}\n";
    6490             :             //std::string input_string;
    6491             :             //input_string.from_utf8(g_mixed_tokens[idx].f_input);
    6492             : 
    6493             :             //as2js::input::pointer_t input(new std::string_input(input_string));
    6494           1 :             as2js::input_stream<std::stringstream>::pointer_t input(std::make_shared<as2js::input_stream<std::stringstream>>());
    6495           1 :             *input << g_mixed_tokens[idx].f_input;
    6496             : 
    6497           1 :             as2js::options::pointer_t options(new as2js::options);
    6498           3 :             as2js::lexer::pointer_t lexer(new as2js::lexer(input, options));
    6499           1 :             CATCH_REQUIRE(lexer->get_input() == input);
    6500             : 
    6501             :             // contrary to the type test here we do not mess around with the
    6502             :             // options and we know exactly what we're expecting and thus we
    6503             :             // only need one result per entry and that's exactly what we get
    6504             :             // (at least for now, the truth is that we could still check each
    6505             :             // list of options... we may add that later!)
    6506         403 :             for(result_t const *results(g_mixed_tokens[idx].f_results);
    6507         403 :                                 results->f_token != as2js::node_t::NODE_UNKNOWN;
    6508             :                                 ++results)
    6509             :             {
    6510         402 :                 as2js::node::pointer_t token(lexer->get_next_token(true));
    6511             : //std::cerr << *token;
    6512             : 
    6513             :                 // handle pragma just like the parser
    6514         405 :                 while(token->get_type() == as2js::node_t::NODE_USE)
    6515             :                 {
    6516             :                     // must be followed by an identifier
    6517           3 :                     token = lexer->get_next_token(true);
    6518           3 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_IDENTIFIER);
    6519           3 :                     std::string const pragma_name(token->get_string());
    6520           3 :                     token = lexer->get_next_token(true);
    6521           3 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_OPEN_PARENTHESIS);
    6522           3 :                     token = lexer->get_next_token(true);
    6523           3 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_INTEGER);
    6524           3 :                     as2js::option_t opt(as2js::option_t::OPTION_UNKNOWN);
    6525           3 :                     if(pragma_name == "extended_escape_sequences")
    6526             :                     {
    6527           0 :                         opt = as2js::option_t::OPTION_EXTENDED_ESCAPE_SEQUENCES;
    6528             :                     }
    6529           3 :                     else if(pragma_name == "extended_operators")
    6530             :                     {
    6531             :                         // we do need this one here because we have '<>' and ':='
    6532             :                         // that are extended operators to be forbidden unless
    6533             :                         // this is turned on
    6534           2 :                         opt = as2js::option_t::OPTION_EXTENDED_OPERATORS;
    6535             :                     }
    6536           1 :                     else if(pragma_name == "octal")
    6537             :                     {
    6538           1 :                         opt = as2js::option_t::OPTION_OCTAL;
    6539             :                     }
    6540           3 :                     CATCH_REQUIRE(opt != as2js::option_t::OPTION_UNKNOWN);
    6541             : //std::cerr << "  use " << static_cast<int>(opt) << " = " << token->get_integer().get() << "\n";
    6542           3 :                     options->set_option(opt, token->get_integer().get());
    6543           3 :                     token = lexer->get_next_token(true);
    6544           3 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_CLOSE_PARENTHESIS);
    6545           3 :                     token = lexer->get_next_token(true);
    6546           3 :                     CATCH_REQUIRE(token->get_type() == as2js::node_t::NODE_SEMICOLON);
    6547             : 
    6548             :                     // get the next token, it can be another option
    6549           3 :                     token = lexer->get_next_token(true);
    6550             : //std::cerr << *token;
    6551           3 :                 }
    6552             : 
    6553             : 
    6554             :                 // token match
    6555         402 :                 CATCH_REQUIRE(token->get_type() == results->f_token);
    6556             : 
    6557             :                 // no children
    6558         402 :                 CATCH_REQUIRE(token->get_children_size() == 0);
    6559             : 
    6560             :                 // no links
    6561         402 :                 CATCH_REQUIRE(!token->get_instance());
    6562         402 :                 CATCH_REQUIRE(!token->get_type_node());
    6563         402 :                 CATCH_REQUIRE(!token->get_attribute_node());
    6564         402 :                 CATCH_REQUIRE(!token->get_goto_exit());
    6565         402 :                 CATCH_REQUIRE(!token->get_goto_enter());
    6566             : 
    6567             :                 // no variables
    6568         402 :                 CATCH_REQUIRE(token->get_variable_size() == 0);
    6569             : 
    6570             :                 // no parent
    6571         402 :                 CATCH_REQUIRE(!token->get_parent());
    6572             : 
    6573             :                 // no parameters
    6574         402 :                 CATCH_REQUIRE(token->get_param_size() == 0);
    6575             : 
    6576             :                 // not locked
    6577         402 :                 CATCH_REQUIRE(!token->is_locked());
    6578             : 
    6579             :                 // default switch operator
    6580         402 :                 if(token->get_type() == as2js::node_t::NODE_SWITCH)
    6581             :                 {
    6582           0 :                     CATCH_REQUIRE(token->get_switch_operator() == as2js::node_t::NODE_UNKNOWN);
    6583             :                 }
    6584             : 
    6585             :                 // ignore flags here, they were tested in the node test already
    6586             : 
    6587             :                 // no attributes
    6588         402 :                 if(token->get_type() != as2js::node_t::NODE_PROGRAM)
    6589             :                 {
    6590         402 :                     for(as2js::attribute_t attr(as2js::attribute_t::NODE_ATTR_PUBLIC);
    6591       12060 :                                     attr < as2js::attribute_t::NODE_ATTR_max;
    6592       11658 :                                     attr = static_cast<as2js::attribute_t>(static_cast<int>(attr) + 1))
    6593             :                     {
    6594       11658 :                         switch(attr)
    6595             :                         {
    6596         402 :                         case as2js::attribute_t::NODE_ATTR_TYPE:
    6597         402 :                             switch(token->get_type())
    6598             :                             {
    6599         315 :                             case as2js::node_t::NODE_ADD:
    6600             :                             case as2js::node_t::NODE_ARRAY:
    6601             :                             case as2js::node_t::NODE_ARRAY_LITERAL:
    6602             :                             case as2js::node_t::NODE_AS:
    6603             :                             case as2js::node_t::NODE_ASSIGNMENT:
    6604             :                             case as2js::node_t::NODE_ASSIGNMENT_ADD:
    6605             :                             case as2js::node_t::NODE_ASSIGNMENT_BITWISE_AND:
    6606             :                             case as2js::node_t::NODE_ASSIGNMENT_BITWISE_OR:
    6607             :                             case as2js::node_t::NODE_ASSIGNMENT_BITWISE_XOR:
    6608             :                             case as2js::node_t::NODE_ASSIGNMENT_DIVIDE:
    6609             :                             case as2js::node_t::NODE_ASSIGNMENT_LOGICAL_AND:
    6610             :                             case as2js::node_t::NODE_ASSIGNMENT_LOGICAL_OR:
    6611             :                             case as2js::node_t::NODE_ASSIGNMENT_LOGICAL_XOR:
    6612             :                             case as2js::node_t::NODE_ASSIGNMENT_MAXIMUM:
    6613             :                             case as2js::node_t::NODE_ASSIGNMENT_MINIMUM:
    6614             :                             case as2js::node_t::NODE_ASSIGNMENT_MODULO:
    6615             :                             case as2js::node_t::NODE_ASSIGNMENT_MULTIPLY:
    6616             :                             case as2js::node_t::NODE_ASSIGNMENT_POWER:
    6617             :                             case as2js::node_t::NODE_ASSIGNMENT_ROTATE_LEFT:
    6618             :                             case as2js::node_t::NODE_ASSIGNMENT_ROTATE_RIGHT:
    6619             :                             case as2js::node_t::NODE_ASSIGNMENT_SHIFT_LEFT:
    6620             :                             case as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT:
    6621             :                             case as2js::node_t::NODE_ASSIGNMENT_SHIFT_RIGHT_UNSIGNED:
    6622             :                             case as2js::node_t::NODE_ASSIGNMENT_SUBTRACT:
    6623             :                             case as2js::node_t::NODE_BITWISE_AND:
    6624             :                             case as2js::node_t::NODE_BITWISE_NOT:
    6625             :                             case as2js::node_t::NODE_BITWISE_OR:
    6626             :                             case as2js::node_t::NODE_BITWISE_XOR:
    6627             :                             case as2js::node_t::NODE_CALL:
    6628             :                             case as2js::node_t::NODE_CONDITIONAL:
    6629             :                             case as2js::node_t::NODE_DECREMENT:
    6630             :                             case as2js::node_t::NODE_DELETE:
    6631             :                             case as2js::node_t::NODE_DIVIDE:
    6632             :                             case as2js::node_t::NODE_EQUAL:
    6633             :                             case as2js::node_t::NODE_FALSE:
    6634             :                             case as2js::node_t::NODE_FLOATING_POINT:
    6635             :                             case as2js::node_t::NODE_FUNCTION:
    6636             :                             case as2js::node_t::NODE_GREATER:
    6637             :                             case as2js::node_t::NODE_GREATER_EQUAL:
    6638             :                             case as2js::node_t::NODE_IDENTIFIER:
    6639             :                             case as2js::node_t::NODE_IN:
    6640             :                             case as2js::node_t::NODE_INCREMENT:
    6641             :                             case as2js::node_t::NODE_INSTANCEOF:
    6642             :                             case as2js::node_t::NODE_INTEGER:
    6643             :                             case as2js::node_t::NODE_IS:
    6644             :                             case as2js::node_t::NODE_LESS:
    6645             :                             case as2js::node_t::NODE_LESS_EQUAL:
    6646             :                             case as2js::node_t::NODE_LIST:
    6647             :                             case as2js::node_t::NODE_LOGICAL_AND:
    6648             :                             case as2js::node_t::NODE_LOGICAL_NOT:
    6649             :                             case as2js::node_t::NODE_LOGICAL_OR:
    6650             :                             case as2js::node_t::NODE_LOGICAL_XOR:
    6651             :                             case as2js::node_t::NODE_MATCH:
    6652             :                             case as2js::node_t::NODE_MAXIMUM:
    6653             :                             case as2js::node_t::NODE_MEMBER:
    6654             :                             case as2js::node_t::NODE_MINIMUM:
    6655             :                             case as2js::node_t::NODE_MODULO:
    6656             :                             case as2js::node_t::NODE_MULTIPLY:
    6657             :                             case as2js::node_t::NODE_NAME:
    6658             :                             case as2js::node_t::NODE_NEW:
    6659             :                             case as2js::node_t::NODE_NOT_EQUAL:
    6660             :                             case as2js::node_t::NODE_NULL:
    6661             :                             case as2js::node_t::NODE_OBJECT_LITERAL:
    6662             :                             case as2js::node_t::NODE_POST_DECREMENT:
    6663             :                             case as2js::node_t::NODE_POST_INCREMENT:
    6664             :                             case as2js::node_t::NODE_POWER:
    6665             :                             case as2js::node_t::NODE_PRIVATE:
    6666             :                             case as2js::node_t::NODE_PUBLIC:
    6667             :                             case as2js::node_t::NODE_RANGE:
    6668             :                             case as2js::node_t::NODE_ROTATE_LEFT:
    6669             :                             case as2js::node_t::NODE_ROTATE_RIGHT:
    6670             :                             case as2js::node_t::NODE_SCOPE:
    6671             :                             case as2js::node_t::NODE_SHIFT_LEFT:
    6672             :                             case as2js::node_t::NODE_SHIFT_RIGHT:
    6673             :                             case as2js::node_t::NODE_SHIFT_RIGHT_UNSIGNED:
    6674             :                             case as2js::node_t::NODE_STRICTLY_EQUAL:
    6675             :                             case as2js::node_t::NODE_STRICTLY_NOT_EQUAL:
    6676             :                             case as2js::node_t::NODE_STRING:
    6677             :                             case as2js::node_t::NODE_SUBTRACT:
    6678             :                             case as2js::node_t::NODE_SUPER:
    6679             :                             case as2js::node_t::NODE_THIS:
    6680             :                             case as2js::node_t::NODE_TRUE:
    6681             :                             case as2js::node_t::NODE_TYPEOF:
    6682             :                             case as2js::node_t::NODE_UNDEFINED:
    6683             :                             case as2js::node_t::NODE_VIDENTIFIER:
    6684             :                             case as2js::node_t::NODE_VOID:
    6685         315 :                                 CATCH_REQUIRE(!token->get_attribute(attr));
    6686         315 :                                 break;
    6687             : 
    6688          87 :                             default:
    6689             :                                 // any other type and you get an exception
    6690          87 :                                 CATCH_REQUIRE_THROWS_MATCHES(
    6691             :                                       token->get_attribute(attr)
    6692             :                                     , as2js::internal_error
    6693             :                                     , Catch::Matchers::ExceptionMessage(
    6694             :                                               "internal_error: node \""
    6695             :                                             + std::string(token->get_type_name())
    6696             :                                             + "\" does not like attribute \""
    6697             :                                             + as2js::node::attribute_to_string(attr)
    6698             :                                             + "\" in node::verify_attribute()."));
    6699             :                                 break;
    6700             : 
    6701             :                             }
    6702         402 :                             break;
    6703             : 
    6704       11256 :                         default:
    6705       11256 :                             CATCH_REQUIRE(!token->get_attribute(attr));
    6706       11256 :                             break;
    6707             : 
    6708             :                         }
    6709             :                     }
    6710             :                 }
    6711             : 
    6712         402 :                 if(results->f_check_value == CHECK_VALUE_INTEGER)
    6713             :                 {
    6714             : //std::cerr << "int " << token->get_integer().get() << " vs " << results->f_integer;
    6715          96 :                     CATCH_REQUIRE(token->get_integer().get() == results->f_integer);
    6716             :                 }
    6717             :                 else
    6718             :                 {
    6719         306 :                     CATCH_REQUIRE_THROWS_MATCHES(
    6720             :                           token->get_integer()
    6721             :                         , as2js::internal_error
    6722             :                         , Catch::Matchers::ExceptionMessage(
    6723             :                                   "internal_error: get_integer() called with a non-integer node type."));
    6724             :                 }
    6725             : 
    6726             : #pragma GCC diagnostic push
    6727             : #pragma GCC diagnostic ignored "-Wfloat-equal"
    6728         402 :                 if(results->f_check_value == CHECK_VALUE_FLOATING_POINT)
    6729             :                 {
    6730          18 :                     if(std::isnan(results->f_floating_point))
    6731             :                     {
    6732           0 :                         CATCH_REQUIRE(token->get_floating_point().is_nan());
    6733             :                     }
    6734             :                     else
    6735             :                     {
    6736          18 :                         CATCH_REQUIRE(token->get_floating_point().get() == results->f_floating_point);
    6737             :                     }
    6738             :                 }
    6739             :                 else
    6740             :                 {
    6741         384 :                     CATCH_REQUIRE_THROWS_MATCHES(
    6742             :                           token->get_floating_point()
    6743             :                         , as2js::internal_error
    6744             :                         , Catch::Matchers::ExceptionMessage(
    6745             :                                   "internal_error: get_floating_point() called with a non-floating point node type."));
    6746             :                 }
    6747             : #pragma GCC diagnostic pop
    6748             : 
    6749         402 :                 if(results->f_check_value == CHECK_VALUE_STRING)
    6750             :                 {
    6751             : //std::cerr << "  --> [" << token->get_string() << "]\n";
    6752          69 :                     CATCH_REQUIRE(token->get_string() == results->f_string);
    6753             :                 }
    6754             :                 else
    6755             :                 {
    6756             :                     // no need to convert the results->f_string should should be ""
    6757         333 :                     CATCH_REQUIRE_THROWS_MATCHES(
    6758             :                           token->get_string()
    6759             :                         , as2js::internal_error
    6760             :                         , Catch::Matchers::ExceptionMessage(
    6761             :                                   "internal_error: get_string() called with non-string node type: \""
    6762             :                                 + std::string(token->get_type_name())
    6763             :                                 + "\"."));
    6764             :                 }
    6765             : 
    6766         402 :                 if(results->f_check_value == CHECK_VALUE_BOOLEAN)
    6767             :                 {
    6768           0 :                     CATCH_REQUIRE(token->get_boolean() == results->f_boolean);
    6769             :                 }
    6770             :                 else
    6771             :                 {
    6772         402 :                     CATCH_REQUIRE_THROWS_MATCHES(
    6773             :                           token->get_boolean()
    6774             :                         , as2js::internal_error
    6775             :                         , Catch::Matchers::ExceptionMessage(
    6776             :                                   "internal_error: get_boolean() called with a non-Boolean node type."));
    6777             :                 }
    6778         402 :             }
    6779           1 :         }
    6780             :     }
    6781           1 :     CATCH_END_SECTION()
    6782           1 : }
    6783             : 
    6784             : 
    6785             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.14