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 {
|
||||
|
||||
PACKED union {
|
||||
char str[5];
|
||||
char str[4];
|
||||
u32 pos;
|
||||
};
|
||||
u8 len;
|
||||
u16 len;
|
||||
|
||||
} PACKED ValueStr;
|
||||
|
||||
|
|
|
@ -27,24 +27,25 @@ enum BuiltinStatements {
|
|||
BI_while = 11,
|
||||
BI_fn = 12,
|
||||
BI_import = 13,
|
||||
BI_add = 14,
|
||||
BI_sub = 15,
|
||||
BI_mul = 16,
|
||||
BI_div = 17,
|
||||
BI_mod = 18,
|
||||
BI_sml = 19,
|
||||
BI_sml_eq = 20,
|
||||
BI_eq = 21,
|
||||
BI_gt_eq = 22,
|
||||
BI_gt = 23,
|
||||
BI_not = 24,
|
||||
BI_and = 25,
|
||||
BI_or = 26,
|
||||
BI_is = 27,
|
||||
BI_cast = 28,
|
||||
BI_is = 14,
|
||||
BI_cast = 15,
|
||||
BI_add = 16,
|
||||
BI_sub = 17,
|
||||
BI_mul = 18,
|
||||
BI_div = 19,
|
||||
BI_mod = 20,
|
||||
BI_sml = 21,
|
||||
BI_sml_eq = 22,
|
||||
BI_eq = 23,
|
||||
BI_gt_eq = 24,
|
||||
BI_gt = 25,
|
||||
BI_not = 26,
|
||||
BI_and = 27,
|
||||
BI_or = 28,
|
||||
BI_len = 29,
|
||||
BI_push = 30,
|
||||
BI_pop = 31,
|
||||
BI_write = 32,
|
||||
BI__end
|
||||
};
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ Value add(Value a, Value b){
|
|||
a.v4B.vfl += b.v4B.vfl;
|
||||
break;
|
||||
case T_str:
|
||||
if(a.vstr.len + b.vstr.len > 5){
|
||||
if(a.vstr.len + b.vstr.len > 4){
|
||||
runtime_err("not implem");
|
||||
}
|
||||
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 tint = {0,T_int};
|
||||
const Tag tfix = {0,T_fix};
|
||||
const Tag tfloat = {0,T_float};
|
||||
const Tag tstr = {0,T_str};
|
||||
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))
|
||||
|
||||
|
@ -220,6 +251,18 @@ FnSig builtins[] = {
|
|||
{{tany,tany},2,1,{.bi = BICAST(mul)}},
|
||||
{{tany,tany},2,1,{.bi = BICAST(divv)}},
|
||||
{{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[] = {
|
||||
|
@ -227,7 +270,19 @@ char *bi_names[] = {
|
|||
"-",
|
||||
"*",
|
||||
"/",
|
||||
"%"
|
||||
"%",
|
||||
"<",
|
||||
"<=",
|
||||
"=",
|
||||
">=",
|
||||
">",
|
||||
"!",
|
||||
"and",
|
||||
"or",
|
||||
"len",
|
||||
"push",
|
||||
"pop",
|
||||
"write"
|
||||
};
|
||||
|
||||
void symbol_map_add_bi(HashMap *map){
|
||||
|
|
|
@ -42,6 +42,36 @@ Value execute(Statement *stat){
|
|||
while(evaluate(execute(stat->children[0])))
|
||||
execute(stat->children[1]);
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ int make_stack(){
|
|||
if(heap_hashmap(&stack->symbol_map, SYMBOL_MAP_S))
|
||||
return 1;
|
||||
stack->stack_size = 2048;
|
||||
symbol_map_add_bi(&stack->symbol_map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -133,7 +134,7 @@ Statement *make_operation(i32 type, i32 extrainf, char *name, i32 nparam,
|
|||
else {
|
||||
fnsig = ret->fnsig;
|
||||
}
|
||||
if(nparam > fnsig->n_param)
|
||||
if(param->child_n > fnsig->n_param)
|
||||
yyerror("Too many parameters to function");
|
||||
}
|
||||
stat->type = type;
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
"if" return IF;
|
||||
"else" return ELSE;
|
||||
"while" return WHILE;
|
||||
"fn" return FN;
|
||||
"var" return VAR;
|
||||
"let" return LET;
|
||||
|
@ -36,7 +37,7 @@
|
|||
return CST;
|
||||
}
|
||||
|
||||
[()] return *yytext;
|
||||
[();] return *yytext;
|
||||
|
||||
[ \t\n]+ ;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "types.h"
|
||||
#include "code_defs.h"
|
||||
#include "parser.h"
|
||||
#include "interpreter.h"
|
||||
|
||||
int yylex();
|
||||
%}
|
||||
|
@ -33,7 +34,7 @@
|
|||
%%
|
||||
|
||||
program:
|
||||
expr_list '.' {set_entry_point($1); exit(0); }
|
||||
expr_list ';' {execute($1); exit(0); }
|
||||
;
|
||||
|
||||
type:
|
||||
|
|
Loading…
Add table
Reference in a new issue