116 lines
2.1 KiB
Text
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;
|
|
}
|