diff --git a/nasal_ast.h b/nasal_ast.h index 90738c4..853f08b 100644 --- a/nasal_ast.h +++ b/nasal_ast.h @@ -98,6 +98,7 @@ private: std::string str; std::vector children; public: + nasal_ast(); nasal_ast(int,int); nasal_ast(const nasal_ast&); ~nasal_ast(); @@ -116,7 +117,14 @@ public: std::vector& get_children(); }; -nasal_ast::nasal_ast(int _line=0,int _type=ast_null) +nasal_ast::nasal_ast() +{ + line=0; + type=ast_null; + return; +} + +nasal_ast::nasal_ast(int _line,int _type) { line=_line; type=_type; diff --git a/nasal_gc.h b/nasal_gc.h index a793e4e..d62136d 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -148,7 +148,7 @@ nasal_val* nasal_hash::get_val(std::string& key) } } } - return ret_addr; + return nullptr; } nasal_val** nasal_hash::get_mem(std::string& key) { @@ -172,7 +172,7 @@ nasal_val** nasal_hash::get_mem(std::string& key) } } } - return mem_addr; + return nullptr; } bool nasal_hash::check_contain(std::string& key) { @@ -285,8 +285,6 @@ void nasal_val::clear() { switch(type) { - case vm_nil: break; - case vm_num: break; case vm_str: delete ptr.str; break; case vm_vec: delete ptr.vec; break; case vm_hash: delete ptr.hash; break; @@ -301,7 +299,6 @@ void nasal_val::set_type(int val_type) type=val_type; switch(type) { - case vm_nil: break; case vm_num: ptr.num=0; break; case vm_str: ptr.str=new std::string; break; case vm_vec: ptr.vec=new nasal_vec; break; @@ -351,9 +348,9 @@ struct nasal_gc void nasal_gc::mark() { std::queue bfs; - bfs.push(zero_addr); - bfs.push(one_addr); - bfs.push(nil_addr); + zero_addr->mark=true; + one_addr->mark=true; + nil_addr->mark=true; bfs.push(global); int size=num_addrs.size(); diff --git a/nasal_parse.h b/nasal_parse.h index 10e2910..1ee6b04 100644 --- a/nasal_parse.h +++ b/nasal_parse.h @@ -400,7 +400,7 @@ nasal_ast nasal_parse::args_gen() match(tok_id); if(tok_list[ptr].type==tok_eq || tok_list[ptr].type==tok_ellipsis) { - nasal_ast special_arg(tok_list[ptr].line); + nasal_ast special_arg(tok_list[ptr].line,ast_null); if(tok_list[ptr].type==tok_eq) { special_arg.add_child(tmp); @@ -468,7 +468,7 @@ nasal_ast nasal_parse::args_gen() } nasal_ast nasal_parse::expr() { - nasal_ast node(tok_list[ptr].line); + nasal_ast node(tok_list[ptr].line,ast_null); int tok_type=tok_list[ptr].type; if((tok_type==tok_break || tok_type==tok_continue) && !in_loop) die(error_line,"cannot use break/continue outside loop"); @@ -612,7 +612,7 @@ nasal_ast nasal_parse::additive_expr() node=multive_expr(); while(tok_list[ptr].type==tok_add || tok_list[ptr].type==tok_sub || tok_list[ptr].type==tok_link) { - nasal_ast tmp(tok_list[ptr].line); + nasal_ast tmp(tok_list[ptr].line,ast_null); switch(tok_list[ptr].type) { case tok_add: tmp.set_type(ast_add); break; @@ -642,7 +642,7 @@ nasal_ast nasal_parse::multive_expr() } nasal_ast nasal_parse::unary() { - nasal_ast node(tok_list[ptr].line); + nasal_ast node(tok_list[ptr].line,ast_null); switch(tok_list[ptr].type) { case tok_sub:node.set_type(ast_neg);match(tok_sub);break; @@ -653,7 +653,7 @@ nasal_ast nasal_parse::unary() } nasal_ast nasal_parse::scalar() { - nasal_ast node(tok_list[ptr].line); + nasal_ast node(tok_list[ptr].line,ast_null); if(tok_list[ptr].type==tok_nil) {node=nil_gen(); match(tok_nil);} else if(tok_list[ptr].type==tok_num){node=num_gen(); match(tok_num);} else if(tok_list[ptr].type==tok_str){node=str_gen(); match(tok_str);} @@ -949,7 +949,7 @@ nasal_ast nasal_parse::for_loop() } nasal_ast nasal_parse::forei_loop() { - nasal_ast node(tok_list[ptr].line); + nasal_ast node(tok_list[ptr].line,ast_null); switch(tok_list[ptr].type) { case tok_forindex: node.set_type(ast_forindex);match(tok_forindex); break; @@ -972,7 +972,7 @@ nasal_ast nasal_parse::forei_loop() nasal_ast nasal_parse::new_iter_gen() { - nasal_ast node(tok_list[ptr].line); + nasal_ast node(tok_list[ptr].line,ast_null); if(tok_list[ptr].type==tok_var) { match(tok_var); diff --git a/nasal_vm.h b/nasal_vm.h index a5e6c26..cbd663b 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -130,14 +130,14 @@ void nasal_vm::die(std::string str) loop_mark=false; return; } -bool nasal_vm::condition(nasal_val* value_addr) +bool nasal_vm::condition(nasal_val* val_addr) { - int type=value_addr->type; + int type=val_addr->type; if(type==vm_num) - return value_addr->ptr.num; + return val_addr->ptr.num; else if(type==vm_str) { - std::string& str=*value_addr->ptr.str; + std::string& str=*val_addr->ptr.str; double number=trans_string_to_number(str); if(std::isnan(number)) return str.length(); @@ -376,15 +376,12 @@ void nasal_vm::opr_lnkeq() } void nasal_vm::opr_meq() { - nasal_val** mem_addr=addr_stack.top(); + *addr_stack.top()=*stack_top; addr_stack.pop(); - nasal_val* val=*stack_top; - *mem_addr=val; return; } void nasal_vm::opr_eq() { - nasal_val* new_val=gc.gc_alloc(vm_num); nasal_val* val2=*stack_top--; nasal_val* val1=*stack_top; int a_type=val1->type; @@ -392,25 +389,15 @@ void nasal_vm::opr_eq() if(a_type==vm_nil && b_type==vm_nil) *stack_top=gc.one_addr; else if(a_type==vm_str && b_type==vm_str) - { - new_val->ptr.num=(*val1->ptr.str==*val2->ptr.str); - *stack_top=new_val; - } + *stack_top=(*val1->ptr.str==*val2->ptr.str)?gc.one_addr:gc.zero_addr; else if(a_type==vm_num || b_type==vm_num) - { - new_val->ptr.num=(val1->to_number()==val2->to_number()); - *stack_top=new_val; - } + *stack_top=(val1->to_number()==val2->to_number())?gc.one_addr:gc.zero_addr; else - { - new_val->ptr.num=(val1==val2); - *stack_top=new_val; - } + *stack_top=(val1==val2)?gc.one_addr:gc.zero_addr; return; } void nasal_vm::opr_neq() { - nasal_val* new_val=gc.gc_alloc(vm_num); nasal_val* val2=*stack_top--; nasal_val* val1=*stack_top; int a_type=val1->type; @@ -418,76 +405,59 @@ void nasal_vm::opr_neq() if(a_type==vm_nil && b_type==vm_nil) *stack_top=gc.zero_addr; else if(a_type==vm_str && b_type==vm_str) - { - new_val->ptr.num=(*val1->ptr.str!=*val2->ptr.str); - *stack_top=new_val; - } + *stack_top=(*val1->ptr.str!=*val2->ptr.str)?gc.one_addr:gc.zero_addr; else if(a_type==vm_num || b_type==vm_num) - { - new_val->ptr.num=(val1->to_number()!=val2->to_number()); - *stack_top=new_val; - } + *stack_top=(val1->to_number()!=val2->to_number())?gc.one_addr:gc.zero_addr; else - { - new_val->ptr.num=(val1!=val2); - *stack_top=new_val; - } + *stack_top=(val1!=val2)?gc.one_addr:gc.zero_addr; return; } void nasal_vm::opr_less() { - nasal_val* new_val=gc.gc_alloc(vm_num); nasal_val* val2=*stack_top--; nasal_val* val1=*stack_top; int a_type=val1->type; int b_type=val2->type; if(a_type==vm_str && b_type==vm_str) - new_val->ptr.num=(*val1->ptr.str<*val2->ptr.str); + *stack_top=(*val1->ptr.str<*val2->ptr.str)?gc.one_addr:gc.zero_addr; else - new_val->ptr.num=(val1->to_number()to_number()); - *stack_top=new_val; + *stack_top=(val1->to_number()to_number())?gc.one_addr:gc.zero_addr; return; } void nasal_vm::opr_leq() { - nasal_val* new_val=gc.gc_alloc(vm_num); nasal_val* val2=*stack_top--; nasal_val* val1=*stack_top; int a_type=val1->type; int b_type=val2->type; if(a_type==vm_str && b_type==vm_str) - new_val->ptr.num=(*val1->ptr.str<=*val2->ptr.str); + *stack_top=(*val1->ptr.str<=*val2->ptr.str)?gc.one_addr:gc.zero_addr; else - new_val->ptr.num=(val1->to_number()<=val2->to_number()); - *stack_top=new_val; + *stack_top=(val1->to_number()<=val2->to_number())?gc.one_addr:gc.zero_addr; return; } void nasal_vm::opr_grt() { - nasal_val* new_val=gc.gc_alloc(vm_num); nasal_val* val2=*stack_top--; nasal_val* val1=*stack_top; int a_type=val1->type; int b_type=val2->type; if(a_type==vm_str && b_type==vm_str) - new_val->ptr.num=(*val1->ptr.str>*val2->ptr.str); + *stack_top=(*val1->ptr.str>*val2->ptr.str)?gc.one_addr:gc.zero_addr; else - new_val->ptr.num=(val1->to_number()>val2->to_number()); - *stack_top=new_val; + *stack_top=(val1->to_number()>val2->to_number())?gc.one_addr:gc.zero_addr; return; } void nasal_vm::opr_geq() { - nasal_val* new_val=gc.gc_alloc(vm_num); nasal_val* val2=*stack_top--; nasal_val* val1=*stack_top; int a_type=val1->type; int b_type=val2->type; if(a_type==vm_str && b_type==vm_str) - new_val->ptr.num=(*val1->ptr.str>=*val2->ptr.str); + *stack_top=(*val1->ptr.str>=*val2->ptr.str)?gc.one_addr:gc.zero_addr; else - new_val->ptr.num=(val1->to_number()>=val2->to_number()); - *stack_top=new_val; + *stack_top=(val1->to_number()>=val2->to_number())?gc.one_addr:gc.zero_addr; return; } void nasal_vm::opr_pop() diff --git a/test/bf.nas b/test/bf.nas new file mode 100644 index 0000000..43f13e8 --- /dev/null +++ b/test/bf.nas @@ -0,0 +1,261 @@ +import("lib.nas"); + +var mandelbrot= +"[A mandelbrot set fractal viewer in brainf*** written by Erik Bosman] ++++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[ +>>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+ +<<<<<<<+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>> +>+<<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+[>>>>>>[>>>>>>>[-]>>]<<<<<<<<<[<<<<<<<<<]>> +>>>>>[-]+<<<<<<++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>+<<<<<<+++++++[-[->>> +>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>+<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[[-]>>>>>>[>>>>> +>>[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>> +[>>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<+<<]>>>>>>>>]<<<<<<<<<[<<<<<<< +<<]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<<<]>>>>>>>>>+++++++++++++++[[ +>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[ +>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<[->>[ +-<<+>>]<<[->>+>>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<< +<<[>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<< +[>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+<<<<<<<<<]>>>>> +>>>>[>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+ +<<<<<<[->>>[-<<<+>>>]<<<[->>>+>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>> +>>>>>>>]<<<<<<<<<[>>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<<]>>[->>>>>>>>>+<<<<<<<<<]<< ++>>>>>>>>]<<<<<<<<<[>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<< +<]<+<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>> +>>>>>>>>>>>>>>>>>>>>>>>]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>> +>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+>>>>>>>>>>>>>>>>>>>>>+<<<[<<<<<< +<<<]>>>>>>>>>[>>>[-<<<->>>]+<<<[->>>->[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<< +<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<[-<<<+>>>]<<<[-> +>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<< +<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]<<<<<<<[->+>>>-<<<<]>>>>>>>>>+++++++++++++++++++ ++++++++>>[-<<<<+>>>>]<<<<[->>>>+<<[-]<<]>>[<<<<<<<+<[-<+>>>>+<<[-]]>[-<<[->+>>>- +<<<<]>>>]>>>>>>>>>>>>>[>>[-]>[-]>[-]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]>>>>>>[>>>>> +[-<<<<+>>>>]<<<<[->>>>+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>[-<<<<<<<< +<+>>>>>>>>>]>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>>>>>>>]+>[- +]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[>+>>>>>>>>]<<< +<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<[->>[-<<+>>]< +<[->>+>+<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[->>>> +>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[>[-]<->>> +[-<<<+>[<->-<<<<<<<+>>>>>>>]<[->+<]>>>]<<[->>+<<]<+<<<<<<<<<]>>>>>>>>>[>>>>>>[-< +<<<<+>>>>>]<<<<<[->>>>>+<<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>+>>>>>>>> +]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<[->>[-<<+ +>>]<<[->>+>>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[> +[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[>[- +]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+<<<<<<<<<]>>>>>>>>> +[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+> +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>++++++++ ++++++++[[>>>>>>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-<<<<<<<+ +>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[ +-]>>>]<<<<<<<<<[<<<<<<<<<]>>>>+>[-<-<<<<+>>>>>]>[-<<<<<<[->>>>>+<++<<<<]>>>>>[-< +<<<<+>>>>>]<->+>]<[->+<]<<<<<[->>>>>+<<<<<]>>>>>>[-]<<<<<<+>>>>[-<<<<->>>>]+<<<< +[->>>>->>>>>[>>[-<<->>]+<<[->>->[-<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-] ++>>>>>>[>>>>>>>>>]>+<]]+>>>[-<<<->>>]+<<<[->>>-<[-<<+>>]<<[->>+<<<<<<<<<<<[<<<<< +<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<< +[<<<<<<<<<]>>>>[-<<<<+>>>>]<<<<[->>>>+>>>>>[>+>>[-<<->>]<<[->>+<<]>>>>>>>>]<<<<< +<<<+<[>[->>>>>+<<<<[->>>>-<<<<<<<<<<<<<<+>>>>>>>>>>>[->>>+<<<]<]>[->>>-<<<<<<<<< +<<<<<+>>>>>>>>>>>]<<]>[->>>>+<<<[->>>-<<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>>+<<<]<< +<<<<<<<<<<]>>>>[-]<<<<]>>>[-<<<+>>>]<<<[->>>+>>>>>>[>+>[-<->]<[->+<]>>>>>>>>]<<< +<<<<<+<[>[->>>>>+<<<[->>>-<<<<<<<<<<<<<<+>>>>>>>>>>[->>>>+<<<<]>]<[->>>>-<<<<<<< +<<<<<<<+>>>>>>>>>>]<]>>[->>>+<<<<[->>>>-<<<<<<<<<<<<<<+>>>>>>>>>>]>]<[->>>>+<<<< +]<<<<<<<<<<<]>>>>>>+<<<<<<]]>>>>[-<<<<+>>>>]<<<<[->>>>+>>>>>[>>>>>>>>>]<<<<<<<<< +[>[->>>>>+<<<<[->>>>-<<<<<<<<<<<<<<+>>>>>>>>>>>[->>>+<<<]<]>[->>>-<<<<<<<<<<<<<< ++>>>>>>>>>>>]<<]>[->>>>+<<<[->>>-<<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>>+<<<]<<<<<<< +<<<<<]]>[-]>>[-]>[-]>>>>>[>>[-]>[-]>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-< +<<<+>>>>]<<<<[->>>>+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[ +[>>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+ +[>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<[->> +[-<<+>>]<<[->>+>+<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<< +<[>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[ +>[-]<->>>[-<<<+>[<->-<<<<<<<+>>>>>>>]<[->+<]>>>]<<[->>+<<]<+<<<<<<<<<]>>>>>>>>>[ +>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]> +>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>[-]>>>>+++++++++++++++[[>>>>>>>>>]<<<<<<<<<-<<<<< +<<<<[<<<<<<<<<]>>>>>>>>>-]+[>>>[-<<<->>>]+<<<[->>>->[-<<<<+>>>>]<<<<[->>>>+<<<<< +<<<<<<<<[<<<<<<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<[- +<<<+>>>]<<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>> +>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-<<<+>>>]<<<[->>>+>>>>>>[>+>>> +[-<<<->>>]<<<[->>>+<<<]>>>>>>>>]<<<<<<<<+<[>[->+>[-<-<<<<<<<<<<+>>>>>>>>>>>>[-<< ++>>]<]>[-<<-<<<<<<<<<<+>>>>>>>>>>>>]<<<]>>[-<+>>[-<<-<<<<<<<<<<+>>>>>>>>>>>>]<]> +[-<<+>>]<<<<<<<<<<<<<]]>>>>[-<<<<+>>>>]<<<<[->>>>+>>>>>[>+>>[-<<->>]<<[->>+<<]>> +>>>>>>]<<<<<<<<+<[>[->+>>[-<<-<<<<<<<<<<+>>>>>>>>>>>[-<+>]>]<[-<-<<<<<<<<<<+>>>> +>>>>>>>]<<]>>>[-<<+>[-<-<<<<<<<<<<+>>>>>>>>>>>]>]<[-<+>]<<<<<<<<<<<<]>>>>>+<<<<< +]>>>>>>>>>[>>>[-]>[-]>[-]>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]>[-]>>>>>[>>>>>>>[-<<<<< +<+>>>>>>]<<<<<<[->>>>>>+<<<<+<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>+>[-<-<<<<+>>>> +>]>>[-<<<<<<<[->>>>>+<++<<<<]>>>>>[-<<<<<+>>>>>]<->+>>]<<[->>+<<]<<<<<[->>>>>+<< +<<<]+>>>>[-<<<<->>>>]+<<<<[->>>>->>>>>[>>>[-<<<->>>]+<<<[->>>-<[-<<+>>]<<[->>+<< +<<<<<<<<<[<<<<<<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>[-<<->>]+<<[->>->[-<<<+>>>]< +<<[->>>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]< +<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-<<<+>>>]<<<[->>>+>>>>>>[>+>[-<->]<[->+ +<]>>>>>>>>]<<<<<<<<+<[>[->>>>+<<[->>-<<<<<<<<<<<<<+>>>>>>>>>>[->>>+<<<]>]<[->>>- +<<<<<<<<<<<<<+>>>>>>>>>>]<]>>[->>+<<<[->>>-<<<<<<<<<<<<<+>>>>>>>>>>]>]<[->>>+<<< +]<<<<<<<<<<<]>>>>>[-]>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<<<]]>>>>[-<<<<+> +>>>]<<<<[->>>>+>>>>>[>+>>[-<<->>]<<[->>+<<]>>>>>>>>]<<<<<<<<+<[>[->>>>+<<<[->>>- +<<<<<<<<<<<<<+>>>>>>>>>>>[->>+<<]<]>[->>-<<<<<<<<<<<<<+>>>>>>>>>>>]<<]>[->>>+<<[ +->>-<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>+<<]<<<<<<<<<<<<]]>>>>[-]<<<<]>>>>[-<<<<+>> +>>]<<<<[->>>>+>[-]>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<<<]>>>>>>>>>[>>>>>> +>>>]<<<<<<<<<[>[->>>>+<<<[->>>-<<<<<<<<<<<<<+>>>>>>>>>>>[->>+<<]<]>[->>-<<<<<<<< +<<<<<+>>>>>>>>>>>]<<]>[->>>+<<[->>-<<<<<<<<<<<<<+>>>>>>>>>>>]<]>[->>+<<]<<<<<<<< +<<<<]]>>>>>>>>>[>>[-]>[-]>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]>[-]>>>>>[>>>>>[-<<<<+ +>>>>]<<<<[->>>>+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[-<<<<<+>>>>> +]<<<<<[->>>>>+<<<+<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>> +>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[>+>> +>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<[->>[-<<+ +>>]<<[->>+>>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[> +[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[>[- +]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+<<<<<<<<<]>>>>>>>>> +[>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<< +<<[->>>[-<<<+>>>]<<<[->>>+>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>> +>>>]<<<<<<<<<[>>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<<]>>[->>>>>>>>>+<<<<<<<<<]<<+>>> +>>>>>]<<<<<<<<<[>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+ +<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>> +>>>>>>>>>>>>>>>>>>>]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>>>>>> +>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+>>>>>>>>>>>>>>>>>>>>>+<<<[<<<<<<<<<] +>>>>>>>>>[>>>[-<<<->>>]+<<<[->>>->[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<<<<<< +]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<[-<<<+>>>]<<<[->>>+< +<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]> +>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>->>[-<<<<+>>>>]<<<<[->>>>+<<[-]<<]>>]<<+>>>>[-<<<< +->>>>]+<<<<[->>>>-<<<<<<.>>]>>>>[-<<<<<<<.>>>>>>>]<<<[-]>[-]>[-]>[-]>[-]>[-]>>>[ +>[-]>[-]>[-]>[-]>[-]>[-]>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-]>>>>]<<<<<<<<< +[<<<<<<<<<]>+++++++++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>+>>>>>>>>>+<<<<<<<< +<<<<<<[<<<<<<<<<]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+[-]>>[>>>>>>>>>]<<<<< +<<<<[>>>>>>>[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<[<<<<<<<<<]>>>>>>>[-]+>>>]<<<< +<<<<<<]]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+>>[>+>>>>[-<<<<->>>>]<<<<[->>> +>+<<<<]>>>>>>>>]<<+<<<<<<<[>>>>>[->>+<<]<<<<<<<<<<<<<<]>>>>>>>>>[>>>>>>>>>]<<<<< +<<<<[>[-]<->>>>>>>[-<<<<<<<+>[<->-<<<+>>>]<[->+<]>>>>>>>]<<<<<<[->>>>>>+<<<<<<]< ++<<<<<<<<<]>>>>>>>-<<<<[-]+<<<]+>>>>>>>[-<<<<<<<->>>>>>>]+<<<<<<<[->>>>>>>->>[>> +>>>[->>+<<]>>>>]<<<<<<<<<[>[-]<->>>>>>>[-<<<<<<<+>[<->-<<<+>>>]<[->+<]>>>>>>>]<< +<<<<[->>>>>>+<<<<<<]<+<<<<<<<<<]>+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>+<<< +<<[<<<<<<<<<]>>>>>>>>>[>>>>>[-<<<<<->>>>>]+<<<<<[->>>>>->>[-<<<<<<<+>>>>>>>]<<<< +<<<[->>>>>>>+<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>>>>[-< +<<<<<<->>>>>>>]+<<<<<<<[->>>>>>>-<<[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<<<<<<<<<[<<< +<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<< +<<[<<<<<<<<<]>>>>[-]<<<+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>-<<<<<[<<<<<<< +<<]]>>>]<<<<.>>>>>>>>>>[>>>>>>[-]>>>]<<<<<<<<<[<<<<<<<<<]>++++++++++[-[->>>>>>>> +>+<<<<<<<<<]>>>>>>>>>]>>>>>+>>>>>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-<<<<<< +<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+[-]>[>>>>>>>>>]<<<<<<<<<[>>>>>>>>[-<<<<<<<+>>>>>> +>]<<<<<<<[->>>>>>>+<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+>>]<<<<<<<<<<]]>>>>>>>>[-<<<<< +<<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+>[>+>>>>>[-<<<<<->>>>>]<<<<<[->>>>>+<<<<<]>>>>>> +>>]<+<<<<<<<<[>>>>>>[->>+<<]<<<<<<<<<<<<<<<]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[-]<- +>>>>>>>>[-<<<<<<<<+>[<->-<<+>>]<[->+<]>>>>>>>>]<<<<<<<[->>>>>>>+<<<<<<<]<+<<<<<< +<<<]>>>>>>>>-<<<<<[-]+<<<]+>>>>>>>>[-<<<<<<<<->>>>>>>>]+<<<<<<<<[->>>>>>>>->[>>> +>>>[->>+<<]>>>]<<<<<<<<<[>[-]<->>>>>>>>[-<<<<<<<<+>[<->-<<+>>]<[->+<]>>>>>>>>]<< +<<<<<[->>>>>>>+<<<<<<<]<+<<<<<<<<<]>+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>> ++>>>>>>>>>>>>>>>>>>>>>>>>>>>+<<<<<<[<<<<<<<<<]>>>>>>>>>[>>>>>>[-<<<<<<->>>>>>]+< +<<<<<[->>>>>>->>[-<<<<<<<<+>>>>>>>>]<<<<<<<<[->>>>>>>>+<<<<<<<<<<<<<<<<<[<<<<<<< +<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>>>>>[-<<<<<<<<->>>>>>>>]+<<<<<<<<[->>>>>>>> +-<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>> +>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++ ++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<< +<<<<<]]>>>]"; +var hello= +"++[>++<-]>[>++<-]>[>++<-]>[>++<-]>[>++<-]>+++++++++++++++++++++++++++++++++++++ ++++.---.+++++++..+++.<.>++++++++.--------.+++.------.--------."; + +var bf=func(program) +{ + var paper=[]; + setsize(paper,131072); + for(var i=0;i<131072;i+=1) + paper[i]=0; + var ptr=0; + var s=program; + var len=size(s); + var code=[]; + var stack=[]; + + var (add,mov,jt,jf,in,out)=(1,2,3,4,5,6); + for(var i=0;i') + { + append(code,[mov,0]); + while(i') + code[-1][1]+=1; + elsif(chr(s[i])=='<') + code[-1][1]-=1; + else + { + i-=1; + break; + } + i+=1; + } + } + elsif(chr(s[i])==',') + append(code,[in,0]); + elsif(chr(s[i])=='.') + append(code,[out,0]); + elsif(chr(s[i])=='[') + { + append(code,[jf,0]); + append(stack,size(code)-1); + } + elsif(chr(s[i])==']') + { + if(!size(stack)) + { + println("lack ["); + return; + } + var label=pop(stack); + append(code,[jt,label]); + code[label][1]=size(code)-1; + } + } + if(size(stack)) + { + println("lack ]"); + return; + } + + len=size(code); + for(var i=0;i255) + paper[ptr]-=256; + elsif(paper[ptr]<0) + paper[ptr]+=256; + } + elsif(code[i][0]==mov) + ptr+=code[i][1]; + elsif(code[i][0]==in) + paper[ptr]=input()[0]; + elsif(code[i][0]==out) + print(chr(paper[ptr])); + elsif(code[i][0]==jt) + { + if(paper[ptr]) + i=code[i][1]-1; + } + elsif(code[i][0]==jf) + { + if(!paper[ptr]) + i=code[i][1]-1; + } + } + print('\n'); + return; +} + +bf(mandelbrot); \ No newline at end of file diff --git a/test/bp.nas b/test/bp.nas index 3bbd9bf..81c6594 100644 --- a/test/bp.nas +++ b/test/bp.nas @@ -137,7 +137,7 @@ while(error>0.001) } cnt+=1; show+=1; - if(show==200) + if(show==250) { show=0; print('epoch ',cnt,':',error,'\r'); diff --git a/test/lexer.nas b/test/lexer.nas index a33aab7..a82220e 100644 --- a/test/lexer.nas +++ b/test/lexer.nas @@ -1,179 +1,286 @@ import("lib.nas"); -var s=io.fin(input()); -var len=size(s); -var ptr=0; -var cnt=0; -var token=[]; +var tok_type= +{ + tok_null:0, + tok_num:1, + tok_str:2, + tok_id:3, + tok_for:4, + tok_forindex:5, + tok_foreach:6, + tok_while:7, + tok_var:8, + tok_func:9, + tok_break:10, + tok_continue:11, + tok_ret:12, + tok_if:13, + tok_elsif:14, + tok_else:15, + tok_nil:16, + tok_lcurve:17, + tok_rcurve:18, + tok_lbracket:19, + tok_rbracket:20, + tok_lbrace:21, + tok_rbrace:22, + tok_semi:23, + tok_and:24, + tok_or:25, + tok_comma:26, + tok_dot:27, + tok_ellipsis:28, + tok_quesmark:29, + tok_colon:30, + tok_add:31, + tok_sub:32, + tok_mult:33, + tok_div:34, + tok_link:35, + tok_not:36, + tok_eq:37, + tok_addeq:38, + tok_subeq:39, + tok_multeq:40, + tok_diveq:41, + tok_lnkeq:42, + tok_cmpeq:43, + tok_neq:44, + tok_less:45, + tok_leq:46, + tok_grt:47, + tok_geq:48, + tok_eof:49 +}; -var jump_note=func() +var lexer=func(filename) { - while(ptr=len) - print("read eof when generating string.\n"); - ptr+=1; - return tok_str; -} -var generate_number=func() -{ - var number=chr(s[ptr]); - ptr+=1; - if(chr(s[ptr])=='x') - { - ptr+=1; - while(ptr' or chr(s[ptr])=='<' or chr(s[ptr])=='!' or chr(s[ptr])=='=') - { - tmp=chr(s[ptr]); - ptr+=1; - if(ptr=_.len) + print("read eof when generating string.\n"); + _.ptr+=1; + append(_.token,[tok_type.tok_str,str]); + }, + numgen:func() { - tmp~=chr(s[ptr]); - ptr+=1; - } - return tmp; - } - elsif(chr(s[ptr])=='.') - { - if(ptr+2' + or chr(_.s[_.ptr])=='<' + or chr(_.s[_.ptr])=='!' + or chr(_.s[_.ptr])=='=') + { + tmp=chr(_.s[_.ptr]); + _.ptr+=1; + if(_.ptr<_.len and chr(_.s[_.ptr])=='=') + { + tmp~=chr(_.s[_.ptr]); + _.ptr+=1; + } + append(_.token,tmp); + return; + } + elsif(chr(_.s[_.ptr])=='.') + { + if(_.ptr+2<_.len and _.s[_.ptr+1]=='.' and _.s[_.ptr+2]=='.') + { + tmp='...'; + _.ptr+=3; + } + else + { + tmp='.'; + _.ptr+=1; + } + append(_.token,tmp); + return; + } + elsif(chr(_.s[_.ptr])!=' ' + and chr(_.s[_.ptr])!='\t' + and chr(_.s[_.ptr])!='\n' + and chr(_.s[_.ptr])!='\r' + and chr(_.s[_.ptr])[0]>0) + tmp=chr(_.s[_.ptr]); + _.ptr+=1; + if(size(tmp)) + append(_.token,tmp); + }, + main:func() { - tmp='.'; - ptr+=1; - } - return tmp; - } - elsif(chr(s[ptr])!=' ' and chr(s[ptr])!='\t' and chr(s[ptr])!='\n' and chr(s[ptr])!='\r' and chr(s[ptr])[0]>0) - tmp=chr(s[ptr]); - ptr+=1; - return tmp; + while(_.ptr<_.len) + { + if(chr(_.s[_.ptr])=='#') + me.jmp_note(); + elsif('a'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='z' + or 'A'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='Z' + or chr(_.s[_.ptr])=='_') + me.idgen(); + elsif(chr(_.s[_.ptr])=='\'' or chr(_.s[_.ptr])=='\"') + me.strgen(); + elsif('0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='9') + me.numgen(); + else + me.oprgen(); + if(_.ptr>=_.len) + break; + } + return; + }, + get_token:func(){return _.token;} + }; } -while(ptr=len) - break; + die:func(info) + { + _.error+=1; + println(info); + } + }; } -foreach(var i;token) +var ast=func() { - print("(",cnt," | ",i,")\n"); - cnt+=1; + var _={type:nil,child:[]}; + return + { + set_type:func(type){_.type=type;}, + get_type:func(){return _.type;}, + add_child:func(child){append(_.child,child);}, + get_child:func(){return _.child;} + }; } + +var nasal_lexer=lexer(input()); +nasal_lexer.main(); +println(nasal_lexer.get_token()); +var nasal_parse=parse(nasal_lexer.get_token()); \ No newline at end of file diff --git a/test/life.nas b/test/life.nas index 41577b4..fa0f468 100644 --- a/test/life.nas +++ b/test/life.nas @@ -4,21 +4,19 @@ var map=nil; var check=func(x,y) { - if(x>=30) x=0; - if(x<0) x=19; - if(y>=40) y=0; - if(y<0) y=39; + if(x>14) x=0; + if(y>19) y=0; return map[x][y]; } var new_map=func() { var tmp=[]; - setsize(tmp,30); + setsize(tmp,15); forindex(var i;tmp) { tmp[i]=[]; - setsize(tmp[i],40); + setsize(tmp[i],20); } return tmp; } @@ -44,7 +42,7 @@ func() forindex(var j;map[i]) map[i][j]=rand()>0.7?'O':' '; var calc=[[0,1],[1,0],[0,-1],[-1,0],[1,1],[1,-1],[-1,-1],[-1,1]]; - for(var r=0;r<200;r+=1) + for(var r=0;r<100;r+=1) { prt(map); var tmp=new_map(); diff --git a/test/queue.nas b/test/queue.nas index ab2db21..009113c 100644 --- a/test/queue.nas +++ b/test/queue.nas @@ -1,40 +1,46 @@ # lib queue.nas -# valkmjolnir 2021/3/3 -var new_queue=func() +# valkmjolnir 2021/3/31 +var queue=func() { - return {begin:nil,end:nil}; -} -var queue_push=func(queue_head,elem) -{ - var new_node= + var _={begin:nil,end:nil}; + return { - elem:elem, - next:nil + push:func(elem) + { + var new_node= + { + elem:elem, + next:nil + }; + if(_.begin==nil) + _.begin=_.end=new_node; + else + { + _.end.next=new_node; + _.end=new_node; + } + return; + }, + pop:func() + { + if(_.begin!=nil) + _.begin=_.begin.next; + if(_.begin==nil) + _.end=nil; + }, + front:func() + { + if(_.begin!=nil) + return _.begin.elem; + return nil; + }, + clear:func() + { + _.begin=_.end=nil; + }, + empty:func() + { + return _.begin==nil; + } }; - if(queue_head.begin==nil) - queue_head.begin=queue_head.end=new_node; - else - { - queue_head.end.next=new_node; - queue_head.end=new_node; - } - return; } -var queue_pop=func(queue_head) -{ - var t=queue_head.begin; - queue_head.begin=queue_head.begin.next; - if(queue_head.begin==nil) - queue_head.end=nil; - return t; -} -var queue_front=func(queue_head) -{ - if(queue_head.begin!=nil) - return queue_head.begin.elem; - return nil; -} -var queue_empty=func(queue_head) -{ - return queue_head.begin==nil; -} \ No newline at end of file diff --git a/test/stack.nas b/test/stack.nas index 610bdc3..856470c 100644 --- a/test/stack.nas +++ b/test/stack.nas @@ -1,34 +1,36 @@ # lib stack.nas -var block_alloc=func() +# valkmjolnir 2021/3/31 +var stack=func() { - return {elem:nil,next:nil}; + var _={next:nil}; + return + { + push:func(elem) + { + _.next={elem:elem,next:_.next}; + return; + }, + pop:func() + { + var tmp=_.next; + if(tmp!=nil) + _.next=tmp.next; + return; + }, + top:func() + { + var tmp=_.next; + if(tmp!=nil) + return tmp.elem; + return nil; + }, + clear:func() + { + _.next=nil; + }, + empty:func() + { + return _.next==nil; + } + }; } -var new_stack=func() -{ - return {next:nil}; -} -var stack_push=func(stack,elem) -{ - var tmp=stack.next; - stack.next=block_alloc(); - stack.next.elem=elem; - stack.next.next=tmp; -} -var stack_pop=func(stack) -{ - var tmp=stack.next; - if(tmp!=nil) - stack.next=tmp.next; - return; -} -var stack_top=func(stack) -{ - var tmp=stack.next; - if(tmp!=nil) - return tmp.elem; - return nil; -} -var stack_empty=func(stack) -{ - return stack.next==nil; -} \ No newline at end of file