diff --git a/src/byte_defs.h b/src/byte_defs.h index 3926376..b220978 100755 --- a/src/byte_defs.h +++ b/src/byte_defs.h @@ -89,10 +89,10 @@ typedef struct { typedef struct { PACKED union { - char str[5]; + char str[4]; u32 pos; }; - u8 len; + u16 len; } PACKED ValueStr; diff --git a/src/code_defs.h b/src/code_defs.h index 46bf3bf..cdb3e73 100755 --- a/src/code_defs.h +++ b/src/code_defs.h @@ -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 }; diff --git a/src/exec_common.c b/src/exec_common.c index d214ae8..8a9a438 100644 --- a/src/exec_common.c +++ b/src/exec_common.c @@ -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){ diff --git a/src/interpreter.c b/src/interpreter.c index a596ad4..f57298f 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -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; } diff --git a/src/parse_utils.c b/src/parse_utils.c index 8f9a2f8..ad33b6c 100644 --- a/src/parse_utils.c +++ b/src/parse_utils.c @@ -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; diff --git a/src/parser.l b/src/parser.l index 05ffa54..994b9aa 100644 --- a/src/parser.l +++ b/src/parser.l @@ -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]+ ; diff --git a/src/parser.y b/src/parser.y index d6acd15..b2a84b8 100644 --- a/src/parser.y +++ b/src/parser.y @@ -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: