Files

51 lines
1.1 KiB
C
Raw Permalink Normal View History

#include "ctx.h"
#include <ivy/lang/ast.h>
bool parse_unit(struct ivy_parser *parser, struct ivy_ast_node **out)
{
struct ivy_ast_unit_node *unit
= (struct ivy_ast_unit_node *)ivy_ast_node_create(IVY_AST_UNIT);
if (!unit) {
parser->p_status = IVY_ERR_NO_MEMORY;
return false;
}
bool result = true;
bool prev_was_expr = false;
while (1) {
struct ivy_ast_node *child = NULL;
if (parse_eof(parser)) {
break;
}
if (parse_linefeed(parser)) {
continue;
}
if (peek_keyword(parser, IVY_KW_PACKAGE)) {
result = parse_package_id(parser, &child);
} else if (peek_keyword(parser, IVY_KW_USE)) {
result = parse_package_import(parser, &child);
} else if (peek_keyword(parser, IVY_KW_CLASS)) {
result = parse_class(parser, &child);
} else if (peek_expr_start(parser)) {
result = parse_expr(
parser, EXPR_PARSE_CONSUME_TERMINATOR, &child);
} else {
parse_trace(parser, "unexpected token");
result = false;
}
if (!result || !child) {
break;
}
fx_queue_push_back(&unit->n_children, &child->n_entry);
}
*out = generic_node(unit);
return result;
}