From 7793ee1739ccb239819c6664c89727697be4bf97 Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Fri, 2 Aug 2024 11:52:50 -0400 Subject: type_helper_pre --- tnslc/parse/ast.tnsl | 85 +++++++++++++++++++++++++++++++++++++++------- tnslc/parse/tokenizer.tnsl | 8 ++++- 2 files changed, 79 insertions(+), 14 deletions(-) (limited to 'tnslc/parse') diff --git a/tnslc/parse/ast.tnsl b/tnslc/parse/ast.tnsl index 9011de1..3cdf269 100644 --- a/tnslc/parse/ast.tnsl +++ b/tnslc/parse/ast.tnsl @@ -49,10 +49,10 @@ struct Node { return ';' ;; else if (ch == '(') return ')' - ;; else if (ch == '{') - return '}' ;; else if (ch == '[') return ']' + ;; else if (ch == '{') + return '}' ;/ return 0 ;/ @@ -85,10 +85,53 @@ struct Node { -# AST types +# AST types /; _type_helper_pre (~utils.File fin, ~Node mod, ~Token first) + /; loop (bool run = true; first`._type !== TTYPE_ERR && run == true) + /; if (first`._type == TTYPE_AUG && first`.eq("~\0") == true) + # Pointer + Node ptr + ptr.init(NTYPE_PRE_OP, first`.data) + mod`.sub.push(~ptr) + first` = produce_next_token(fin, first`) + ;; else if (first`._type == TTYPE_DELIM && first`.eq("{\0") == true) + # Array + Node arr + arr.init(NTYPE_PRE_OP, first`.data) + first` = produce_next_token(fin, first`) + + /; if (first`._type == TTYPE_LITRL && is_numeric(first`.data`) == true) + Node num + num.init(NTYPE_LITERAL, first`.data) + arr.sub.push(~num) + + first` = produce_next_token(fin, first`) + /; if (first`.eq("}\0") == true) + Token tmp = produce_next_token(fin, first`) + first`.end() + first` = tmp + ;; else + _ast_print_err(first, "Expected closing '}' after integer in type declaration\0") + run = false + ;/ + ;; else if (first`.eq("}\0") == true) + Token tmp = produce_next_token(fin, first`) + first`.end() + first` = tmp + ;; else + _ast_print_err(first, "Expected integer or '}' to define either a fixed sized array or pointer to unknown sized array\0") + run = false + ;/ + + mod`.sub.push(~arr) + + ;; else + run = false + ;/ + ;/ + ;/ /; _type_helper_func (~utils.File fin, ~Node mod, ~Token first) @@ -502,25 +545,41 @@ struct Node { /; print_node_type (~Node n) /; if (n`._type == NTYPE_MODULE) - _printf("Mod\0") + _printf("NTYPE_MODULE\0") ;; else if (n`._type == NTYPE_EXPORT) - _printf("Exported Module\0") + _printf("NTYPE_EXPORT\0") ;; else if (n`._type == NTYPE_STRUCT) - _printf("Struct\0") + _printf("NTYPE_STRUCT\0") + ;; else if (n`._type == NTYPE_TYPE) + _printf("NTYPE_TYPE\0") ;; else if (n`._type == NTYPE_ID) - _printf("ID\0") + _printf("NTYPE_ID\0") ;; else if (n`._type == NTYPE_BIN_OP) - _printf("Binary OP\0") + _printf("NTYPE_BIN_OP\0") ;; else if (n`._type == NTYPE_PRE_OP) - _printf("Pre OP\0") + _printf("NTYPE_PRE_OP\0") ;; else if (n`._type == NTYPE_POST_OP) - _printf("Post OP\0") + _printf("NTYPE_POST_OP\0") ;; else if (n`._type == NTYPE_FUNCTION) - _printf("Function\0") + _printf("NTYPE_FUNCTION\0") ;; else if (n`._type == NTYPE_METHOD) - _printf("Method\0") + _printf("NTYPE_METHOD\0") + ;; else if (n`._type == NTYPE_TLIST) + _printf("NTYPE_TLIST\0") + ;; else if (n`._type == NTYPE_DLIST) + _printf("NTYPE_DLIST\0") + ;; else if (n`._type == NTYPE_ELIST) + _printf("NTYPE_ELIST\0") + ;; else if (n`._type == NTYPE_LITERAL) + _printf("NTYPE_LITERAL\0") + ;; else if (n`._type == NTYPE_KEY_TYPE) + _printf("NTYPE_KEY_TYPE\0") + ;; else if (n`._type == NTYPE_ENUM) + _printf("NTYPE_ENUM\0") + ;; else if (n`._type == NTYPE_DECL) + _printf("NTYPE_DECL\0") ;; else if (n`._type == NTYPE_ASM) - _printf("ASM\0") + _printf("NTYPE_ASM\0") ;/ ;/ diff --git a/tnslc/parse/tokenizer.tnsl b/tnslc/parse/tokenizer.tnsl index 745100c..e44e648 100644 --- a/tnslc/parse/tokenizer.tnsl +++ b/tnslc/parse/tokenizer.tnsl @@ -333,7 +333,13 @@ uint MAX_MULTI = 3 /; if (first == '\'' || first == '\"') return produce_string_token(fin, prev) ;; else if (is_reserved(first) == true) - return produce_reserved_token(fin, prev) + Token out = produce_reserved_token(fin, prev) + /; loop (out._type == TTYPE_COMNT) + Token tmp = produce_next_token(fin, out) + out.end() + out = tmp + ;/ + return out ;; else if (is_numeric(first) == true) return produce_numeric_token(fin, prev) ;; else if (first !== 0) -- cgit v1.2.3