Rearrange files
This commit is contained in:
parent
f28f949d0f
commit
1f5f0ce0d4
128
Program.cs
128
Program.cs
|
@ -1,128 +0,0 @@
|
||||||
namespace tlang;
|
|
||||||
class Program
|
|
||||||
{
|
|
||||||
static int Main(string[] args)
|
|
||||||
{
|
|
||||||
|
|
||||||
//Lexer lexer = new Lexer("testString.tlang");
|
|
||||||
Parser parser = new Parser();
|
|
||||||
//parser.Add(lexer.Tokens);
|
|
||||||
int r=0;
|
|
||||||
RootEnvironment env=new RootEnvironment();
|
|
||||||
parser.LoadEnvironment(env);
|
|
||||||
env["array"] = new TExternalMethod((args2)=>{
|
|
||||||
return new TArray();
|
|
||||||
});
|
|
||||||
env["dict"] = new TExternalMethod((args2)=>{
|
|
||||||
return new TDictionary();
|
|
||||||
});
|
|
||||||
env["print"] = new TExternalMethod((args2)=>{
|
|
||||||
foreach(var arg in args2)
|
|
||||||
{
|
|
||||||
Console.Write(arg);
|
|
||||||
}
|
|
||||||
return new TNumber(args2.Length);
|
|
||||||
});
|
|
||||||
env["println"] = new TExternalMethod((args2)=>{
|
|
||||||
foreach(var arg in args2)
|
|
||||||
{
|
|
||||||
Console.Write(arg);
|
|
||||||
}
|
|
||||||
Console.WriteLine();
|
|
||||||
return new TNumber(args2.Length);
|
|
||||||
});
|
|
||||||
env["int"] = new TExternalMethod((args2)=>{
|
|
||||||
|
|
||||||
if(args2.Length == 1)
|
|
||||||
{
|
|
||||||
var arg = args2[0];
|
|
||||||
var sArg = arg as TString;
|
|
||||||
var dArg = arg as TNumber;
|
|
||||||
if(sArg != null)
|
|
||||||
{
|
|
||||||
long val;
|
|
||||||
if(long.TryParse(sArg.Value,out val))
|
|
||||||
{
|
|
||||||
return new TNumber(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(dArg != null)
|
|
||||||
{
|
|
||||||
return new TNumber(Math.Round(dArg.Value));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return TObject.Null;
|
|
||||||
});
|
|
||||||
|
|
||||||
env["filecreate"]=new TExternalMethod((args2)=>{
|
|
||||||
|
|
||||||
if(args2.Length == 1)
|
|
||||||
{
|
|
||||||
var fileName = args2[0] as TString;
|
|
||||||
if(fileName != null)
|
|
||||||
{
|
|
||||||
return new TInternalObject(File.Create(fileName.Value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new TNull();
|
|
||||||
});
|
|
||||||
env["streamwritestr"]=new TExternalMethod((args2)=>{
|
|
||||||
if(args2.Length == 2)
|
|
||||||
{
|
|
||||||
var internalObj = args2[0] as TInternalObject;
|
|
||||||
if(internalObj != null)
|
|
||||||
{
|
|
||||||
var strm = internalObj.Object as Stream;
|
|
||||||
if(strm != null)
|
|
||||||
{
|
|
||||||
var str = args2[1] as TString;
|
|
||||||
if(str != null)
|
|
||||||
{
|
|
||||||
var bytes=System.Text.Encoding.UTF8.GetBytes(str.Value);
|
|
||||||
strm.Write(bytes,0,bytes.Length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TObject.Null;
|
|
||||||
});
|
|
||||||
env["streamclose"]=new TExternalMethod((args2)=>{
|
|
||||||
if(args2.Length == 1)
|
|
||||||
{
|
|
||||||
var internalObj = args2[0] as TInternalObject;
|
|
||||||
if(internalObj != null)
|
|
||||||
{
|
|
||||||
var strm = internalObj.Object as Stream;
|
|
||||||
if(strm != null)
|
|
||||||
{
|
|
||||||
strm.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TObject.Null;
|
|
||||||
});
|
|
||||||
|
|
||||||
Lexer lexer =new Lexer(new StreamReader("file.tlang"));
|
|
||||||
var res=parser.ParseExpression(lexer.Tokens,ref r,true).Execute(env) as TNumber;
|
|
||||||
var main = env["main"] as ICallable;
|
|
||||||
|
|
||||||
if(main != null)
|
|
||||||
{
|
|
||||||
List<TString> args2=new List<TString>();
|
|
||||||
foreach(var argument in args)
|
|
||||||
{
|
|
||||||
args2.Add(new TString(argument));
|
|
||||||
}
|
|
||||||
res=main.Call(args2.ToArray()) as TNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(res != null)
|
|
||||||
{
|
|
||||||
return (int)res.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
each(dir : fs.enumerate_dirs(fs.home))
|
|
||||||
{
|
|
||||||
println(dir);
|
|
||||||
}
|
|
||||||
each(file : fs.enumerate_files(fs.home))
|
|
||||||
{
|
|
||||||
println(file);
|
|
||||||
}
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
using tlang;
|
||||||
|
|
||||||
|
List<LexToken> tokens;
|
||||||
|
using(var sr = new StreamReader(ApplicationRunner.GetLauncherScript()))
|
||||||
|
{
|
||||||
|
var lexer=new Lexer(sr);
|
||||||
|
tokens=lexer.Tokens;
|
||||||
|
}
|
||||||
|
Environment.Exit(ApplicationRunner.Run(tokens,args));
|
|
@ -0,0 +1 @@
|
||||||
|
console.writeln(42);
|
|
@ -1,5 +1,10 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\tlanglib\tlanglib.csproj" />
|
||||||
|
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net7.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
|
@ -1,6 +1,6 @@
|
||||||
namespace tlang
|
namespace tlang
|
||||||
{
|
{
|
||||||
internal class LexToken
|
public class LexToken
|
||||||
{
|
{
|
||||||
private LexToken(string text)
|
private LexToken(string text)
|
||||||
{
|
{
|
|
@ -2,7 +2,7 @@ using System.Text;
|
||||||
|
|
||||||
namespace tlang
|
namespace tlang
|
||||||
{
|
{
|
||||||
internal class Lexer
|
public class Lexer
|
||||||
{
|
{
|
||||||
TextReader reader;
|
TextReader reader;
|
||||||
public Lexer(string fName) : this(new StreamReader(fName))
|
public Lexer(string fName) : this(new StreamReader(fName))
|
||||||
|
@ -13,17 +13,19 @@ namespace tlang
|
||||||
{
|
{
|
||||||
this.reader = reader;
|
this.reader = reader;
|
||||||
}
|
}
|
||||||
List<LexToken>? tokens=null;
|
List<LexToken> tokens=new List<LexToken>();
|
||||||
public List<LexToken> Tokens
|
public List<LexToken> Tokens
|
||||||
{
|
{
|
||||||
get{
|
get{
|
||||||
if(tokens == null)
|
if(!set)
|
||||||
{
|
{
|
||||||
|
set=true;
|
||||||
tokens = _getTokens();
|
tokens = _getTokens();
|
||||||
}
|
}
|
||||||
return tokens;
|
return tokens;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
bool set=false;
|
||||||
List<LexToken> _tokens = new List<LexToken>();
|
List<LexToken> _tokens = new List<LexToken>();
|
||||||
StringBuilder b = new StringBuilder();
|
StringBuilder b = new StringBuilder();
|
||||||
private void FlushBuilder()
|
private void FlushBuilder()
|
||||||
|
@ -44,7 +46,8 @@ namespace tlang
|
||||||
read = reader.Read();
|
read = reader.Read();
|
||||||
if(read == 'x')
|
if(read == 'x')
|
||||||
{
|
{
|
||||||
return (char)Convert.FromHexString($"{(char)reader.Read()}{(char)reader.Read()}")[0];
|
|
||||||
|
return (char)short.Parse($"0x{(char)reader.Read()}{(char)reader.Read()}",System.Globalization.NumberStyles.AllowHexSpecifier);
|
||||||
}
|
}
|
||||||
else if(read == 'n')
|
else if(read == 'n')
|
||||||
{
|
{
|
||||||
|
@ -89,7 +92,7 @@ namespace tlang
|
||||||
break;
|
break;
|
||||||
case '\'':
|
case '\'':
|
||||||
FlushBuilder();
|
FlushBuilder();
|
||||||
LexToken.FromChar(getChar().ToString());
|
_tokens.Add(LexToken.FromChar(getChar().ToString()));
|
||||||
reader.Read();
|
reader.Read();
|
||||||
break;
|
break;
|
||||||
case '#':
|
case '#':
|
||||||
|
@ -200,23 +203,10 @@ namespace tlang
|
||||||
case ':':
|
case ':':
|
||||||
case ',':
|
case ',':
|
||||||
case ';':
|
case ';':
|
||||||
FlushBuilder();
|
|
||||||
_tokens.Add(LexToken.FromGeneralToken(read));
|
|
||||||
break;
|
|
||||||
case '=':
|
case '=':
|
||||||
FlushBuilder();
|
FlushBuilder();
|
||||||
if(next == read || next == '>')
|
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
_tokens.Add(LexToken.FromGeneralToken($"{(char)read}{(char)next}"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_tokens.Add(LexToken.FromGeneralToken(read));
|
_tokens.Add(LexToken.FromGeneralToken(read));
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case ' ':
|
case ' ':
|
||||||
case '\n':
|
case '\n':
|
||||||
case '\t':
|
case '\t':
|
|
@ -13,6 +13,7 @@ namespace tlang
|
||||||
}
|
}
|
||||||
public override TObject Execute(IScopeEnvironment nodeEnv)
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
{
|
{
|
||||||
|
|
||||||
var res=Parent.Execute(nodeEnv);
|
var res=Parent.Execute(nodeEnv);
|
||||||
|
|
||||||
var dict = res as TDictionary;
|
var dict = res as TDictionary;
|
||||||
|
@ -48,6 +49,7 @@ namespace tlang
|
||||||
}
|
}
|
||||||
else if(array != null)
|
else if(array != null)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(Text == "add")
|
if(Text == "add")
|
||||||
{
|
{
|
||||||
if(Args.Count == 1)
|
if(Args.Count == 1)
|
|
@ -3,12 +3,24 @@ namespace tlang
|
||||||
internal class Parser
|
internal class Parser
|
||||||
{
|
{
|
||||||
|
|
||||||
public Parser()
|
public Parser(List<LexToken> tokens)
|
||||||
{
|
{
|
||||||
|
int i=0;
|
||||||
|
Node = ParseExpression(tokens,ref i,true);
|
||||||
}
|
}
|
||||||
|
public Node Node {get;set;}
|
||||||
|
|
||||||
public Node ParseExpression(List<LexToken> tokens,ref int i,bool isFirst=false)
|
public TObject Execute(IScopeEnvironment env,params TObject[] args)
|
||||||
|
{
|
||||||
|
var res=Node.Execute(env);
|
||||||
|
var main = env["main"] as ICallable;
|
||||||
|
if(main != null)
|
||||||
|
{
|
||||||
|
res=main.Call(args);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
private Node ParseExpression(List<LexToken> tokens,ref int i,bool isFirst=false)
|
||||||
{
|
{
|
||||||
if(i>= tokens.Count) return new ConstNode(new TNumber(0));
|
if(i>= tokens.Count) return new ConstNode(new TNumber(0));
|
||||||
if(tokens[i].Text == "{" || isFirst)
|
if(tokens[i].Text == "{" || isFirst)
|
||||||
|
@ -39,7 +51,7 @@ namespace tlang
|
||||||
if(i<tokens.Count && tokens[i].Text == "=")
|
if(i<tokens.Count && tokens[i].Text == "=")
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
GetVariableValue? gvar = myExpression as GetVariableValue;
|
var gvar = myExpression as GetVariableValue;
|
||||||
if(gvar != null)
|
if(gvar != null)
|
||||||
{
|
{
|
||||||
myExpression= new SetVariableNode(gvar,ParseSum(tokens,ref i));
|
myExpression= new SetVariableNode(gvar,ParseSum(tokens,ref i));
|
||||||
|
@ -164,7 +176,7 @@ namespace tlang
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
Node ls = ParseExpression(tokens,ref i);
|
Node ls = ParseExpression(tokens,ref i);
|
||||||
GetVariableValue? name = new GetVariableValue("item");
|
var name = new GetVariableValue("item");
|
||||||
if(i<tokens.Count && tokens[i].Text == ":")
|
if(i<tokens.Count && tokens[i].Text == ":")
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
|
@ -418,10 +430,316 @@ namespace tlang
|
||||||
}
|
}
|
||||||
return myExpression;
|
return myExpression;
|
||||||
}
|
}
|
||||||
|
private TObject CreateStream(Stream strm)
|
||||||
|
{
|
||||||
|
TDictionary dict = new TDictionary();
|
||||||
|
dict["setposition"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length ==1)
|
||||||
|
{
|
||||||
|
var pos = args2[0] as TNumber;
|
||||||
|
if(pos != null)
|
||||||
|
{
|
||||||
|
strm.Position = (long)pos.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TObject.Null;
|
||||||
|
});
|
||||||
|
dict["getposition"] = new TExternalMethod((args2)=>{
|
||||||
|
return new TNumber(strm.Position);
|
||||||
|
});
|
||||||
|
dict["getlength"] = new TExternalMethod((args2)=>{
|
||||||
|
return new TNumber(strm.Length);
|
||||||
|
});
|
||||||
|
dict["getcount"] = new TExternalMethod((args2)=>{
|
||||||
|
return new TNumber(strm.Length);
|
||||||
|
});
|
||||||
|
dict["canread"] = new TExternalMethod((args2)=>{
|
||||||
|
return new TNumber(strm.CanRead ? 1 : 0);
|
||||||
|
});
|
||||||
|
dict["canwrite"] = new TExternalMethod((args2)=>{
|
||||||
|
return new TNumber(strm.CanWrite ? 1 : 0);
|
||||||
|
});
|
||||||
|
dict["canseek"] = new TExternalMethod((args2)=>{
|
||||||
|
return new TNumber(strm.CanSeek ? 1 : 0);
|
||||||
|
});
|
||||||
|
dict["write"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length >= 2)
|
||||||
|
{
|
||||||
|
var bufAr = args2[0] as TArray;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(args2.Length == 3)
|
||||||
|
{
|
||||||
|
//buffer,offset,len
|
||||||
|
var _offset = args2[1] as TNumber;
|
||||||
|
var _len = args2[2] as TNumber;
|
||||||
|
|
||||||
|
if(bufAr != null && _offset != null && _len != null)
|
||||||
|
{
|
||||||
|
int count = (int)_len.Value;
|
||||||
|
int offset = (int)_offset.Value;
|
||||||
|
int totalRead = Math.Min(bufAr.Items.Count - offset,count);
|
||||||
|
byte[] buffer = new byte[totalRead];
|
||||||
|
|
||||||
|
for(int i = 0;i<totalRead;i++)
|
||||||
|
{
|
||||||
|
var item = bufAr.Items[i+offset];
|
||||||
|
var c = item as TChar;
|
||||||
|
var n = item as TNumber;
|
||||||
|
if(c != null) buffer[i] = (byte)c.Value;
|
||||||
|
if(n != null) buffer[i] = (byte)n.Value;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.Write(buffer,0,buffer.Length);
|
||||||
|
return new TNumber(totalRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var _len = args2[1] as TNumber;
|
||||||
|
|
||||||
|
if(bufAr != null && _len != null)
|
||||||
|
{
|
||||||
|
int count = (int)_len.Value;
|
||||||
|
|
||||||
|
int totalRead = Math.Min(bufAr.Items.Count,count);
|
||||||
|
byte[] buffer = new byte[totalRead];
|
||||||
|
|
||||||
|
for(int i = 0;i<totalRead;i++)
|
||||||
|
{
|
||||||
|
var item = bufAr.Items[i];
|
||||||
|
var c = item as TChar;
|
||||||
|
var n = item as TNumber;
|
||||||
|
if(c != null) buffer[i] = (byte)c.Value;
|
||||||
|
if(n != null) buffer[i] = (byte)n.Value;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
strm.Write(buffer,0,buffer.Length);
|
||||||
|
return new TNumber(totalRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}return new TNumber(0);
|
||||||
|
});
|
||||||
|
dict["read"] = new TExternalMethod((args2)=>{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(args2.Length >= 2)
|
||||||
|
{
|
||||||
|
var bufAr = args2[0] as TArray;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(args2.Length == 3)
|
||||||
|
{
|
||||||
|
//buffer,offset,len
|
||||||
|
var _offset = args2[1] as TNumber;
|
||||||
|
var _len = args2[2] as TNumber;
|
||||||
|
|
||||||
|
if(bufAr != null && _offset != null && _len != null)
|
||||||
|
{
|
||||||
|
int count = (int)_len.Value;
|
||||||
|
int offset = (int)_offset.Value;
|
||||||
|
int totalRead = Math.Min(bufAr.Items.Count - offset,count);
|
||||||
|
byte[] buffer = new byte[totalRead];
|
||||||
|
totalRead=strm.Read(buffer,0,buffer.Length);
|
||||||
|
for(int i = 0;i<totalRead;i++)
|
||||||
|
{
|
||||||
|
bufAr.Items[i+offset] = new TNumber(buffer[i]);
|
||||||
|
}
|
||||||
|
return new TNumber(totalRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var _len = args2[1] as TNumber;
|
||||||
|
|
||||||
|
if(bufAr != null && _len != null)
|
||||||
|
{
|
||||||
|
int count = (int)_len.Value;
|
||||||
|
|
||||||
|
int totalRead = Math.Min(bufAr.Items.Count,count);
|
||||||
|
byte[] buffer = new byte[totalRead];
|
||||||
|
totalRead=strm.Read(buffer,0,buffer.Length);
|
||||||
|
for(int i = 0;i<totalRead;i++)
|
||||||
|
{
|
||||||
|
bufAr.Items[i] = new TNumber(buffer[i]);
|
||||||
|
}
|
||||||
|
return new TNumber(totalRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}return new TNumber(0);
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
dict["close"] = new TExternalMethod((args2)=>{
|
||||||
|
strm.Dispose();
|
||||||
|
return TObject.Uninit;
|
||||||
|
});
|
||||||
|
dict["flush"] = new TExternalMethod((args2)=>{
|
||||||
|
strm.Flush();
|
||||||
|
return TObject.Uninit;
|
||||||
|
});
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
public void LoadEnvironment(RootEnvironment env)
|
public void LoadEnvironment(RootEnvironment env)
|
||||||
{
|
{
|
||||||
TDictionary fs = new TDictionary();
|
TDictionary fs = new TDictionary();
|
||||||
|
fs["file_exists"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
if(File.Exists(fileName)) return new TNumber(1);
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
_=ex;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TNumber(0);
|
||||||
|
});
|
||||||
|
fs["dir_exists"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
if(Directory.Exists(fileName)) return new TNumber(1);
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
_=ex;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TNumber(0);
|
||||||
|
});
|
||||||
|
fs["mkdir"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
if(Directory.Exists(fileName)) return new TNumber(2);
|
||||||
|
Directory.CreateDirectory(fileName);
|
||||||
|
return new TNumber(1);
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
_=ex;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TNumber(0);
|
||||||
|
});
|
||||||
|
fs["create"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
return CreateStream(File.Create(fileName));
|
||||||
|
}catch(Exception ex){
|
||||||
|
_=ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TObject.Null;
|
||||||
|
});
|
||||||
|
fs["openread"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
return CreateStream(File.OpenRead(fileName));
|
||||||
|
}catch(Exception ex){
|
||||||
|
_=ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TObject.Null;
|
||||||
|
});
|
||||||
|
fs["openwrite"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
return CreateStream(File.OpenWrite(fileName));
|
||||||
|
}catch(Exception ex){
|
||||||
|
_=ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TObject.Null;
|
||||||
|
});
|
||||||
|
fs["append"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
return CreateStream(File.Open(fileName,FileMode.Append));
|
||||||
|
}catch(Exception ex){
|
||||||
|
_=ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TObject.Null;
|
||||||
|
});
|
||||||
|
|
||||||
|
fs["readalltext"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
if(!File.Exists(fileName)) return TObject.Null;
|
||||||
|
return new TString(File.ReadAllText(fileName));
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
_=ex;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TObject.Null;
|
||||||
|
});
|
||||||
|
fs["writealltext"] = new TExternalMethod((args2)=>{
|
||||||
|
if(args2.Length >= 2)
|
||||||
|
{
|
||||||
|
var fileName=args2[0].ToString();
|
||||||
|
var text = args2[1].ToString();
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName) && text != null)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
File.WriteAllText(fileName,text);
|
||||||
|
return new TNumber(1);
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
_=ex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TNumber(0);
|
||||||
|
});
|
||||||
fs["home"] = new TString(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile));
|
fs["home"] = new TString(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile));
|
||||||
fs["enumerate_files"] = new TExternalMethod((args)=>{
|
fs["enumerate_files"] = new TExternalMethod((args)=>{
|
||||||
if(args.Length > 0)
|
if(args.Length > 0)
|
||||||
|
@ -477,6 +795,105 @@ namespace tlang
|
||||||
return TObject.Null;
|
return TObject.Null;
|
||||||
});
|
});
|
||||||
env["fs"]=fs;
|
env["fs"]=fs;
|
||||||
|
TDictionary reflection = new TDictionary();
|
||||||
|
reflection["parse_code"] = new TExternalMethod((args2)=>{
|
||||||
|
|
||||||
|
if(args2.Length > 0)
|
||||||
|
{
|
||||||
|
var str = args2[0] as TString;
|
||||||
|
if(str != null)
|
||||||
|
{
|
||||||
|
Lexer lexer = new Lexer(new StringReader(str.Value));
|
||||||
|
try{
|
||||||
|
Parser _parser=new Parser(lexer.Tokens);
|
||||||
|
|
||||||
|
|
||||||
|
RootEnvironment env2 = new RootEnvironment();
|
||||||
|
TDictionary rootDict = new TRootDict(env2);
|
||||||
|
LoadEnvironment(env2);
|
||||||
|
TDictionary parseCodeVal = new TDictionary();
|
||||||
|
var argsArray= new TArray();
|
||||||
|
parseCodeVal["root"] = rootDict;
|
||||||
|
parseCodeVal["args"] = argsArray;
|
||||||
|
parseCodeVal["run"] = new TExternalMethod((args4)=>{
|
||||||
|
//run()
|
||||||
|
try{
|
||||||
|
return _parser.Execute(env2,argsArray.Items.ToArray());
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
|
||||||
|
_=ex;
|
||||||
|
return TObject.Null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return parseCodeVal;
|
||||||
|
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
_=ex;
|
||||||
|
return TObject.Null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return TObject.Uninit;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
env["reflection"] = reflection;
|
||||||
|
var con = new TDictionary();
|
||||||
|
con["write"] = new TExternalMethod((args2)=>{
|
||||||
|
foreach(var arg in args2)
|
||||||
|
{
|
||||||
|
Console.Write(arg);
|
||||||
|
}
|
||||||
|
return new TNumber(args2.Length);
|
||||||
|
});
|
||||||
|
con["writeln"] = new TExternalMethod((args2)=>{
|
||||||
|
foreach(var arg in args2)
|
||||||
|
{
|
||||||
|
Console.Write(arg);
|
||||||
|
}
|
||||||
|
Console.WriteLine();
|
||||||
|
return new TNumber(args2.Length);
|
||||||
|
});
|
||||||
|
|
||||||
|
var instance = new TDictionary();
|
||||||
|
instance["array"] = new TExternalMethod((args2)=>{
|
||||||
|
|
||||||
|
|
||||||
|
return new TArray();
|
||||||
|
});
|
||||||
|
instance["dict"] = new TExternalMethod((args2)=>{
|
||||||
|
return new TDictionary();
|
||||||
|
});
|
||||||
|
env["create"] =instance;
|
||||||
|
env["console"]=con;
|
||||||
|
env["int"] = new TExternalMethod((args2)=>{
|
||||||
|
|
||||||
|
if(args2.Length == 1)
|
||||||
|
{
|
||||||
|
var arg = args2[0];
|
||||||
|
var sArg = arg as TString;
|
||||||
|
var dArg = arg as TNumber;
|
||||||
|
if(sArg != null)
|
||||||
|
{
|
||||||
|
long val;
|
||||||
|
if(long.TryParse(sArg.Value,out val))
|
||||||
|
{
|
||||||
|
return new TNumber(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dArg != null)
|
||||||
|
{
|
||||||
|
return new TNumber(Math.Round(dArg.Value));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return TObject.Null;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
public class ApplicationRunner
|
||||||
|
{
|
||||||
|
public static Stream GetLauncherScript()
|
||||||
|
{
|
||||||
|
var fileName = System.Environment.GetEnvironmentVariable("TLANG_LAUNCHER_SCRIPT");
|
||||||
|
if(!string.IsNullOrWhiteSpace(fileName))
|
||||||
|
{
|
||||||
|
return File.OpenRead(fileName);
|
||||||
|
}
|
||||||
|
return typeof(ApplicationRunner).Assembly.GetManifestResourceStream("tlanglib.launcher.launcher.tlang");
|
||||||
|
|
||||||
|
}
|
||||||
|
public static int Run(List<LexToken> code,string[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RootEnvironment env=new RootEnvironment();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Parser parser=new Parser(code);
|
||||||
|
parser.LoadEnvironment(env);
|
||||||
|
List<TString> args2=new List<TString>();
|
||||||
|
foreach(var argument in args)
|
||||||
|
{
|
||||||
|
args2.Add(new TString(argument));
|
||||||
|
}
|
||||||
|
|
||||||
|
var res= parser.Execute(env,args2.ToArray()) as TNumber;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(res != null)
|
||||||
|
{
|
||||||
|
return (int)res.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,25 @@
|
||||||
namespace tlang
|
namespace tlang
|
||||||
{
|
{
|
||||||
|
public class TRootDict : TDictionary
|
||||||
|
{
|
||||||
|
IScopeEnvironment env;
|
||||||
|
public TRootDict(IScopeEnvironment env)
|
||||||
|
{
|
||||||
|
this.env=env;
|
||||||
|
}
|
||||||
|
public override TObject GetMember(string name)
|
||||||
|
{
|
||||||
|
return env.GetVariable(name);
|
||||||
|
}
|
||||||
|
public override void SetMember(string name, TObject obj)
|
||||||
|
{
|
||||||
|
env.SetVariable(name,obj);
|
||||||
|
}
|
||||||
|
public override bool MemberExists(string name)
|
||||||
|
{
|
||||||
|
return env.VariableExists(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
public class TDictionary : TObject
|
public class TDictionary : TObject
|
||||||
{
|
{
|
||||||
public override bool AsBoolean {get =>true;}
|
public override bool AsBoolean {get =>true;}
|
||||||
|
@ -10,7 +30,7 @@ namespace tlang
|
||||||
|
|
||||||
Dictionary<string,TObject> items {get;set;}=new Dictionary<string, TObject>();
|
Dictionary<string,TObject> items {get;set;}=new Dictionary<string, TObject>();
|
||||||
|
|
||||||
public TObject GetMember(string name)
|
public virtual TObject GetMember(string name)
|
||||||
{
|
{
|
||||||
if(items.ContainsKey(name))
|
if(items.ContainsKey(name))
|
||||||
{
|
{
|
||||||
|
@ -20,7 +40,7 @@ namespace tlang
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetMember(string name, TObject obj)
|
public virtual void SetMember(string name, TObject obj)
|
||||||
{
|
{
|
||||||
if(items.ContainsKey(name))
|
if(items.ContainsKey(name))
|
||||||
{
|
{
|
||||||
|
@ -32,7 +52,7 @@ namespace tlang
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool MemberExists(string name)
|
public virtual bool MemberExists(string name)
|
||||||
{
|
{
|
||||||
return items.ContainsKey(name);
|
return items.ContainsKey(name);
|
||||||
}
|
}
|
|
@ -53,7 +53,7 @@ namespace tlang
|
||||||
{
|
{
|
||||||
for(int i =0;i<Body.Arguments.Count;i++)
|
for(int i =0;i<Body.Arguments.Count;i++)
|
||||||
{
|
{
|
||||||
if(Body.Arguments[i].StartsWith('$'))
|
if(Body.Arguments[i].StartsWith("$"))
|
||||||
{
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
main = func($$args){
|
||||||
|
if(fs.file_exists(args[0]))
|
||||||
|
{
|
||||||
|
code = reflection.parse_code(fs.readalltext(args[0]));
|
||||||
|
code.run();
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,15 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<!--<OutputType>Exe</OutputType>-->
|
||||||
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
|
||||||
|
<LangVersion>10.0</LangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="launcher\launcher.tlang" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
Loading…
Reference in New Issue