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