Unify call and compound but have different kinds
This commit is contained in:
41
ast.cpp
41
ast.cpp
@@ -18,7 +18,6 @@ enum Ast_Kind: U32{
|
|||||||
AST_CALL,
|
AST_CALL,
|
||||||
|
|
||||||
AST_COMPOUND,
|
AST_COMPOUND,
|
||||||
AST_COMPOUND_ITEM,
|
|
||||||
AST_TYPE,
|
AST_TYPE,
|
||||||
AST_VAR,
|
AST_VAR,
|
||||||
AST_CONST,
|
AST_CONST,
|
||||||
@@ -82,27 +81,19 @@ struct Ast_Atom: Ast_Expr{
|
|||||||
INLINE_VALUE_FIELDS;
|
INLINE_VALUE_FIELDS;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ast_Compound_Item: Ast_Expr{
|
|
||||||
Ast_Atom *name;
|
|
||||||
Ast_Expr *index;
|
|
||||||
Ast_Expr *item;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Ast_Compound: Ast_Expr{
|
|
||||||
Ast_Resolved_Type *type;
|
|
||||||
Ast_Expr *typespec;
|
|
||||||
Array<Ast_Compound_Item *> exprs;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Ast_Call_Item: Ast_Expr{
|
struct Ast_Call_Item: Ast_Expr{
|
||||||
Ast_Atom *name;
|
Ast_Atom *name;
|
||||||
Ast_Expr *item;
|
Ast_Expr *item;
|
||||||
|
Ast_Expr *index;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ast_Call: Ast_Expr{
|
struct Ast_Call: Ast_Expr{
|
||||||
Ast_Resolved_Type *type;
|
union{
|
||||||
Ast_Expr *name;
|
Ast_Expr *name;
|
||||||
|
Ast_Expr *typespec;
|
||||||
|
};
|
||||||
Array<Ast_Call_Item *> exprs;
|
Array<Ast_Call_Item *> exprs;
|
||||||
|
Ast_Resolved_Type *type;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Ast_Unary: Ast_Expr{
|
struct Ast_Unary: Ast_Expr{
|
||||||
@@ -297,23 +288,6 @@ ast_expr_binary(Ast_Expr *left, Ast_Expr *right, Token *op){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Ast_Compound *
|
|
||||||
ast_compound(Token *pos, Ast_Expr *typespec, Array<Ast_Compound_Item *> exprs){
|
|
||||||
AST_NEW(Compound, COMPOUND, pos, AST_EXPR);
|
|
||||||
result->typespec = typespec;
|
|
||||||
result->exprs = exprs.tight_copy(pctx->perm);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Ast_Compound_Item *
|
|
||||||
ast_compound_item(Token *pos, Ast_Atom *name, Ast_Expr *index, Ast_Expr *item){
|
|
||||||
AST_NEW(Compound_Item, COMPOUND_ITEM, pos, AST_EXPR);
|
|
||||||
result->name = name;
|
|
||||||
result->index = index;
|
|
||||||
result->item = item;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Ast_Call *
|
function Ast_Call *
|
||||||
ast_call(Token *pos, Ast_Expr *name, Array<Ast_Call_Item *> exprs){
|
ast_call(Token *pos, Ast_Expr *name, Array<Ast_Call_Item *> exprs){
|
||||||
AST_NEW(Call, CALL, pos, AST_EXPR);
|
AST_NEW(Call, CALL, pos, AST_EXPR);
|
||||||
@@ -323,10 +297,11 @@ ast_call(Token *pos, Ast_Expr *name, Array<Ast_Call_Item *> exprs){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function Ast_Call_Item *
|
function Ast_Call_Item *
|
||||||
ast_call_item(Token *pos, Ast_Atom *name, Ast_Expr *item){
|
ast_call_item(Token *pos, Ast_Atom *name, Ast_Expr *index, Ast_Expr *item){
|
||||||
AST_NEW(Call_Item, CALL_ITEM, pos, AST_EXPR);
|
AST_NEW(Call_Item, CALL_ITEM, pos, AST_EXPR);
|
||||||
result->name = name;
|
result->name = name;
|
||||||
result->item = item;
|
result->item = item;
|
||||||
|
result->index = index;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
56
parsing.cpp
56
parsing.cpp
@@ -145,46 +145,21 @@ parse_init_stmt(Ast_Expr *expr){
|
|||||||
return expr;
|
return expr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @todo: Unify with call ???
|
|
||||||
function Ast_Compound *
|
|
||||||
parse_compound(Ast_Expr *left){
|
|
||||||
Scratch scratch;
|
|
||||||
Token *pos = token_get();
|
|
||||||
Array<Ast_Compound_Item *> exprs = {scratch};
|
|
||||||
|
|
||||||
while(!token_is(TK_CloseBrace)){
|
|
||||||
Token *token = token_get();
|
|
||||||
Ast_Atom *name = 0;
|
|
||||||
|
|
||||||
Ast_Expr *item = parse_expr();
|
|
||||||
if(token_match(TK_Assign)){
|
|
||||||
assert(is_flag_set(item->flags, AST_ATOM));
|
|
||||||
name = (Ast_Atom *)item;
|
|
||||||
item = parse_expr();
|
|
||||||
}
|
|
||||||
|
|
||||||
Ast_Compound_Item *item_comp = ast_compound_item(token, name, 0, item);
|
|
||||||
exprs.add(item_comp);
|
|
||||||
|
|
||||||
if(!token_match(TK_Comma)){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
token_expect(TK_CloseBrace);
|
|
||||||
|
|
||||||
Ast_Compound *result = ast_compound(pos, left, exprs);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Ast_Call *
|
function Ast_Call *
|
||||||
parse_expr_call(Ast_Expr *left){
|
parse_expr_call(Ast_Expr *left, Token_Kind close_kind){
|
||||||
Scratch scratch;
|
Scratch scratch;
|
||||||
Token *pos = token_get();
|
Token *pos = token_get();
|
||||||
Array<Ast_Call_Item *> exprs = {scratch};
|
Array<Ast_Call_Item *> exprs = {scratch};
|
||||||
|
|
||||||
while(!token_is(TK_CloseParen)){
|
while(!token_is(close_kind)){
|
||||||
Token *token = token_get();
|
Token *token = token_get();
|
||||||
Ast_Atom *name = 0;
|
Ast_Atom *name = 0;
|
||||||
|
Ast_Expr *index = 0;
|
||||||
|
if(token_match(TK_OpenBracket)){
|
||||||
|
index = parse_expr(0);
|
||||||
|
token_expect(TK_CloseBracket);
|
||||||
|
token_expect(TK_Assign);
|
||||||
|
}
|
||||||
|
|
||||||
Ast_Expr *item = parse_expr();
|
Ast_Expr *item = parse_expr();
|
||||||
if(token_match(TK_Assign)){
|
if(token_match(TK_Assign)){
|
||||||
@@ -193,14 +168,17 @@ parse_expr_call(Ast_Expr *left){
|
|||||||
item = parse_expr();
|
item = parse_expr();
|
||||||
}
|
}
|
||||||
|
|
||||||
Ast_Call_Item *item_comp = ast_call_item(token, name, item);
|
if(item && index) compiler_error(token, "Both index and name are present, that is invalid");
|
||||||
|
if(close_kind == TK_OpenParen && index) compiler_error(token, "Lambda calls can't have indexed arguments");
|
||||||
|
|
||||||
|
Ast_Call_Item *item_comp = ast_call_item(token, name, index, item);
|
||||||
exprs.add(item_comp);
|
exprs.add(item_comp);
|
||||||
|
|
||||||
if(!token_match(TK_Comma)){
|
if(!token_match(TK_Comma)){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
token_expect(TK_CloseParen);
|
token_expect(close_kind);
|
||||||
|
|
||||||
Ast_Call *result = ast_call(pos, left, exprs);
|
Ast_Call *result = ast_call(pos, left, exprs);
|
||||||
return result;
|
return result;
|
||||||
@@ -462,7 +440,8 @@ parse_expr(S64 min_bp){
|
|||||||
}break;
|
}break;
|
||||||
|
|
||||||
case TK_OpenBrace: {
|
case TK_OpenBrace: {
|
||||||
left = parse_compound(0);
|
left = parse_expr_call(0, TK_CloseBrace);
|
||||||
|
left->kind = AST_COMPOUND;
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
case TK_Keyword: {
|
case TK_Keyword: {
|
||||||
@@ -512,10 +491,11 @@ parse_expr(S64 min_bp){
|
|||||||
left = ast_expr_index(token, left, index);
|
left = ast_expr_index(token, left, index);
|
||||||
}break;
|
}break;
|
||||||
case TK_OpenBrace: {
|
case TK_OpenBrace: {
|
||||||
left = parse_compound(left);
|
left = parse_expr_call(left, TK_CloseBrace);
|
||||||
|
left->kind = AST_COMPOUND;
|
||||||
}break;
|
}break;
|
||||||
case TK_OpenParen:{
|
case TK_OpenParen:{
|
||||||
left = parse_expr_call(left);
|
left = parse_expr_call(left, TK_CloseParen);
|
||||||
}break;
|
}break;
|
||||||
default:{
|
default:{
|
||||||
assert(token->kind == TK_Increment || token->kind == TK_Decrement);
|
assert(token->kind == TK_Increment || token->kind == TK_Decrement);
|
||||||
|
|||||||
@@ -814,7 +814,7 @@ resolve_expr(Ast_Expr *ast, Resolve_Flag flags){
|
|||||||
else{
|
else{
|
||||||
// @note: default values are typechecked when they get resolved
|
// @note: default values are typechecked when they get resolved
|
||||||
if(lambda_arg->expr){
|
if(lambda_arg->expr){
|
||||||
items.add(ast_call_item(lambda_arg->expr->pos, 0, lambda_arg->expr));
|
items.add(ast_call_item(lambda_arg->expr->pos, 0, 0, lambda_arg->expr));
|
||||||
}
|
}
|
||||||
else compiler_error(lambda_arg->pos, "Required value in lambda call was not passed");
|
else compiler_error(lambda_arg->pos, "Required value in lambda call was not passed");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user