Change syntax of compound exprs
This commit is contained in:
@@ -136,12 +136,12 @@ Compound literals
|
||||
function Ast_Expr *parse_expr(S64 rbp = 0);
|
||||
|
||||
function Ast_Compound *
|
||||
parse_expr_compound(){
|
||||
parse_expr_compound(Ast_Expr *left){
|
||||
Scratch scratch;
|
||||
Token *pos = token_get();
|
||||
Array<Ast_Compound_Item *> exprs = {scratch};
|
||||
|
||||
while(!token_is(TK_CloseBrace)){
|
||||
while(!token_is(TK_CloseParen)){
|
||||
Token *token = token_get();
|
||||
Ast_Expr *index = 0;
|
||||
Ast_Atom *name = 0;
|
||||
@@ -164,9 +164,9 @@ parse_expr_compound(){
|
||||
break;
|
||||
}
|
||||
}
|
||||
token_expect(TK_CloseBrace);
|
||||
token_expect(TK_CloseParen);
|
||||
|
||||
Ast_Compound *result = ast_expr_compound(pos, 0, exprs);
|
||||
Ast_Compound *result = ast_expr_compound(pos, left, exprs);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -287,12 +287,14 @@ null_denotation(Token *token){
|
||||
case TK_Integer : return ast_int(token, token->int_val, AST_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);
|
||||
result->base = parse_expr();
|
||||
result->base = parse_expr(1);
|
||||
return result;
|
||||
}break;
|
||||
|
||||
case TK_Keyword: {
|
||||
if(token->intern_val == keyword_cast){
|
||||
token_expect(TK_OpenParen);
|
||||
@@ -307,7 +309,7 @@ null_denotation(Token *token){
|
||||
return 0;
|
||||
}
|
||||
}break;
|
||||
case TK_OpenBrace: return parse_expr_compound();
|
||||
|
||||
case TK_OpenParen: {
|
||||
if (token_is(TK_CloseParen)) return parse_lambda(token);
|
||||
else if(token_is(TK_Identifier) && token_is(TK_Colon, 1)) return parse_lambda(token);
|
||||
@@ -330,14 +332,6 @@ left_binding_power(Token_Kind kind){
|
||||
}
|
||||
}
|
||||
|
||||
function S64
|
||||
postfix_binding_power(Token_Kind kind){
|
||||
switch(kind){
|
||||
case TK_Increment: case TK_Decrement: case TK_OpenBracket: return 1;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function Ast_Expr *
|
||||
left_denotation(Token *op, Ast_Expr *left){
|
||||
enum{ Left_Associative, Right_Associative };
|
||||
@@ -349,6 +343,14 @@ left_denotation(Token *op, Ast_Expr *left){
|
||||
}
|
||||
}
|
||||
|
||||
function S64
|
||||
postfix_binding_power(Token_Kind kind){
|
||||
switch(kind){
|
||||
case TK_Decrement: case TK_Increment: case TK_OpenBracket: case TK_OpenParen: return 1;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function Ast_Expr *
|
||||
parse_expr(S64 rbp){
|
||||
Token *token = token_next();
|
||||
@@ -356,17 +358,23 @@ parse_expr(S64 rbp){
|
||||
for(;;){
|
||||
token = token_get();
|
||||
|
||||
if((rbp == 0) && (token->kind == TK_Increment || token->kind == TK_Decrement || token->kind == TK_OpenBracket)){
|
||||
if(postfix_binding_power(token->kind) > rbp){
|
||||
token_next();
|
||||
if(token->kind == TK_OpenBracket){
|
||||
Ast_Expr *index = parse_expr();
|
||||
left = ast_expr_index(token, left, index);
|
||||
token_expect(TK_CloseBracket);
|
||||
}
|
||||
else{
|
||||
if(token->kind == TK_Increment) token->kind = TK_PostIncrement;
|
||||
else if(token->kind == TK_Decrement) token->kind = TK_PostDecrement;
|
||||
left = ast_expr_unary(token, token->kind, left);
|
||||
// @note: parse postfix
|
||||
switch(token->kind){
|
||||
case TK_OpenBracket:{
|
||||
Ast_Expr *index = parse_expr();
|
||||
left = ast_expr_index(token, left, index);
|
||||
token_expect(TK_CloseBracket);
|
||||
}break;
|
||||
case TK_OpenParen:{
|
||||
left = parse_expr_compound(left);
|
||||
}break;
|
||||
default:{
|
||||
if(token->kind == TK_Increment) token->kind = TK_PostIncrement;
|
||||
else if(token->kind == TK_Decrement) token->kind = TK_PostDecrement;
|
||||
left = ast_expr_unary(token, token->kind, left);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user