flisp/src/parser.y
2025-03-08 21:59:43 +01:00

116 lines
2.1 KiB
Text

%{
#include <stdio.h>
#include <stdlib.h>
#include "types.h"
#include "code_defs.h"
#include "parser.h"
int yylex();
%}
%union {
char *str;
Statement *st;
Tag tag;
}
%nonassoc <str> G_IDENT
%token <str> TYPE_U
%token VEC
%token VAR
%token LET
%token IF
%token ELSE
%token WHILE
%token FN
%token BLOCK
%token <st> CST
%type <st> expr expr_list
%type <tag> type
%%
program:
expr_list '.' {set_entry_point($1); exit(0); }
;
type:
TYPE_U
{Tag tag = get_type($1);
if(!tag.type) yyerror("Invalid type !");
$$ = tag;
}
| VEC TYPE_U
{Tag tag = get_type($2); tag.is_array = 1; $$ = tag;}
;
fn_args:
G_IDENT
{}
| G_IDENT type
{}
| fn_args G_IDENT
{}
| fn_args G_IDENT type
{}
;
expr:
'(' G_IDENT ')'
{$$ = make_operation(ST_Call, 0, $2, 0, NULL);}
| '(' VAR G_IDENT ')'
{ $$ = declare(BI_var,ntag,$3);}
| '(' VAR type G_IDENT ')'
{$$ = declare(BI_var, $3, $4);}
| '(' VAR G_IDENT expr')'
{$$ = declare(BI_var,ntag,$4);}
| '(' VAR type G_IDENT expr ')'
{$$ = declare(BI_var,$3,$4);}
| '(' 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 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 expr expr_list ')'
{}
| '(' FN '(' fn_args ')' expr_list ')'
{}
| '(' BLOCK expr_list ')'
{$$ = $3;}
| '(' G_IDENT expr_list ')'
{$$ = make_operation(ST_None, 0, $2, 1, $3);}
| G_IDENT
{$$ = variable_get($1);}
| CST
{$$ = $1;}
;
expr_list:
expr
{$$ = make_block($1);}
| expr_list expr
{$$ = add_block($1, $2);}
;
%%
void yyerror(char *s){
fprintf(stderr, "Error : %s\n", s);
exit(1);
}
int main(){
make_stack();
yyparse();
return 0;
}