bug fixed & test file changes
compare operators now run more efficiently.
This commit is contained in:
parent
b06e1bb5dd
commit
125fc8a9fe
10
nasal_ast.h
10
nasal_ast.h
|
@ -98,6 +98,7 @@ private:
|
||||||
std::string str;
|
std::string str;
|
||||||
std::vector<nasal_ast> children;
|
std::vector<nasal_ast> children;
|
||||||
public:
|
public:
|
||||||
|
nasal_ast();
|
||||||
nasal_ast(int,int);
|
nasal_ast(int,int);
|
||||||
nasal_ast(const nasal_ast&);
|
nasal_ast(const nasal_ast&);
|
||||||
~nasal_ast();
|
~nasal_ast();
|
||||||
|
@ -116,7 +117,14 @@ public:
|
||||||
std::vector<nasal_ast>& get_children();
|
std::vector<nasal_ast>& 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;
|
line=_line;
|
||||||
type=_type;
|
type=_type;
|
||||||
|
|
13
nasal_gc.h
13
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)
|
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)
|
bool nasal_hash::check_contain(std::string& key)
|
||||||
{
|
{
|
||||||
|
@ -285,8 +285,6 @@ void nasal_val::clear()
|
||||||
{
|
{
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case vm_nil: break;
|
|
||||||
case vm_num: break;
|
|
||||||
case vm_str: delete ptr.str; break;
|
case vm_str: delete ptr.str; break;
|
||||||
case vm_vec: delete ptr.vec; break;
|
case vm_vec: delete ptr.vec; break;
|
||||||
case vm_hash: delete ptr.hash; break;
|
case vm_hash: delete ptr.hash; break;
|
||||||
|
@ -301,7 +299,6 @@ void nasal_val::set_type(int val_type)
|
||||||
type=val_type;
|
type=val_type;
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case vm_nil: break;
|
|
||||||
case vm_num: ptr.num=0; break;
|
case vm_num: ptr.num=0; break;
|
||||||
case vm_str: ptr.str=new std::string; break;
|
case vm_str: ptr.str=new std::string; break;
|
||||||
case vm_vec: ptr.vec=new nasal_vec; break;
|
case vm_vec: ptr.vec=new nasal_vec; break;
|
||||||
|
@ -351,9 +348,9 @@ struct nasal_gc
|
||||||
void nasal_gc::mark()
|
void nasal_gc::mark()
|
||||||
{
|
{
|
||||||
std::queue<nasal_val*> bfs;
|
std::queue<nasal_val*> bfs;
|
||||||
bfs.push(zero_addr);
|
zero_addr->mark=true;
|
||||||
bfs.push(one_addr);
|
one_addr->mark=true;
|
||||||
bfs.push(nil_addr);
|
nil_addr->mark=true;
|
||||||
bfs.push(global);
|
bfs.push(global);
|
||||||
|
|
||||||
int size=num_addrs.size();
|
int size=num_addrs.size();
|
||||||
|
|
|
@ -400,7 +400,7 @@ nasal_ast nasal_parse::args_gen()
|
||||||
match(tok_id);
|
match(tok_id);
|
||||||
if(tok_list[ptr].type==tok_eq || tok_list[ptr].type==tok_ellipsis)
|
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)
|
if(tok_list[ptr].type==tok_eq)
|
||||||
{
|
{
|
||||||
special_arg.add_child(tmp);
|
special_arg.add_child(tmp);
|
||||||
|
@ -468,7 +468,7 @@ nasal_ast nasal_parse::args_gen()
|
||||||
}
|
}
|
||||||
nasal_ast nasal_parse::expr()
|
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;
|
int tok_type=tok_list[ptr].type;
|
||||||
if((tok_type==tok_break || tok_type==tok_continue) && !in_loop)
|
if((tok_type==tok_break || tok_type==tok_continue) && !in_loop)
|
||||||
die(error_line,"cannot use break/continue outside loop");
|
die(error_line,"cannot use break/continue outside loop");
|
||||||
|
@ -612,7 +612,7 @@ nasal_ast nasal_parse::additive_expr()
|
||||||
node=multive_expr();
|
node=multive_expr();
|
||||||
while(tok_list[ptr].type==tok_add || tok_list[ptr].type==tok_sub || tok_list[ptr].type==tok_link)
|
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)
|
switch(tok_list[ptr].type)
|
||||||
{
|
{
|
||||||
case tok_add: tmp.set_type(ast_add); break;
|
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 nasal_parse::unary()
|
||||||
{
|
{
|
||||||
nasal_ast node(tok_list[ptr].line);
|
nasal_ast node(tok_list[ptr].line,ast_null);
|
||||||
switch(tok_list[ptr].type)
|
switch(tok_list[ptr].type)
|
||||||
{
|
{
|
||||||
case tok_sub:node.set_type(ast_neg);match(tok_sub);break;
|
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 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);}
|
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_num){node=num_gen(); match(tok_num);}
|
||||||
else if(tok_list[ptr].type==tok_str){node=str_gen(); match(tok_str);}
|
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 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)
|
switch(tok_list[ptr].type)
|
||||||
{
|
{
|
||||||
case tok_forindex: node.set_type(ast_forindex);match(tok_forindex); break;
|
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 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)
|
if(tok_list[ptr].type==tok_var)
|
||||||
{
|
{
|
||||||
match(tok_var);
|
match(tok_var);
|
||||||
|
|
68
nasal_vm.h
68
nasal_vm.h
|
@ -130,14 +130,14 @@ void nasal_vm::die(std::string str)
|
||||||
loop_mark=false;
|
loop_mark=false;
|
||||||
return;
|
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)
|
if(type==vm_num)
|
||||||
return value_addr->ptr.num;
|
return val_addr->ptr.num;
|
||||||
else if(type==vm_str)
|
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);
|
double number=trans_string_to_number(str);
|
||||||
if(std::isnan(number))
|
if(std::isnan(number))
|
||||||
return str.length();
|
return str.length();
|
||||||
|
@ -376,15 +376,12 @@ void nasal_vm::opr_lnkeq()
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_meq()
|
void nasal_vm::opr_meq()
|
||||||
{
|
{
|
||||||
nasal_val** mem_addr=addr_stack.top();
|
*addr_stack.top()=*stack_top;
|
||||||
addr_stack.pop();
|
addr_stack.pop();
|
||||||
nasal_val* val=*stack_top;
|
|
||||||
*mem_addr=val;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_eq()
|
void nasal_vm::opr_eq()
|
||||||
{
|
{
|
||||||
nasal_val* new_val=gc.gc_alloc(vm_num);
|
|
||||||
nasal_val* val2=*stack_top--;
|
nasal_val* val2=*stack_top--;
|
||||||
nasal_val* val1=*stack_top;
|
nasal_val* val1=*stack_top;
|
||||||
int a_type=val1->type;
|
int a_type=val1->type;
|
||||||
|
@ -392,25 +389,15 @@ void nasal_vm::opr_eq()
|
||||||
if(a_type==vm_nil && b_type==vm_nil)
|
if(a_type==vm_nil && b_type==vm_nil)
|
||||||
*stack_top=gc.one_addr;
|
*stack_top=gc.one_addr;
|
||||||
else if(a_type==vm_str && b_type==vm_str)
|
else if(a_type==vm_str && b_type==vm_str)
|
||||||
{
|
*stack_top=(*val1->ptr.str==*val2->ptr.str)?gc.one_addr:gc.zero_addr;
|
||||||
new_val->ptr.num=(*val1->ptr.str==*val2->ptr.str);
|
|
||||||
*stack_top=new_val;
|
|
||||||
}
|
|
||||||
else if(a_type==vm_num || b_type==vm_num)
|
else if(a_type==vm_num || b_type==vm_num)
|
||||||
{
|
*stack_top=(val1->to_number()==val2->to_number())?gc.one_addr:gc.zero_addr;
|
||||||
new_val->ptr.num=(val1->to_number()==val2->to_number());
|
|
||||||
*stack_top=new_val;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
*stack_top=(val1==val2)?gc.one_addr:gc.zero_addr;
|
||||||
new_val->ptr.num=(val1==val2);
|
|
||||||
*stack_top=new_val;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_neq()
|
void nasal_vm::opr_neq()
|
||||||
{
|
{
|
||||||
nasal_val* new_val=gc.gc_alloc(vm_num);
|
|
||||||
nasal_val* val2=*stack_top--;
|
nasal_val* val2=*stack_top--;
|
||||||
nasal_val* val1=*stack_top;
|
nasal_val* val1=*stack_top;
|
||||||
int a_type=val1->type;
|
int a_type=val1->type;
|
||||||
|
@ -418,76 +405,59 @@ void nasal_vm::opr_neq()
|
||||||
if(a_type==vm_nil && b_type==vm_nil)
|
if(a_type==vm_nil && b_type==vm_nil)
|
||||||
*stack_top=gc.zero_addr;
|
*stack_top=gc.zero_addr;
|
||||||
else if(a_type==vm_str && b_type==vm_str)
|
else if(a_type==vm_str && b_type==vm_str)
|
||||||
{
|
*stack_top=(*val1->ptr.str!=*val2->ptr.str)?gc.one_addr:gc.zero_addr;
|
||||||
new_val->ptr.num=(*val1->ptr.str!=*val2->ptr.str);
|
|
||||||
*stack_top=new_val;
|
|
||||||
}
|
|
||||||
else if(a_type==vm_num || b_type==vm_num)
|
else if(a_type==vm_num || b_type==vm_num)
|
||||||
{
|
*stack_top=(val1->to_number()!=val2->to_number())?gc.one_addr:gc.zero_addr;
|
||||||
new_val->ptr.num=(val1->to_number()!=val2->to_number());
|
|
||||||
*stack_top=new_val;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
*stack_top=(val1!=val2)?gc.one_addr:gc.zero_addr;
|
||||||
new_val->ptr.num=(val1!=val2);
|
|
||||||
*stack_top=new_val;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_less()
|
void nasal_vm::opr_less()
|
||||||
{
|
{
|
||||||
nasal_val* new_val=gc.gc_alloc(vm_num);
|
|
||||||
nasal_val* val2=*stack_top--;
|
nasal_val* val2=*stack_top--;
|
||||||
nasal_val* val1=*stack_top;
|
nasal_val* val1=*stack_top;
|
||||||
int a_type=val1->type;
|
int a_type=val1->type;
|
||||||
int b_type=val2->type;
|
int b_type=val2->type;
|
||||||
if(a_type==vm_str && b_type==vm_str)
|
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
|
else
|
||||||
new_val->ptr.num=(val1->to_number()<val2->to_number());
|
*stack_top=(val1->to_number()<val2->to_number())?gc.one_addr:gc.zero_addr;
|
||||||
*stack_top=new_val;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_leq()
|
void nasal_vm::opr_leq()
|
||||||
{
|
{
|
||||||
nasal_val* new_val=gc.gc_alloc(vm_num);
|
|
||||||
nasal_val* val2=*stack_top--;
|
nasal_val* val2=*stack_top--;
|
||||||
nasal_val* val1=*stack_top;
|
nasal_val* val1=*stack_top;
|
||||||
int a_type=val1->type;
|
int a_type=val1->type;
|
||||||
int b_type=val2->type;
|
int b_type=val2->type;
|
||||||
if(a_type==vm_str && b_type==vm_str)
|
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
|
else
|
||||||
new_val->ptr.num=(val1->to_number()<=val2->to_number());
|
*stack_top=(val1->to_number()<=val2->to_number())?gc.one_addr:gc.zero_addr;
|
||||||
*stack_top=new_val;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_grt()
|
void nasal_vm::opr_grt()
|
||||||
{
|
{
|
||||||
nasal_val* new_val=gc.gc_alloc(vm_num);
|
|
||||||
nasal_val* val2=*stack_top--;
|
nasal_val* val2=*stack_top--;
|
||||||
nasal_val* val1=*stack_top;
|
nasal_val* val1=*stack_top;
|
||||||
int a_type=val1->type;
|
int a_type=val1->type;
|
||||||
int b_type=val2->type;
|
int b_type=val2->type;
|
||||||
if(a_type==vm_str && b_type==vm_str)
|
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
|
else
|
||||||
new_val->ptr.num=(val1->to_number()>val2->to_number());
|
*stack_top=(val1->to_number()>val2->to_number())?gc.one_addr:gc.zero_addr;
|
||||||
*stack_top=new_val;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_geq()
|
void nasal_vm::opr_geq()
|
||||||
{
|
{
|
||||||
nasal_val* new_val=gc.gc_alloc(vm_num);
|
|
||||||
nasal_val* val2=*stack_top--;
|
nasal_val* val2=*stack_top--;
|
||||||
nasal_val* val1=*stack_top;
|
nasal_val* val1=*stack_top;
|
||||||
int a_type=val1->type;
|
int a_type=val1->type;
|
||||||
int b_type=val2->type;
|
int b_type=val2->type;
|
||||||
if(a_type==vm_str && b_type==vm_str)
|
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
|
else
|
||||||
new_val->ptr.num=(val1->to_number()>=val2->to_number());
|
*stack_top=(val1->to_number()>=val2->to_number())?gc.one_addr:gc.zero_addr;
|
||||||
*stack_top=new_val;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void nasal_vm::opr_pop()
|
void nasal_vm::opr_pop()
|
||||||
|
|
|
@ -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<len;i+=1)
|
||||||
|
{
|
||||||
|
if(chr(s[i])=='+' or chr(s[i])=='-')
|
||||||
|
{
|
||||||
|
append(code,[add,0]);
|
||||||
|
while(i<len)
|
||||||
|
{
|
||||||
|
if(chr(s[i])=='+')
|
||||||
|
code[-1][1]+=1;
|
||||||
|
elsif(chr(s[i])=='-')
|
||||||
|
code[-1][1]-=1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i-=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elsif(chr(s[i])=='<' or chr(s[i])=='>')
|
||||||
|
{
|
||||||
|
append(code,[mov,0]);
|
||||||
|
while(i<len)
|
||||||
|
{
|
||||||
|
if(chr(s[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;i<len;i+=1)
|
||||||
|
{
|
||||||
|
if(code[i][0]==add)
|
||||||
|
{
|
||||||
|
paper[ptr]+=code[i][1];
|
||||||
|
if(paper[ptr]>255)
|
||||||
|
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);
|
|
@ -137,7 +137,7 @@ while(error>0.001)
|
||||||
}
|
}
|
||||||
cnt+=1;
|
cnt+=1;
|
||||||
show+=1;
|
show+=1;
|
||||||
if(show==200)
|
if(show==250)
|
||||||
{
|
{
|
||||||
show=0;
|
show=0;
|
||||||
print('epoch ',cnt,':',error,'\r');
|
print('epoch ',cnt,':',error,'\r');
|
||||||
|
|
355
test/lexer.nas
355
test/lexer.nas
|
@ -1,179 +1,286 @@
|
||||||
import("lib.nas");
|
import("lib.nas");
|
||||||
|
|
||||||
var s=io.fin(input());
|
var tok_type=
|
||||||
var len=size(s);
|
|
||||||
var ptr=0;
|
|
||||||
var cnt=0;
|
|
||||||
var token=[];
|
|
||||||
|
|
||||||
var jump_note=func()
|
|
||||||
{
|
{
|
||||||
while(ptr<len and chr(s[ptr])!='\n')
|
tok_null:0,
|
||||||
ptr+=1;
|
tok_num:1,
|
||||||
ptr+=1;
|
tok_str:2,
|
||||||
return;
|
tok_id:3,
|
||||||
}
|
tok_for:4,
|
||||||
var generate_id=func()
|
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 lexer=func(filename)
|
||||||
|
{
|
||||||
|
var _={s:io.fin(filename),len:0,ptr:0,token:[]};
|
||||||
|
_.len=size(_.s);
|
||||||
|
return
|
||||||
|
{
|
||||||
|
jmp_note:func()
|
||||||
|
{
|
||||||
|
while(_.ptr<_.len and chr(_.s[_.ptr])!='\n')
|
||||||
|
_.ptr+=1;
|
||||||
|
_.ptr+=1;
|
||||||
|
},
|
||||||
|
idgen:func()
|
||||||
{
|
{
|
||||||
var tmp="";
|
var tmp="";
|
||||||
while(ptr<len)
|
while(_.ptr<_.len)
|
||||||
{
|
{
|
||||||
if('a'<=chr(s[ptr]) and chr(s[ptr])<='z'
|
if('a'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='z'
|
||||||
or 'A'<=chr(s[ptr]) and chr(s[ptr])<='Z'
|
or 'A'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='Z'
|
||||||
or chr(s[ptr])=='_'
|
or '0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='9'
|
||||||
or '0'<=chr(s[ptr]) and chr(s[ptr])<='9')
|
or chr(_.s[_.ptr])=='_')
|
||||||
tmp~=chr(s[ptr]);
|
tmp~=chr(_.s[_.ptr]);
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
return tmp;
|
append(_.token,tmp);
|
||||||
}
|
},
|
||||||
var generate_str=func()
|
strgen:func()
|
||||||
{
|
{
|
||||||
var tok_str="";
|
var str="";
|
||||||
var mark=chr(s[ptr]);
|
var mark=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
while(ptr<len and chr(s[ptr])!=mark)
|
while(_.ptr<_.len and chr(_.s[_.ptr])!=mark)
|
||||||
{
|
{
|
||||||
if(chr(s[ptr])=='\\')
|
if(chr(_.s[_.ptr])=='\\')
|
||||||
{
|
{
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
if(chr(s[ptr])=='a') tok_str~='\a';
|
if (chr(_.s[_.ptr])=='a' ) str~='\a';
|
||||||
elsif(chr(s[ptr])=='b') tok_str~='\b';
|
elsif(chr(_.s[_.ptr])=='b' ) str~='\b';
|
||||||
elsif(chr(s[ptr])=='f') tok_str~='\f';
|
elsif(chr(_.s[_.ptr])=='f' ) str~='\f';
|
||||||
elsif(chr(s[ptr])=='n') tok_str~='\n';
|
elsif(chr(_.s[_.ptr])=='n' ) str~='\n';
|
||||||
elsif(chr(s[ptr])=='r') tok_str~='\r';
|
elsif(chr(_.s[_.ptr])=='r' ) str~='\r';
|
||||||
elsif(chr(s[ptr])=='t') tok_str~='\t';
|
elsif(chr(_.s[_.ptr])=='t' ) str~='\t';
|
||||||
elsif(chr(s[ptr])=='v') tok_str~='\v';
|
elsif(chr(_.s[_.ptr])=='v' ) str~='\v';
|
||||||
elsif(chr(s[ptr])=='?') tok_str~='?';
|
elsif(chr(_.s[_.ptr])=='?' ) str~='?';
|
||||||
elsif(chr(s[ptr])=='0') tok_str~='\0';
|
elsif(chr(_.s[_.ptr])=='0' ) str~='\0';
|
||||||
elsif(chr(s[ptr])=='\\') tok_str~='\\';
|
elsif(chr(_.s[_.ptr])=='\\') str~='\\';
|
||||||
elsif(chr(s[ptr])=='\'') tok_str~='\'';
|
elsif(chr(_.s[_.ptr])=='\'') str~='\'';
|
||||||
elsif(chr(s[ptr])=='\"') tok_str~='\"';
|
elsif(chr(_.s[_.ptr])=='\"') str~='\"';
|
||||||
else tok_str~=chr(s[ptr]);
|
else str~=chr(_.s[_.ptr]);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tok_str~=chr(s[ptr]);
|
str~=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
if(ptr>=len)
|
if(_.ptr>=_.len)
|
||||||
print("read eof when generating string.\n");
|
print("read eof when generating string.\n");
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
return tok_str;
|
append(_.token,[tok_type.tok_str,str]);
|
||||||
}
|
},
|
||||||
var generate_number=func()
|
numgen:func()
|
||||||
{
|
{
|
||||||
var number=chr(s[ptr]);
|
var number=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
if(chr(s[ptr])=='x')
|
if(chr(_.s[_.ptr])=='x')
|
||||||
{
|
{
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
while(ptr<len and ('a'<=chr(s[ptr]) and chr(s[ptr])<='f' or '0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
while(_.ptr<_.len and
|
||||||
|
('a'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='f'
|
||||||
|
or '0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='9'))
|
||||||
{
|
{
|
||||||
number~=chr(s[ptr]);
|
number~=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
return num(number);
|
append(_.token,[tok_type.tok_num,num(number)]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
elsif(chr(s[ptr])=='o')
|
elsif(chr(_.s[_.ptr])=='o')
|
||||||
{
|
{
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='7'))
|
while(_.ptr<_.len and ('0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='7'))
|
||||||
{
|
{
|
||||||
number~=chr(s[ptr]);
|
number~=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
return num(number);
|
append(_.token,[tok_type.tok_num,num(number)]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
while(_.ptr<_.len and ('0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='9'))
|
||||||
{
|
{
|
||||||
number~=chr(s[ptr]);
|
number~=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
if(chr(s[ptr])=='.')
|
if(chr(_.s[_.ptr])=='.')
|
||||||
number~=chr(s[ptr]);
|
number~=chr(_.s[_.ptr]);
|
||||||
else
|
else
|
||||||
return num(number);
|
|
||||||
ptr+=1;
|
|
||||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
|
||||||
{
|
{
|
||||||
number~=chr(s[ptr]);
|
append(_.token,[tok_type.tok_num,num(number)]);
|
||||||
ptr+=1;
|
return;
|
||||||
}
|
}
|
||||||
if(chr(s[ptr])=='e' or chr(s[ptr])=='E')
|
_.ptr+=1;
|
||||||
number~=chr(s[ptr]);
|
while(_.ptr<_.len and ('0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='9'))
|
||||||
|
{
|
||||||
|
number~=chr(_.s[_.ptr]);
|
||||||
|
_.ptr+=1;
|
||||||
|
}
|
||||||
|
if(chr(_.s[_.ptr])=='e' or chr(_.s[_.ptr])=='E')
|
||||||
|
number~=chr(_.s[_.ptr]);
|
||||||
else
|
else
|
||||||
return num(number);
|
|
||||||
ptr+=1;
|
|
||||||
if(chr(s[ptr])=='-' or chr(s[ptr])=='+')
|
|
||||||
{
|
{
|
||||||
number~=chr(s[ptr]);
|
append(_.token,[tok_type.tok_num,num(number)]);
|
||||||
ptr+=1;
|
return;
|
||||||
}
|
}
|
||||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
_.ptr+=1;
|
||||||
|
if(chr(_.s[_.ptr])=='-' or chr(_.s[_.ptr])=='+')
|
||||||
{
|
{
|
||||||
number~=chr(s[ptr]);
|
number~=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
return num(number);
|
while(_.ptr<_.len and ('0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='9'))
|
||||||
|
{
|
||||||
|
number~=chr(_.s[_.ptr]);
|
||||||
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
var generate_operator=func()
|
append(_.token,[tok_type.tok_num,num(number)]);
|
||||||
|
},
|
||||||
|
oprgen:func()
|
||||||
{
|
{
|
||||||
var tmp="";
|
var tmp="";
|
||||||
if(chr(s[ptr])=='+' or chr(s[ptr])=='-' or chr(s[ptr])=='~' or chr(s[ptr])=='/' or chr(s[ptr])=='*' or chr(s[ptr])=='>' or chr(s[ptr])=='<' or chr(s[ptr])=='!' or chr(s[ptr])=='=')
|
if(chr(_.s[_.ptr])=='+'
|
||||||
|
or chr(_.s[_.ptr])=='-'
|
||||||
|
or chr(_.s[_.ptr])=='~'
|
||||||
|
or chr(_.s[_.ptr])=='/'
|
||||||
|
or chr(_.s[_.ptr])=='*'
|
||||||
|
or chr(_.s[_.ptr])=='>'
|
||||||
|
or chr(_.s[_.ptr])=='<'
|
||||||
|
or chr(_.s[_.ptr])=='!'
|
||||||
|
or chr(_.s[_.ptr])=='=')
|
||||||
{
|
{
|
||||||
tmp=chr(s[ptr]);
|
tmp=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
if(ptr<len and chr(s[ptr])=='=')
|
if(_.ptr<_.len and chr(_.s[_.ptr])=='=')
|
||||||
{
|
{
|
||||||
tmp~=chr(s[ptr]);
|
tmp~=chr(_.s[_.ptr]);
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
return tmp;
|
append(_.token,tmp);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
elsif(chr(s[ptr])=='.')
|
elsif(chr(_.s[_.ptr])=='.')
|
||||||
{
|
{
|
||||||
if(ptr+2<len and s[ptr+1]=='.' and s[ptr+2]=='.')
|
if(_.ptr+2<_.len and _.s[_.ptr+1]=='.' and _.s[_.ptr+2]=='.')
|
||||||
{
|
{
|
||||||
tmp='...';
|
tmp='...';
|
||||||
ptr+=3;
|
_.ptr+=3;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tmp='.';
|
tmp='.';
|
||||||
ptr+=1;
|
_.ptr+=1;
|
||||||
}
|
}
|
||||||
return tmp;
|
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)
|
elsif(chr(_.s[_.ptr])!=' '
|
||||||
tmp=chr(s[ptr]);
|
and chr(_.s[_.ptr])!='\t'
|
||||||
ptr+=1;
|
and chr(_.s[_.ptr])!='\n'
|
||||||
return tmp;
|
and chr(_.s[_.ptr])!='\r'
|
||||||
}
|
and chr(_.s[_.ptr])[0]>0)
|
||||||
|
tmp=chr(_.s[_.ptr]);
|
||||||
while(ptr<len)
|
_.ptr+=1;
|
||||||
{
|
|
||||||
if(chr(s[ptr])=='#')
|
|
||||||
jump_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])=='_')
|
|
||||||
append(token,generate_id());
|
|
||||||
elsif(chr(s[ptr])=='\'' or chr(s[ptr])=='\"')
|
|
||||||
append(token,generate_str());
|
|
||||||
elsif('0'<=chr(s[ptr]) and chr(s[ptr])<='9')
|
|
||||||
append(token,generate_number());
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var tmp=generate_operator();
|
|
||||||
if(size(tmp))
|
if(size(tmp))
|
||||||
append(token,tmp);
|
append(_.token,tmp);
|
||||||
}
|
},
|
||||||
if(ptr>=len)
|
main:func()
|
||||||
|
{
|
||||||
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
foreach(var i;token)
|
},
|
||||||
{
|
get_token:func(){return _.token;}
|
||||||
print("(",cnt," | ",i,")\n");
|
};
|
||||||
cnt+=1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var parse=func(token)
|
||||||
|
{
|
||||||
|
var _={error:0,size:0,token:token,ast:nil};
|
||||||
|
_.size=size(token);
|
||||||
|
return
|
||||||
|
{
|
||||||
|
die:func(info)
|
||||||
|
{
|
||||||
|
_.error+=1;
|
||||||
|
println(info);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var ast=func()
|
||||||
|
{
|
||||||
|
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());
|
|
@ -4,21 +4,19 @@ var map=nil;
|
||||||
|
|
||||||
var check=func(x,y)
|
var check=func(x,y)
|
||||||
{
|
{
|
||||||
if(x>=30) x=0;
|
if(x>14) x=0;
|
||||||
if(x<0) x=19;
|
if(y>19) y=0;
|
||||||
if(y>=40) y=0;
|
|
||||||
if(y<0) y=39;
|
|
||||||
return map[x][y];
|
return map[x][y];
|
||||||
}
|
}
|
||||||
|
|
||||||
var new_map=func()
|
var new_map=func()
|
||||||
{
|
{
|
||||||
var tmp=[];
|
var tmp=[];
|
||||||
setsize(tmp,30);
|
setsize(tmp,15);
|
||||||
forindex(var i;tmp)
|
forindex(var i;tmp)
|
||||||
{
|
{
|
||||||
tmp[i]=[];
|
tmp[i]=[];
|
||||||
setsize(tmp[i],40);
|
setsize(tmp[i],20);
|
||||||
}
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
@ -44,7 +42,7 @@ func()
|
||||||
forindex(var j;map[i])
|
forindex(var j;map[i])
|
||||||
map[i][j]=rand()>0.7?'O':' ';
|
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]];
|
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);
|
prt(map);
|
||||||
var tmp=new_map();
|
var tmp=new_map();
|
||||||
|
|
|
@ -1,40 +1,46 @@
|
||||||
# lib queue.nas
|
# lib queue.nas
|
||||||
# valkmjolnir 2021/3/3
|
# valkmjolnir 2021/3/31
|
||||||
var new_queue=func()
|
var queue=func()
|
||||||
{
|
{
|
||||||
return {begin:nil,end:nil};
|
var _={begin:nil,end:nil};
|
||||||
}
|
return
|
||||||
var queue_push=func(queue_head,elem)
|
{
|
||||||
|
push:func(elem)
|
||||||
{
|
{
|
||||||
var new_node=
|
var new_node=
|
||||||
{
|
{
|
||||||
elem:elem,
|
elem:elem,
|
||||||
next:nil
|
next:nil
|
||||||
};
|
};
|
||||||
if(queue_head.begin==nil)
|
if(_.begin==nil)
|
||||||
queue_head.begin=queue_head.end=new_node;
|
_.begin=_.end=new_node;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
queue_head.end.next=new_node;
|
_.end.next=new_node;
|
||||||
queue_head.end=new_node;
|
_.end=new_node;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
},
|
||||||
var queue_pop=func(queue_head)
|
pop:func()
|
||||||
{
|
{
|
||||||
var t=queue_head.begin;
|
if(_.begin!=nil)
|
||||||
queue_head.begin=queue_head.begin.next;
|
_.begin=_.begin.next;
|
||||||
if(queue_head.begin==nil)
|
if(_.begin==nil)
|
||||||
queue_head.end=nil;
|
_.end=nil;
|
||||||
return t;
|
},
|
||||||
}
|
front:func()
|
||||||
var queue_front=func(queue_head)
|
|
||||||
{
|
{
|
||||||
if(queue_head.begin!=nil)
|
if(_.begin!=nil)
|
||||||
return queue_head.begin.elem;
|
return _.begin.elem;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
},
|
||||||
var queue_empty=func(queue_head)
|
clear:func()
|
||||||
{
|
{
|
||||||
return queue_head.begin==nil;
|
_.begin=_.end=nil;
|
||||||
|
},
|
||||||
|
empty:func()
|
||||||
|
{
|
||||||
|
return _.begin==nil;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
|
@ -1,34 +1,36 @@
|
||||||
# lib stack.nas
|
# lib stack.nas
|
||||||
var block_alloc=func()
|
# valkmjolnir 2021/3/31
|
||||||
|
var stack=func()
|
||||||
{
|
{
|
||||||
return {elem:nil,next:nil};
|
var _={next:nil};
|
||||||
}
|
return
|
||||||
var new_stack=func()
|
|
||||||
{
|
{
|
||||||
return {next:nil};
|
push:func(elem)
|
||||||
}
|
|
||||||
var stack_push=func(stack,elem)
|
|
||||||
{
|
{
|
||||||
var tmp=stack.next;
|
_.next={elem:elem,next:_.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;
|
return;
|
||||||
}
|
},
|
||||||
var stack_top=func(stack)
|
pop:func()
|
||||||
{
|
{
|
||||||
var tmp=stack.next;
|
var tmp=_.next;
|
||||||
|
if(tmp!=nil)
|
||||||
|
_.next=tmp.next;
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
top:func()
|
||||||
|
{
|
||||||
|
var tmp=_.next;
|
||||||
if(tmp!=nil)
|
if(tmp!=nil)
|
||||||
return tmp.elem;
|
return tmp.elem;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
},
|
||||||
var stack_empty=func(stack)
|
clear:func()
|
||||||
{
|
{
|
||||||
return stack.next==nil;
|
_.next=nil;
|
||||||
|
},
|
||||||
|
empty:func()
|
||||||
|
{
|
||||||
|
return _.next==nil;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
Loading…
Reference in New Issue