Changing typespecs to be normal expressions

This commit is contained in:
Krzosa Karol
2022-05-27 12:29:51 +02:00
parent f66fd447e5
commit d8a9b318b7
4 changed files with 78 additions and 53 deletions

View File

@@ -9,6 +9,12 @@
/// @todo /// @todo
/// [ ] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int /// [ ] - Typespecs should probably be expressions so stuff like would be possible :: *[32]int
/*
thing1 :: *int // type
thing2 :: *get_value // value from pointer
*/
int main(){ int main(){
test_os_memory(); test_os_memory();

View File

@@ -91,6 +91,8 @@ enum Ast_Kind{
AST_COMPOUND_ITEM, AST_COMPOUND_ITEM,
AST_COMPOUND, AST_COMPOUND,
AST_POINTER,
AST_ARRAY,
AST_INIT, AST_INIT,
AST_IF, AST_IF,
AST_IF_NODE, AST_IF_NODE,
@@ -190,16 +192,20 @@ struct Ast_If: Ast{
struct Ast_Lambda_Arg: Ast_Expr{ struct Ast_Lambda_Arg: Ast_Expr{
Intern_String name; Intern_String name;
Ast_Typespec *typespec; Ast_Expr *typespec;
}; };
struct Ast_Lambda : Ast_Expr { struct Ast_Lambda : Ast_Expr {
Array<Ast_Lambda_Arg *> args; Array<Ast_Lambda_Arg *> args;
Ast_Typespec *ret; Ast_Expr *ret;
Ast_Block *block; Ast_Block *block;
}; };
struct Ast_Resolved_Type; struct Ast_Array: Ast_Expr{
Ast_Expr *base;
Ast_Expr *expr;
};
struct Ast_Typespec:Ast{ struct Ast_Typespec:Ast{
union{ union{
Ast_Typespec *base; Ast_Typespec *base;
@@ -331,7 +337,7 @@ ast_expr_lambda_empty(Token *pos){
} }
function Ast_Lambda_Arg * 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); AST_NEW(Lambda_Arg, LAMBDA_ARG, pos);
result->name = name; result->name = name;
result->typespec = typespec; result->typespec = typespec;
@@ -370,6 +376,13 @@ ast_init(Token *pos, Token_Kind op, Ast_Atom *ident, Ast_Expr *expr){
return result; return result;
} }
function Ast_Array *
ast_array(Token *pos, Ast_Expr *base){
AST_NEW(Array, ARRAY, pos);
result->base = base;
return result;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Typespecs // Typespecs
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@@ -26,6 +26,7 @@ enum Token_Kind{
TK_BitAnd, TK_BitAnd,
TK_BitOr, TK_BitOr,
TK_BitXor,
TK_And, TK_And,
TK_Or, TK_Or,
TK_FirstLogical = TK_BitAnd, TK_FirstLogical = TK_BitAnd,
@@ -82,12 +83,12 @@ enum Token_Kind{
TK_Integer, TK_Integer,
TK_Keyword, TK_Keyword,
TK_Pointer, TK_Pointer = TK_Mul,
TK_Dereference, TK_Dereference = TK_BitAnd,
// These are not produced by lexer // These are not produced by lexer
// but identified by parser // but identified by parser
OPEN_SCOPE, OPEN_SCOPE = 128,
CLOSE_SCOPE, CLOSE_SCOPE,
SAME_SCOPE, SAME_SCOPE,
}; };
@@ -443,7 +444,7 @@ lex__stream(Intern_Table *table, Array<Token> *array, Lex_Stream *s){
case '~': t.kind = TK_Neg; break; case '~': t.kind = TK_Neg; break;
case '?': t.kind = TK_Question; break; case '?': t.kind = TK_Question; break;
case '#': t.kind = TK_Pound; 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_Not, TK_NotEquals);
CASE2('=', TK_Assign, TK_Equals); CASE2('=', TK_Assign, TK_Equals);
CASE2('*', TK_Mul, TK_MulAssign); CASE2('*', TK_Mul, TK_MulAssign);
@@ -697,7 +698,7 @@ token_kind_string(Token_Kind kind){
case TK_Mod: return "%"_s; case TK_Mod: return "%"_s;
case TK_BitAnd: return "&"_s; case TK_BitAnd: return "&"_s;
case TK_BitOr: return "|"_s; case TK_BitOr: return "|"_s;
case TK_Pointer: return "^"_s; case TK_BitXor: return "^"_s;
case TK_Neg: return "~"_s; case TK_Neg: return "~"_s;
case TK_Not: return "!"_s; case TK_Not: return "!"_s;
case TK_OpenParen: return "("_s; case TK_OpenParen: return "("_s;

View File

@@ -134,7 +134,6 @@ Compound literals
- { } - { }
*/ */
function Ast_Expr *parse_expr(S64 rbp = 0); function Ast_Expr *parse_expr(S64 rbp = 0);
function Ast_Typespec *parse_typespec();
function Ast_Compound * function Ast_Compound *
parse_expr_compound(){ parse_expr_compound(){
@@ -170,10 +169,10 @@ parse_expr_compound(){
return result; return result;
} }
function Ast_Typespec * function Ast_Expr *
parse_optional_type(){ parse_optional_type(){
Ast_Typespec *result = 0; Ast_Expr *result = 0;
if(token_match(TK_Colon)) result = parse_typespec(); if(token_match(TK_Colon)) result = parse_expr();
return result; return result;
} }
@@ -261,7 +260,7 @@ parse_lambda(Token *token, B32 is_typespec = false){
for(;;){ for(;;){
Token *name = token_expect(TK_Identifier); Token *name = token_expect(TK_Identifier);
token_expect(TK_Colon); 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); Ast_Lambda_Arg *param = ast_expr_lambda_arg(name, name->intern_val, typespec);
params.add(param); params.add(param);
@@ -284,7 +283,13 @@ null_denotation(Token *token){
case TK_StringLit : return ast_expr_string(token, token->intern_val); case TK_StringLit : return ast_expr_string(token, token->intern_val);
case TK_Identifier : return ast_expr_identifier(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_Integer : return ast_expr_integer(token, token->int_val);
case TK_Pointer : return ast_expr_unary(token, TK_Dereference, parse_expr()); 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: { case TK_Keyword: {
if(token->intern_val == keyword_cast){ if(token->intern_val == keyword_cast){
token_expect(TK_OpenParen); token_expect(TK_OpenParen);
@@ -325,7 +330,7 @@ left_binding_power(Token_Kind kind){
function S64 function S64
postfix_binding_power(Token_Kind kind){ postfix_binding_power(Token_Kind kind){
switch(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; default: return 0;
} }
} }
@@ -348,7 +353,7 @@ parse_expr(S64 rbp){
for(;;){ for(;;){
token = token_get(); 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(); token_next();
if(token->kind == TK_OpenBracket){ if(token->kind == TK_OpenBracket){
Ast_Expr *index = parse_expr(); Ast_Expr *index = parse_expr();
@@ -376,40 +381,40 @@ parse_expr(S64 rbp){
// Parsing declarations // Parsing declarations
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// [10]*int - Array of 10 pointers to ints // [10]*int - Array of 10 pointers to ints
function Ast_Typespec * // function Ast_Typespec *
parse_typespec_recurse(){ // parse_typespec_recurse(){
Token *token = token_get(); // Token *token = token_get();
if(token_match(TK_Pointer)){ // if(token_match(TK_Pointer)){
Ast_Typespec *result = parse_typespec_recurse(); // Ast_Typespec *result = parse_typespec_recurse();
result = ast_typespec_pointer(token, result); // result = ast_typespec_pointer(token, result);
return result; // return result;
} // }
else if(token_match(TK_OpenBracket)){ // else if(token_match(TK_OpenBracket)){
Ast_Expr *expr = parse_expr(); // Ast_Expr *expr = parse_expr();
token_expect(TK_CloseBracket); // token_expect(TK_CloseBracket);
Ast_Typespec *result = parse_typespec_recurse(); // Ast_Typespec *result = parse_typespec_recurse();
result = ast_typespec_array(token, result, expr); // result = ast_typespec_array(token, result, expr);
return result; // return result;
} // }
else if(token_match(TK_OpenParen)){ // else if(token_match(TK_OpenParen)){
Ast_Lambda *result = parse_lambda(token, true); // Ast_Lambda *result = parse_lambda(token, true);
return ast_typespec_lambda(token, result); // return ast_typespec_lambda(token, result);
} // }
else if(token_match(TK_Identifier)){ // else if(token_match(TK_Identifier)){
Ast_Typespec *result = ast_typespec_name(token, token->intern_val); // Ast_Typespec *result = ast_typespec_name(token, token->intern_val);
return result; // return result;
} // }
else{ // else{
parsing_error(token, "Failed to parse type, unexpected token of kind", token_kind_string(token->kind).str); // parsing_error(token, "Failed to parse type, unexpected token of kind", token_kind_string(token->kind).str);
return 0; // return 0;
} // }
} // }
function Ast_Typespec * // function Ast_Typespec *
parse_typespec(){ // parse_typespec(){
Ast_Typespec *result = parse_typespec_recurse(); // Ast_Typespec *result = parse_typespec_recurse();
return result; // return result;
} // }
function Ast_Expr * function Ast_Expr *
parse_assign_expr(){ parse_assign_expr(){