update
This commit is contained in:
parent
3fac8aa665
commit
f312250d27
16
README.md
16
README.md
|
@ -213,6 +213,22 @@ __`vm_str`__ has 3 formats. The third one is used to declare a character.
|
||||||
var s='str';
|
var s='str';
|
||||||
var s="another string";
|
var s="another string";
|
||||||
var s=`c`;
|
var s=`c`;
|
||||||
|
|
||||||
|
# some special characters is allowed in this language:
|
||||||
|
|
||||||
|
'\a';
|
||||||
|
'\b';
|
||||||
|
'\e';
|
||||||
|
'\f';
|
||||||
|
'\n';
|
||||||
|
'\r';
|
||||||
|
'\t';
|
||||||
|
'\v';
|
||||||
|
'\0';
|
||||||
|
'\\';
|
||||||
|
'\?';
|
||||||
|
'\'';
|
||||||
|
'\"';
|
||||||
```
|
```
|
||||||
|
|
||||||
__`vm_vec`__ has unlimited length and can store all types of values.
|
__`vm_vec`__ has unlimited length and can store all types of values.
|
||||||
|
|
2
makefile
2
makefile
|
@ -31,5 +31,5 @@ test:nasal
|
||||||
./nasal -op -e test/scalar.nas
|
./nasal -op -e test/scalar.nas
|
||||||
./nasal -op -e test/trait.nas
|
./nasal -op -e test/trait.nas
|
||||||
./nasal -op -t -d test/turingmachine.nas
|
./nasal -op -t -d test/turingmachine.nas
|
||||||
./nasal -op -t -d test/ycombinator.nas
|
./nasal -op -t -d -o test/ycombinator.nas
|
||||||
|
|
|
@ -949,7 +949,7 @@ nasal_ref builtin_opendir(nasal_ref* local,nasal_gc& gc)
|
||||||
return builtin_err("opendir","\"path\" must be string");
|
return builtin_err("opendir","\"path\" must be string");
|
||||||
DIR* p=opendir(path.str()->c_str());
|
DIR* p=opendir(path.str()->c_str());
|
||||||
if(!p)
|
if(!p)
|
||||||
return builtin_err("opendir","cannot open dir <"+*path.str()+">");
|
return builtin_err("opendir","cannot open dir <"+*path.str()+"> errno "+std::to_string(errno));
|
||||||
nasal_ref ret=gc.alloc(vm_obj);
|
nasal_ref ret=gc.alloc(vm_obj);
|
||||||
ret.obj()->type=obj_dir;
|
ret.obj()->type=obj_dir;
|
||||||
ret.obj()->ptr=(void*)p;
|
ret.obj()->ptr=(void*)p;
|
||||||
|
@ -1020,7 +1020,7 @@ nasal_ref builtin_dlopen(nasal_ref* local,nasal_gc& gc)
|
||||||
void* ptr=dlopen(dlname.str()->c_str(),RTLD_LOCAL|RTLD_LAZY);
|
void* ptr=dlopen(dlname.str()->c_str(),RTLD_LOCAL|RTLD_LAZY);
|
||||||
#endif
|
#endif
|
||||||
if(!ptr)
|
if(!ptr)
|
||||||
return builtin_err("dlopen","cannot open dynamic lib \""+*dlname.str()+"\"");
|
return builtin_err("dlopen","cannot open dynamic lib <"+*dlname.str()+">");
|
||||||
nasal_ref ret=gc.alloc(vm_obj);
|
nasal_ref ret=gc.alloc(vm_obj);
|
||||||
ret.obj()->type=obj_dylib;
|
ret.obj()->type=obj_dylib;
|
||||||
ret.obj()->ptr=ptr;
|
ret.obj()->ptr=ptr;
|
||||||
|
|
|
@ -7,8 +7,44 @@ var table=[
|
||||||
['q2','0','1','R','q3'],
|
['q2','0','1','R','q3'],
|
||||||
['q3',nil,nil,'S','q3']
|
['q3',nil,nil,'S','q3']
|
||||||
];
|
];
|
||||||
|
|
||||||
|
var operand={
|
||||||
|
new:func(symbol,changed_symbol,move,next_state){
|
||||||
|
if(move!='L' and move!='R' and move!='S')
|
||||||
|
die("invalid move type:"+move);
|
||||||
|
return {
|
||||||
|
symbol:symbol,
|
||||||
|
changed_symbol:changed_symbol,
|
||||||
|
move:move,
|
||||||
|
next_state:next_state
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var machine={
|
||||||
|
states:{},
|
||||||
|
add:func(state,operand){
|
||||||
|
if(!contains(me.states,state))
|
||||||
|
me.states[state]=[operand];
|
||||||
|
else{
|
||||||
|
foreach(var i;me.states[state])
|
||||||
|
if(i.symbol==operand.symbol or i.symbol==nil){
|
||||||
|
println(i);
|
||||||
|
die("conflict operand");
|
||||||
|
}
|
||||||
|
append(me.states[state],operand);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
load:func(data){
|
||||||
|
foreach(var opr;data){
|
||||||
|
var (nstat,sym,csym,move,nextstat)=opr;
|
||||||
|
me.add(nstat,operand.new(sym,csym,move,nextstat));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var prt=func(state,pointer,paper,act=nil){
|
var prt=func(state,pointer,paper,act=nil){
|
||||||
print(state,':',pointer,':',act!=nil?act:'','\n\t');
|
print(act!=nil?act:'','\n\t');
|
||||||
var s='';
|
var s='';
|
||||||
foreach(var i;paper)
|
foreach(var i;paper)
|
||||||
s~=i;
|
s~=i;
|
||||||
|
@ -16,37 +52,50 @@ var prt=func(state,pointer,paper,act=nil){
|
||||||
for(var i=0;i<pointer;i+=1)
|
for(var i=0;i<pointer;i+=1)
|
||||||
for(var j=0;j<size(paper[i]);j+=1)
|
for(var j=0;j<size(paper[i]);j+=1)
|
||||||
s~=' ';
|
s~=' ';
|
||||||
print(s,'^\n');
|
print(s,'^\n',state," ");
|
||||||
}
|
}
|
||||||
var run=func(table,node,start,stop){
|
var run=func(table,start,stop){
|
||||||
var paper=['0','1','1','1','0','1','0','a'];
|
var paper=['0','1','1','1','0','1','0','a'];
|
||||||
var pointer=0;
|
var pointer=0;
|
||||||
foreach(var action;table){
|
|
||||||
if(!contains(node,action[0]))
|
machine.load(table);
|
||||||
node[action[0]]=nil;
|
|
||||||
if(!contains(node,action[4]))
|
print("states: ",keys(machine.states),'\n');
|
||||||
node[action[4]]=nil;
|
if(!contains(machine.states,start))
|
||||||
print(action,'\n');
|
|
||||||
}
|
|
||||||
print("nodes: ",keys(node),'\n');
|
|
||||||
if(!contains(node,start))
|
|
||||||
die(start~" is not a valid node");
|
die(start~" is not a valid node");
|
||||||
if(!contains(node,stop))
|
if(!contains(machine.states,stop))
|
||||||
die(stop~" is not a valid node");
|
die(stop~" is not a valid node");
|
||||||
var state=start;
|
|
||||||
|
var (state,pointer)=(start,0);
|
||||||
|
|
||||||
prt(state,pointer,paper);
|
prt(state,pointer,paper);
|
||||||
while(state!=stop){
|
while(state!=stop){
|
||||||
foreach(var action;table)
|
if(!contains(machine.states,state))
|
||||||
if(action[0]==state and (action[1]==paper[pointer] or action[1]==' ')){
|
die("no matching function for state:"~state);
|
||||||
paper[pointer]=action[2]==nil?paper[pointer]:action[2];
|
var found=0;
|
||||||
if(action[3]=='L') pointer-=1;
|
foreach(var action;machine.states[state]){
|
||||||
elsif(action[3]=='R') pointer+=1;
|
var (sym,csym,move,next)=(
|
||||||
elsif(action[3]!='S') die("invalid action <"~action[3]~'>');
|
action.symbol,
|
||||||
state=action[4];
|
action.changed_symbol,
|
||||||
|
action.move,
|
||||||
|
action.next_state
|
||||||
|
);
|
||||||
|
if(sym==paper[pointer] or sym==nil){
|
||||||
|
if(sym!=nil)
|
||||||
|
paper[pointer]=csym;
|
||||||
|
if(move=='L') pointer-=1;
|
||||||
|
elsif(move=='R') pointer+=1;
|
||||||
|
(state,found)=(next,1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
prt(state,pointer,paper,action);
|
}
|
||||||
|
|
||||||
|
if(!found)
|
||||||
|
die("no matching function for state:"~state);
|
||||||
|
|
||||||
|
prt(state,pointer,paper,[sym,csym,move,next]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
run(table,{},'q0','q3');
|
run(table,'q0','q3');
|
||||||
|
print('\n');
|
Loading…
Reference in New Issue