diff --git a/utest/parser.test.cpp b/utest/parser.test.cpp index e656d9de..8397f903 100644 --- a/utest/parser.test.cpp +++ b/utest/parser.test.cpp @@ -17,180 +17,203 @@ namespace xo { namespace ut { TEST_CASE("parser", "[parser]") { - parser_type parser; + for (std::size_t i_tc = 0; i_tc < 2; ++i_tc) { + parser_type parser; - parser.begin_translation_unit(); + constexpr bool c_debug_flag = true; + scope log(XO_DEBUG(c_debug_flag), xtag("i_tc", i_tc)); - REQUIRE(parser.stack_size() == 1); - REQUIRE(parser.i_exstype(0) - == exprstatetype::expect_toplevel_expression_sequence); + parser.begin_translation_unit(); - /* input: - * def - */ - { - auto r1 = parser.include_token(token_type::def()); - REQUIRE(r1.get() == nullptr); + REQUIRE(parser.stack_size() == 1); + REQUIRE(parser.i_exstype(0) + == exprstatetype::expect_toplevel_expression_sequence); - /* stack should be: + /* input: + * def + */ + { + auto r1 = parser.include_token(token_type::def()); + REQUIRE(r1.get() == nullptr); + + /* stack should be: + * + * expect_toplevel_expression_sequence + * def_0 + * expect_symbol + */ + CHECK(parser.stack_size() == 3); + if (parser.stack_size() > 0) + CHECK(parser.i_exstype(0) == exprstatetype::expect_symbol); + if (parser.stack_size() > 1) + CHECK(parser.i_exstype(1) == exprstatetype::def_0); + if (parser.stack_size() > 2) + CHECK(parser.i_exstype(2) + == exprstatetype::expect_toplevel_expression_sequence); + } + + /* input: + * def foo + * ^ ^ + * 0 1 + */ + { + auto r2 = parser.include_token(token_type::symbol_token("foo")); + + cerr << "parser state after [def foo]" << endl; + cerr << parser << endl; + + REQUIRE(r2.get() == nullptr); + + /* stack should be: + * + * expect_toplevel_expression_sequence + * def_1 + */ + CHECK(parser.stack_size() == 2); + if (parser.stack_size() > 0) + CHECK(parser.i_exstype(0) == exprstatetype::def_1); + if (parser.stack_size() > 1) + CHECK(parser.i_exstype(1) + == exprstatetype::expect_toplevel_expression_sequence); + + } + + if (i_tc == 0) { + ; + } else if (i_tc == 1) { + /* input: + * def foo : + * ^ ^ + * 0 1 + */ + { + auto r3 = parser.include_token(token_type::colon()); + + cerr << "parser state after [def foo :]" << endl; + cerr << parser << endl; + + REQUIRE(r3.get() == nullptr); + + /* stack should be: + * + * expect_toplevel_expression_sequence + * def_2 + * expect_symbol + */ + CHECK(parser.stack_size() == 3); + if (parser.stack_size() > 0) + CHECK(parser.i_exstype(0) == exprstatetype::expect_type); + if (parser.stack_size() > 1) + CHECK(parser.i_exstype(1) == exprstatetype::def_2); + if (parser.stack_size() > 2) + CHECK(parser.i_exstype(2) + == exprstatetype::expect_toplevel_expression_sequence); + } + + /* input: + * def foo : f64 + * ^ ^ + * 0 1 + */ + { + auto r4 = parser.include_token(token_type::symbol_token("f64")); + + cerr << "parser state after [def foo : f64]" << endl; + cerr << parser << endl; + + REQUIRE(r4.get() == nullptr); + + CHECK(parser.stack_size() == 2); + + /* stack should be: + * + * expect_toplevel_expression_sequence + * def_3 + */ + CHECK(parser.stack_size() == 2); + if (parser.stack_size() > 0) + CHECK(parser.i_exstype(0) == exprstatetype::def_3); + if (parser.stack_size() > 1) + CHECK(parser.i_exstype(1) + == exprstatetype::expect_toplevel_expression_sequence); + + /* expecting either: + * = rhs-expression + * new-expression + */ + } + } + + /* input: * - * expect_toplevel_expression_sequence - * def_0 - * expect_symbol - */ - CHECK(parser.stack_size() == 3); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) == exprstatetype::expect_symbol); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) == exprstatetype::def_0); - if (parser.stack_size() > 2) - CHECK(parser.i_exstype(2) - == exprstatetype::expect_toplevel_expression_sequence); - } - - /* input: - * def foo - * ^ ^ - * 0 1 - */ - { - auto r2 = parser.include_token(token_type::symbol_token("foo")); - - cerr << "parser state after [def foo]" << endl; - cerr << parser << endl; - - REQUIRE(r2.get() == nullptr); - - /* stack should be: + * i_tc==0: + * def foo = + * ^ ^ + * 0 1 * - * expect_toplevel_expression_sequence - * def_1 + * i_tc==1: + * def foo : f64 = + * ^ ^ + * 0 1 */ - CHECK(parser.stack_size() == 2); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) == exprstatetype::def_1); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) - == exprstatetype::expect_toplevel_expression_sequence); + { + auto r5 = parser.include_token(token_type::singleassign()); - } + cerr << "parser state after [def foo : f64 =]" << endl; + cerr << parser << endl; - /* input: - * def foo : - * ^ ^ - * 0 1 - */ - { - auto r3 = parser.include_token(token_type::colon()); + REQUIRE(r5.get() == nullptr); - cerr << "parser state after [def foo :]" << endl; - cerr << parser << endl; + CHECK(parser.stack_size() == 3); - REQUIRE(r3.get() == nullptr); + /* stack should be + * + * expect_toplevel_expression_sequence + * def_4 + * expect_expression + */ + CHECK(parser.stack_size() == 3); + if (parser.stack_size() > 0) + CHECK(parser.i_exstype(0) == exprstatetype::expect_rhs_expression); + if (parser.stack_size() > 1) + CHECK(parser.i_exstype(1) == exprstatetype::def_4); + if (parser.stack_size() > 2) + CHECK(parser.i_exstype(2) + == exprstatetype::expect_toplevel_expression_sequence); + } - /* stack should be: + /* input: * - * expect_toplevel_expression_sequence - * def_2 - * expect_symbol - */ - CHECK(parser.stack_size() == 3); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) == exprstatetype::expect_type); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) == exprstatetype::def_2); - if (parser.stack_size() > 2) - CHECK(parser.i_exstype(2) - == exprstatetype::expect_toplevel_expression_sequence); - } - - /* input: - * def foo : f64 - * ^ ^ - * 0 1 - */ - { - auto r4 = parser.include_token(token_type::symbol_token("f64")); - - cerr << "parser state after [def foo : f64]" << endl; - cerr << parser << endl; - - REQUIRE(r4.get() == nullptr); - - CHECK(parser.stack_size() == 2); - - /* stack should be: + * i_tc==0: + * def foo = 3.14159265 + * ^ ^ + * 0 1 * - * expect_toplevel_expression_sequence - * def_3 + * i_tc==1: + * def foo : f64 = 3.14159265 + * ^ ^ + * 0 1 */ - CHECK(parser.stack_size() == 2); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) == exprstatetype::def_3); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) - == exprstatetype::expect_toplevel_expression_sequence); + { + auto r6 = parser.include_token(token_type::f64_token("3.14159265")); - /* expecting either: - * = rhs-expression - * new-expression - */ - } + cerr << "parser state after [def foo : f64 = 3.14159265]" << endl; + cerr << parser << endl; - /* input: - * def foo : f64 = - * ^ ^ - * 0 1 - */ - { - auto r5 = parser.include_token(token_type::singleassign()); + REQUIRE(r6.get() != nullptr); - cerr << "parser state after [def foo : f64 =]" << endl; - cerr << parser << endl; + CHECK(parser.stack_size() == 1); - REQUIRE(r5.get() == nullptr); - - CHECK(parser.stack_size() == 3); - - /* stack should be - * - * expect_toplevel_expression_sequence - * def_4 - * expect_expression - */ - CHECK(parser.stack_size() == 3); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) == exprstatetype::expect_rhs_expression); - if (parser.stack_size() > 1) - CHECK(parser.i_exstype(1) == exprstatetype::def_4); - if (parser.stack_size() > 2) - CHECK(parser.i_exstype(2) - == exprstatetype::expect_toplevel_expression_sequence); - } - - /* input: - * def foo : f64 = 3.14159265 - * ^ ^ - * 0 1 - */ - { - auto r6 = parser.include_token(token_type::f64_token("3.14159265")); - - cerr << "parser state after [def foo : f64 = 3.14159265]" << endl; - cerr << parser << endl; - - REQUIRE(r6.get() != nullptr); - - CHECK(parser.stack_size() == 1); - - /* stack should be - * - * expect_toplevel_expression_sequence - */ - CHECK(parser.stack_size() == 1); - if (parser.stack_size() > 0) - CHECK(parser.i_exstype(0) - == exprstatetype::expect_toplevel_expression_sequence); + /* stack should be + * + * expect_toplevel_expression_sequence + */ + CHECK(parser.stack_size() == 1); + if (parser.stack_size() > 0) + CHECK(parser.i_exstype(0) + == exprstatetype::expect_toplevel_expression_sequence); + } } } /*TEST_CASE(parser)*/ } /*namespace ut*/