Parser Seems done!
This commit is contained in:
parent
94f6de20ce
commit
c48bd44bc3
|
@ -77,70 +77,70 @@ namespace TLang.Parser
|
|||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,ParseLOr()){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,ParseLOr()){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "+=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new AddNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new AddNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "-=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new SubtractNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new SubtractNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "*=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new MultiplyNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new MultiplyNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "/=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new DivideNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new DivideNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "%=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new ModuloNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new ModuloNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "|=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new BOrNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new BOrNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "&=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new BAndNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new BAndNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "^=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new XOrNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new XOrNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
if(token.Text == "^^=")
|
||||
{
|
||||
var symbolNode = expr as SymbolNode;
|
||||
if(symbolNode == null) throw new CompilerError("Assigning variable to something that is not a symbol",expr);
|
||||
|
||||
expr = new SetVariableNode(symbolNode.Name,new PowNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
expr = new SetVariableNode(symbolNode,new PowNode(new GetVariableNode(symbolNode.Name),ParseLOr())){LineInfo=token.Position};
|
||||
}
|
||||
}
|
||||
return expr;
|
||||
|
@ -638,12 +638,102 @@ namespace TLang.Parser
|
|||
}
|
||||
}
|
||||
else{
|
||||
Node ret = new Node();
|
||||
SymbolNode ret = new NullNode();
|
||||
if(token.Text == "func")
|
||||
{
|
||||
var res = new GetVariableNode(Context.NextEntry.Text);
|
||||
if(Context.MoreTokens && Context.)
|
||||
if(Context.MoreTokens && Context.NextEntries(true,"(").Success)
|
||||
{
|
||||
List<string> args=new List<string>();
|
||||
while(!Context.NextEntries(true,")").Success)
|
||||
{
|
||||
if(Context.NextEntries(true,",").Success) continue;
|
||||
|
||||
if(Context.Offset < Context.Tokens.Count)
|
||||
{
|
||||
var n0 = ParseNode();
|
||||
var n= n0 as GetVariableNode;
|
||||
if(n != null)
|
||||
{
|
||||
args.Add(n.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new CompilerError("Argument must be a GetVariableNode",n0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new SetVariableNode( res,new ClosureNode(args,ParseNode()));
|
||||
}
|
||||
}
|
||||
if(token.Text == "null")
|
||||
{
|
||||
ret=new NullNode(){LineInfo=token.Position};
|
||||
}
|
||||
else if(token.Text == "undefined")
|
||||
{
|
||||
ret = new UndefinedNode(){LineInfo=token.Position};
|
||||
}
|
||||
else if(token.Text == "true")
|
||||
{
|
||||
ret = new TrueNode(){LineInfo=token.Position};
|
||||
}
|
||||
else if(token.Text == "false")
|
||||
{
|
||||
ret = new FalseNode(){LineInfo=token.Position};
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = new GetVariableNode(token.Text){LineInfo = token.Position};
|
||||
}
|
||||
|
||||
while(Context.MoreTokens && Context.NextEntries(true,"[").Success)
|
||||
{
|
||||
var p = ParseNode();
|
||||
ret = new GetArrayNode(ret,p){LineInfo = p.LineInfo};
|
||||
Context.NextEntries(true,"]");
|
||||
}
|
||||
while(Context.MoreTokens && Context.NextEntries(true,".").Success)
|
||||
{
|
||||
var token2 = Context.NextEntry;
|
||||
|
||||
if(Context.MoreTokens && Context.NextEntries(true,"(").Success)
|
||||
{
|
||||
var mCall = new MethodCallNode(ret,token2.Text){LineInfo=token2.Position};
|
||||
ret = mCall;
|
||||
while(Context.MoreTokens && !Context.NextEntries(true,")").Success)
|
||||
{
|
||||
if(Context.NextEntries(true,",").Success) continue;
|
||||
mCall.Arguments.Add(ParseNode());
|
||||
}
|
||||
}
|
||||
else if(Context.MoreTokens && Context.NextEntries(false,"[").Success)
|
||||
{
|
||||
while(Context.MoreTokens && Context.NextEntries(true,"[").Success)
|
||||
{
|
||||
var p = ParseNode();
|
||||
ret = new GetArrayNode(ret,p){LineInfo = p.LineInfo};
|
||||
Context.NextEntries(true,"]");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = new GetMemberNode(ret,token2.Text){LineInfo = token2.Position};
|
||||
}
|
||||
|
||||
}
|
||||
if(Context.MoreTokens && Context.NextEntries(true,"++").Success)
|
||||
{
|
||||
var r = new PostFixIncrementNode(ret){LineInfo = ret.LineInfo};
|
||||
ret = r;
|
||||
}
|
||||
if(Context.MoreTokens && Context.NextEntries(true,"--").Success)
|
||||
{
|
||||
var r = new PostFixDecrementNode(ret){LineInfo = ret.LineInfo};
|
||||
ret = r;
|
||||
}
|
||||
return ret;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,11 +3,12 @@ namespace TLang.Parser
|
|||
public class SetVariableNode : SymbolNode
|
||||
{
|
||||
|
||||
public SymbolNode SetTo {get;set;}
|
||||
public Node Expression {get;set;}
|
||||
|
||||
public SetVariableNode(string name, Node expr)
|
||||
public SetVariableNode(SymbolNode setTo, Node expr)
|
||||
{
|
||||
Name = name;
|
||||
SetTo = setTo;
|
||||
Expression = expr;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue