@@ -75,6 +75,38 @@ static Expr* parse_expression(Parser* parser);
7575static Stmt * parse_statement (Parser * parser );
7676static Stmt * parse_block (Parser * parser );
7777
78+ static bool is_type_token (PTokenType type ) {
79+ return type == TOKEN_IDENT || type == TOKEN_FUNC || type == TOKEN_THR ;
80+ }
81+
82+ static bool parse_param_list (Parser * parser , ParamList * params ) {
83+ if (parser -> current_token .type == TOKEN_RPAREN ) return true;
84+ do {
85+ if (!is_type_token (parser -> current_token .type )) {
86+ report_error (parser , "Expected parameter type" );
87+ return false;
88+ }
89+ DeclType ptype = parse_type_name (parser -> current_token .literal );
90+ advance (parser );
91+ consume (parser , TOKEN_COLON , "Expected ':' after parameter type" );
92+ if (parser -> current_token .type != TOKEN_IDENT ) {
93+ report_error (parser , "Expected parameter name" );
94+ return false;
95+ }
96+ Param param ;
97+ param .type = ptype ;
98+ param .name = parser -> current_token .literal ;
99+ param .default_value = NULL ;
100+ advance (parser );
101+ if (match (parser , TOKEN_EQUALS )) {
102+ param .default_value = parse_expression (parser );
103+ if (!param .default_value ) return false;
104+ }
105+ param_list_add (params , param );
106+ } while (match (parser , TOKEN_COMMA ));
107+ return true;
108+ }
109+
78110static Expr * parse_primary (Parser * parser ) {
79111 Token token = parser -> current_token ;
80112 if (parser -> current_token .type == TOKEN_ASYNC ) {
@@ -125,6 +157,24 @@ static Expr* parse_primary(Parser* parser) {
125157 advance (parser );
126158 return expr_ptr (id .literal , id .line , id .column );
127159 }
160+ if (match (parser , TOKEN_LAMBDA )) {
161+ Token lambda_tok = token ;
162+ consume (parser , TOKEN_LPAREN , "Expected '(' after LAMBDA" );
163+
164+ ParamList params = {0 };
165+ if (!parse_param_list (parser , & params )) return NULL ;
166+
167+ consume (parser , TOKEN_RPAREN , "Expected ')' after parameters" );
168+ consume (parser , TOKEN_COLON , "Expected ':' before return type" );
169+ if (!is_type_token (parser -> current_token .type )) {
170+ report_error (parser , "Expected return type" );
171+ return NULL ;
172+ }
173+ DeclType ret = parse_type_name (parser -> current_token .literal );
174+ advance (parser );
175+ Stmt * body = parse_block (parser );
176+ return expr_lambda (params , ret , body , lambda_tok .line , lambda_tok .column );
177+ }
128178 if (match (parser , TOKEN_IDENT )) {
129179 return expr_ident (token .literal , token .line , token .column );
130180 }
@@ -419,34 +469,10 @@ static Stmt* parse_func(Parser* parser) {
419469 consume (parser , TOKEN_LPAREN , "Expected '(' after function name" );
420470
421471 ParamList params = {0 };
422- if (parser -> current_token .type != TOKEN_RPAREN ) {
423- do {
424- if (parser -> current_token .type != TOKEN_IDENT ) {
425- report_error (parser , "Expected parameter type" );
426- break ;
427- }
428- DeclType ptype = parse_type_name (parser -> current_token .literal );
429- advance (parser );
430- consume (parser , TOKEN_COLON , "Expected ':' after parameter type" );
431- if (parser -> current_token .type != TOKEN_IDENT ) {
432- report_error (parser , "Expected parameter name" );
433- break ;
434- }
435- Param param ;
436- param .type = ptype ;
437- param .name = parser -> current_token .literal ;
438- param .default_value = NULL ;
439- advance (parser );
440- if (match (parser , TOKEN_EQUALS )) {
441- param .default_value = parse_expression (parser );
442- if (!param .default_value ) return NULL ;
443- }
444- param_list_add (& params , param );
445- } while (match (parser , TOKEN_COMMA ));
446- }
472+ if (!parse_param_list (parser , & params )) return NULL ;
447473 consume (parser , TOKEN_RPAREN , "Expected ')' after parameters" );
448474 consume (parser , TOKEN_COLON , "Expected ':' before return type" );
449- if (!(parser -> current_token .type == TOKEN_IDENT || parser -> current_token . type == TOKEN_FUNC || parser -> current_token . type == TOKEN_THR )) {
475+ if (!is_type_token (parser -> current_token .type )) {
450476 report_error (parser , "Expected return type" );
451477 return NULL ;
452478 }
0 commit comments