mirror of
https://github.com/ValKmjolnir/Nasal-Interpreter.git
synced 2026-07-21 18:38:44 +08:00
gc changed to mark-sweep
This commit is contained in:
+59
-62
@@ -1,60 +1,60 @@
|
||||
import("lib.nas");
|
||||
|
||||
var s=split('',io.fin(input()));
|
||||
var s=io.fin(input());
|
||||
var len=size(s);
|
||||
var ptr=0;
|
||||
var cnt=0;
|
||||
var token=[];
|
||||
|
||||
var jump_note=func()
|
||||
{
|
||||
while(ptr<len and s[ptr]!='\n')
|
||||
while(ptr<len and chr(s[ptr])!='\n')
|
||||
ptr+=1;
|
||||
ptr+=1;
|
||||
return;
|
||||
}
|
||||
|
||||
var generate_id=func()
|
||||
{
|
||||
var tmp="";
|
||||
while(ptr<len)
|
||||
{
|
||||
if('a'<=s[ptr] and s[ptr]<='z'
|
||||
or 'A'<=s[ptr] and s[ptr]<='Z'
|
||||
or s[ptr]=='_'
|
||||
or '0'<=s[ptr] and s[ptr]<='9')
|
||||
tmp~=s[ptr];
|
||||
if('a'<=chr(s[ptr]) and chr(s[ptr])<='z'
|
||||
or 'A'<=chr(s[ptr]) and chr(s[ptr])<='Z'
|
||||
or chr(s[ptr])=='_'
|
||||
or '0'<=chr(s[ptr]) and chr(s[ptr])<='9')
|
||||
tmp~=chr(s[ptr]);
|
||||
else
|
||||
break;
|
||||
ptr+=1;
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
|
||||
var generate_str=func()
|
||||
{
|
||||
var tok_str="";
|
||||
var mark=s[ptr];
|
||||
var mark=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
while(ptr<len and s[ptr]!=mark)
|
||||
while(ptr<len and chr(s[ptr])!=mark)
|
||||
{
|
||||
if(s[ptr]=='\\')
|
||||
if(chr(s[ptr])=='\\')
|
||||
{
|
||||
ptr+=1;
|
||||
if(s[ptr]=='a') tok_str~='\a';
|
||||
elsif(s[ptr]=='b') tok_str~='\b';
|
||||
elsif(s[ptr]=='f') tok_str~='\f';
|
||||
elsif(s[ptr]=='n') tok_str~='\n';
|
||||
elsif(s[ptr]=='r') tok_str~='\r';
|
||||
elsif(s[ptr]=='t') tok_str~='\t';
|
||||
elsif(s[ptr]=='v') tok_str~='\v';
|
||||
elsif(s[ptr]=='?') tok_str~='?';
|
||||
elsif(s[ptr]=='0') tok_str~='\0';
|
||||
elsif(s[ptr]=='\\') tok_str~='\\';
|
||||
elsif(s[ptr]=='\'') tok_str~='\'';
|
||||
elsif(s[ptr]=='\"') tok_str~='\"';
|
||||
else tok_str~=s[ptr];
|
||||
if(chr(s[ptr])=='a') tok_str~='\a';
|
||||
elsif(chr(s[ptr])=='b') tok_str~='\b';
|
||||
elsif(chr(s[ptr])=='f') tok_str~='\f';
|
||||
elsif(chr(s[ptr])=='n') tok_str~='\n';
|
||||
elsif(chr(s[ptr])=='r') tok_str~='\r';
|
||||
elsif(chr(s[ptr])=='t') tok_str~='\t';
|
||||
elsif(chr(s[ptr])=='v') tok_str~='\v';
|
||||
elsif(chr(s[ptr])=='?') tok_str~='?';
|
||||
elsif(chr(s[ptr])=='0') tok_str~='\0';
|
||||
elsif(chr(s[ptr])=='\\') tok_str~='\\';
|
||||
elsif(chr(s[ptr])=='\'') tok_str~='\'';
|
||||
elsif(chr(s[ptr])=='\"') tok_str~='\"';
|
||||
else tok_str~=chr(s[ptr]);
|
||||
}
|
||||
else
|
||||
tok_str~=s[ptr];
|
||||
tok_str~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
if(ptr>=len)
|
||||
@@ -62,80 +62,77 @@ var generate_str=func()
|
||||
ptr+=1;
|
||||
return tok_str;
|
||||
}
|
||||
|
||||
var generate_number=func()
|
||||
{
|
||||
var number=s[ptr];
|
||||
var number=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
if(s[ptr]=='x')
|
||||
if(chr(s[ptr])=='x')
|
||||
{
|
||||
ptr+=1;
|
||||
while(ptr<len and ('a'<=s[ptr] and s[ptr]<='f' or '0'<=s[ptr] and s[ptr]<='9'))
|
||||
while(ptr<len and ('a'<=chr(s[ptr]) and chr(s[ptr])<='f' or '0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
||||
{
|
||||
number~=s[ptr];
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
return num(number);
|
||||
}
|
||||
elsif(s[ptr]=='o')
|
||||
elsif(chr(s[ptr])=='o')
|
||||
{
|
||||
ptr+=1;
|
||||
while(ptr<len and ('0'<=s[ptr] and s[ptr]<='7'))
|
||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='7'))
|
||||
{
|
||||
number~=s[ptr];
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
return num(number);
|
||||
}
|
||||
|
||||
while(ptr<len and ('0'<=s[ptr] and s[ptr]<='9'))
|
||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
||||
{
|
||||
number~=s[ptr];
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
if(s[ptr]=='.')
|
||||
number~=s[ptr];
|
||||
if(chr(s[ptr])=='.')
|
||||
number~=chr(s[ptr]);
|
||||
else
|
||||
return num(number);
|
||||
ptr+=1;
|
||||
while(ptr<len and ('0'<=s[ptr] and s[ptr]<='9'))
|
||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
||||
{
|
||||
number~=s[ptr];
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
if(s[ptr]=='e' or s[ptr]=='E')
|
||||
number~=s[ptr];
|
||||
if(chr(s[ptr])=='e' or chr(s[ptr])=='E')
|
||||
number~=chr(s[ptr]);
|
||||
else
|
||||
return num(number);
|
||||
ptr+=1;
|
||||
if(s[ptr]=='-' or s[ptr]=='+')
|
||||
if(chr(s[ptr])=='-' or chr(s[ptr])=='+')
|
||||
{
|
||||
number~=s[ptr];
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
while(ptr<len and ('0'<=s[ptr] and s[ptr]<='9'))
|
||||
while(ptr<len and ('0'<=chr(s[ptr]) and chr(s[ptr])<='9'))
|
||||
{
|
||||
number~=s[ptr];
|
||||
number~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
return num(number);
|
||||
}
|
||||
|
||||
var generate_operator=func()
|
||||
{
|
||||
var tmp="";
|
||||
if(s[ptr]=='+' or s[ptr]=='-' or s[ptr]=='~' or s[ptr]=='/' or s[ptr]=='*' or s[ptr]=='>' or s[ptr]=='<' or s[ptr]=='!' or s[ptr]=='=')
|
||||
if(chr(s[ptr])=='+' or chr(s[ptr])=='-' or chr(s[ptr])=='~' or chr(s[ptr])=='/' or chr(s[ptr])=='*' or chr(s[ptr])=='>' or chr(s[ptr])=='<' or chr(s[ptr])=='!' or chr(s[ptr])=='=')
|
||||
{
|
||||
tmp=s[ptr];
|
||||
tmp=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
if(ptr<len and s[ptr]=='=')
|
||||
if(ptr<len and chr(s[ptr])=='=')
|
||||
{
|
||||
tmp~=s[ptr];
|
||||
tmp~=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
elsif(s[ptr]=='.')
|
||||
elsif(chr(s[ptr])=='.')
|
||||
{
|
||||
if(ptr+2<len and s[ptr+1]=='.' and s[ptr+2]=='.')
|
||||
{
|
||||
@@ -149,22 +146,21 @@ var generate_operator=func()
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
elsif(s[ptr]!=' ' and s[ptr]!='\t' and s[ptr]!='\n' and s[ptr]!='\r' and s[ptr][0]>0)
|
||||
tmp=s[ptr];
|
||||
elsif(chr(s[ptr])!=' ' and chr(s[ptr])!='\t' and chr(s[ptr])!='\n' and chr(s[ptr])!='\r' and chr(s[ptr])[0]>0)
|
||||
tmp=chr(s[ptr]);
|
||||
ptr+=1;
|
||||
return tmp;
|
||||
}
|
||||
var cnt=0;
|
||||
var token=[];
|
||||
|
||||
while(ptr<len)
|
||||
{
|
||||
if(s[ptr]=='#')
|
||||
if(chr(s[ptr])=='#')
|
||||
jump_note();
|
||||
elsif('a'<=s[ptr] and s[ptr]<='z' or 'A'<=s[ptr] and s[ptr]<='Z' or s[ptr]=='_')
|
||||
elsif('a'<=chr(s[ptr]) and chr(s[ptr])<='z' or 'A'<=chr(s[ptr]) and chr(s[ptr])<='Z' or chr(s[ptr])=='_')
|
||||
append(token,generate_id());
|
||||
elsif(s[ptr]=='\'' or s[ptr]=='\"')
|
||||
elsif(chr(s[ptr])=='\'' or chr(s[ptr])=='\"')
|
||||
append(token,generate_str());
|
||||
elsif('0'<=s[ptr] and s[ptr]<='9')
|
||||
elsif('0'<=chr(s[ptr]) and chr(s[ptr])<='9')
|
||||
append(token,generate_number());
|
||||
else
|
||||
{
|
||||
@@ -175,8 +171,9 @@ while(ptr<len)
|
||||
if(ptr>=len)
|
||||
break;
|
||||
}
|
||||
|
||||
foreach(var i;token)
|
||||
{
|
||||
print("(",cnt," | ",i,")\n");
|
||||
cnt+=1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user