LCOV - code coverage report
Current view: top level - tests - test_as2js_lexer.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 982 992 99.0 %
Date: 2014-11-22 Functions: 20 23 87.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10