bug fixed & test file changes

compare operators now run more efficiently.
This commit is contained in:
Valk Richard Li 2021-03-31 20:59:13 +08:00
parent b06e1bb5dd
commit 125fc8a9fe
10 changed files with 648 additions and 299 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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);

View File

@ -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()

261
test/bf.nas Normal file
View File

@ -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);

View File

@ -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');

View File

@ -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());

View File

@ -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();

View File

@ -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;
}
};
}

View File

@ -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;
}
};
}