From f7489e89e73d10dce694f599a6b29b02480b6aa2 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 19 Jun 2020 21:38:04 -0500 Subject: [PATCH] Added bin ops with precedence; bug fixes --- include/onyxparser.h | 4 -- include/onyxutils.h | 3 + onyx | Bin 152896 -> 158352 bytes progs/minimal.onyx | 10 +-- src/onyx.c | 10 ++- src/onyxparser.c | 160 +++++++++++++++++++++++++------------------ src/onyxutils.c | 3 + src/onyxwasm.c | 26 +++++++ 8 files changed, 136 insertions(+), 80 deletions(-) diff --git a/include/onyxparser.h b/include/onyxparser.h index df4adab6..91dc48ff 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -21,10 +21,6 @@ typedef struct OnyxParser { OnyxToken *prev_token; OnyxToken *curr_token; - // BUG: This way of handling identifiers will work for now, - // but it will not allow for shadowing. Also, variable names - // cannot be the same as any function or global variable. - // That will get annoying to program. // NOTE: A table of the current identifiers in the current scope. // If the identifier doesn't at the time of parsing, it is an error. // Cleared at the end of a block. diff --git a/include/onyxutils.h b/include/onyxutils.h index 63b6f601..a63e4558 100644 --- a/include/onyxutils.h +++ b/include/onyxutils.h @@ -2,4 +2,7 @@ #include "onyxparser.h" +extern bh_scratch global_scratch; +extern bh_allocator global_scratch_allocator; + void onyx_ast_print(OnyxAstNode* program, i32 indent); diff --git a/onyx b/onyx index 86ccaf9ebe9972c33c0e141faf14cae4bed9c0cb..59fdd5b4cc20fbbebe03806ed8025a447c2791a6 100755 GIT binary patch delta 61328 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 z zlN|XT6x+K5=SQ`WtG2y@ksRhL(YG-wg@NxYv86<%1|Hm}(h!DcqnM*oD-Vum;EeoP zEift1%>SSTJ9`+^QXZ+7Z%zAEa-P5}6Uerv1KHMeAlsS_WLwjLY->7@ZA}NVt?59v zH66&drUMUP*6|CpY)$)xsq~$m5Vkcf`$f3u#lB#gA^akP$dD9@jrB0eubPv-;o}IV zHHu$U6%vaLzL(#tm7LIu3j4*V7a_oQn!^0zT>VH7?LPa(2S$*dVA_55OAI82OY+Bl z4JN*^`FmT*k>gI&)aMg29wa~2{7(^8=~Z&MvF&Pql*TWWT|p{%A97)&TW*|0x-kaB z*wbF)RASL`)!#7$Sh$49$|=61&=QCG=httIA;APwYIDH}QpB?)l3)uER(5)&U^uWlev&Ty^uLF&ph|kHz$~Loyuy;+NKrT4tDO|Za6~@Ek;xGzp{@K=YouE}@ zw2DSO1Z$ebRiY~8%WdS)+H=u9J`$}rMJL<`LF$8^6E5KNTVI*_;Dh`TRpo&E#%<-` zy6vG$@$s37S=lkJX=BMZ+C_UBio>TLLgaTA7rt-eyUv-Jzp1Jm9ZN52sAtjReK-59 z2VRM$&>|$ZLi5ke|Ej7Sr{E(!!RUuq*Zmo{Yc8#PRxErhlRR1P{9V(R$co$A5 z`+n|f4V%uL$oPH{_%kcHGYOe5ZB)_~ICk0?WSo=SUl%1-(d=73CiLx)HE^GC+Xjr3;_XwTWvzsQ(pN7I4-AI^>f#o5t*h?Som zoj}g!AT{h<#O@ba4L-WqxrqI|oxX)uxi_ZxAUYSZUl0D7z6TdX2P5_yq4dW;L3A); z|0tL~h8MIAz2E+Eun)=5!HE5n;01)!!HE545N!wq(Yc8IR#nm*MCT&*Ps4hEF0peF zyB1HMV&mr`_E`?n#I~dCvx8jlKyvDIFk-hJjM(P{Xeh%EM(lH4E#WTTkFw7TY=)VZ zAB@=N*LHxz4-4!ISo2_0na)D&mEv45#Lq?S&pOCwZgr8c%8ase5nb$p*>$VcOktG{ zM(odpq{0wC7_l#5E(ohxrd2u%vHQm@BdhFO#GdE)*<*E$)vEPe#J)B_x72l=uu2Cb z_LoBF=poEW2P5`;=7O-gp1FX!(piW-Anq|)W#=OH4cM79>sny7YCRXRzb2|mkJP$- zqcy^tM1<*J#J*Y7l@=fNEzBQSZBHG<8Ao4E3?MwkzT81QhevpY)vEPe#QuUcz&WN- zJs#RthCERo;aqEkUo<03havXBgzw2JI~cKVcThj$R(DvfTF*u7yDW9JziwJ3qq~_M zJ|NB32%+UX z!rsk^Nl^dq4kRj^N7x6c)es|o9$_Ei`WqSERzrhnp5^BeIF$YgxQ~<0BkbZlB3P#b z348g0L@*sl*vk(jg6TlQUVb1EOa~J7r#y!``~iFNAq^lrb(a>+Qr$34{H8%#Ihs&um8u!Yi1 zIE*aI{(fpI9Yo_7c9sZEKXry6gs(?QS+jYsIpl)zFc87^uC;h_K+RjPN4&$N>-f@_ z5Y@c3dSvPVrdO)Lfz$_1R+}iv0m^7l=y8~TGvNl&$BmKX$f~3m3#!N`239Qkq9_`r z@}hfmDe^5ZnS(+GJIh>Xzb-`w52~n$>{l0j`gmJZ3i$U>GUheZLv9dCvnF=2rKpi$ z_`;nSwma84l;$$p7>J^WB3fz3um{K

$87O}D5bFq(m($FRrR{-Jb_qeW=ceQ=(l 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 i32 { c := a - b; // Mutable d :: a + b; // Constant - return (c * d) as i32; + return c * d; } export do_stuff :: proc -> i32 { res := diff_square((4 + 5) as i32, (2 + 3) as i32); res = res + foo(); - // res should be 66 - return res * (0 - 1); + // res should be -66 + return res * -1; } -export float_test :: proc -> f32 { - return (1.2f + 5.3f); +float_test :: proc -> f32 { + return 3.14159f; } export main :: proc { diff --git a/src/onyx.c b/src/onyx.c index 5a07b655..816a38a7 100644 --- a/src/onyx.c +++ b/src/onyx.c @@ -9,6 +9,12 @@ #include "onyxwasm.h" int main(int argc, char *argv[]) { + + bh_allocator alloc = bh_heap_allocator(); + + bh_scratch_init(&global_scratch, alloc, 16 * 1024); // NOTE: 16 KB + global_scratch_allocator = bh_scratch_allocator(&global_scratch); + bh_file source_file; bh_file_error err = bh_file_open(&source_file, argv[1]); if (err != BH_FILE_ERROR_NONE) { @@ -16,8 +22,6 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - bh_allocator alloc = bh_heap_allocator(); - // NOTE: 1st: Read file contents bh_file_contents fc = bh_file_read_contents(alloc, &source_file); bh_file_close(&source_file); @@ -51,7 +55,7 @@ int main(int argc, char *argv[]) { onyx_message_print(&msgs); goto main_exit; } else { - onyx_ast_print(program, 0); + // onyx_ast_print(program, 0); bh_printf("\nNo errors.\n"); } diff --git a/src/onyxparser.c b/src/onyxparser.c index 4a65939a..9cdbda49 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -1,6 +1,7 @@ #include "onyxlex.h" #include "onyxmsgs.h" #include "onyxparser.h" +#include "onyxutils.h" static const char* ast_node_names[] = { "ERROR", @@ -240,6 +241,22 @@ static OnyxAstNode* parse_factor(OnyxParser* parser) { return expr; } + case TOKEN_TYPE_SYM_MINUS: + { + parser_next_token(parser); + OnyxAstNode* factor = parse_factor(parser); + + OnyxAstNode* negate_node = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_NEGATE); + negate_node->left = factor; + negate_node->type = factor->type; + + if ((factor->flags & ONYX_AST_FLAG_COMPTIME) != 0) { + negate_node->flags |= ONYX_AST_FLAG_COMPTIME; + } + + return negate_node; + } + case TOKEN_TYPE_SYMBOL: { OnyxToken* sym_token = expect(parser, TOKEN_TYPE_SYMBOL); @@ -310,82 +327,89 @@ static OnyxAstNode* parse_factor(OnyxParser* parser) { return NULL; } -static OnyxAstNode* parse_bin_op(OnyxParser* parser, OnyxAstNode* left) { - OnyxAstNodeKind kind = -1; - - switch (parser->curr_token->type) { - case TOKEN_TYPE_SYM_PLUS: kind = ONYX_AST_NODE_KIND_ADD; break; - case TOKEN_TYPE_SYM_MINUS: kind = ONYX_AST_NODE_KIND_MINUS; break; - 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) { - OnyxToken* bin_op_tok = parser->curr_token; - parser_next_token(parser); - - OnyxAstNode* right = parse_factor(parser); - - // NOTE: Typechecking like this will not be here for long but - // want to start working on it early - if (left->type != right->type) { - onyx_message_add(parser->msgs, - ONYX_MESSAGE_TYPE_BINOP_MISMATCH_TYPE, - bin_op_tok->pos, - left->type->name, right->type->name); - return &error_node; - } - - OnyxAstNode* bin_op = onyx_ast_node_new(parser->allocator, kind); - bin_op->left = left; - bin_op->right = right; - bin_op->type = left->type; - - if ((left->flags & ONYX_AST_FLAG_COMPTIME) != 0 && (right->flags & ONYX_AST_FLAG_COMPTIME) != 0) { - bin_op->flags |= ONYX_AST_FLAG_COMPTIME; - } - - return bin_op; - } - - return &error_node; +static inline i32 get_precedence(OnyxAstNodeKind kind) { + switch (kind) { + case ONYX_AST_NODE_KIND_ADD: return 1; + case ONYX_AST_NODE_KIND_MINUS: return 1; + case ONYX_AST_NODE_KIND_MULTIPLY: return 2; + case ONYX_AST_NODE_KIND_DIVIDE: return 2; + case ONYX_AST_NODE_KIND_MODULUS: return 3; + case ONYX_AST_NODE_KIND_CAST: return 4; + default: return -1; + } } static OnyxAstNode* parse_expression(OnyxParser* parser) { - OnyxAstNode* left = parse_factor(parser); + bh_arr(OnyxAstNode*) tree_stack = NULL; + bh_arr_new(global_scratch_allocator, tree_stack, 4); + bh_arr_set_length(tree_stack, 0); - switch (parser->curr_token->type) { - case TOKEN_TYPE_SYM_PLUS: - case TOKEN_TYPE_SYM_MINUS: - case TOKEN_TYPE_SYM_STAR: - case TOKEN_TYPE_SYM_FSLASH: - case TOKEN_TYPE_SYM_PERCENT: - { - OnyxAstNode* expr = parse_bin_op(parser, left); - return expr; - } - case TOKEN_TYPE_KEYWORD_CAST: - { - parser_next_token(parser); - OnyxTypeInfo* type = parse_type(parser); + OnyxAstNode* left = parse_factor(parser); + OnyxAstNode* right; + OnyxAstNode* root = left; + + i32 bin_op_kind; + OnyxToken* bin_op_tok; + + while (1) { + bin_op_kind = -1; + switch (parser->curr_token->type) { + case TOKEN_TYPE_SYM_PLUS: bin_op_kind = ONYX_AST_NODE_KIND_ADD; break; + case TOKEN_TYPE_SYM_MINUS: bin_op_kind = ONYX_AST_NODE_KIND_MINUS; break; + case TOKEN_TYPE_SYM_STAR: bin_op_kind = ONYX_AST_NODE_KIND_MULTIPLY; break; + case TOKEN_TYPE_SYM_FSLASH: bin_op_kind = ONYX_AST_NODE_KIND_DIVIDE; break; + case TOKEN_TYPE_SYM_PERCENT: bin_op_kind = ONYX_AST_NODE_KIND_MODULUS; break; + case TOKEN_TYPE_KEYWORD_CAST: bin_op_kind = ONYX_AST_NODE_KIND_CAST; break; + default: goto expression_done; + } - // NOTE: This may be premature in the parser but a cast - // node doesn't need to exist if the source and target - // types are the same - if (type == left->type) return left; + if (bin_op_kind != -1) { + bin_op_tok = parser->curr_token; + parser_next_token(parser); + + OnyxAstNode* bin_op = onyx_ast_node_new(parser->allocator, bin_op_kind); + + while ( !bh_arr_is_empty(tree_stack) && + get_precedence(bh_arr_last(tree_stack)->kind) >= get_precedence(bin_op_kind)) + bh_arr_pop(tree_stack); + + if (bh_arr_is_empty(tree_stack)) { + // NOTE: new is now the root node + bin_op->left = root; + root = bin_op; + } else { + bin_op->left = bh_arr_last(tree_stack)->right; + bh_arr_last(tree_stack)->right = bin_op; + } + + bh_arr_push(tree_stack, bin_op); + + if (bin_op_kind == ONYX_AST_NODE_KIND_CAST) { + bin_op->type = parse_type(parser); + } else { + right = parse_factor(parser); + if (left->type != right->type) { + onyx_message_add(parser->msgs, + ONYX_MESSAGE_TYPE_BINOP_MISMATCH_TYPE, + bin_op_tok->pos, + left->type->name, right->type->name); + + find_token(parser, TOKEN_TYPE_SYM_SEMICOLON); + return &error_node; + } - OnyxAstNode* cast_node = onyx_ast_node_new(parser->allocator, ONYX_AST_NODE_KIND_CAST); - cast_node->type = type; - cast_node->left = left; + bin_op->right = right; + bin_op->type = right->type; - return cast_node; - } - default: break; - } + if ((left->flags & ONYX_AST_FLAG_COMPTIME) != 0 && (right->flags & ONYX_AST_FLAG_COMPTIME) != 0) { + bin_op->flags |= ONYX_AST_FLAG_COMPTIME; + } + } + } + } - return left; +expression_done: + return root; } static OnyxAstNode* parse_if_stmt(OnyxParser* parser) { diff --git a/src/onyxutils.c b/src/onyxutils.c index 5f0e97c9..77cd47d0 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -2,6 +2,9 @@ #include "onyxlex.h" #include "onyxparser.h" +bh_scratch global_scratch; +bh_allocator global_scratch_allocator; + #define print_indent { if (indent > 0) bh_printf("\n"); for (int i = 0; i < indent; i++) bh_printf(" "); } void onyx_ast_print(OnyxAstNode* node, i32 indent) { diff --git a/src/onyxwasm.c b/src/onyxwasm.c index 27760df3..ce965f20 100644 --- a/src/onyxwasm.c +++ b/src/onyxwasm.c @@ -333,6 +333,32 @@ static void process_expression(OnyxWasmModule* mod, WasmFunc* func, OnyxAstNode* break; } + case ONYX_AST_NODE_KIND_NEGATE: + { + OnyxTypeInfoKind type_kind = expr->type->kind; + + if (type_kind == ONYX_TYPE_INFO_KIND_INT32) { + bh_arr_push(func->code, ((WasmInstruction){ WI_I32_CONST, 0x00 })); + process_expression(mod, func, expr->left); + bh_arr_push(func->code, ((WasmInstruction){ WI_I32_SUB, 0x00 })); + + } else if (type_kind == ONYX_TYPE_INFO_KIND_INT64) { + bh_arr_push(func->code, ((WasmInstruction){ WI_I64_CONST, 0x00 })); + process_expression(mod, func, expr->left); + bh_arr_push(func->code, ((WasmInstruction){ WI_I64_SUB, 0x00 })); + + } else { + process_expression(mod, func, expr->left); + + if (type_kind == ONYX_TYPE_INFO_KIND_FLOAT32) + bh_arr_push(func->code, ((WasmInstruction){ WI_F32_NEG, 0x00 })); + + if (type_kind == ONYX_TYPE_INFO_KIND_FLOAT64) + bh_arr_push(func->code, ((WasmInstruction){ WI_F32_NEG, 0x00 })); + } + break; + } + case ONYX_AST_NODE_KIND_LOCAL: case ONYX_AST_NODE_KIND_PARAM: { -- 2.25.1