update
This commit is contained in:
parent
7087c67d79
commit
569d5c6c6a
96
main.cpp
96
main.cpp
|
@ -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;
|
||||
}
|
|
@ -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()
|
||||
|
|
|
@ -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);
|
Loading…
Reference in New Issue