This commit is contained in:
attilavs2 2025-03-09 12:37:43 +01:00
parent 628e9dde0c
commit b48a2e542e
7 changed files with 112 additions and 23 deletions

View file

@ -89,10 +89,10 @@ typedef struct {
typedef struct {
PACKED union {
char str[5];
char str[4];
u32 pos;
};
u8 len;
u16 len;
} PACKED ValueStr;

View file

@ -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
};

View file

@ -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){

View file

@ -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;
}

View file

@ -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;

View file

@ -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]+ ;

View file

@ -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: