add test file 'turingmachine.nas' & change output format of ast & bug fixed

This commit is contained in:
ValKmjolnir 2021-12-28 20:23:47 +08:00
parent 70a43c2f03
commit 46716620e3
5 changed files with 71 additions and 10 deletions

View File

@ -29,5 +29,6 @@ test:nasal
./nasal -t test/quick_sort.nas
./nasal test/scalar.nas
./nasal test/trait.nas
./nasal -t test/turingmachine.nas
./nasal -t test/ycombinator.nas

View File

@ -138,7 +138,7 @@ public:
nasal_ast(const uint32_t l=0,const uint32_t t=ast_null):_line(l),_type(t){}
nasal_ast(const nasal_ast&);
nasal_ast(nasal_ast&&);
void print(const int);
void print(int,bool);
void clear();
nasal_ast& operator=(const nasal_ast&);
@ -209,10 +209,11 @@ void nasal_ast::clear()
_child.clear();
}
void nasal_ast::print(const int depth)
void nasal_ast::print(int depth,bool last=false)
{
for(int i=0;i<depth;++i)
std::cout<<"| ";
static std::vector<std::string> intentation={};
for(auto& i:intentation)
std::cout<<i;
std::cout<<ast_name[_type];
if(
_type==ast_str ||
@ -224,8 +225,16 @@ void nasal_ast::print(const int depth)
else if(_type==ast_num || _type==ast_file)
std::cout<<":"<<_num;
std::cout<<'\n';
for(auto& i:_child)
i.print(depth+1);
if(last && depth)
intentation.back()=" ";
else if(!last && depth)
intentation.back()="";
for(uint32_t i=0;i<_child.size();++i)
{
intentation.push_back(i==_child.size()-1?"└─":"├─");
_child[i].print(depth+1,i==_child.size()-1);
intentation.pop_back();
}
}
#endif

View File

@ -83,7 +83,7 @@ void nasal_dbg::stepinfo()
uint32_t begin,end;
uint32_t line=bytecode[pc].line==0?0:bytecode[pc].line-1;
src.load(files[bytecode[pc].fidx]);
printf("source code:\n");
printf("\nsource code:\n");
begin=(line>>3)==0?0:((line>>3)<<3);
end=(1+(line>>3))<<3;
for(uint32_t i=begin;i<end && i<src.size();++i)

View File

@ -48,14 +48,14 @@ public:
void err(const char* stage,const std::string& info)
{
++error;
std::cout<<"["<<stage<<"] "<<file<<": "<<info<<'\n';
std::cout<<"["<<stage<<"] "<<info<<'\n';
}
void err(const char* stage,uint32_t line,uint32_t column,const std::string& info)
{
++error;
if(!line)
{
err(stage,info);
std::cout<<"["<<stage<<"] "<<file<<": "<<info<<'\n';
return;
}
std::cout<<"["<<stage<<"] "<<file<<":"<<line<<":"<<column<<" "<<info<<"\n"<<res[line-1]<<'\n';
@ -68,7 +68,7 @@ public:
++error;
if(!line)
{
err(stage,info);
std::cout<<"["<<stage<<"] "<<file<<": "<<info<<'\n';
return;
}
std::cout<<"["<<stage<<"] "<<file<<":"<<line<<" "<<info<<"\n"<<res[line-1]<<'\n';

51
test/turingmachine.nas Normal file
View File

@ -0,0 +1,51 @@
import("lib.nas");
var table=[
['q0','0','1','R','q1'],
['q1','1','1','R','q1'],
['q1','0','0','S','q2'],
['q2','0','1','R','q3'],
['q3',' ',' ','S','q3']
];
var prt=func(state,pointer,paper,act=nil){
print(state,':',pointer,':',act!=nil?act:'','\n\t');
var s='';
foreach(var i;paper)
s~=i;
s~='\n\t';
for(var i=0;i<pointer;i+=1)
for(var j=0;j<size(paper[i]);j+=1)
s~=' ';
print(s,'^\n');
}
var run=func(table,node,start,stop){
var paper=['0','1','0','1','0','a'];
var pointer=0;
foreach(var action;table){
if(!contains(node,action[0]))
node[action[0]]=nil;
if(!contains(node,action[4]))
node[action[4]]=nil;
}
print("nodes: ",keys(node),'\n');
if(!contains(node,start))
die(start~" is not a valid node");
if(!contains(node,stop))
die(stop~" is not a valid node");
var state=start;
prt(state,pointer,paper);
while(state!=stop){
foreach(var action;table)
if(action[0]==state and (action[1]==paper[pointer] or action[1]==' ')){
paper[pointer]=action[2]==' '?paper[pointer]:action[2];
if(action[3]=='L') pointer-=1;
elsif(action[3]=='R') pointer+=1;
elsif(action[3]!='S') die("invalid action <"~action[3]~'>');
state=action[4];
break;
}
prt(state,pointer,paper,action);
}
}
run(table,{},'q0','q3');