Parse tl-typedef
This commit is contained in:
parent
29fd757517
commit
f283149090
@ -404,7 +404,7 @@ namespace parsing {
|
||||
}
|
||||
}
|
||||
|
||||
Result<std::unique_ptr<AST::TopLevelStatement>, std::string> parse_top_level_statement(token::TokenStream& stream, Scope& scope) {
|
||||
Result<std::unique_ptr<AST::TopLevelStatement>, std::string> parse_function(token::TokenStream& stream, Scope& scope) {
|
||||
token::TokenStream inner{ stream };
|
||||
auto before_meta = inner.metadata();
|
||||
try {
|
||||
@ -492,4 +492,42 @@ namespace parsing {
|
||||
return std::string(error.what());
|
||||
}
|
||||
}
|
||||
|
||||
Result<std::unique_ptr<AST::TopLevelStatement>, std::string> parse_tl_typedef(token::TokenStream& stream, Scope& scope) {
|
||||
token::TokenStream inner{ stream };
|
||||
auto before_meta = inner.metadata();
|
||||
try {
|
||||
auto ty = parse_type(inner, scope).unwrap();
|
||||
|
||||
stream.m_position = inner.m_position;
|
||||
auto tl_typedef = new AST::TopLevelTypedef{
|
||||
before_meta + stream.metadata(), ty
|
||||
};
|
||||
return std::unique_ptr<AST::TopLevelStatement>{tl_typedef};
|
||||
}
|
||||
catch (std::runtime_error& error) {
|
||||
return std::string(error.what());
|
||||
}
|
||||
}
|
||||
|
||||
Result<std::unique_ptr<AST::TopLevelStatement>, std::string> parse_top_level_statement(token::TokenStream& stream, Scope& scope) {
|
||||
token::TokenStream inner{ stream };
|
||||
auto before_meta = inner.metadata();
|
||||
try {
|
||||
if (auto func = parse_function(inner, scope); func.ok()) {
|
||||
stream.m_position = inner.m_position;
|
||||
return func.unwrap();
|
||||
}
|
||||
else if (auto tl_typedef = parse_tl_typedef(inner, scope); tl_typedef.ok()) {
|
||||
stream.m_position = inner.m_position;
|
||||
return tl_typedef.unwrap();
|
||||
}
|
||||
else {
|
||||
throw std::runtime_error("Expected top-level statement, got " + inner.peek().formatted());
|
||||
}
|
||||
}
|
||||
catch (std::runtime_error& error) {
|
||||
return std::string(error.what());
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user