Missing semicolon error!
This commit is contained in:
parent
016e48570e
commit
25e730c8d3
@ -115,7 +115,8 @@ std::ostream& operator<<(std::ostream& os, Error const& err)
|
||||
[](errors::Unexpected_Empty_Source const&) { return "Unexpected end of file"; },
|
||||
[](errors::Unexpected_Keyword const&) { return "Unexpected keyword"; },
|
||||
[](errors::Unrecognized_Character const&) { return "Unrecognized character"; },
|
||||
[](errors::internal::Unexpected_Token const&) { return "Unexpected token"; }
|
||||
[](errors::internal::Unexpected_Token const&) { return "Unexpected token"; },
|
||||
[](errors::Expected_Expression_Separator_Before const&) { return "Missing semicolon"; }
|
||||
}, err.details);
|
||||
|
||||
error_heading(os, err.location, Error_Level::Error, short_description);
|
||||
@ -148,13 +149,22 @@ std::ostream& operator<<(std::ostream& os, Error const& err)
|
||||
encourage_contact(os);
|
||||
},
|
||||
|
||||
[&os](errors::Expected_Keyword const&) {},
|
||||
[&os](errors::Music_Literal_Used_As_Identifier const&) {},
|
||||
[&os](errors::Not_Callable const&) {},
|
||||
[&os](errors::Undefined_Identifier const&) {},
|
||||
[&os](errors::Undefined_Operator const&) {},
|
||||
[&os](errors::Unexpected_Keyword const&) {},
|
||||
[&os](errors::Unexpected_Empty_Source const&) {}
|
||||
[&os](errors::Expected_Expression_Separator_Before const& err) {
|
||||
os << "I failed to parse following code, due to missing semicolon before it!\n";
|
||||
|
||||
if (err.what == "var") {
|
||||
os << "\nIf you want to create variable inside expression try wrapping them inside parentheses like this:\n";
|
||||
os << " 10 + (var i = 20)\n";
|
||||
}
|
||||
},
|
||||
|
||||
[&os](errors::Expected_Keyword const&) { unimplemented(); },
|
||||
[&os](errors::Music_Literal_Used_As_Identifier const&) { unimplemented(); },
|
||||
[&os](errors::Not_Callable const&) { unimplemented(); },
|
||||
[&os](errors::Undefined_Identifier const&) { unimplemented(); },
|
||||
[&os](errors::Undefined_Operator const&) { unimplemented(); },
|
||||
[&os](errors::Unexpected_Keyword const&) { unimplemented(); },
|
||||
[&os](errors::Unexpected_Empty_Source const&) { unimplemented(); }
|
||||
}, err.details);
|
||||
|
||||
return os;
|
||||
|
@ -69,6 +69,11 @@ namespace errors
|
||||
std::string_view received_type = {};
|
||||
};
|
||||
|
||||
struct Expected_Expression_Separator_Before
|
||||
{
|
||||
std::string_view what;
|
||||
};
|
||||
|
||||
struct Unexpected_Keyword
|
||||
{
|
||||
std::string_view keyword;
|
||||
@ -109,6 +114,7 @@ namespace errors
|
||||
}
|
||||
|
||||
using Details = std::variant<
|
||||
Expected_Expression_Separator_Before,
|
||||
Expected_Keyword,
|
||||
Failed_Numeric_Parsing,
|
||||
Music_Literal_Used_As_Identifier,
|
||||
|
@ -40,6 +40,12 @@ Result<Ast> Parser::parse(std::string_view source, std::string_view filename)
|
||||
auto const result = parser.parse_sequence();
|
||||
|
||||
if (parser.token_id < parser.tokens.size()) {
|
||||
if (parser.expect(Token::Type::Keyword, "var")) {
|
||||
return Error {
|
||||
.details = errors::Expected_Expression_Separator_Before { .what = "var" },
|
||||
.location = parser.peek()->location
|
||||
};
|
||||
}
|
||||
errors::all_tokens_were_not_parsed(std::span(parser.tokens).subspan(parser.token_id));
|
||||
}
|
||||
|
||||
@ -54,10 +60,10 @@ Result<Ast> Parser::parse_sequence()
|
||||
|
||||
Result<Ast> Parser::parse_expression()
|
||||
{
|
||||
auto var = parse_variable_declaration();
|
||||
if (!var.has_value())
|
||||
if (expect(Token::Type::Keyword, "var")) {
|
||||
return parse_variable_declaration();
|
||||
}
|
||||
return parse_infix_expression();
|
||||
return var;
|
||||
}
|
||||
|
||||
Result<Ast> Parser::parse_variable_declaration()
|
||||
|
Loading…
Reference in New Issue
Block a user