This commit is contained in:
Valk Richard Li 2021-03-11 23:18:04 +08:00
parent 7087c67d79
commit 569d5c6c6a
3 changed files with 56 additions and 77 deletions

View File

@ -3,8 +3,8 @@
nasal_lexer lexer;
nasal_parse parse;
nasal_import import;
std::string inputfile="null";
nasal_codegen code_generator;
std::string file="null";
nasal_codegen codegen;
nasal_vm vm;
void help()
@ -49,97 +49,51 @@ void clear()
return;
}
void lex_func()
void execute(std::string& command)
{
lexer.openfile(inputfile);
lexer.openfile(file);
lexer.scanner();
if(lexer.get_error())
{
die("lexer",inputfile);
die("lexer",file);
return;
}
lexer.print_token();
clear();
return;
}
void ast_print()
{
lexer.openfile(inputfile);
lexer.scanner();
if(lexer.get_error())
if(command=="lex")
{
die("lexer",inputfile);
lexer.print_token();
clear();
return;
}
parse.set_toklist(lexer.get_token_list());
parse.main_process();
if(parse.get_error())
{
die("parse",inputfile);
die("parse",file);
return;
}
parse.get_root().print_ast(0);
clear();
return;
}
void show_bytecode()
{
lexer.openfile(inputfile);
lexer.scanner();
if(lexer.get_error())
if(command=="ast")
{
die("lexer",inputfile);
return;
}
parse.set_toklist(lexer.get_token_list());
parse.main_process();
if(parse.get_error())
{
die("parse",inputfile);
parse.get_root().print_ast(0);
clear();
return;
}
import.link(parse.get_root());
if(import.get_error())
{
die("import",inputfile);
die("import",file);
return;
}
code_generator.main_progress(import.get_root());
codegen.main_progress(import.get_root());
clear();
code_generator.print_byte_code();
return;
}
void execute()
{
lexer.openfile(inputfile);
lexer.scanner();
if(lexer.get_error())
if(command=="code")
{
die("lexer",inputfile);
codegen.print_byte_code();
return;
}
parse.set_toklist(lexer.get_token_list());
parse.main_process();
if(parse.get_error())
{
die("parse",inputfile);
return;
}
import.link(parse.get_root());
if(import.get_error())
{
die("import",inputfile);
return;
}
code_generator.main_progress(import.get_root());
clear();
vm.run(
code_generator.get_string_table(),
code_generator.get_number_table(),
code_generator.get_exec_code()
codegen.get_string_table(),
codegen.get_number_table(),
codegen.get_exec_code()
);
return;
}
@ -175,20 +129,14 @@ int main()
system("clear");
#endif
}
else if(command=="lex")
lex_func();
else if(command=="ast")
ast_print();
else if(command=="code")
show_bytecode();
else if(command=="exec")
execute();
else if(command=="logo")
logo();
else if(command=="exit")
break;
else if(command=="lex" || command=="ast" || command=="code" || command=="exec")
execute(command);
else
inputfile=command;
file=command;
}
return 0;
}

View File

@ -885,9 +885,8 @@ void nasal_vm::opr_builtincall()
void nasal_vm::opr_slicebegin()
{
slice_stack.push(gc.gc_alloc(vm_vec));
if((*val_stack_top)->get_type()==vm_vec)
return;
die("slcbegin: must slice a vector");
if((*val_stack_top)->get_type()!=vm_vec)
die("slcbegin: must slice a vector");
return;
}
void nasal_vm::opr_sliceend()

32
test/quick_sort.nas Normal file
View File

@ -0,0 +1,32 @@
import("lib.nas");
rand(time(0));
var sort=func(vec,left,right)
{
if(left>=right) return nil;
var L=left;
var R=right;
var tmp=vec[L];
while(left<right)
{
while(left<right and tmp<=vec[right])
right-=1;
while(left<right and tmp>=vec[left])
left+=1;
if(left!=right)
{
var t=vec[left];
vec[left]=vec[right];
vec[right]=t;
}
}
vec[L]=vec[left];
vec[left]=tmp;
sort(vec,L,left-1);
sort(vec,left+1,R);
return nil;
}
var vec=[];
for(var i=0;i<500;i+=1)
append(vec,int(rand()*1000));
sort(vec,0,size(vec)-1);
println(vec);