Changing typespecs to be normal expressions
This commit is contained in:
@@ -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(){
|
||||
|
||||
Reference in New Issue
Block a user