From 28b09d0a0e59384b2effd4e90ce16118674b79a3 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 16 Jun 2020 22:37:07 -0500 Subject: [PATCH] Many small changes; working on function calls This version does not work for the minimal.onyx. --- docs/plan | 9 +++++++-- include/onyxlex.h | 8 ++++---- include/onyxparser.h | 14 ++++++++++++++ onyx | Bin 137224 -> 137728 bytes progs/demo.onyx | 6 +----- progs/minimal.onyx | 6 +----- progs/mvp.onyx | 16 +++++----------- src/onyxlex.c | 16 ++++++++-------- src/onyxparser.c | 44 +++++++++++++++++++++++++++++++++++++++---- src/onyxwasm.c | 6 ++++++ 10 files changed, 86 insertions(+), 39 deletions(-) diff --git a/docs/plan b/docs/plan index d91c21b5..b297a650 100644 --- a/docs/plan +++ b/docs/plan @@ -52,11 +52,12 @@ HOW: casts X to type T - [ ] Numeric literals are parsed and minimum type detected + [X] Curly braces are required for all bodies of blocks + [ ] Numeric literals are parsed + [ ] Numeric literals have the minimum type detected (automatically upcasts) [ ] Comparison operators [ ] Proper boolean type [ ] Conditional branching works as expected - [ ] Curly braces are required for all bodies of blocks [ ] Simple while loop is functioning as expected [ ] break and continue semantics [ ] Function calling works for the builtin types @@ -77,6 +78,10 @@ HOW: [ ] Devise and implement a simple set of implicit type casting rules. - Numeric literals always type cast to whatever type is needed (very flexible). + [ ] Strings should work as pointers to data. + - Literals should be placed in data section with pointers to the start. + - Should strings be null-terminated or a length at the start of the string? + [ ] Start work on evaluating compile time known values. - An expression marked COMPTIME will be reduced to its value in the parse tree. diff --git a/include/onyxlex.h b/include/onyxlex.h index b1b5eb06..366465ab 100644 --- a/include/onyxlex.h +++ b/include/onyxlex.h @@ -17,7 +17,6 @@ typedef enum OnyxTokenType { TOKEN_TYPE_KEYWORD_FOR, TOKEN_TYPE_KEYWORD_DO, TOKEN_TYPE_KEYWORD_RETURN, - TOKEN_TYPE_KEYWORD_CONST, TOKEN_TYPE_KEYWORD_FOREIGN, TOKEN_TYPE_KEYWORD_PROC, TOKEN_TYPE_KEYWORD_GLOBAL, @@ -31,8 +30,6 @@ typedef enum OnyxTokenType { TOKEN_TYPE_CLOSE_BRACE, TOKEN_TYPE_OPEN_BRACKET, TOKEN_TYPE_CLOSE_BRACKET, - TOKEN_TYPE_OPEN_ANGLE, - TOKEN_TYPE_CLOSE_ANGLE, TOKEN_TYPE_SYM_PLUS, TOKEN_TYPE_SYM_MINUS, @@ -44,8 +41,11 @@ typedef enum OnyxTokenType { TOKEN_TYPE_SYM_COLON, TOKEN_TYPE_SYM_SEMICOLON, TOKEN_TYPE_SYM_COMMA, + TOKEN_TYPE_SYM_GREATER, + TOKEN_TYPE_SYM_GREATER_EQUAL, + TOKEN_TYPE_SYM_LESS, + TOKEN_TYPE_SYM_LESS_EQUAL, TOKEN_TYPE_SYM_EQUALS, - TOKEN_TYPE_SYM_GRAVE, TOKEN_TYPE_SYM_TILDE, TOKEN_TYPE_SYM_BANG, TOKEN_TYPE_SYM_CARET, diff --git a/include/onyxparser.h b/include/onyxparser.h index f210da90..631fc092 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -13,6 +13,7 @@ typedef struct OnyxAstNodeScope OnyxAstNodeScope; typedef struct OnyxAstNodeBlock OnyxAstNodeBlock; typedef struct OnyxAstNodeParam OnyxAstNodeParam; typedef struct OnyxAstNodeFuncDef OnyxAstNodeFuncDef; +typedef struct OnyxAstNodeCall OnyxAstNodeCall; typedef struct OnyxParser { OnyxTokenizer *tokenizer; // NOTE: not used since all tokens are lexed before parsing starts @@ -162,6 +163,18 @@ struct OnyxAstNodeFuncDef { OnyxAstNodeParam *params; }; +struct OnyxAstNodeCall { + OnyxAstNodeKind kind; + u32 flags; + OnyxToken *token; // NOTE: Not specified (undefined) + OnyxTypeInfo *type; // NOTE: The type that the function returns + OnyxAstNode *next; + OnyxAstNode *callee; // NOTE: Function definition node + OnyxAstNode *arguments; // NOTE: Expressions that form the actual param list + // They will be chained down using the "next" property + // unless this becomes used by something else +}; + union OnyxAstNode { // Generic node structure for capturing all binary ops and statements @@ -180,6 +193,7 @@ union OnyxAstNode { OnyxAstNodeParam as_param; OnyxAstNodeLocal as_local; OnyxAstNodeScope as_scope; + OnyxAstNodeCall as_call; }; const char* onyx_ast_node_kind_string(OnyxAstNodeKind kind); diff --git a/onyx b/onyx index 74ff9b5d862da4e596e74b3de33f281ac0dcdca4..54fb7e20cea62187341433b97188c40a2131f32b 100755 GIT binary patch delta 46934 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 tTc7*}ZnZBi%eHN_{@U?>$e$zsW{2#`Fgo^+G diff --git a/progs/demo.onyx b/progs/demo.onyx index 2300ab04..b36b5c89 100644 --- a/progs/demo.onyx +++ b/progs/demo.onyx @@ -1,11 +1,7 @@ -/* This is a comment -This is also the only way to do comments -*/ - use "core"; /* Looks for "core.onyx" in the current directory */ Foo :: struct { x i32, y i32 }; add :: proc (a i32, b i32) -> i32 { return a + b + 1234.56; -}; \ No newline at end of file +}; diff --git a/progs/minimal.onyx b/progs/minimal.onyx index 17df6c75..79fa4857 100644 --- a/progs/minimal.onyx +++ b/progs/minimal.onyx @@ -12,13 +12,9 @@ export diff_square :: proc (a i32, b i32) -> i32 { c := a - b; // Mutable d :: a + b; // Constant - { - f :: 10; - }; - return (c * d) as i32; } export main :: proc () { - + add(2, 3); } diff --git a/progs/mvp.onyx b/progs/mvp.onyx index cb32d79b..dbef39d4 100644 --- a/progs/mvp.onyx +++ b/progs/mvp.onyx @@ -1,27 +1,21 @@ -/* Comments need to be parsed - /* nested comments /* are /* okay */ */ */ -*/ - foreign console { log :: proc (data ptr, length i32) -> void ---; } export add :: proc (a i32, b i32) -> i32 { return a + b; -}; +} export max :: proc (a i32, b i32) -> i32 { - /* Curly braces are required */ - x := "String literal! HERE \\\"Woot Woot\" done"; - + // Curly braces are always required if a > b { return a; } else { return b; } -}; +} -export main :: proc () -> void { +export main :: proc () { console.log(add(2, 3)); console.log(max(5, 10)); -}; +} diff --git a/src/onyxlex.c b/src/onyxlex.c index 7fdc4370..0a4c3035 100644 --- a/src/onyxlex.c +++ b/src/onyxlex.c @@ -15,7 +15,6 @@ static const char* onyx_token_type_names[] = { "for", //"TOKEN_TYPE_KEYWORD_FOR", "do", //"TOKEN_TYPE_KEYWORD_DO", "return", //"TOKEN_TYPE_KEYWORD_RETURN", - "const", //"TOKEN_TYPE_KEYWORD_CONST", "foreign", //"TOKEN_TYPE_KEYWORD_FOREIGN", "proc", //"TOKEN_TYPE_KEYWORD_PROC", "global", //"TOKEN_TYPE_KEYWORD_GLOBAL", @@ -29,8 +28,6 @@ static const char* onyx_token_type_names[] = { "}", //"TOKEN_TYPE_CLOSE_BRACE", "[", //"TOKEN_TYPE_OPEN_BRACKET", "]", //"TOKEN_TYPE_CLOSE_BRACKET", - "<", //"TOKEN_TYPE_OPEN_ANGLE", - ">", //"TOKEN_TYPE_CLOSE_ANGLE", "+", // "TOKEN_TYPE_SYM_PLUS", "-", // "TOKEN_TYPE_SYM_MINUS", @@ -42,8 +39,11 @@ static const char* onyx_token_type_names[] = { ":", // "TOKEN_TYPE_SYM_COLON", ";", // "TOKEN_TYPE_SYM_SEMICOLON", ",", // "TOKEN_TYPE_SYM_COMMA", + ">", // "TOKEN_TYPE_SYM_GREATER", + ">=", // "TOKEN_TYPE_SYM_GREATER_EQUAL", + "<", // "TOKEN_TYPE_SYM_LESS", + "<=", // "TOKEN_TYPE_SYM_LESS_EQUAL", "=", // "TOKEN_TYPE_SYM_EQUALS", - "`", // "TOKEN_TYPE_SYM_GRAVE", "~", // "TOKEN_TYPE_SYM_TILDE", "!", // "TOKEN_TYPE_SYM_BANG", "^", // "TOKEN_TYPE_SYM_CARET", @@ -139,21 +139,20 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) { LITERAL_TOKEN("foreign", TOKEN_TYPE_KEYWORD_FOREIGN); LITERAL_TOKEN("for", TOKEN_TYPE_KEYWORD_FOR); LITERAL_TOKEN("return", TOKEN_TYPE_KEYWORD_RETURN); - LITERAL_TOKEN("const", TOKEN_TYPE_KEYWORD_CONST); LITERAL_TOKEN("do", TOKEN_TYPE_KEYWORD_DO); LITERAL_TOKEN("proc", TOKEN_TYPE_KEYWORD_PROC); LITERAL_TOKEN("global", TOKEN_TYPE_KEYWORD_GLOBAL); LITERAL_TOKEN("as", TOKEN_TYPE_KEYWORD_CAST); LITERAL_TOKEN("->", TOKEN_TYPE_RIGHT_ARROW); LITERAL_TOKEN("<-", TOKEN_TYPE_RIGHT_ARROW); + LITERAL_TOKEN("<=", TOKEN_TYPE_SYM_LESS_EQUAL); + LITERAL_TOKEN(">=", TOKEN_TYPE_SYM_GREATER_EQUAL); LITERAL_TOKEN("(", TOKEN_TYPE_OPEN_PAREN); LITERAL_TOKEN(")", TOKEN_TYPE_CLOSE_PAREN); LITERAL_TOKEN("{", TOKEN_TYPE_OPEN_BRACE); LITERAL_TOKEN("}", TOKEN_TYPE_CLOSE_BRACE); LITERAL_TOKEN("[", TOKEN_TYPE_OPEN_BRACKET); LITERAL_TOKEN("]", TOKEN_TYPE_CLOSE_BRACKET); - LITERAL_TOKEN("<", TOKEN_TYPE_OPEN_ANGLE); - LITERAL_TOKEN(">", TOKEN_TYPE_CLOSE_ANGLE); LITERAL_TOKEN("+", TOKEN_TYPE_SYM_PLUS); LITERAL_TOKEN("-", TOKEN_TYPE_SYM_MINUS); LITERAL_TOKEN("*", TOKEN_TYPE_SYM_STAR); @@ -164,8 +163,9 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) { LITERAL_TOKEN(":", TOKEN_TYPE_SYM_COLON); LITERAL_TOKEN(";", TOKEN_TYPE_SYM_SEMICOLON); LITERAL_TOKEN(",", TOKEN_TYPE_SYM_COMMA); + LITERAL_TOKEN(">", TOKEN_TYPE_SYM_GREATER); + LITERAL_TOKEN("<", TOKEN_TYPE_SYM_LESS); LITERAL_TOKEN("=", TOKEN_TYPE_SYM_EQUALS); - LITERAL_TOKEN("`", TOKEN_TYPE_SYM_GRAVE); LITERAL_TOKEN("~", TOKEN_TYPE_SYM_TILDE); LITERAL_TOKEN("!", TOKEN_TYPE_SYM_BANG); LITERAL_TOKEN("^", TOKEN_TYPE_SYM_CARET); diff --git a/src/onyxparser.c b/src/onyxparser.c index 00530182..dff9dbba 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -1,4 +1,3 @@ - #include "onyxlex.h" #include "onyxmsgs.h" #include "onyxparser.h" @@ -92,7 +91,6 @@ static void parser_next_token(OnyxParser* parser) { static void parser_prev_token(OnyxParser* parser) { // TODO: This is probably wrong - parser->prev_token--; while (parser->prev_token->type == TOKEN_TYPE_COMMENT) parser->prev_token--; parser->curr_token = parser->prev_token; parser->prev_token--; @@ -214,8 +212,42 @@ static OnyxAstNode* parse_factor(OnyxParser* parser) { onyx_token_null_toggle(*sym_token); } - // TODO: Handle calling a function - return sym_node; + if (parser->curr_token->type != TOKEN_TYPE_OPEN_PAREN) { + return sym_node; + } + + // NOTE: Function call + expect(parser, TOKEN_TYPE_OPEN_PAREN); + + OnyxAstNodeCall* call_node = (OnyxAstNodeCall *) onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_CALL); + call_node->callee = sym_node; + OnyxAstNode** prev = &call_node->arguments; + OnyxAstNode* curr = NULL; + while (parser->curr_token->type != TOKEN_TYPE_CLOSE_PAREN) { + curr = parse_expression(parser); + + if (curr != NULL && curr->kind != ONYX_AST_NODE_KIND_ERROR) { + *prev = curr; + prev = &curr->next; + } + + if (parser->curr_token->type == TOKEN_TYPE_CLOSE_PAREN) + break; + + if (parser->curr_token->type != TOKEN_TYPE_SYM_COMMA) { + onyx_message_add(parser->msgs, + ONYX_MESSAGE_TYPE_EXPECTED_TOKEN, + parser->curr_token->pos, + onyx_get_token_type_name(TOKEN_TYPE_SYM_COMMA), + onyx_get_token_type_name(parser->curr_token->type)); + return &error_node; + } + + parser_next_token(parser); + } + parser_next_token(parser); + + return (OnyxAstNode *) call_node; } case TOKEN_TYPE_LITERAL_NUMERIC: @@ -246,6 +278,7 @@ static OnyxAstNode* parse_bin_op(OnyxParser* parser, OnyxAstNode* left) { case TOKEN_TYPE_SYM_STAR: kind = ONYX_AST_NODE_KIND_MULTIPLY; break; case TOKEN_TYPE_SYM_FSLASH: kind = ONYX_AST_NODE_KIND_DIVIDE; break; case TOKEN_TYPE_SYM_PERCENT: kind = ONYX_AST_NODE_KIND_MODULUS; break; + default: break; } if (kind != -1) { @@ -303,6 +336,7 @@ static OnyxAstNode* parse_expression(OnyxParser* parser) { return cast_node; } + default: break; } return left; @@ -669,6 +703,8 @@ static OnyxAstNode* parse_top_level_statement(OnyxParser* parser) { break; } } + + default: break; } parser_next_token(parser); diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 4b9f2007..2dcff896 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -358,6 +358,12 @@ static void process_expression(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* case ONYX_AST_NODE_KIND_BLOCK: process_block(mod, func, (OnyxAstNodeBlock *) expr); break; + case ONYX_AST_NODE_KIND_CALL: + { + DEBUG_HERE; + break; + } + default: DEBUG_HERE; bh_printf("Unhandled case: %d\n", expr->kind); -- 2.25.1