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