Initial working version of types as expressions

This commit is contained in:
Krzosa Karol
2022-05-27 13:46:27 +02:00
parent d8a9b318b7
commit 46abf8c1a6
6 changed files with 159 additions and 171 deletions

View File

@@ -151,7 +151,7 @@ parse_expr_compound(){
}
else if(token_is(TK_Identifier)){
token = token_next();
name = ast_expr_identifier(token, token->intern_val);
name = ast_ident(token, token->intern_val);
token_expect(TK_Assign);
}
@@ -271,7 +271,7 @@ parse_lambda(Token *token, B32 is_typespec = false){
}
token_expect(TK_CloseParen);
Ast_Typespec *ret = parse_optional_type();
Ast_Expr *ret = parse_optional_type();
Ast_Block *block = is_typespec ? 0 : parse_block();
Ast_Lambda *result = ast_lambda(token, params, ret, block);
return result;
@@ -280,9 +280,9 @@ 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_StringLit : return ast_str(token, token->intern_val);
case TK_Identifier : return ast_ident(token, token->intern_val);
case TK_Integer : return ast_int(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: {
@@ -295,7 +295,7 @@ null_denotation(Token *token){
token_expect(TK_OpenParen);
Ast_Expr *expr = parse_expr();
token_expect(TK_Colon);
Ast_Typespec *typespec = parse_typespec();
Ast_Expr *typespec = parse_expr();
token_expect(TK_CloseParen);
return ast_expr_cast(token, expr, typespec);
}
@@ -435,9 +435,9 @@ parse_named(B32 is_global){
result = ast_const(name, name->intern_val, expr);
}
else if(token_match(TK_Colon)){
Ast_Typespec *typespec = 0;
Ast_Expr *expr = 0;
if(!token_is(TK_Assign)) typespec = parse_typespec();
Ast_Expr *typespec = 0;
Ast_Expr *expr = 0;
if(!token_is(TK_Assign)) typespec = parse_expr();
if(token_match(TK_Assign)) expr = parse_expr();
if(!expr && !typespec) parsing_error(name, "invalid declaration, no type or value");