Skip to content

Commit

Permalink
Refactored t_parser a little.
Browse files Browse the repository at this point in the history
  • Loading branch information
shin1m committed Jun 25, 2023
1 parent 72407b1 commit eb4fe7f
Showing 1 changed file with 25 additions and 44 deletions.
69 changes: 25 additions & 44 deletions src/parser.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ std::unique_ptr<ast::t_node> 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) {
Expand Down Expand Up @@ -97,7 +97,7 @@ std::unique_ptr<ast::t_node> t_parser::f_target(bool a_assignable)
case t_lexer::e_token__LEFT_PARENTHESIS:
{
v_lexer.f_next();
std::unique_ptr<ast::t_node> 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;
Expand Down Expand Up @@ -203,8 +203,7 @@ std::unique_ptr<ast::t_node> t_parser::f_target(bool a_assignable)
size_t indent = v_lexer.f_indent();
v_lexer.f_next();
std::unique_ptr<ast::t_call> call(new ast::t_call(at, std::unique_ptr<ast::t_node>(new ast::t_literal<t_svalue&>(at, v_module.f_slot(t_object::f_of(f_global()->f_type<t_map>()))))));
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);
Expand All @@ -215,16 +214,8 @@ std::unique_ptr<ast::t_node> 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);
}
Expand Down Expand Up @@ -260,16 +251,14 @@ std::unique_ptr<ast::t_node> 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<ast::t_node> node(new ast::t_break(at, f_end_of_expression() ? nullptr : f_expression()));
return node;
return std::unique_ptr<ast::t_node>(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<ast::t_node> node(new ast::t_continue(at));
return node;
return std::unique_ptr<ast::t_node>(new ast::t_continue(at));
}
case t_lexer::e_token__RETURN:
{
Expand Down Expand Up @@ -311,7 +300,7 @@ std::unique_ptr<ast::t_node> 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<ast::t_node> 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) {
Expand Down Expand Up @@ -344,7 +333,7 @@ std::unique_ptr<ast::t_node> 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<ast::t_node> 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);
Expand All @@ -366,7 +355,7 @@ std::unique_ptr<ast::t_node> 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<ast::t_node> 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) {
Expand Down Expand Up @@ -409,21 +398,21 @@ std::unique_ptr<ast::t_node> t_parser::f_unary(bool a_assignable)
switch (v_lexer.f_token()) {
case t_lexer::e_token__INTEGER:
{
intptr_t value = f_number<intptr_t>();
auto value = f_number<intptr_t>();
v_lexer.f_next();
return f_action(indent, new ast::t_literal<intptr_t>(at, instruction == e_instruction__MINUS_T ? -value : value), a_assignable);
}
case t_lexer::e_token__FLOAT:
{
double value = f_number<double>();
auto value = f_number<double>();
v_lexer.f_next();
return f_action(indent, new ast::t_literal<double>(at, instruction == e_instruction__MINUS_T ? -value : value), a_assignable);
}
}
break;
case e_instruction__COMPLEMENT_T:
if (v_lexer.f_token() == t_lexer::e_token__INTEGER) {
intptr_t value = f_number<intptr_t>();
auto value = f_number<intptr_t>();
v_lexer.f_next();
return f_action(indent, new ast::t_literal<intptr_t>(at, ~value), a_assignable);
}
Expand All @@ -434,7 +423,7 @@ std::unique_ptr<ast::t_node> t_parser::f_unary(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_multiplicative(bool a_assignable)
{
std::unique_ptr<ast::t_node> node = f_unary(a_assignable);
auto node = f_unary(a_assignable);
while (!v_lexer.f_newline()) {
t_instruction instruction;
switch (v_lexer.f_token()) {
Expand All @@ -459,7 +448,7 @@ std::unique_ptr<ast::t_node> t_parser::f_multiplicative(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_additive(bool a_assignable)
{
std::unique_ptr<ast::t_node> node = f_multiplicative(a_assignable);
auto node = f_multiplicative(a_assignable);
while (!v_lexer.f_newline()) {
t_instruction instruction;
switch (v_lexer.f_token()) {
Expand All @@ -481,7 +470,7 @@ std::unique_ptr<ast::t_node> t_parser::f_additive(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_shift(bool a_assignable)
{
std::unique_ptr<ast::t_node> node = f_additive(a_assignable);
auto node = f_additive(a_assignable);
while (!v_lexer.f_newline()) {
t_instruction instruction;
switch (v_lexer.f_token()) {
Expand All @@ -503,7 +492,7 @@ std::unique_ptr<ast::t_node> t_parser::f_shift(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_relational(bool a_assignable)
{
std::unique_ptr<ast::t_node> node = f_shift(a_assignable);
auto node = f_shift(a_assignable);
while (!v_lexer.f_newline()) {
t_instruction instruction;
switch (v_lexer.f_token()) {
Expand Down Expand Up @@ -531,7 +520,7 @@ std::unique_ptr<ast::t_node> t_parser::f_relational(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_equality(bool a_assignable)
{
std::unique_ptr<ast::t_node> node = f_relational(a_assignable);
auto node = f_relational(a_assignable);
while (!v_lexer.f_newline()) {
t_instruction instruction;
switch (v_lexer.f_token()) {
Expand Down Expand Up @@ -559,7 +548,7 @@ std::unique_ptr<ast::t_node> t_parser::f_equality(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_and(bool a_assignable)
{
std::unique_ptr<ast::t_node> 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();
Expand All @@ -570,7 +559,7 @@ std::unique_ptr<ast::t_node> t_parser::f_and(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_xor(bool a_assignable)
{
std::unique_ptr<ast::t_node> 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();
Expand All @@ -581,7 +570,7 @@ std::unique_ptr<ast::t_node> t_parser::f_xor(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_or(bool a_assignable)
{
std::unique_ptr<ast::t_node> 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();
Expand All @@ -592,7 +581,7 @@ std::unique_ptr<ast::t_node> t_parser::f_or(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_and_also(bool a_assignable)
{
std::unique_ptr<ast::t_node> 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();
Expand All @@ -606,7 +595,7 @@ std::unique_ptr<ast::t_node> t_parser::f_and_also(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_or_else(bool a_assignable)
{
std::unique_ptr<ast::t_node> 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();
Expand All @@ -620,7 +609,7 @@ std::unique_ptr<ast::t_node> t_parser::f_or_else(bool a_assignable)

std::unique_ptr<ast::t_node> t_parser::f_conditional(bool a_assignable)
{
std::unique_ptr<ast::t_node> 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();
Expand Down Expand Up @@ -711,7 +700,7 @@ std::unique_ptr<ast::t_node> 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<ast::t_node> 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();
Expand Down Expand Up @@ -741,22 +730,14 @@ std::unique_ptr<ast::t_node> t_parser::f_expression()

bool t_parser::f_expressions(size_t a_indent, std::vector<std::unique_ptr<ast::t_node>>& 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) {
if (v_lexer.f_newline() && v_lexer.f_indent() < a_indent) return false;
v_lexer.f_next();
continue;
}
if (!v_lexer.f_newline()) return false;
if (indent > 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());
Expand Down

0 comments on commit eb4fe7f

Please sign in to comment.