Prog2
This commit is contained in:
parent
628e9dde0c
commit
b48a2e542e
7 changed files with 112 additions and 23 deletions
|
@ -89,10 +89,10 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
||||||
PACKED union {
|
PACKED union {
|
||||||
char str[5];
|
char str[4];
|
||||||
u32 pos;
|
u32 pos;
|
||||||
};
|
};
|
||||||
u8 len;
|
u16 len;
|
||||||
|
|
||||||
} PACKED ValueStr;
|
} PACKED ValueStr;
|
||||||
|
|
||||||
|
|
|
@ -27,24 +27,25 @@ enum BuiltinStatements {
|
||||||
BI_while = 11,
|
BI_while = 11,
|
||||||
BI_fn = 12,
|
BI_fn = 12,
|
||||||
BI_import = 13,
|
BI_import = 13,
|
||||||
BI_add = 14,
|
BI_is = 14,
|
||||||
BI_sub = 15,
|
BI_cast = 15,
|
||||||
BI_mul = 16,
|
BI_add = 16,
|
||||||
BI_div = 17,
|
BI_sub = 17,
|
||||||
BI_mod = 18,
|
BI_mul = 18,
|
||||||
BI_sml = 19,
|
BI_div = 19,
|
||||||
BI_sml_eq = 20,
|
BI_mod = 20,
|
||||||
BI_eq = 21,
|
BI_sml = 21,
|
||||||
BI_gt_eq = 22,
|
BI_sml_eq = 22,
|
||||||
BI_gt = 23,
|
BI_eq = 23,
|
||||||
BI_not = 24,
|
BI_gt_eq = 24,
|
||||||
BI_and = 25,
|
BI_gt = 25,
|
||||||
BI_or = 26,
|
BI_not = 26,
|
||||||
BI_is = 27,
|
BI_and = 27,
|
||||||
BI_cast = 28,
|
BI_or = 28,
|
||||||
BI_len = 29,
|
BI_len = 29,
|
||||||
BI_push = 30,
|
BI_push = 30,
|
||||||
BI_pop = 31,
|
BI_pop = 31,
|
||||||
|
BI_write = 32,
|
||||||
BI__end
|
BI__end
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ Value add(Value a, Value b){
|
||||||
a.v4B.vfl += b.v4B.vfl;
|
a.v4B.vfl += b.v4B.vfl;
|
||||||
break;
|
break;
|
||||||
case T_str:
|
case T_str:
|
||||||
if(a.vstr.len + b.vstr.len > 5){
|
if(a.vstr.len + b.vstr.len > 4){
|
||||||
runtime_err("not implem");
|
runtime_err("not implem");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -204,13 +204,44 @@ Value pop(Value a, Value b){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value write(Value a){
|
||||||
|
switch(a.tag.type){
|
||||||
|
case T_null:
|
||||||
|
printf("null");
|
||||||
|
break;
|
||||||
|
case T_int:
|
||||||
|
printf("%d",a.v4B.value);
|
||||||
|
break;
|
||||||
|
case T_fix:
|
||||||
|
printf("%f",f2float(a.v4B.value));
|
||||||
|
break;
|
||||||
|
case T_float:
|
||||||
|
printf("%f",a.v4B.vfl);
|
||||||
|
break;
|
||||||
|
case T_str:
|
||||||
|
if(a.vstr.len > 4){
|
||||||
|
runtime_err("Not implem");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
char *nstr = strndup(a.vstr.str, 4);
|
||||||
|
nstr[a.vstr.len] = '\0';
|
||||||
|
printf("%s",nstr);
|
||||||
|
free(nstr);
|
||||||
|
}
|
||||||
|
case T_fn:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const Tag tany = {0,T_null};
|
const Tag tany = {0,T_null};
|
||||||
const Tag tint = {0,T_int};
|
const Tag tint = {0,T_int};
|
||||||
const Tag tfix = {0,T_fix};
|
const Tag tfix = {0,T_fix};
|
||||||
const Tag tfloat = {0,T_float};
|
const Tag tfloat = {0,T_float};
|
||||||
const Tag tstr = {0,T_str};
|
const Tag tstr = {0,T_str};
|
||||||
const Tag tfn = {0,T_fn};
|
const Tag tfn = {0,T_fn};
|
||||||
const Tag vec = {1,T_null};
|
const Tag tvec = {1,T_null};
|
||||||
|
|
||||||
#define BICAST(x) ((bi_fn_t*)(x))
|
#define BICAST(x) ((bi_fn_t*)(x))
|
||||||
|
|
||||||
|
@ -220,6 +251,18 @@ FnSig builtins[] = {
|
||||||
{{tany,tany},2,1,{.bi = BICAST(mul)}},
|
{{tany,tany},2,1,{.bi = BICAST(mul)}},
|
||||||
{{tany,tany},2,1,{.bi = BICAST(divv)}},
|
{{tany,tany},2,1,{.bi = BICAST(divv)}},
|
||||||
{{tany,tany},2,1,{.bi = BICAST(mod)}},
|
{{tany,tany},2,1,{.bi = BICAST(mod)}},
|
||||||
|
{{tany,tany},2,1,{.bi = BICAST(sml)}},
|
||||||
|
{{tany,tany},2,1,{.bi = BICAST(sml_eq)}},
|
||||||
|
{{tany,tany},2,1,{.bi = BICAST(eq)}},
|
||||||
|
{{tany,tany},2,1,{.bi = BICAST(gt_eq)}},
|
||||||
|
{{tany,tany},2,1,{.bi = BICAST(gt)}},
|
||||||
|
{{tany} ,1,1,{.bi = BICAST(not)}},
|
||||||
|
{{tany,tany},2,1,{.bi = BICAST(and)}},
|
||||||
|
{{tany,tany},2,1,{.bi = BICAST(or)}},
|
||||||
|
{{tvec} ,1,1,{.bi = BICAST(len)}},
|
||||||
|
{{tvec,tany},2,1,{.bi = BICAST(push)}},
|
||||||
|
{{tvec,tint},2,1,{.bi = BICAST(pop)}},
|
||||||
|
{{tany} ,1,1,{.bi = BICAST(write)}}
|
||||||
};
|
};
|
||||||
|
|
||||||
char *bi_names[] = {
|
char *bi_names[] = {
|
||||||
|
@ -227,7 +270,19 @@ char *bi_names[] = {
|
||||||
"-",
|
"-",
|
||||||
"*",
|
"*",
|
||||||
"/",
|
"/",
|
||||||
"%"
|
"%",
|
||||||
|
"<",
|
||||||
|
"<=",
|
||||||
|
"=",
|
||||||
|
">=",
|
||||||
|
">",
|
||||||
|
"!",
|
||||||
|
"and",
|
||||||
|
"or",
|
||||||
|
"len",
|
||||||
|
"push",
|
||||||
|
"pop",
|
||||||
|
"write"
|
||||||
};
|
};
|
||||||
|
|
||||||
void symbol_map_add_bi(HashMap *map){
|
void symbol_map_add_bi(HashMap *map){
|
||||||
|
|
|
@ -42,6 +42,36 @@ Value execute(Statement *stat){
|
||||||
while(evaluate(execute(stat->children[0])))
|
while(evaluate(execute(stat->children[0])))
|
||||||
execute(stat->children[1]);
|
execute(stat->children[1]);
|
||||||
break;
|
break;
|
||||||
|
case BI_fn:
|
||||||
|
case BI_import:
|
||||||
|
break;
|
||||||
|
// TODO
|
||||||
|
case BI_is:
|
||||||
|
break;
|
||||||
|
// TODO
|
||||||
|
case BI_cast:
|
||||||
|
break;
|
||||||
|
case ST_Call:
|
||||||
|
FnSig *fn = stat->func;
|
||||||
|
Statement **params = ((Statement*)stat->children[0])->children;
|
||||||
|
if(fn->is_builtin){
|
||||||
|
switch(fn->n_param){
|
||||||
|
case 0:
|
||||||
|
returnv = fn->bi();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
Value (*fn1)(Value) = (void*)fn->bi;
|
||||||
|
returnv = fn1(execute(params[0]));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
Value (*fn2)(Value,Value) = (void*)fn->bi;
|
||||||
|
returnv = fn2(execute(params[0]),execute(params[1]));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return returnv;
|
return returnv;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ int make_stack(){
|
||||||
if(heap_hashmap(&stack->symbol_map, SYMBOL_MAP_S))
|
if(heap_hashmap(&stack->symbol_map, SYMBOL_MAP_S))
|
||||||
return 1;
|
return 1;
|
||||||
stack->stack_size = 2048;
|
stack->stack_size = 2048;
|
||||||
|
symbol_map_add_bi(&stack->symbol_map);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -133,7 +134,7 @@ Statement *make_operation(i32 type, i32 extrainf, char *name, i32 nparam,
|
||||||
else {
|
else {
|
||||||
fnsig = ret->fnsig;
|
fnsig = ret->fnsig;
|
||||||
}
|
}
|
||||||
if(nparam > fnsig->n_param)
|
if(param->child_n > fnsig->n_param)
|
||||||
yyerror("Too many parameters to function");
|
yyerror("Too many parameters to function");
|
||||||
}
|
}
|
||||||
stat->type = type;
|
stat->type = type;
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
"if" return IF;
|
"if" return IF;
|
||||||
"else" return ELSE;
|
"else" return ELSE;
|
||||||
|
"while" return WHILE;
|
||||||
"fn" return FN;
|
"fn" return FN;
|
||||||
"var" return VAR;
|
"var" return VAR;
|
||||||
"let" return LET;
|
"let" return LET;
|
||||||
|
@ -36,7 +37,7 @@
|
||||||
return CST;
|
return CST;
|
||||||
}
|
}
|
||||||
|
|
||||||
[()] return *yytext;
|
[();] return *yytext;
|
||||||
|
|
||||||
[ \t\n]+ ;
|
[ \t\n]+ ;
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "code_defs.h"
|
#include "code_defs.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
|
#include "interpreter.h"
|
||||||
|
|
||||||
int yylex();
|
int yylex();
|
||||||
%}
|
%}
|
||||||
|
@ -33,7 +34,7 @@
|
||||||
%%
|
%%
|
||||||
|
|
||||||
program:
|
program:
|
||||||
expr_list '.' {set_entry_point($1); exit(0); }
|
expr_list ';' {execute($1); exit(0); }
|
||||||
;
|
;
|
||||||
|
|
||||||
type:
|
type:
|
||||||
|
|
Loading…
Add table
Reference in a new issue