From d8a9b318b74516510706a9378c99ba2b58cd885f Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 27 May 2022 12:29:51 +0200 Subject: [PATCH] Changing typespecs to be normal expressions --- main.cpp | 6 ++++ new_ast.cpp | 21 +++++++++--- new_lex.cpp | 11 +++--- new_parse.cpp | 93 +++++++++++++++++++++++++++------------------------ 4 files changed, 78 insertions(+), 53 deletions(-) diff --git a/main.cpp b/main.cpp index 36ddf99..d3efa15 100644 --- a/main.cpp +++ b/main.cpp @@ -9,6 +9,12 @@ /// @todo /// [ ] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int +/* +thing1 :: *int // type +thing2 :: *get_value // value from pointer + +*/ + int main(){ test_os_memory(); diff --git a/new_ast.cpp b/new_ast.cpp index b19fd05..0247fa1 100644 --- a/new_ast.cpp +++ b/new_ast.cpp @@ -91,6 +91,8 @@ enum Ast_Kind{ AST_COMPOUND_ITEM, AST_COMPOUND, + AST_POINTER, + AST_ARRAY, AST_INIT, AST_IF, AST_IF_NODE, @@ -190,16 +192,20 @@ struct Ast_If: Ast{ struct Ast_Lambda_Arg: Ast_Expr{ Intern_String name; - Ast_Typespec *typespec; + Ast_Expr *typespec; }; struct Ast_Lambda : Ast_Expr { Array args; - Ast_Typespec *ret; + Ast_Expr *ret; Ast_Block *block; }; -struct Ast_Resolved_Type; +struct Ast_Array: Ast_Expr{ + Ast_Expr *base; + Ast_Expr *expr; +}; + struct Ast_Typespec:Ast{ union{ Ast_Typespec *base; @@ -331,7 +337,7 @@ ast_expr_lambda_empty(Token *pos){ } function Ast_Lambda_Arg * -ast_expr_lambda_arg(Token *pos, Intern_String name, Ast_Typespec *typespec){ +ast_expr_lambda_arg(Token *pos, Intern_String name, Ast_Expr *typespec){ AST_NEW(Lambda_Arg, LAMBDA_ARG, pos); result->name = name; result->typespec = typespec; @@ -370,6 +376,13 @@ ast_init(Token *pos, Token_Kind op, Ast_Atom *ident, Ast_Expr *expr){ return result; } +function Ast_Array * +ast_array(Token *pos, Ast_Expr *base){ + AST_NEW(Array, ARRAY, pos); + result->base = base; + return result; +} + //----------------------------------------------------------------------------- // Typespecs //----------------------------------------------------------------------------- diff --git a/new_lex.cpp b/new_lex.cpp index cd8dfeb..576e78f 100644 --- a/new_lex.cpp +++ b/new_lex.cpp @@ -26,6 +26,7 @@ enum Token_Kind{ TK_BitAnd, TK_BitOr, + TK_BitXor, TK_And, TK_Or, TK_FirstLogical = TK_BitAnd, @@ -82,12 +83,12 @@ enum Token_Kind{ TK_Integer, TK_Keyword, - TK_Pointer, - TK_Dereference, + TK_Pointer = TK_Mul, + TK_Dereference = TK_BitAnd, // These are not produced by lexer // but identified by parser - OPEN_SCOPE, + OPEN_SCOPE = 128, CLOSE_SCOPE, SAME_SCOPE, }; @@ -443,7 +444,7 @@ lex__stream(Intern_Table *table, Array *array, Lex_Stream *s){ case '~': t.kind = TK_Neg; break; case '?': t.kind = TK_Question; break; case '#': t.kind = TK_Pound; break; - case '^': t.kind = TK_Pointer; break; + case '^': t.kind = TK_BitXor; break; CASE2('!', TK_Not, TK_NotEquals); CASE2('=', TK_Assign, TK_Equals); CASE2('*', TK_Mul, TK_MulAssign); @@ -697,7 +698,7 @@ token_kind_string(Token_Kind kind){ case TK_Mod: return "%"_s; case TK_BitAnd: return "&"_s; case TK_BitOr: return "|"_s; - case TK_Pointer: return "^"_s; + case TK_BitXor: return "^"_s; case TK_Neg: return "~"_s; case TK_Not: return "!"_s; case TK_OpenParen: return "("_s; diff --git a/new_parse.cpp b/new_parse.cpp index f8886ff..c140db6 100644 --- a/new_parse.cpp +++ b/new_parse.cpp @@ -134,7 +134,6 @@ Compound literals - { } */ function Ast_Expr *parse_expr(S64 rbp = 0); -function Ast_Typespec *parse_typespec(); function Ast_Compound * parse_expr_compound(){ @@ -170,10 +169,10 @@ parse_expr_compound(){ return result; } -function Ast_Typespec * +function Ast_Expr * parse_optional_type(){ - Ast_Typespec *result = 0; - if(token_match(TK_Colon)) result = parse_typespec(); + Ast_Expr *result = 0; + if(token_match(TK_Colon)) result = parse_expr(); return result; } @@ -261,7 +260,7 @@ parse_lambda(Token *token, B32 is_typespec = false){ for(;;){ Token *name = token_expect(TK_Identifier); token_expect(TK_Colon); - Ast_Typespec *typespec = parse_typespec(); + Ast_Expr *typespec = parse_expr(); Ast_Lambda_Arg *param = ast_expr_lambda_arg(name, name->intern_val, typespec); params.add(param); @@ -281,10 +280,16 @@ parse_lambda(Token *token, B32 is_typespec = false){ function Ast_Expr * null_denotation(Token *token){ switch(token->kind){ - case TK_StringLit : return ast_expr_string(token, token->intern_val); - case TK_Identifier: return ast_expr_identifier(token, token->intern_val); - case TK_Integer : return ast_expr_integer(token, token->int_val); - case TK_Pointer : return ast_expr_unary(token, TK_Dereference, parse_expr()); + case TK_StringLit : return ast_expr_string(token, token->intern_val); + case TK_Identifier : return ast_expr_identifier(token, token->intern_val); + case TK_Integer : return ast_expr_integer(token, token->int_val); + case TK_Pointer : return ast_expr_unary(token, TK_Pointer, parse_expr()); + case TK_Dereference: return ast_expr_unary(token, TK_Dereference, parse_expr()); + case TK_OpenBracket: { + Ast_Array *result = ast_array(token, parse_expr()); + token_expect(TK_CloseBracket); + return result; + }break; case TK_Keyword: { if(token->intern_val == keyword_cast){ token_expect(TK_OpenParen); @@ -325,7 +330,7 @@ left_binding_power(Token_Kind kind){ function S64 postfix_binding_power(Token_Kind kind){ switch(kind){ - case TK_Increment: case TK_Decrement: case TK_Pointer: case TK_OpenBracket: return 1; + case TK_Increment: case TK_Decrement: case TK_OpenBracket: return 1; default: return 0; } } @@ -348,7 +353,7 @@ parse_expr(S64 rbp){ for(;;){ token = token_get(); - if((rbp == 0) && (token->kind == TK_Increment || token->kind == TK_Decrement || token->kind == TK_Pointer || token->kind == TK_OpenBracket)){ + if((rbp == 0) && (token->kind == TK_Increment || token->kind == TK_Decrement || token->kind == TK_OpenBracket)){ token_next(); if(token->kind == TK_OpenBracket){ Ast_Expr *index = parse_expr(); @@ -376,40 +381,40 @@ parse_expr(S64 rbp){ // Parsing declarations //----------------------------------------------------------------------------- // [10]*int - Array of 10 pointers to ints -function Ast_Typespec * -parse_typespec_recurse(){ - Token *token = token_get(); - if(token_match(TK_Pointer)){ - Ast_Typespec *result = parse_typespec_recurse(); - result = ast_typespec_pointer(token, result); - return result; - } - else if(token_match(TK_OpenBracket)){ - Ast_Expr *expr = parse_expr(); - token_expect(TK_CloseBracket); - Ast_Typespec *result = parse_typespec_recurse(); - result = ast_typespec_array(token, result, expr); - return result; - } - else if(token_match(TK_OpenParen)){ - Ast_Lambda *result = parse_lambda(token, true); - return ast_typespec_lambda(token, result); - } - else if(token_match(TK_Identifier)){ - Ast_Typespec *result = ast_typespec_name(token, token->intern_val); - return result; - } - else{ - parsing_error(token, "Failed to parse type, unexpected token of kind", token_kind_string(token->kind).str); - return 0; - } -} +// function Ast_Typespec * +// parse_typespec_recurse(){ +// Token *token = token_get(); +// if(token_match(TK_Pointer)){ +// Ast_Typespec *result = parse_typespec_recurse(); +// result = ast_typespec_pointer(token, result); +// return result; +// } +// else if(token_match(TK_OpenBracket)){ +// Ast_Expr *expr = parse_expr(); +// token_expect(TK_CloseBracket); +// Ast_Typespec *result = parse_typespec_recurse(); +// result = ast_typespec_array(token, result, expr); +// return result; +// } +// else if(token_match(TK_OpenParen)){ +// Ast_Lambda *result = parse_lambda(token, true); +// return ast_typespec_lambda(token, result); +// } +// else if(token_match(TK_Identifier)){ +// Ast_Typespec *result = ast_typespec_name(token, token->intern_val); +// return result; +// } +// else{ +// parsing_error(token, "Failed to parse type, unexpected token of kind", token_kind_string(token->kind).str); +// return 0; +// } +// } -function Ast_Typespec * -parse_typespec(){ - Ast_Typespec *result = parse_typespec_recurse(); - return result; -} +// function Ast_Typespec * +// parse_typespec(){ +// Ast_Typespec *result = parse_typespec_recurse(); +// return result; +// } function Ast_Expr * parse_assign_expr(){