diff --git a/nasal_ast.h b/nasal_ast.h index fad32f2..084b47d 100644 --- a/nasal_ast.h +++ b/nasal_ast.h @@ -71,9 +71,15 @@ public: void set_num(double n){num=n;} int get_line(){return line;} int get_type(){return type;} - double get_num(){return num;} + double get_num() {return num;} std::string& get_str(){return str;} std::vector& get_children(){return children;} + + int get_line() const {return line;} + int get_type() const {return type;} + double get_num() const {return num;} + const std::string& get_str() const {return str;} + const std::vector& get_children() const {return children;} }; nasal_ast::nasal_ast(const nasal_ast& tmp) diff --git a/nasal_codegen.h b/nasal_codegen.h index ed2451f..fce553d 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -210,46 +210,46 @@ private: void die(std::string,int); void regist_number(double); - void regist_string(std::string&); - void find_symbol(nasal_ast&); - void add_sym(std::string&); - int local_find(std::string&); - int global_find(std::string&); + void regist_string(const std::string&); + void find_symbol(const nasal_ast&); + void add_sym(const std::string&); + int local_find(const std::string&); + int global_find(const std::string&); void gen(uint8_t,uint32_t,uint32_t); - void num_gen(nasal_ast&); - void str_gen(nasal_ast&); - void vec_gen(nasal_ast&); - void hash_gen(nasal_ast&); - void func_gen(nasal_ast&); - void call_gen(nasal_ast&); - void call_id(nasal_ast&); - void call_hash(nasal_ast&); - void call_vec(nasal_ast&); - void call_func(nasal_ast&); - void mcall(nasal_ast&); - void mcall_id(nasal_ast&); - void mcall_vec(nasal_ast&); - void mcall_hash(nasal_ast&); - void multi_def(nasal_ast&); - void single_def(nasal_ast&); - void def_gen(nasal_ast&); - void multi_assign_gen(nasal_ast&); - void conditional_gen(nasal_ast&); - void loop_gen(nasal_ast&); + void num_gen(const nasal_ast&); + void str_gen(const nasal_ast&); + void vec_gen(const nasal_ast&); + void hash_gen(const nasal_ast&); + void func_gen(const nasal_ast&); + void call_gen(const nasal_ast&); + void call_id(const nasal_ast&); + void call_hash(const nasal_ast&); + void call_vec(const nasal_ast&); + void call_func(const nasal_ast&); + void mcall(const nasal_ast&); + void mcall_id(const nasal_ast&); + void mcall_vec(const nasal_ast&); + void mcall_hash(const nasal_ast&); + void multi_def(const nasal_ast&); + void single_def(const nasal_ast&); + void def_gen(const nasal_ast&); + void multi_assign_gen(const nasal_ast&); + void conditional_gen(const nasal_ast&); + void loop_gen(const nasal_ast&); void load_continue_break(int,int); - void while_gen(nasal_ast&); - void for_gen(nasal_ast&); - void forindex_gen(nasal_ast&); - void foreach_gen(nasal_ast&); - void or_gen(nasal_ast&); - void and_gen(nasal_ast&); - void trino_gen(nasal_ast&); - void calc_gen(nasal_ast&); - void block_gen(nasal_ast&); - void ret_gen(nasal_ast&); + void while_gen(const nasal_ast&); + void for_gen(const nasal_ast&); + void forindex_gen(const nasal_ast&); + void foreach_gen(const nasal_ast&); + void or_gen(const nasal_ast&); + void and_gen(const nasal_ast&); + void trino_gen(const nasal_ast&); + void calc_gen(const nasal_ast&); + void block_gen(const nasal_ast&); + void ret_gen(const nasal_ast&); public: int get_error(){return error;} - void main_progress(nasal_ast&,std::vector&); + void main_progress(const nasal_ast&,std::vector&); void print_op(int); void print_byte_code(); std::vector& get_str_table(){return str_res_table;} @@ -275,7 +275,7 @@ void nasal_codegen::regist_number(double num) return; } -void nasal_codegen::regist_string(std::string& str) +void nasal_codegen::regist_string(const std::string& str) { int size=string_table.size(); if(!string_table.count(str)) @@ -286,7 +286,7 @@ void nasal_codegen::regist_string(std::string& str) return; } -void nasal_codegen::find_symbol(nasal_ast& node) +void nasal_codegen::find_symbol(const nasal_ast& node) { // symbol definition checked here // if find a function, return @@ -312,7 +312,7 @@ void nasal_codegen::find_symbol(nasal_ast& node) return; } -void nasal_codegen::add_sym(std::string& name) +void nasal_codegen::add_sym(const std::string& name) { if(local.empty()) { @@ -331,7 +331,7 @@ void nasal_codegen::add_sym(std::string& name) return; } -int nasal_codegen::local_find(std::string& name) +int nasal_codegen::local_find(const std::string& name) { int index=-1,cnt=0; for(auto& i:local) @@ -344,7 +344,7 @@ int nasal_codegen::local_find(std::string& name) return index; } -int nasal_codegen::global_find(std::string& name) +int nasal_codegen::global_find(const std::string& name) { for(int i=0;i jmp_label; for(auto& tmp:ast.get_children()) @@ -755,7 +757,7 @@ void nasal_codegen::conditional_gen(nasal_ast& ast) return; } -void nasal_codegen::loop_gen(nasal_ast& ast) +void nasal_codegen::loop_gen(const nasal_ast& ast) { continue_ptr.push_front(std::vector()); break_ptr.push_front(std::vector()); @@ -780,7 +782,7 @@ void nasal_codegen::load_continue_break(int continue_place,int break_place) return; } -void nasal_codegen::while_gen(nasal_ast& ast) +void nasal_codegen::while_gen(const nasal_ast& ast) { int loop_ptr=exec_code.size(); calc_gen(ast.get_children()[0]); @@ -794,7 +796,7 @@ void nasal_codegen::while_gen(nasal_ast& ast) return; } -void nasal_codegen::for_gen(nasal_ast& ast) +void nasal_codegen::for_gen(const nasal_ast& ast) { switch(ast.get_children()[0].get_type()) { @@ -865,7 +867,7 @@ void nasal_codegen::for_gen(nasal_ast& ast) load_continue_break(continue_place,exec_code.size()); return; } -void nasal_codegen::forindex_gen(nasal_ast& ast) +void nasal_codegen::forindex_gen(const nasal_ast& ast) { calc_gen(ast.get_children()[1]); gen(op_cnt,0,ast.get_children()[1].get_line()); @@ -873,7 +875,7 @@ void nasal_codegen::forindex_gen(nasal_ast& ast) gen(op_findex,0,ast.get_line()); if(ast.get_children()[0].get_type()==ast_new_iter) { - std::string& str=ast.get_children()[0].get_children()[0].get_str(); + const std::string& str=ast.get_children()[0].get_children()[0].get_str(); local.empty()? gen(op_loadg,global_find(str),ast.get_children()[0].get_children()[0].get_line()) :gen(op_loadl,local_find(str),ast.get_children()[0].get_children()[0].get_line()); @@ -893,7 +895,7 @@ void nasal_codegen::forindex_gen(nasal_ast& ast) gen(op_cntpop,0,0); return; } -void nasal_codegen::foreach_gen(nasal_ast& ast) +void nasal_codegen::foreach_gen(const nasal_ast& ast) { calc_gen(ast.get_children()[1]); gen(op_cnt,0,ast.get_line()); @@ -901,7 +903,7 @@ void nasal_codegen::foreach_gen(nasal_ast& ast) gen(op_feach,0,ast.get_line()); if(ast.get_children()[0].get_type()==ast_new_iter) { - std::string& str=ast.get_children()[0].get_children()[0].get_str(); + const std::string& str=ast.get_children()[0].get_children()[0].get_str(); local.empty()? gen(op_loadg,global_find(str),ast.get_children()[0].get_children()[0].get_line()) :gen(op_loadl,local_find(str),ast.get_children()[0].get_children()[0].get_line()); @@ -922,7 +924,7 @@ void nasal_codegen::foreach_gen(nasal_ast& ast) return; } -void nasal_codegen::or_gen(nasal_ast& ast) +void nasal_codegen::or_gen(const nasal_ast& ast) { calc_gen(ast.get_children()[0]); int l1=exec_code.size(); @@ -940,7 +942,7 @@ void nasal_codegen::or_gen(nasal_ast& ast) return; } -void nasal_codegen::and_gen(nasal_ast& ast) +void nasal_codegen::and_gen(const nasal_ast& ast) { calc_gen(ast.get_children()[0]); gen(op_jt,exec_code.size()+2,0); @@ -959,7 +961,7 @@ void nasal_codegen::and_gen(nasal_ast& ast) return; } -void nasal_codegen::trino_gen(nasal_ast& ast) +void nasal_codegen::trino_gen(const nasal_ast& ast) { calc_gen(ast.get_children()[0]); int lfalse=exec_code.size(); @@ -973,7 +975,7 @@ void nasal_codegen::trino_gen(nasal_ast& ast) return; } -void nasal_codegen::calc_gen(nasal_ast& ast) +void nasal_codegen::calc_gen(const nasal_ast& ast) { switch(ast.get_type()) { @@ -1079,7 +1081,7 @@ void nasal_codegen::calc_gen(nasal_ast& ast) return; } -void nasal_codegen::block_gen(nasal_ast& ast) +void nasal_codegen::block_gen(const nasal_ast& ast) { for(auto& tmp:ast.get_children()) switch(tmp.get_type()) @@ -1147,7 +1149,7 @@ void nasal_codegen::block_gen(nasal_ast& ast) return; } -void nasal_codegen::ret_gen(nasal_ast& ast) +void nasal_codegen::ret_gen(const nasal_ast& ast) { for(int i=0;i& files) +void nasal_codegen::main_progress(const nasal_ast& ast,std::vector& files) { error=0; in_foreach=0; @@ -1186,7 +1188,7 @@ void nasal_codegen::main_progress(nasal_ast& ast,std::vector& files // search symbols first find_symbol(ast); - gen(op_intg,0,0); + gen(op_intg,global.size(),0); for(auto& tmp:ast.get_children()) { switch(tmp.get_type()) @@ -1247,7 +1249,6 @@ void nasal_codegen::main_progress(nasal_ast& ast,std::vector& files gen(op_nop,0,0); if(global.size()>=STACK_MAX_DEPTH) die("too many global variants: "+std::to_string(global.size())+".",0); - exec_code[0].num=global.size(); return; } diff --git a/test/prime.nas b/test/prime.nas new file mode 100644 index 0000000..dd5257c --- /dev/null +++ b/test/prime.nas @@ -0,0 +1,41 @@ +import("lib.nas"); + +var is_prime=func(x){ + for(var i=2;i=i){ + for(var j=i+1;j<=math.sqrt(x);j+=1) + if(x/j==int(x/j)) + return 0; + append(primes,x); + return 1; + } + } + append(primes,x); + return 1; +} + +func(){ + var cnt=0; + for(var i=0;i<50000;i+=1) + if(filter(i)) + cnt+=1; + println(cnt); +}();