This commit is contained in:
Li Haokun 2021-07-19 17:04:45 +08:00 committed by GitHub
parent 9fe7a86a3b
commit 7a93f5b89b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 14 deletions

View File

@ -34,13 +34,13 @@ Better choose the latest update of the interpreter.
MUST USE -O2/-O3 if want to optimize the interpreter!
Also remember to use g++ and clang++.
Also remember to use g++ or clang++.
> g++ | clang++ -std=c++11 -O2 main.cpp -o nasal.exe
> [cpp compiler] -std=c++11 -O2 main.cpp -o nasal.exe
Or use this in linux/macOS/Unix
> g++ | clang++ -std=c++11 -O2 main.cpp -o nasal
> [cpp compiler] -std=c++11 -O2 main.cpp -o nasal
## How to Use?
@ -71,7 +71,11 @@ The interpreter's interactive mode will do this automatically,so you don't need
LL(k) parser.
```javascript
(var a,b,c)=[{b:nil},[1,2],func{return 0;}];
(var a,b,c)=[
{b:nil},
[1,2],
func{return 0;}
];
(a.b,b[0],c)=(1,2,3);
```
@ -485,7 +489,13 @@ var b="another string";
var b=`c`;
var c=[];
var c=[0,nil,{},[],func(){return 0;}];
var c=[
0,
nil,
{},
[],
func(){return 0;}
];
append(c,0,1,2);
var d={
@ -690,6 +700,7 @@ nasal_val* builtin_print(std::vector<nasal_val*>& local_scope,nasal_gc& gc)
case vm_hash: i->ptr.hash->print(); break;
case vm_func: std::cout<<"func(...){...}"; break;
}
std::cout<<std::flush;
// if a nasal value is not in use,use gc::del_reference to delete it
// generate return value,use gc::gc_alloc(type) to make a new value
// or use reserved reference gc.nil_addr/gc.one_addr/gc.zero_addr

View File

@ -124,6 +124,7 @@ nasal_val* builtin_print(std::vector<nasal_val*>& local_scope,nasal_gc& gc)
case vm_hash: i->ptr.hash->print(); break;
case vm_func: std::cout<<"func(...){...}"; break;
}
std::cout<<std::flush;
// generate return value
return gc.nil_addr;
}

View File

@ -68,7 +68,7 @@ private:
nasal_ast func_gen();
nasal_ast args_gen();
nasal_ast expr();
nasal_ast exprs_gen();
nasal_ast exprs();
nasal_ast calc();
nasal_ast or_expr();
nasal_ast and_expr();
@ -362,7 +362,7 @@ nasal_ast nasal_parse::func_gen()
node.add_child(args_gen());
else
node.add_child(null_node_gen());
node.add_child(exprs_gen());
node.add_child(exprs());
return node;
}
nasal_ast nasal_parse::args_gen()
@ -476,7 +476,7 @@ nasal_ast nasal_parse::expr()
}
return node;
}
nasal_ast nasal_parse::exprs_gen()
nasal_ast nasal_parse::exprs()
{
if(tok_list[ptr].type==tok_eof)
{
@ -875,7 +875,7 @@ nasal_ast nasal_parse::while_loop()
match(tok_lcurve);
node.add_child(calc());
match(tok_rcurve);
node.add_child(exprs_gen());
node.add_child(exprs());
return node;
}
nasal_ast nasal_parse::for_loop()
@ -921,7 +921,7 @@ nasal_ast nasal_parse::for_loop()
else
node.add_child(calc());
match(tok_rcurve);
node.add_child(exprs_gen());
node.add_child(exprs());
return node;
}
nasal_ast nasal_parse::forei_loop()
@ -945,7 +945,7 @@ nasal_ast nasal_parse::forei_loop()
die(error_line,"expected vector");
node.add_child(calc());
match(tok_rcurve);
node.add_child(exprs_gen());
node.add_child(exprs());
return node;
}
nasal_ast nasal_parse::new_iter_gen()
@ -976,7 +976,7 @@ nasal_ast nasal_parse::conditional()
match(tok_lcurve);
tmp.add_child(calc());
match(tok_rcurve);
tmp.add_child(exprs_gen());
tmp.add_child(exprs());
node.add_child(std::move(tmp));
// end of if-expression
while(tok_list[ptr].type==tok_elsif)
@ -986,14 +986,14 @@ nasal_ast nasal_parse::conditional()
match(tok_lcurve);
tmp.add_child(calc());
match(tok_rcurve);
tmp.add_child(exprs_gen());
tmp.add_child(exprs());
node.add_child(std::move(tmp));
}
if(tok_list[ptr].type==tok_else)
{
nasal_ast tmp(tok_list[ptr].line,ast_else);
match(tok_else);
tmp.add_child(exprs_gen());
tmp.add_child(exprs());
node.add_child(std::move(tmp));
}
return node;