From: Brendan Hansen Date: Thu, 9 Jul 2020 18:25:11 +0000 (-0500) Subject: Bugfix for directive parsing X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=d9a4e38f5c090a2bd6dc8da4e45e4fd35f81548e;p=onyx.git Bugfix for directive parsing --- diff --git a/include/onyxmsgs.h b/include/onyxmsgs.h index 8490bd06..9c23a1a4 100644 --- a/include/onyxmsgs.h +++ b/include/onyxmsgs.h @@ -16,6 +16,8 @@ typedef enum OnyxMessageType { ONYX_MESSAGE_TYPE_NOT_LVAL, ONYX_MESSAGE_TYPE_ASSIGN_CONST, ONYX_MESSAGE_TYPE_UNKNOWN_SYMBOL, + ONYX_MESSAGE_TYPE_UNKNOWN_DIRECTIVE, + ONYX_MESSAGE_TYPE_CONFLICTING_GLOBALS, ONYX_MESSAGE_TYPE_BINOP_MISMATCH_TYPE, ONYX_MESSAGE_TYPE_ASSIGNMENT_TYPE_MISMATCH, diff --git a/onyx b/onyx index c96373e5..aeaff62d 100755 Binary files a/onyx and b/onyx differ diff --git a/src/onyxchecker.c b/src/onyxchecker.c index b63ae843..1361d78a 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -194,7 +194,7 @@ static void check_call(OnyxSemPassState* state, AstNodeCall* call) { if (formal_param->base.type != actual_param->base.type) { onyx_message_add(state->msgs, ONYX_MESSAGE_TYPE_FUNCTION_PARAM_TYPE_MISMATCH, - call->base.token->pos, + actual_param->value->token->pos, callee->base.token->text, callee->base.token->length, formal_param->base.type->name, arg_pos, actual_param->base.type->name); diff --git a/src/onyxmsgs.c b/src/onyxmsgs.c index 959c7969..4ef2848c 100644 --- a/src/onyxmsgs.c +++ b/src/onyxmsgs.c @@ -10,6 +10,8 @@ static const char* msg_formats[] = { "expected lval '%b'", "attempt to assign to constant '%b'", "unknown symbol '%s'", + "unknown directive '%b'", + "conflicting declarations of global '%s'", "mismatched types for binary operator, '%s', '%s'", "mismatched types on assignment, expected '%s', got '%s'", @@ -63,7 +65,7 @@ void onyx_message_print(OnyxMessages* msgs) { OnyxMessage* msg = msgs->first; i32 msg_count = 3; - while (msg && msg_count--) { + while (msg && msg_count-- > 0) { if (msg->pos.filename) { bh_file_contents* fc = &bh_table_get(bh_file_contents, *msgs->file_contents, (char *) msg->pos.filename); diff --git a/src/onyxparser.c b/src/onyxparser.c index b286f4c2..260217a7 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -688,7 +688,12 @@ static b32 parse_possible_directive(OnyxParser* parser, const char* dir) { expect(parser, '#'); OnyxToken* sym = expect(parser, TOKEN_TYPE_SYMBOL); - return strncmp(dir, sym->text, sym->length) == 0; + b32 match = (strlen(dir) == sym->length) && (strncmp(dir, sym->text, sym->length) == 0); + if (!match) { + parser_prev_token(parser); + parser_prev_token(parser); + } + return match; } static AstNodeFunction* parse_function_definition(OnyxParser* parser) { @@ -704,6 +709,16 @@ static AstNodeFunction* parse_function_definition(OnyxParser* parser) { else if (parse_possible_directive(parser, "inline")) { func_def->base.flags |= ONYX_AST_FLAG_INLINE; } + + else { + OnyxToken* directive_token = expect(parser, '#'); + OnyxToken* symbol_token = expect(parser, TOKEN_TYPE_SYMBOL); + + onyx_message_add(parser->msgs, + ONYX_MESSAGE_TYPE_UNKNOWN_DIRECTIVE, + directive_token->pos, + symbol_token->text, symbol_token->length); + } } AstNodeLocal* params = parse_function_params(parser);