From 77ddf1514af74e95d03140ad80c4777ad100b8ef Mon Sep 17 00:00:00 2001 From: attilavs2 Date: Sat, 8 Mar 2025 18:57:42 +0100 Subject: [PATCH] Work --- src/parser.l | 8 +++---- src/parser.y | 59 +++++++++++++++++++++++++++------------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/parser.l b/src/parser.l index e7c53c1..f46d028 100644 --- a/src/parser.l +++ b/src/parser.l @@ -21,10 +21,11 @@ "else" return ELSE; "fn" return FN; "var" return VAR; +"let" return LET; "block" return BLOCK; -[-+*/%a-zA-Z]+ { +[-+*/%<=>!a-zA-Z]+ { yylval.str = yytext; return G_IDENT; } @@ -34,10 +35,7 @@ return CST; } -[()<=>!] return *yytext; - -">=" return GTEQ; -"<=" return SMEQ; +[()] return *yytext; [ \t\n]+ ; diff --git a/src/parser.y b/src/parser.y index 765fd96..1bb0510 100644 --- a/src/parser.y +++ b/src/parser.y @@ -17,22 +17,21 @@ %token G_IDENT TYPE_U %token VEC %token VAR +%token LET %token IF %token ELSE %token WHILE %token FN -%token GTEQ -%token SMEQ %token BLOCK %token CST -%type stmt stmt_list +%type expr expr_list %type type %% program: - stmt_list '.' {set_entry_point($1); exit(0); } + expr_list '.' {set_entry_point($1); exit(0); } ; type: @@ -46,44 +45,48 @@ type: ; fn_args: - G_IDENT type + G_IDENT + {} + | G_IDENT type + {} + | fn_args G_IDENT {} | fn_args G_IDENT type {} ; -stmt: +expr: '(' G_IDENT ')' {$$ = make_operation(ST_Call, 0, $2, 0, NULL);} - | '(' VAR G_IDENT ')' + | '(' VAR G_IDENT ')' {Tag ntag = {0,T_null}; $$ = declare(BI_var,ntag,$3);} | '(' VAR type G_IDENT ')' {$$ = declare(BI_var, $3, $4);} - | '(' IF stmt stmt_list ')' + | '(' VAR G_IDENT expr')' + {} + | '(' VAR type G_IDENT expr ')' + {} + | '(' LET G_IDENT ')' + {} + | '(' LET type G_IDENT ')' + {} + | '(' LET G_IDENT expr ')' + {} + | '(' LET type G_IDENT expr ')' + {} + | '(' IF expr expr_list ')' {$$ = make_operation(BI_if, 0, NULL, 2, $3, $4);} - | '(' IF stmt stmt_list ')' '(' ELSE stmt_list ')' + | '(' IF expr expr_list ')' '(' ELSE expr_list ')' {Statement *st = make_block(make_operation(BI_if, 0, NULL, 2, $3, $4)); $$ = add_block(st, make_operation(BI_else, 0, NULL, 1, $8)); } - | '(' WHILE stmt stmt_list ')' + | '(' WHILE expr expr_list ')' {} - | '(' FN '(' fn_args ')' stmt_list ')' + | '(' FN '(' fn_args ')' expr_list ')' {} - | '(' GTEQ stmt stmt ')' - {} - | '(' SMEQ stmt stmt ')' - {} - | '(' '<' stmt stmt ')' - {} - | '(' '>' stmt stmt ')' - {} - | '(' '=' stmt stmt ')' - {} - | '(' '!' stmt ')' - {} - | '(' BLOCK stmt_list ')' + | '(' BLOCK expr_list ')' {$$ = $3;} - | '(' G_IDENT stmt ')' + | '(' G_IDENT expr_list ')' {$$ = make_operation(ST_None, 0, $2, 1, $3);} | G_IDENT {$$ = variable_get($1);} @@ -91,10 +94,10 @@ stmt: {$$ = $1;} ; -stmt_list: - stmt +expr_list: + expr {$$ = make_block($1);} - | stmt_list stmt + | expr_list expr {$$ = add_block($1, $2);} ;