From eb4fe7ff6321128c75f9e4e85956bc9ae67c4a85 Mon Sep 17 00:00:00 2001 From: Shin-ichi MORITA Date: Mon, 26 Jun 2023 06:19:40 +0900 Subject: [PATCH] Refactored t_parser a little. --- src/parser.cc | 69 +++++++++++++++++++-------------------------------- 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/src/parser.cc b/src/parser.cc index 6f385c70..2a39689b 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -24,7 +24,7 @@ std::unique_ptr t_parser::f_target(bool a_assignable) case t_lexer::e_token__SELF: { size_t outer = 0; - ast::t_scope* scope = v_scope; + auto scope = v_scope; if (v_lexer.f_token() == t_lexer::e_token__COLON) { outer = v_lexer.f_value().size(); for (size_t i = 0; i < outer; ++i) { @@ -97,7 +97,7 @@ std::unique_ptr t_parser::f_target(bool a_assignable) case t_lexer::e_token__LEFT_PARENTHESIS: { v_lexer.f_next(); - std::unique_ptr expression = f_expression(); + auto expression = f_expression(); if (v_lexer.f_token() != t_lexer::e_token__RIGHT_PARENTHESIS) f_throw(L"expecting ')'."sv); v_lexer.f_next(); return expression; @@ -203,8 +203,7 @@ std::unique_ptr t_parser::f_target(bool a_assignable) size_t indent = v_lexer.f_indent(); v_lexer.f_next(); std::unique_ptr call(new ast::t_call(at, std::unique_ptr(new ast::t_literal(at, v_module.f_slot(t_object::f_of(f_global()->f_type())))))); - if ((!v_lexer.f_newline() || v_lexer.f_indent() > indent) && v_lexer.f_token() != t_lexer::e_token__RIGHT_BRACE) { - size_t i = v_lexer.f_indent(); + if ((!v_lexer.f_newline() || v_lexer.f_indent() > indent) && v_lexer.f_token() != t_lexer::e_token__RIGHT_BRACE) while (true) { call->v_arguments.push_back(f_expression()); if (!f_single_colon()) f_throw(L"expecting ':'."sv); @@ -215,16 +214,8 @@ std::unique_ptr t_parser::f_target(bool a_assignable) v_lexer.f_next(); continue; } - if (!v_lexer.f_newline()) break; - if (i > indent) { - if (v_lexer.f_indent() < i) break; - if (v_lexer.f_indent() > i) f_throw(L"unexpected indent."sv); - } else { - i = v_lexer.f_indent(); - if (i <= indent) break; - } + if (!v_lexer.f_newline() || v_lexer.f_indent() <= indent) break; } - } if ((!v_lexer.f_newline() || v_lexer.f_indent() >= indent) && v_lexer.f_token() == t_lexer::e_token__RIGHT_BRACE) v_lexer.f_next(); return std::move(call); } @@ -260,16 +251,14 @@ std::unique_ptr t_parser::f_target(bool a_assignable) t_at at = v_lexer.f_at(); if (!v_can_jump) f_throw(L"expecting inside loop."sv, at); v_lexer.f_next(); - std::unique_ptr node(new ast::t_break(at, f_end_of_expression() ? nullptr : f_expression())); - return node; + return std::unique_ptr(new ast::t_break(at, f_end_of_expression() ? nullptr : f_expression())); } case t_lexer::e_token__CONTINUE: { t_at at = v_lexer.f_at(); if (!v_can_jump) f_throw(L"expecting inside loop."sv, at); v_lexer.f_next(); - std::unique_ptr node(new ast::t_continue(at)); - return node; + return std::unique_ptr(new ast::t_continue(at)); } case t_lexer::e_token__RETURN: { @@ -311,7 +300,7 @@ std::unique_ptr t_parser::f_action(size_t a_indent, std::unique_ptr case t_lexer::e_token__LEFT_PARENTHESIS: { v_lexer.f_next(); - std::unique_ptr key = f_expression(); + auto key = f_expression(); if (v_lexer.f_token() != t_lexer::e_token__RIGHT_PARENTHESIS) f_throw(L"expecting ')'."sv); v_lexer.f_next(); if (v_lexer.f_token() == t_lexer::e_token__EQUAL) { @@ -344,7 +333,7 @@ std::unique_ptr t_parser::f_action(size_t a_indent, std::unique_ptr case t_lexer::e_token__LEFT_PARENTHESIS: { v_lexer.f_next(); - std::unique_ptr key = f_expression(); + auto key = f_expression(); if (v_lexer.f_token() != t_lexer::e_token__RIGHT_PARENTHESIS) f_throw(L"expecting ')'."sv); v_lexer.f_next(); return f_action(a_indent, new ast::t_object_has_indirect(at, std::move(a_target), std::move(key)), a_assignable); @@ -366,7 +355,7 @@ std::unique_ptr t_parser::f_action(size_t a_indent, std::unique_ptr { t_at at = v_lexer.f_at(); v_lexer.f_next(); - std::unique_ptr index = f_expression(); + auto index = f_expression(); if (v_lexer.f_token() != t_lexer::e_token__RIGHT_BRACKET) f_throw(L"expecting ']'."sv); v_lexer.f_next(); if (v_lexer.f_token() == t_lexer::e_token__EQUAL) { @@ -409,13 +398,13 @@ std::unique_ptr t_parser::f_unary(bool a_assignable) switch (v_lexer.f_token()) { case t_lexer::e_token__INTEGER: { - intptr_t value = f_number(); + auto value = f_number(); v_lexer.f_next(); return f_action(indent, new ast::t_literal(at, instruction == e_instruction__MINUS_T ? -value : value), a_assignable); } case t_lexer::e_token__FLOAT: { - double value = f_number(); + auto value = f_number(); v_lexer.f_next(); return f_action(indent, new ast::t_literal(at, instruction == e_instruction__MINUS_T ? -value : value), a_assignable); } @@ -423,7 +412,7 @@ std::unique_ptr t_parser::f_unary(bool a_assignable) break; case e_instruction__COMPLEMENT_T: if (v_lexer.f_token() == t_lexer::e_token__INTEGER) { - intptr_t value = f_number(); + auto value = f_number(); v_lexer.f_next(); return f_action(indent, new ast::t_literal(at, ~value), a_assignable); } @@ -434,7 +423,7 @@ std::unique_ptr t_parser::f_unary(bool a_assignable) std::unique_ptr t_parser::f_multiplicative(bool a_assignable) { - std::unique_ptr node = f_unary(a_assignable); + auto node = f_unary(a_assignable); while (!v_lexer.f_newline()) { t_instruction instruction; switch (v_lexer.f_token()) { @@ -459,7 +448,7 @@ std::unique_ptr t_parser::f_multiplicative(bool a_assignable) std::unique_ptr t_parser::f_additive(bool a_assignable) { - std::unique_ptr node = f_multiplicative(a_assignable); + auto node = f_multiplicative(a_assignable); while (!v_lexer.f_newline()) { t_instruction instruction; switch (v_lexer.f_token()) { @@ -481,7 +470,7 @@ std::unique_ptr t_parser::f_additive(bool a_assignable) std::unique_ptr t_parser::f_shift(bool a_assignable) { - std::unique_ptr node = f_additive(a_assignable); + auto node = f_additive(a_assignable); while (!v_lexer.f_newline()) { t_instruction instruction; switch (v_lexer.f_token()) { @@ -503,7 +492,7 @@ std::unique_ptr t_parser::f_shift(bool a_assignable) std::unique_ptr t_parser::f_relational(bool a_assignable) { - std::unique_ptr node = f_shift(a_assignable); + auto node = f_shift(a_assignable); while (!v_lexer.f_newline()) { t_instruction instruction; switch (v_lexer.f_token()) { @@ -531,7 +520,7 @@ std::unique_ptr t_parser::f_relational(bool a_assignable) std::unique_ptr t_parser::f_equality(bool a_assignable) { - std::unique_ptr node = f_relational(a_assignable); + auto node = f_relational(a_assignable); while (!v_lexer.f_newline()) { t_instruction instruction; switch (v_lexer.f_token()) { @@ -559,7 +548,7 @@ std::unique_ptr t_parser::f_equality(bool a_assignable) std::unique_ptr t_parser::f_and(bool a_assignable) { - std::unique_ptr node = f_equality(a_assignable); + auto node = f_equality(a_assignable); while (!v_lexer.f_newline() && v_lexer.f_token() == t_lexer::e_token__AMPERSAND) { t_at at = v_lexer.f_at(); v_lexer.f_next(); @@ -570,7 +559,7 @@ std::unique_ptr t_parser::f_and(bool a_assignable) std::unique_ptr t_parser::f_xor(bool a_assignable) { - std::unique_ptr node = f_and(a_assignable); + auto node = f_and(a_assignable); while (!v_lexer.f_newline() && v_lexer.f_token() == t_lexer::e_token__HAT) { t_at at = v_lexer.f_at(); v_lexer.f_next(); @@ -581,7 +570,7 @@ std::unique_ptr t_parser::f_xor(bool a_assignable) std::unique_ptr t_parser::f_or(bool a_assignable) { - std::unique_ptr node = f_xor(a_assignable); + auto node = f_xor(a_assignable); while (!v_lexer.f_newline() && v_lexer.f_token() == t_lexer::e_token__BAR) { t_at at = v_lexer.f_at(); v_lexer.f_next(); @@ -592,7 +581,7 @@ std::unique_ptr t_parser::f_or(bool a_assignable) std::unique_ptr t_parser::f_and_also(bool a_assignable) { - std::unique_ptr node = f_or(a_assignable); + auto node = f_or(a_assignable); while (!v_lexer.f_newline() && v_lexer.f_token() == t_lexer::e_token__AND_ALSO) { t_at at = v_lexer.f_at(); v_lexer.f_next(); @@ -606,7 +595,7 @@ std::unique_ptr t_parser::f_and_also(bool a_assignable) std::unique_ptr t_parser::f_or_else(bool a_assignable) { - std::unique_ptr node = f_and_also(a_assignable); + auto node = f_and_also(a_assignable); while (!v_lexer.f_newline() && v_lexer.f_token() == t_lexer::e_token__OR_ELSE) { t_at at = v_lexer.f_at(); v_lexer.f_next(); @@ -620,7 +609,7 @@ std::unique_ptr t_parser::f_or_else(bool a_assignable) std::unique_ptr t_parser::f_conditional(bool a_assignable) { - std::unique_ptr node = f_or_else(a_assignable); + auto node = f_or_else(a_assignable); if (v_lexer.f_newline() || v_lexer.f_token() != t_lexer::e_token__QUESTION) return node; t_at at = v_lexer.f_at(); v_lexer.f_next(); @@ -711,7 +700,7 @@ std::unique_ptr t_parser::f_expression() while (v_lexer.f_indent() == indent && v_lexer.f_token() == t_lexer::e_token__CATCH) { catching = true; v_lexer.f_next(); - std::unique_ptr expression = f_expression(); + auto expression = f_expression(); if (v_lexer.f_token() != t_lexer::e_token__SYMBOL) f_throw(L"expecting symbol."sv); t_object* symbol = f_symbol(); v_lexer.f_next(); @@ -741,7 +730,6 @@ std::unique_ptr t_parser::f_expression() bool t_parser::f_expressions(size_t a_indent, std::vector>& a_nodes) { - size_t indent = v_lexer.f_indent(); while (v_lexer.f_token() != t_lexer::e_token__ASTERISK) { a_nodes.push_back(f_expression()); if (v_lexer.f_token() == t_lexer::e_token__COMMA) { @@ -749,14 +737,7 @@ bool t_parser::f_expressions(size_t a_indent, std::vector a_indent) { - if (v_lexer.f_indent() < indent) return false; - if (v_lexer.f_indent() > indent) f_throw(L"unexpected indent."sv); - } else { - indent = v_lexer.f_indent(); - if (indent <= a_indent) return false; - } + if (!v_lexer.f_newline() || v_lexer.f_indent() <= a_indent) return false; } v_lexer.f_next(); a_nodes.push_back(f_expression());