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::vector<nasal_ast> children;
|
||||
public:
|
||||
nasal_ast();
|
||||
nasal_ast(int,int);
|
||||
nasal_ast(const nasal_ast&);
|
||||
~nasal_ast();
|
||||
|
@ -116,7 +117,14 @@ public:
|
|||
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;
|
||||
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)
|
||||
{
|
||||
|
@ -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<nasal_val*> 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();
|
||||
|
|
|
@ -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);
|
||||
|
|
68
nasal_vm.h
68
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()<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_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()
|
||||
|
|
|
@ -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;
|
||||
show+=1;
|
||||
if(show==200)
|
||||
if(show==250)
|
||||
{
|
||||
show=0;
|
||||
print('epoch ',cnt,':',error,'\r');
|
||||
|
|
355
test/lexer.nas
355
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 jump_note=func()
|
||||
var tok_type=
|
||||
{
|
||||
while(ptr<len and chr(s[ptr])!='\n')
|
||||
ptr+=1;
|
||||
ptr+=1;
|
||||
return;
|
||||
}
|
||||
var generate_id=func()
|
||||
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 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="";
|
||||
while(ptr<len)
|
||||
while(_.ptr<_.len)
|
||||
{
|
||||
if('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')
|
||||
tmp~=chr(s[ptr]);
|
||||
if('a'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='z'
|
||||
or 'A'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='Z'
|
||||
or '0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='9'
|
||||
or chr(_.s[_.ptr])=='_')
|
||||
tmp~=chr(_.s[_.ptr]);
|
||||
else
|
||||
break;
|
||||
ptr+=1;
|
||||
_.ptr+=1;
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
var generate_str=func()
|
||||
append(_.token,tmp);
|
||||
},
|
||||
strgen:func()
|
||||
{
|
||||
var tok_str="";
|
||||
var mark=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
while(ptr<len and chr(s[ptr])!=mark)
|
||||
var str="";
|
||||
var mark=chr(_.s[_.ptr]);
|
||||
_.ptr+=1;
|
||||
while(_.ptr<_.len and chr(_.s[_.ptr])!=mark)
|
||||
{
|
||||
if(chr(s[ptr])=='\\')
|
||||
if(chr(_.s[_.ptr])=='\\')
|
||||
{
|
||||
ptr+=1;
|
||||
if(chr(s[ptr])=='a') tok_str~='\a';
|
||||
elsif(chr(s[ptr])=='b') tok_str~='\b';
|
||||
elsif(chr(s[ptr])=='f') tok_str~='\f';
|
||||
elsif(chr(s[ptr])=='n') tok_str~='\n';
|
||||
elsif(chr(s[ptr])=='r') tok_str~='\r';
|
||||
elsif(chr(s[ptr])=='t') tok_str~='\t';
|
||||
elsif(chr(s[ptr])=='v') tok_str~='\v';
|
||||
elsif(chr(s[ptr])=='?') tok_str~='?';
|
||||
elsif(chr(s[ptr])=='0') tok_str~='\0';
|
||||
elsif(chr(s[ptr])=='\\') tok_str~='\\';
|
||||
elsif(chr(s[ptr])=='\'') tok_str~='\'';
|
||||
elsif(chr(s[ptr])=='\"') tok_str~='\"';
|
||||
else tok_str~=chr(s[ptr]);
|
||||
_.ptr+=1;
|
||||
if (chr(_.s[_.ptr])=='a' ) str~='\a';
|
||||
elsif(chr(_.s[_.ptr])=='b' ) str~='\b';
|
||||
elsif(chr(_.s[_.ptr])=='f' ) str~='\f';
|
||||
elsif(chr(_.s[_.ptr])=='n' ) str~='\n';
|
||||
elsif(chr(_.s[_.ptr])=='r' ) str~='\r';
|
||||
elsif(chr(_.s[_.ptr])=='t' ) str~='\t';
|
||||
elsif(chr(_.s[_.ptr])=='v' ) str~='\v';
|
||||
elsif(chr(_.s[_.ptr])=='?' ) str~='?';
|
||||
elsif(chr(_.s[_.ptr])=='0' ) str~='\0';
|
||||
elsif(chr(_.s[_.ptr])=='\\') str~='\\';
|
||||
elsif(chr(_.s[_.ptr])=='\'') str~='\'';
|
||||
elsif(chr(_.s[_.ptr])=='\"') str~='\"';
|
||||
else str~=chr(_.s[_.ptr]);
|
||||
}
|
||||
else
|
||||
tok_str~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
str~=chr(_.s[_.ptr]);
|
||||
_.ptr+=1;
|
||||
}
|
||||
if(ptr>=len)
|
||||
if(_.ptr>=_.len)
|
||||
print("read eof when generating string.\n");
|
||||
ptr+=1;
|
||||
return tok_str;
|
||||
}
|
||||
var generate_number=func()
|
||||
_.ptr+=1;
|
||||
append(_.token,[tok_type.tok_str,str]);
|
||||
},
|
||||
numgen:func()
|
||||
{
|
||||
var number=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
if(chr(s[ptr])=='x')
|
||||
var number=chr(_.s[_.ptr]);
|
||||
_.ptr+=1;
|
||||
if(chr(_.s[_.ptr])=='x')
|
||||
{
|
||||
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'))
|
||||
_.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'))
|
||||
{
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
number~=chr(_.s[_.ptr]);
|
||||
_.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;
|
||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='7'))
|
||||
_.ptr+=1;
|
||||
while(_.ptr<_.len and ('0'<=chr(_.s[_.ptr]) and chr(_.s[_.ptr])<='7'))
|
||||
{
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
number~=chr(_.s[_.ptr]);
|
||||
_.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]);
|
||||
ptr+=1;
|
||||
number~=chr(_.s[_.ptr]);
|
||||
_.ptr+=1;
|
||||
}
|
||||
if(chr(s[ptr])=='.')
|
||||
number~=chr(s[ptr]);
|
||||
if(chr(_.s[_.ptr])=='.')
|
||||
number~=chr(_.s[_.ptr]);
|
||||
else
|
||||
return num(number);
|
||||
ptr+=1;
|
||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
||||
{
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
append(_.token,[tok_type.tok_num,num(number)]);
|
||||
return;
|
||||
}
|
||||
if(chr(s[ptr])=='e' or chr(s[ptr])=='E')
|
||||
number~=chr(s[ptr]);
|
||||
_.ptr+=1;
|
||||
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
|
||||
return num(number);
|
||||
ptr+=1;
|
||||
if(chr(s[ptr])=='-' or chr(s[ptr])=='+')
|
||||
{
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
append(_.token,[tok_type.tok_num,num(number)]);
|
||||
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]);
|
||||
ptr+=1;
|
||||
number~=chr(_.s[_.ptr]);
|
||||
_.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="";
|
||||
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]);
|
||||
ptr+=1;
|
||||
if(ptr<len and chr(s[ptr])=='=')
|
||||
tmp=chr(_.s[_.ptr]);
|
||||
_.ptr+=1;
|
||||
if(_.ptr<_.len and chr(_.s[_.ptr])=='=')
|
||||
{
|
||||
tmp~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
tmp~=chr(_.s[_.ptr]);
|
||||
_.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='...';
|
||||
ptr+=3;
|
||||
_.ptr+=3;
|
||||
}
|
||||
else
|
||||
{
|
||||
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)
|
||||
tmp=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
while(ptr<len)
|
||||
{
|
||||
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();
|
||||
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);
|
||||
}
|
||||
if(ptr>=len)
|
||||
append(_.token,tmp);
|
||||
},
|
||||
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;
|
||||
}
|
||||
|
||||
foreach(var i;token)
|
||||
{
|
||||
print("(",cnt," | ",i,")\n");
|
||||
cnt+=1;
|
||||
return;
|
||||
},
|
||||
get_token:func(){return _.token;}
|
||||
};
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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();
|
||||
|
|
|
@ -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 _={begin:nil,end:nil};
|
||||
return
|
||||
{
|
||||
push:func(elem)
|
||||
{
|
||||
var new_node=
|
||||
{
|
||||
elem:elem,
|
||||
next:nil
|
||||
};
|
||||
if(queue_head.begin==nil)
|
||||
queue_head.begin=queue_head.end=new_node;
|
||||
if(_.begin==nil)
|
||||
_.begin=_.end=new_node;
|
||||
else
|
||||
{
|
||||
queue_head.end.next=new_node;
|
||||
queue_head.end=new_node;
|
||||
_.end.next=new_node;
|
||||
_.end=new_node;
|
||||
}
|
||||
return;
|
||||
}
|
||||
var queue_pop=func(queue_head)
|
||||
},
|
||||
pop:func()
|
||||
{
|
||||
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(_.begin!=nil)
|
||||
_.begin=_.begin.next;
|
||||
if(_.begin==nil)
|
||||
_.end=nil;
|
||||
},
|
||||
front:func()
|
||||
{
|
||||
if(queue_head.begin!=nil)
|
||||
return queue_head.begin.elem;
|
||||
if(_.begin!=nil)
|
||||
return _.begin.elem;
|
||||
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
|
||||
var block_alloc=func()
|
||||
# valkmjolnir 2021/3/31
|
||||
var stack=func()
|
||||
{
|
||||
return {elem:nil,next:nil};
|
||||
}
|
||||
var new_stack=func()
|
||||
var _={next:nil};
|
||||
return
|
||||
{
|
||||
return {next:nil};
|
||||
}
|
||||
var stack_push=func(stack,elem)
|
||||
push:func(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;
|
||||
_.next={elem:elem,next:_.next};
|
||||
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)
|
||||
return tmp.elem;
|
||||
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