⚡ add new operand calculate const and pop
This commit is contained in:
parent
8161f3c514
commit
bd12fe917a
109
nasal_codegen.h
109
nasal_codegen.h
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
enum op_code_type:u8 {
|
enum op_code_type:u8 {
|
||||||
op_exit, // stop the virtual machine
|
op_exit, // stop the virtual machine
|
||||||
op_intg, // global scope size
|
op_intg, // global scope size, set stack top
|
||||||
op_intl, // local scope size
|
op_intl, // local scope size
|
||||||
op_loadg, // load global value
|
op_loadg, // load global value
|
||||||
op_loadl, // load local value
|
op_loadl, // load local value
|
||||||
|
@ -26,7 +26,7 @@ enum op_code_type:u8 {
|
||||||
op_deft, // default parameter
|
op_deft, // default parameter
|
||||||
op_dyn, // dynamic parameter
|
op_dyn, // dynamic parameter
|
||||||
op_lnot, // ! logical negation
|
op_lnot, // ! logical negation
|
||||||
op_usub, // -
|
op_usub, // - negation
|
||||||
op_bnot, // ~ bitwise not static_cast<i32>
|
op_bnot, // ~ bitwise not static_cast<i32>
|
||||||
op_btor, // | bitwise or
|
op_btor, // | bitwise or
|
||||||
op_btxor, // ^ bitwise xor
|
op_btxor, // ^ bitwise xor
|
||||||
|
@ -41,20 +41,25 @@ enum op_code_type:u8 {
|
||||||
op_mulc, // * const
|
op_mulc, // * const
|
||||||
op_divc, // / const
|
op_divc, // / const
|
||||||
op_lnkc, // ~ const
|
op_lnkc, // ~ const
|
||||||
op_addeq, // +=
|
op_addeq, // += maybe pop stack top
|
||||||
op_subeq, // -=
|
op_subeq, // -= maybe pop stack top
|
||||||
op_muleq, // *=
|
op_muleq, // *= maybe pop stack top
|
||||||
op_diveq, // /=
|
op_diveq, // /= maybe pop stack top
|
||||||
op_lnkeq, // ~=
|
op_lnkeq, // ~= maybe pop stack top
|
||||||
op_btandeq,// &=
|
op_btandeq,// &= maybe pop stack top
|
||||||
op_btoreq, // |=
|
op_btoreq, // |= maybe pop stack top
|
||||||
op_btxoreq,// ^=
|
op_btxoreq,// ^= maybe pop stack top
|
||||||
op_addeqc, // += const
|
op_addeqc, // += const don't pop stack top
|
||||||
op_subeqc, // -= const
|
op_subeqc, // -= const don't pop stack top
|
||||||
op_muleqc, // *= const
|
op_muleqc, // *= const don't pop stack top
|
||||||
op_diveqc, // /= const
|
op_diveqc, // /= const don't pop stack top
|
||||||
op_lnkeqc, // ~= const
|
op_lnkeqc, // ~= const don't pop stack top
|
||||||
op_meq, // =
|
op_addecp, // += const and pop stack top
|
||||||
|
op_subecp, // -= const and pop stack top
|
||||||
|
op_mulecp, // *= const and pop stack top
|
||||||
|
op_divecp, // /= const and pop stack top
|
||||||
|
op_lnkecp, // ~= concat const string and pop stack top
|
||||||
|
op_meq, // = maybe pop stack top
|
||||||
op_eq, // ==
|
op_eq, // ==
|
||||||
op_neq, // !=
|
op_neq, // !=
|
||||||
op_less, // <
|
op_less, // <
|
||||||
|
@ -65,8 +70,8 @@ enum op_code_type:u8 {
|
||||||
op_leqc, // <= const
|
op_leqc, // <= const
|
||||||
op_grtc, // > const
|
op_grtc, // > const
|
||||||
op_geqc, // >= const
|
op_geqc, // >= const
|
||||||
op_pop, // pop a value from stack
|
op_pop, // pop a value out of stack top
|
||||||
op_jmp, // jump with no condition
|
op_jmp, // jump absolute address with no condition
|
||||||
op_jt, // used in operator and/or,jmp when condition is true and DO NOT POP
|
op_jt, // used in operator and/or,jmp when condition is true and DO NOT POP
|
||||||
op_jf, // used in conditional/loop,jmp when condition is false and POP STACK
|
op_jf, // used in conditional/loop,jmp when condition is false and POP STACK
|
||||||
op_cnt, // add counter for forindex/foreach
|
op_cnt, // add counter for forindex/foreach
|
||||||
|
@ -74,7 +79,7 @@ enum op_code_type:u8 {
|
||||||
op_feach, // index counter on the top of forindex_stack plus 1 and get the value in vector
|
op_feach, // index counter on the top of forindex_stack plus 1 and get the value in vector
|
||||||
op_callg, // get value in global scope
|
op_callg, // get value in global scope
|
||||||
op_calll, // get value in local scope
|
op_calll, // get value in local scope
|
||||||
op_upval, // get upvalue in closure
|
op_upval, // get upvalue in closure, high 16 as the index of upval, low 16 as the index of local
|
||||||
op_callv, // call vec[index]
|
op_callv, // call vec[index]
|
||||||
op_callvi, // call vec[immediate] (used in multi-assign/multi-define)
|
op_callvi, // call vec[immediate] (used in multi-assign/multi-define)
|
||||||
op_callh, // call hash.label
|
op_callh, // call hash.label
|
||||||
|
@ -105,23 +110,24 @@ const char* opname[]={
|
||||||
"addeq ","subeq ","muleq ","diveq ",
|
"addeq ","subeq ","muleq ","diveq ",
|
||||||
"lnkeq ","bandeq","boreq ","bxoreq",
|
"lnkeq ","bandeq","boreq ","bxoreq",
|
||||||
"addeqc","subeqc","muleqc","diveqc",
|
"addeqc","subeqc","muleqc","diveqc",
|
||||||
"lnkeqc","meq ","eq ","neq ",
|
"lnkeqc","addecp","subecp","mulecp",
|
||||||
"less ","leq ","grt ","geq ",
|
"divecp","lnkecp","meq ","eq ",
|
||||||
"lessc ","leqc ","grtc ","geqc ",
|
"neq ","less ","leq ","grt ",
|
||||||
"pop ","jmp ","jt ","jf ",
|
"geq ","lessc ","leqc ","grtc ",
|
||||||
"cnt ","findx ","feach ","callg ",
|
"geqc ","pop ","jmp ","jt ",
|
||||||
"calll ","upval ","callv ","callvi",
|
"jf ","cnt ","findx ","feach ",
|
||||||
"callh ","callfv","callfh","callb ",
|
"callg ","calll ","upval ","callv ",
|
||||||
"slcbeg","slcend","slc ","slc2 ",
|
"callvi","callh ","callfv","callfh",
|
||||||
"mcallg","mcalll","mupval","mcallv",
|
"callb ","slcbeg","slcend","slc ",
|
||||||
"mcallh","ret "
|
"slc2 ","mcallg","mcalll","mupval",
|
||||||
|
"mcallv","mcallh","ret "
|
||||||
};
|
};
|
||||||
|
|
||||||
struct opcode {
|
struct opcode {
|
||||||
u8 op; // opcode
|
u8 op; // opcode
|
||||||
u16 fidx;// source code file index
|
u16 fidx; // source code file index
|
||||||
u32 num; // imm num
|
u32 num; // immediate num
|
||||||
u32 line;// line of source code
|
u32 line; // location line of source code
|
||||||
opcode(u8 o=op_exit,u16 f=0,u32 n=0,u32 l=0):
|
opcode(u8 o=op_exit,u16 f=0,u32 n=0,u32 l=0):
|
||||||
op(o),fidx(f),num(n),line(l) {}
|
op(o),fidx(f),num(n),line(l) {}
|
||||||
opcode& operator=(const opcode& tmp) = default;
|
opcode& operator=(const opcode& tmp) = default;
|
||||||
|
@ -141,7 +147,7 @@ public:
|
||||||
u8 op=ins.code.op;
|
u8 op=ins.code.op;
|
||||||
u32 num=ins.code.num;
|
u32 num=ins.code.num;
|
||||||
out<<std::hex<<"0x"
|
out<<std::hex<<"0x"
|
||||||
<<std::setw(8)<<std::setfill('0')<<ins.index<<" "
|
<<std::setw(6)<<std::setfill('0')<<ins.index<<" "
|
||||||
<<std::setw(2)<<std::setfill('0')<<(u32)op<<" "
|
<<std::setw(2)<<std::setfill('0')<<(u32)op<<" "
|
||||||
<<std::setw(2)<<std::setfill('0')<<((num>>24)&0xff)<<" "
|
<<std::setw(2)<<std::setfill('0')<<((num>>24)&0xff)<<" "
|
||||||
<<std::setw(2)<<std::setfill('0')<<((num>>16)&0xff)<<" "
|
<<std::setw(2)<<std::setfill('0')<<((num>>16)&0xff)<<" "
|
||||||
|
@ -155,13 +161,17 @@ public:
|
||||||
out<<std::hex<<"0x"<<num<<std::dec
|
out<<std::hex<<"0x"<<num<<std::dec
|
||||||
<<" sp-"<<num;break;
|
<<" sp-"<<num;break;
|
||||||
case op_addeqc:case op_subeqc: case op_muleqc:case op_diveqc:
|
case op_addeqc:case op_subeqc: case op_muleqc:case op_diveqc:
|
||||||
out<<std::hex<<"0x"<<(num&0x7fffffff)<<std::dec
|
out<<std::hex<<"0x"<<num<<std::dec
|
||||||
<<" ("<<ins.nums[num&0x7fffffff]<<") sp-"
|
<<" ("<<ins.nums[num]<<")";break;
|
||||||
<<(num>>31);break;
|
|
||||||
case op_lnkeqc:
|
case op_lnkeqc:
|
||||||
out<<std::hex<<"0x"<<(num&0x7fffffff)<<std::dec<<" (\""
|
out<<std::hex<<"0x"<<num<<std::dec<<" (\""
|
||||||
<<rawstr(ins.strs[num&0x7fffffff],16)<<"\") sp-"
|
<<rawstr(ins.strs[num],16)<<"\")";break;
|
||||||
<<(num>>31);break;
|
case op_addecp:case op_subecp:case op_mulecp:case op_divecp:
|
||||||
|
out<<std::hex<<"0x"<<num<<std::dec
|
||||||
|
<<" ("<<ins.nums[num]<<") sp-1";break;
|
||||||
|
case op_lnkecp:
|
||||||
|
out<<std::hex<<"0x"<<num<<std::dec<<" (\""
|
||||||
|
<<rawstr(ins.strs[num],16)<<"\") sp-1";break;
|
||||||
case op_addc: case op_subc: case op_mulc: case op_divc:
|
case op_addc: case op_subc: case op_mulc: case op_divc:
|
||||||
case op_lessc: case op_leqc: case op_grtc: case op_geqc:
|
case op_lessc: case op_leqc: case op_grtc: case op_geqc:
|
||||||
case op_pnum:
|
case op_pnum:
|
||||||
|
@ -212,9 +222,12 @@ private:
|
||||||
std::vector<opcode> code;
|
std::vector<opcode> code;
|
||||||
std::list<std::vector<i32>> continue_ptr;
|
std::list<std::vector<i32>> continue_ptr;
|
||||||
std::list<std::vector<i32>> break_ptr;
|
std::list<std::vector<i32>> break_ptr;
|
||||||
// global : max 1023 values
|
|
||||||
|
// symbol table
|
||||||
|
// global : max STACK_DEPTH-1 values
|
||||||
std::unordered_map<string,i32> global;
|
std::unordered_map<string,i32> global;
|
||||||
// local : max 32768 upvalues 65536 values
|
// local : max 32768 upvalues 65536 values
|
||||||
|
// but in fact local scope also has less than STACK_DEPTH value
|
||||||
std::list<std::unordered_map<string,i32>> local;
|
std::list<std::unordered_map<string,i32>> local;
|
||||||
|
|
||||||
bool check_memory_reachable(const ast&);
|
bool check_memory_reachable(const ast&);
|
||||||
|
@ -858,7 +871,7 @@ void codegen::expr_gen(const ast& node) {
|
||||||
if (op_addeq<=code.back().op && code.back().op<=op_btxoreq) {
|
if (op_addeq<=code.back().op && code.back().op<=op_btxoreq) {
|
||||||
code.back().num=1;
|
code.back().num=1;
|
||||||
} else if (op_addeqc<=code.back().op && code.back().op<=op_lnkeqc) {
|
} else if (op_addeqc<=code.back().op && code.back().op<=op_lnkeqc) {
|
||||||
code.back().num|=0x80000000;
|
code.back().op=code.back().op-op_addeqc+op_addecp;
|
||||||
} else {
|
} else {
|
||||||
gen(op_pop,0,node.line());
|
gen(op_pop,0,node.line());
|
||||||
}
|
}
|
||||||
|
@ -1195,11 +1208,21 @@ const error& codegen::compile(const parse& parse,const linker& import) {
|
||||||
gen(op_intg,global.size(),0);
|
gen(op_intg,global.size(),0);
|
||||||
block_gen(parse.tree()); // generate main block
|
block_gen(parse.tree()); // generate main block
|
||||||
gen(op_exit,0,0);
|
gen(op_exit,0,0);
|
||||||
|
|
||||||
|
// size out of bound check
|
||||||
|
if (num_res.size()>0xffffff) {
|
||||||
|
err.load(file[0]); // load main execute file
|
||||||
|
err.err("code","too many constant numbers: "+std::to_string(num_res.size()));
|
||||||
|
}
|
||||||
|
if (str_res.size()>0xffffff) {
|
||||||
|
err.load(file[0]); // load main execute file
|
||||||
|
err.err("code","too many constant strings: "+std::to_string(str_res.size()));
|
||||||
|
}
|
||||||
if (global.size()>=STACK_DEPTH) {
|
if (global.size()>=STACK_DEPTH) {
|
||||||
err.load(file[0]); // load main execute file
|
err.load(file[0]); // load main execute file
|
||||||
err.err("code","too many global variants: "+std::to_string(global.size()));
|
err.err("code","too many global variants: "+std::to_string(global.size()));
|
||||||
}
|
}
|
||||||
if (code.size()>0x00ffffff) {
|
if (code.size()>0xffffff) {
|
||||||
err.load(file[0]); // load main execute file
|
err.load(file[0]); // load main execute file
|
||||||
err.err("code","bytecode size overflow: "+std::to_string(code.size()));
|
err.err("code","bytecode size overflow: "+std::to_string(code.size()));
|
||||||
}
|
}
|
||||||
|
|
34
nasal_dbg.h
34
nasal_dbg.h
|
@ -213,16 +213,17 @@ void debugger::run(
|
||||||
&&addeq, &&subeq, &&muleq, &&diveq,
|
&&addeq, &&subeq, &&muleq, &&diveq,
|
||||||
&&lnkeq, &&bandeq, &&boreq, &&bxoreq,
|
&&lnkeq, &&bandeq, &&boreq, &&bxoreq,
|
||||||
&&addeqc, &&subeqc, &&muleqc, &&diveqc,
|
&&addeqc, &&subeqc, &&muleqc, &&diveqc,
|
||||||
&&lnkeqc, &&meq, &&eq, &&neq,
|
&&lnkeqc, &&addecp, &&subecp, &&mulecp,
|
||||||
&&less, &&leq, &&grt, &&geq,
|
&&divecp, &&lnkecp, &&meq, &&eq,
|
||||||
&&lessc, &&leqc, &&grtc, &&geqc,
|
&&neq, &&less, &&leq, &&grt,
|
||||||
&&pop, &&jmp, &&jt, &&jf,
|
&&geq, &&lessc, &&leqc, &&grtc,
|
||||||
&&cnt, &&findex, &&feach, &&callg,
|
&&geqc, &&pop, &&jmp, &&jt,
|
||||||
&&calll, &&upval, &&callv, &&callvi,
|
&&jf, &&cnt, &&findex, &&feach,
|
||||||
&&callh, &&callfv, &&callfh, &&callb,
|
&&callg, &&calll, &&upval, &&callv,
|
||||||
&&slcbeg, &&slcend, &&slc, &&slc2,
|
&&callvi, &&callh, &&callfv, &&callfh,
|
||||||
&&mcallg, &&mcalll, &&mupval, &&mcallv,
|
&&callb, &&slcbeg, &&slcend, &&slc,
|
||||||
&&mcallh, &&ret
|
&&slc2, &&mcallg, &&mcalll, &&mupval,
|
||||||
|
&&mcallv, &&mcallh, &&ret
|
||||||
};
|
};
|
||||||
std::vector<const void*> code;
|
std::vector<const void*> code;
|
||||||
for(auto& i:gen.codes()) {
|
for(auto& i:gen.codes()) {
|
||||||
|
@ -254,9 +255,11 @@ void debugger::run(
|
||||||
&debugger::o_muleq, &debugger::o_diveq,
|
&debugger::o_muleq, &debugger::o_diveq,
|
||||||
&debugger::o_lnkeq, &debugger::o_bandeq,
|
&debugger::o_lnkeq, &debugger::o_bandeq,
|
||||||
&debugger::o_boreq, &debugger::o_bxoreq,
|
&debugger::o_boreq, &debugger::o_bxoreq,
|
||||||
&debugger::o_addeqc,
|
&debugger::o_addeqc, &debugger::o_subeqc,
|
||||||
&debugger::o_subeqc, &debugger::o_muleqc,
|
&debugger::o_muleqc, &debugger::o_diveqc,
|
||||||
&debugger::o_diveqc, &debugger::o_lnkeqc,
|
&debugger::o_lnkeqc, &debugger::o_addecp,
|
||||||
|
&debugger::o_subecp, &debugger::o_mulecp,
|
||||||
|
&debugger::o_divecp, &debugger::o_lnkecp,
|
||||||
&debugger::o_meq, &debugger::o_eq,
|
&debugger::o_meq, &debugger::o_eq,
|
||||||
&debugger::o_neq, &debugger::o_less,
|
&debugger::o_neq, &debugger::o_less,
|
||||||
&debugger::o_leq, &debugger::o_grt,
|
&debugger::o_leq, &debugger::o_grt,
|
||||||
|
@ -355,6 +358,11 @@ subeqc: dbg(o_subeqc,op_subeqc);
|
||||||
muleqc: dbg(o_muleqc,op_muleqc);
|
muleqc: dbg(o_muleqc,op_muleqc);
|
||||||
diveqc: dbg(o_diveqc,op_diveqc);
|
diveqc: dbg(o_diveqc,op_diveqc);
|
||||||
lnkeqc: dbg(o_lnkeqc,op_lnkeqc);
|
lnkeqc: dbg(o_lnkeqc,op_lnkeqc);
|
||||||
|
addecp: dbg(o_addecp,op_addecp);
|
||||||
|
subecp: dbg(o_subecp,op_subecp);
|
||||||
|
mulecp: dbg(o_mulecp,op_mulecp);
|
||||||
|
divecp: dbg(o_divecp,op_divecp);
|
||||||
|
lnkecp: dbg(o_lnkecp,op_lnkecp);
|
||||||
meq: dbg(o_meq ,op_meq );
|
meq: dbg(o_meq ,op_meq );
|
||||||
eq: dbg(o_eq ,op_eq );
|
eq: dbg(o_eq ,op_eq );
|
||||||
neq: dbg(o_neq ,op_neq );
|
neq: dbg(o_neq ,op_neq );
|
||||||
|
|
62
nasal_vm.h
62
nasal_vm.h
|
@ -96,6 +96,11 @@ protected:
|
||||||
void o_muleqc();
|
void o_muleqc();
|
||||||
void o_diveqc();
|
void o_diveqc();
|
||||||
void o_lnkeqc();
|
void o_lnkeqc();
|
||||||
|
void o_addecp();
|
||||||
|
void o_subecp();
|
||||||
|
void o_mulecp();
|
||||||
|
void o_divecp();
|
||||||
|
void o_lnkecp();
|
||||||
void o_meq();
|
void o_meq();
|
||||||
void o_eq();
|
void o_eq();
|
||||||
void o_neq();
|
void o_neq();
|
||||||
|
@ -554,18 +559,31 @@ void vm::o_bxoreq() {
|
||||||
// like this: func{a+=1;}(); the result of 'a+1' will no be used later, imm[pc]>>31=1
|
// like this: func{a+=1;}(); the result of 'a+1' will no be used later, imm[pc]>>31=1
|
||||||
// but if b+=a+=1; the result of 'a+1' will be used later, imm[pc]>>31=0
|
// but if b+=a+=1; the result of 'a+1' will be used later, imm[pc]>>31=0
|
||||||
#define op_calc_eq_const(type)\
|
#define op_calc_eq_const(type)\
|
||||||
top[0]=memr[0]=var::num(memr[0].tonum() type cnum[imm[pc]&0x7fffffff]);\
|
top[0]=memr[0]=var::num(memr[0].tonum() type cnum[imm[pc]]);\
|
||||||
memr=nullptr;\
|
memr=nullptr;
|
||||||
top-=(imm[pc]>>31);
|
|
||||||
|
|
||||||
void vm::o_addeqc() {op_calc_eq_const(+);}
|
void vm::o_addeqc() {op_calc_eq_const(+);}
|
||||||
void vm::o_subeqc() {op_calc_eq_const(-);}
|
void vm::o_subeqc() {op_calc_eq_const(-);}
|
||||||
void vm::o_muleqc() {op_calc_eq_const(*);}
|
void vm::o_muleqc() {op_calc_eq_const(*);}
|
||||||
void vm::o_diveqc() {op_calc_eq_const(/);}
|
void vm::o_diveqc() {op_calc_eq_const(/);}
|
||||||
void vm::o_lnkeqc() {
|
void vm::o_lnkeqc() {
|
||||||
top[0]=memr[0]=ngc.newstr(memr[0].tostr()+cstr[imm[pc]&0x7fffffff]);
|
top[0]=memr[0]=ngc.newstr(memr[0].tostr()+cstr[imm[pc]]);
|
||||||
memr=nullptr;
|
memr=nullptr;
|
||||||
top-=(imm[pc]>>31);
|
}
|
||||||
|
|
||||||
|
#define op_calc_eq_const_and_pop(type)\
|
||||||
|
top[0]=memr[0]=var::num(memr[0].tonum() type cnum[imm[pc]]);\
|
||||||
|
memr=nullptr;\
|
||||||
|
--top;
|
||||||
|
|
||||||
|
void vm::o_addecp() {op_calc_eq_const_and_pop(+);}
|
||||||
|
void vm::o_subecp() {op_calc_eq_const_and_pop(-);}
|
||||||
|
void vm::o_mulecp() {op_calc_eq_const_and_pop(*);}
|
||||||
|
void vm::o_divecp() {op_calc_eq_const_and_pop(/);}
|
||||||
|
void vm::o_lnkecp() {
|
||||||
|
top[0]=memr[0]=ngc.newstr(memr[0].tostr()+cstr[imm[pc]]);
|
||||||
|
memr=nullptr;
|
||||||
|
--top;
|
||||||
}
|
}
|
||||||
|
|
||||||
void vm::o_meq() {
|
void vm::o_meq() {
|
||||||
|
@ -1062,16 +1080,17 @@ void vm::run(
|
||||||
&&addeq, &&subeq, &&muleq, &&diveq,
|
&&addeq, &&subeq, &&muleq, &&diveq,
|
||||||
&&lnkeq, &&bandeq, &&boreq, &&bxoreq,
|
&&lnkeq, &&bandeq, &&boreq, &&bxoreq,
|
||||||
&&addeqc, &&subeqc, &&muleqc, &&diveqc,
|
&&addeqc, &&subeqc, &&muleqc, &&diveqc,
|
||||||
&&lnkeqc, &&meq, &&eq, &&neq,
|
&&lnkeqc, &&addecp, &&subecp, &&mulecp,
|
||||||
&&less, &&leq, &&grt, &&geq,
|
&&divecp, &&lnkecp, &&meq, &&eq,
|
||||||
&&lessc, &&leqc, &&grtc, &&geqc,
|
&&neq, &&less, &&leq, &&grt,
|
||||||
&&pop, &&jmp, &&jt, &&jf,
|
&&geq, &&lessc, &&leqc, &&grtc,
|
||||||
&&cnt, &&findex, &&feach, &&callg,
|
&&geqc, &&pop, &&jmp, &&jt,
|
||||||
&&calll, &&upval, &&callv, &&callvi,
|
&&jf, &&cnt, &&findex, &&feach,
|
||||||
&&callh, &&callfv, &&callfh, &&callb,
|
&&callg, &&calll, &&upval, &&callv,
|
||||||
&&slcbeg, &&slcend, &&slc, &&slc2,
|
&&callvi, &&callh, &&callfv, &&callfh,
|
||||||
&&mcallg, &&mcalll, &&mupval, &&mcallv,
|
&&callb, &&slcbeg, &&slcend, &&slc,
|
||||||
&&mcallh, &&ret
|
&&slc2, &&mcallg, &&mcalll, &&mupval,
|
||||||
|
&&mcallv, &&mcallh, &&ret
|
||||||
};
|
};
|
||||||
std::vector<const void*> code;
|
std::vector<const void*> code;
|
||||||
for(auto& i:gen.codes()) {
|
for(auto& i:gen.codes()) {
|
||||||
|
@ -1103,9 +1122,11 @@ void vm::run(
|
||||||
&vm::o_muleq, &vm::o_diveq,
|
&vm::o_muleq, &vm::o_diveq,
|
||||||
&vm::o_lnkeq, &vm::o_bandeq,
|
&vm::o_lnkeq, &vm::o_bandeq,
|
||||||
&vm::o_boreq, &vm::o_bxoreq,
|
&vm::o_boreq, &vm::o_bxoreq,
|
||||||
&vm::o_addeqc,
|
&vm::o_addeqc, &vm::o_subeqc,
|
||||||
&vm::o_subeqc, &vm::o_muleqc,
|
&vm::o_muleqc, &vm::o_diveqc,
|
||||||
&vm::o_diveqc, &vm::o_lnkeqc,
|
&vm::o_lnkeqc, &vm::o_addecp,
|
||||||
|
&vm::o_subecp, &vm::o_mulecp,
|
||||||
|
&vm::o_divecp, &vm::o_lnkecp,
|
||||||
&vm::o_meq, &vm::o_eq,
|
&vm::o_meq, &vm::o_eq,
|
||||||
&vm::o_neq, &vm::o_less,
|
&vm::o_neq, &vm::o_less,
|
||||||
&vm::o_leq, &vm::o_grt,
|
&vm::o_leq, &vm::o_grt,
|
||||||
|
@ -1204,6 +1225,11 @@ subeqc: exec_nodie(o_subeqc); // -0
|
||||||
muleqc: exec_nodie(o_muleqc); // -0
|
muleqc: exec_nodie(o_muleqc); // -0
|
||||||
diveqc: exec_nodie(o_diveqc); // -0
|
diveqc: exec_nodie(o_diveqc); // -0
|
||||||
lnkeqc: exec_nodie(o_lnkeqc); // -0
|
lnkeqc: exec_nodie(o_lnkeqc); // -0
|
||||||
|
addecp: exec_nodie(o_addecp); // -1
|
||||||
|
subecp: exec_nodie(o_subecp); // -1
|
||||||
|
mulecp: exec_nodie(o_mulecp); // -1
|
||||||
|
divecp: exec_nodie(o_divecp); // -1
|
||||||
|
lnkecp: exec_nodie(o_lnkecp); // -1
|
||||||
meq: exec_nodie(o_meq ); // -1
|
meq: exec_nodie(o_meq ); // -1
|
||||||
eq: exec_nodie(o_eq ); // -1
|
eq: exec_nodie(o_eq ); // -1
|
||||||
neq: exec_nodie(o_neq ); // -1
|
neq: exec_nodie(o_neq ); // -1
|
||||||
|
|
|
@ -219,7 +219,7 @@ var bp_example=func() {
|
||||||
|
|
||||||
var epoch=0;
|
var epoch=0;
|
||||||
var total=1e6;
|
var total=1e6;
|
||||||
while(total>0.01) {
|
while(total>0.001) {
|
||||||
epoch+=1;
|
epoch+=1;
|
||||||
if(epoch>1e4) {
|
if(epoch>1e4) {
|
||||||
println("Training failed after ",epoch," epoch.");
|
println("Training failed after ",epoch," epoch.");
|
||||||
|
|
|
@ -55,7 +55,7 @@ var curve1=func(line=4){
|
||||||
rand(100);
|
rand(100);
|
||||||
var s="";
|
var s="";
|
||||||
for(var i=0;i<line;i+=1){
|
for(var i=0;i<line;i+=1){
|
||||||
for(var j=0;j<45;j+=1)
|
for(var j=0;j<90;j+=1)
|
||||||
s~=table[int(6*rand())];
|
s~=table[int(6*rand())];
|
||||||
s~='\n';
|
s~='\n';
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ var curve2=func(line=2){
|
||||||
rand(100);
|
rand(100);
|
||||||
var s="";
|
var s="";
|
||||||
for(var i=0;i<line;i+=1){
|
for(var i=0;i<line;i+=1){
|
||||||
for(var j=0;j<45;j+=1)
|
for(var j=0;j<90;j+=1)
|
||||||
s~=shadow[int(8*rand())];
|
s~=shadow[int(8*rand())];
|
||||||
s~='\n';
|
s~='\n';
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,11 @@ var curve2=func(line=2){
|
||||||
|
|
||||||
var curve3=func(line=2){
|
var curve3=func(line=2){
|
||||||
var arr=[
|
var arr=[
|
||||||
|
0,1,2,3,4,5,6,7,8,
|
||||||
|
0,1,2,3,4,5,6,7,8,
|
||||||
|
0,1,2,3,4,5,6,7,8,
|
||||||
|
0,1,2,3,4,5,6,7,8,
|
||||||
|
0,1,2,3,4,5,6,7,8,
|
||||||
0,1,2,3,4,5,6,7,8,
|
0,1,2,3,4,5,6,7,8,
|
||||||
0,1,2,3,4,5,6,7,8,
|
0,1,2,3,4,5,6,7,8,
|
||||||
0,1,2,3,4,5,6,7,8,
|
0,1,2,3,4,5,6,7,8,
|
||||||
|
@ -109,7 +114,7 @@ var curve4=func(line=4){
|
||||||
];
|
];
|
||||||
rand(time(0));
|
rand(time(0));
|
||||||
for(var i=0;i<line;i+=1){
|
for(var i=0;i<line;i+=1){
|
||||||
for(var j=0;j<45;j+=1)
|
for(var j=0;j<90;j+=1)
|
||||||
print("\e["~front[16*rand()]~";"~back[16*rand()]~shadow[8*rand()]);
|
print("\e["~front[16*rand()]~";"~back[16*rand()]~shadow[8*rand()]);
|
||||||
print('\n');
|
print('\n');
|
||||||
}
|
}
|
||||||
|
@ -118,7 +123,7 @@ var curve4=func(line=4){
|
||||||
var curve5=func(line=4){
|
var curve5=func(line=4){
|
||||||
var vec=["▀▄─","▄▀─","▀─▄","▄─▀"];
|
var vec=["▀▄─","▄▀─","▀─▄","▄─▀"];
|
||||||
for(var (y,p)=(0,0);y!=line;y+=1){
|
for(var (y,p)=(0,0);y!=line;y+=1){
|
||||||
for(var x=0;x!=15;x+=1)
|
for(var x=0;x!=30;x+=1)
|
||||||
print(vec[p]);
|
print(vec[p]);
|
||||||
print("\n");
|
print("\n");
|
||||||
p+=1;
|
p+=1;
|
||||||
|
|
|
@ -114,7 +114,7 @@ while(error>0.0005){
|
||||||
backward(i);
|
backward(i);
|
||||||
}
|
}
|
||||||
cnt+=1;
|
cnt+=1;
|
||||||
if(cnt>=3e5)
|
if(cnt>=1e4)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(cnt>=3e5){
|
if(cnt>=3e5){
|
||||||
|
|
|
@ -41,7 +41,7 @@ var run=func(width,height){
|
||||||
forindex(var j;map[i])
|
forindex(var j;map[i])
|
||||||
map[i][j]=rand()<0.45?'O':'.';
|
map[i][j]=rand()<0.45?'O':'.';
|
||||||
|
|
||||||
for(var r=0;r<400;r+=1){
|
for(var r=0;r<200;r+=1){
|
||||||
prt(map);
|
prt(map);
|
||||||
for(var i=0;i<height;i+=1)
|
for(var i=0;i<height;i+=1)
|
||||||
for(var j=0;j<width;j+=1){
|
for(var j=0;j<width;j+=1){
|
||||||
|
@ -154,5 +154,5 @@ var ppm_gen=func(width,height){
|
||||||
if (size(runtime.argv()) and runtime.argv()[0]=="--generate-ppm") {
|
if (size(runtime.argv()) and runtime.argv()[0]=="--generate-ppm") {
|
||||||
ppm_gen(1500*4,1500);
|
ppm_gen(1500*4,1500);
|
||||||
} else {
|
} else {
|
||||||
run(80,30);
|
run(60,25);
|
||||||
}
|
}
|
|
@ -21,8 +21,14 @@ var spliter=func(content){
|
||||||
for(var i=0;i<len;i+=1){
|
for(var i=0;i<len;i+=1){
|
||||||
var n=content[i];
|
var n=content[i];
|
||||||
var c=chr(n);
|
var c=chr(n);
|
||||||
if(('a'[0]<=n and n<='z'[0]) or ('A'[0]<=n and n<='Z'[0]) or n=='\''[0] or n=='-'[0]){
|
if(('a'[0]<=n and n<='z'[0]) or ('A'[0]<=n and n<='Z'[0])){
|
||||||
s~=c;
|
s~=c;
|
||||||
|
}elsif(c=='.' or c==',' or c=='-' or c=='\'' or c=='\"' or c=='!' or c=='?'){
|
||||||
|
if(size(s)) {
|
||||||
|
token[to_lower(s)]+=1;
|
||||||
|
}
|
||||||
|
token[c]+=1;
|
||||||
|
s="";
|
||||||
}elsif(size(s)){
|
}elsif(size(s)){
|
||||||
if(s[0]!="-"[0] and s[0]!="'"[0] and s[-1]!="-"[0] and s[-1]!="'"[0])
|
if(s[0]!="-"[0] and s[0]!="'"[0] and s[-1]!="-"[0] and s[-1]!="'"[0])
|
||||||
token[to_lower(s)]+=1;
|
token[to_lower(s)]+=1;
|
||||||
|
|
Loading…
Reference in New Issue