Work on lambda body
This commit is contained in:
35
new_ast.cpp
35
new_ast.cpp
@@ -7,6 +7,10 @@
|
||||
//
|
||||
Intern_String keyword_struct;
|
||||
Intern_String keyword_union;
|
||||
Intern_String keyword_return;
|
||||
Intern_String keyword_if;
|
||||
Intern_String keyword_else;
|
||||
Intern_String keyword_for;
|
||||
Intern_String keyword_cast;
|
||||
Intern_String keyword_enum;
|
||||
|
||||
@@ -15,7 +19,7 @@ Intern_String intern_int;
|
||||
Intern_String intern_str;
|
||||
Intern_String intern_unsigned;
|
||||
|
||||
const U64 Parse_Ctx_ID = 115151;
|
||||
struct Sym;
|
||||
struct Parse_Ctx:Lexer{
|
||||
Allocator *perm; // Stores: AST, tokens, interns
|
||||
Allocator *heap;
|
||||
@@ -23,6 +27,7 @@ struct Parse_Ctx:Lexer{
|
||||
U64 unique_ids;
|
||||
Map global_syms;
|
||||
Map type_map;
|
||||
Array<Sym *> local_syms;
|
||||
|
||||
Token empty_token;
|
||||
S64 indent;
|
||||
@@ -39,9 +44,13 @@ struct Parse_Ctx:Lexer{
|
||||
type_map = {heap};
|
||||
|
||||
lex_init(perm, heap, this);
|
||||
keyword_struct= intern_string(&interns, "struct"_s);
|
||||
keyword_union = intern_string(&interns, "union"_s);
|
||||
keyword_cast = intern_string(&interns, "cast"_s);
|
||||
keyword_struct= intern("struct"_s);
|
||||
keyword_union = intern("union"_s);
|
||||
keyword_cast = intern("cast"_s);
|
||||
keyword_return = intern("return"_s);
|
||||
keyword_if = intern("if"_s);
|
||||
keyword_else = intern("else"_s);
|
||||
keyword_for = intern("for"_s);
|
||||
keyword_enum = intern_string(&interns, "enum"_s);
|
||||
interns.first_keyword = keyword_struct.str;
|
||||
interns.last_keyword = keyword_enum.str;
|
||||
@@ -72,6 +81,8 @@ enum Ast_Kind{
|
||||
AST_COMPOUND_ITEM,
|
||||
AST_COMPOUND,
|
||||
|
||||
AST_RETURN,
|
||||
AST_BLOCK,
|
||||
AST_LAMBDA,
|
||||
AST_LAMBDA_ARG,
|
||||
AST_CONST,
|
||||
@@ -101,6 +112,7 @@ struct Ast_Atom: Ast_Expr{
|
||||
};
|
||||
|
||||
struct Ast_Compound_Item: Ast_Expr{
|
||||
// @todo: Ast_Expr to Ast_Atom
|
||||
Ast_Expr *name; // index | name
|
||||
Ast_Expr *index;
|
||||
Ast_Expr *item;
|
||||
@@ -137,6 +149,10 @@ struct Ast_Block : Ast {
|
||||
Array<Ast *> stmts;
|
||||
};
|
||||
|
||||
struct Ast_Return: Ast{
|
||||
Ast_Expr *expr;
|
||||
};
|
||||
|
||||
struct Ast_Lambda_Arg: Ast_Expr{
|
||||
Intern_String name;
|
||||
Ast_Typespec *typespec;
|
||||
@@ -177,6 +193,7 @@ struct Ast_Package:Ast{
|
||||
Array<Ast_Decl *> decls;
|
||||
};
|
||||
|
||||
function Ast_Typespec *ast_typespec_name(Token *pos, Intern_String name);
|
||||
//-----------------------------------------------------------------------------
|
||||
// AST Constructors beginning with expressions
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -262,6 +279,9 @@ ast_lambda(Token *pos, Array<Ast_Lambda_Arg *> params, Ast_Typespec *ret, Ast_Bl
|
||||
AST_NEW(Lambda, AST_LAMBDA, pos);
|
||||
result->args = params.tight_copy(pctx->perm);
|
||||
result->ret = ret;
|
||||
if(!ret){
|
||||
result->ret = ast_typespec_name(0, intern_void);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -279,6 +299,13 @@ ast_expr_lambda_arg(Token *pos, Intern_String name, Ast_Typespec *typespec){
|
||||
return result;
|
||||
}
|
||||
|
||||
function Ast_Block *
|
||||
ast_block(Token *pos, Array<Ast *> stmts){
|
||||
AST_NEW(Block, AST_BLOCK, pos);
|
||||
result->stmts = stmts.tight_copy(pctx->perm);
|
||||
return result;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Typespecs
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user