Begin structs, add comment on multiline lambdas, add Ast flags
This commit is contained in:
@@ -281,9 +281,9 @@ parse_lambda(Token *token, B32 is_typespec = false){
|
||||
function Ast_Expr *
|
||||
null_denotation(Token *token){
|
||||
switch(token->kind){
|
||||
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_StringLit : return ast_str(token, token->intern_val, AST_EXPR);
|
||||
case TK_Identifier : return ast_ident(token, token->intern_val, AST_EXPR);
|
||||
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: {
|
||||
@@ -386,6 +386,23 @@ parse_assign_expr(){
|
||||
return result;
|
||||
}
|
||||
|
||||
function Ast_Struct *
|
||||
parse_struct(Token *pos){
|
||||
Scratch scratch;
|
||||
Array<Ast *> members = {scratch};
|
||||
|
||||
token_match(OPEN_SCOPE);
|
||||
do{
|
||||
Token *token = token_get();
|
||||
Ast_Named *named = parse_named(false);
|
||||
if(!named) parsing_error(token, "Failed to parse struct member");
|
||||
}while(token_match(SAME_SCOPE));
|
||||
token_expect(CLOSE_SCOPE);
|
||||
|
||||
Ast_Struct *result = ast_struct(pos, members);
|
||||
return result;
|
||||
}
|
||||
|
||||
function Ast_Named *
|
||||
parse_named(B32 is_global){
|
||||
Ast_Named *result = 0;
|
||||
@@ -393,10 +410,24 @@ parse_named(B32 is_global){
|
||||
if(token_is(TK_Identifier)){
|
||||
if(is_global && pctx->indent != 0) parsing_error(token_get(), "Top level declarations shouldn't be indented");
|
||||
Token *name = token_next();
|
||||
if(token_match(TK_DoubleColon)){ // Constant
|
||||
Ast_Expr *expr = parse_expr();
|
||||
result = ast_const(name, name->intern_val, expr);
|
||||
|
||||
// @note: parse constant
|
||||
if(token_match(TK_DoubleColon)){
|
||||
// parse struct binding
|
||||
Token *struct_pos = token_get();
|
||||
if(token_match_keyword(keyword_struct)){
|
||||
Ast_Struct *struct_val = parse_struct(struct_pos);
|
||||
result = ast_const(name, name->intern_val, struct_val);
|
||||
}
|
||||
|
||||
// parse constant expression
|
||||
else{
|
||||
Ast_Expr *expr = parse_expr();
|
||||
result = ast_const(name, name->intern_val, expr);
|
||||
}
|
||||
}
|
||||
|
||||
// @note: parse variable
|
||||
else if(token_match(TK_Colon)){
|
||||
Ast_Expr *typespec = 0;
|
||||
Ast_Expr *expr = 0;
|
||||
|
||||
Reference in New Issue
Block a user