AST pretty much complete
This commit is contained in:
parent
c91f9b9781
commit
c1a3acee07
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class BitwiseAndNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public BitwiseAndNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("band"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["band"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber((long)lnum.Value & (long)rnum.Value);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class BitwiseOrNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public BitwiseOrNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("bor"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["bor"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber((long)lnum.Value | (long)rnum.Value);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class EqualsNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public EqualsNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("eq"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["eq"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber(lnum.Value == rnum.Value ? 1 : 0);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class GreaterThanEqualsNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public GreaterThanEqualsNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("gte"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["gte"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber(lnum.Value >= rnum.Value ? 1 : 0);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class GreaterThanNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public GreaterThanNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("gt"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["gt"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber(lnum.Value > rnum.Value ? 1 : 0);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class LeftShiftNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public LeftShiftNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("ls"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["ls"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber((long)lnum.Value << (int)rnum.Value);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class LessThanEqualsNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public LessThanEqualsNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("lte"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["lte"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber(lnum.Value <= rnum.Value ? 1 : 0);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class LessThanNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public LessThanNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("lt"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["lt"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber(lnum.Value < rnum.Value ? 1 : 0);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class LogicalAndNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public LogicalAndNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
Left = left;
|
||||||
|
Right = right;
|
||||||
|
}
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
|
||||||
|
var ldict = l as TDictionary;
|
||||||
|
|
||||||
|
if(ldict != null)
|
||||||
|
{
|
||||||
|
var lor=ldict["land"] as ICallable;
|
||||||
|
if(lor != null)
|
||||||
|
{
|
||||||
|
return lor.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TNumber(l.AsBoolean && r.AsBoolean ? 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class LogicalOrNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public LogicalOrNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
Left = left;
|
||||||
|
Right = right;
|
||||||
|
}
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
|
||||||
|
var ldict = l as TDictionary;
|
||||||
|
|
||||||
|
if(ldict != null)
|
||||||
|
{
|
||||||
|
var lor=ldict["lor"] as ICallable;
|
||||||
|
if(lor != null)
|
||||||
|
{
|
||||||
|
return lor.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TNumber(l.AsBoolean || r.AsBoolean ? 1 : 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class NotEqualsNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public NotEqualsNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("neq"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["neq"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber(lnum.Value != rnum.Value ? 1 : 0);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class RightShiftNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public RightShiftNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("rs"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["rs"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber((long)lnum.Value >> (int)rnum.Value);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
namespace tlang
|
||||||
|
{
|
||||||
|
internal class XOrNode : Node
|
||||||
|
{
|
||||||
|
public Node Left {get;set;}
|
||||||
|
public Node Right {get;set;}
|
||||||
|
|
||||||
|
public XOrNode(Node left, Node right)
|
||||||
|
{
|
||||||
|
this.Left = left;
|
||||||
|
this.Right = right;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TObject Execute(IScopeEnvironment nodeEnv)
|
||||||
|
{
|
||||||
|
var l = Left.Execute(nodeEnv);
|
||||||
|
var r = Right.Execute(nodeEnv);
|
||||||
|
var lnum = l as TNumber;
|
||||||
|
var rnum = r as TNumber;
|
||||||
|
var dleft = l as TDictionary;
|
||||||
|
|
||||||
|
if(dleft != null)
|
||||||
|
{
|
||||||
|
if(dleft.MemberExists("xor"))
|
||||||
|
{
|
||||||
|
var mbm = dleft["xor"] as ICallable;
|
||||||
|
if(mbm != null)
|
||||||
|
{
|
||||||
|
return mbm.Call(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lnum != null && rnum != null)
|
||||||
|
return new TNumber((long)lnum.Value ^ (long)rnum.Value);
|
||||||
|
|
||||||
|
return new TNull();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue