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

View File

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