From c48bd44bc3bdcdf2147d2c0f22156989e390bb03 Mon Sep 17 00:00:00 2001 From: Michael Nolan Date: Wed, 26 Jul 2023 22:47:21 -0500 Subject: [PATCH] Parser Seems done! --- TLang.Parser/Class1.cs | 114 ++++++++++++++++++++++++++++---- TLang.Parser/SetVariableNode.cs | 5 +- 2 files changed, 105 insertions(+), 14 deletions(-) diff --git a/TLang.Parser/Class1.cs b/TLang.Parser/Class1.cs index 8661120..d38bf92 100644 --- a/TLang.Parser/Class1.cs +++ b/TLang.Parser/Class1.cs @@ -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 args=new List(); + 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; + } } diff --git a/TLang.Parser/SetVariableNode.cs b/TLang.Parser/SetVariableNode.cs index 95c9ce8..1ef4d48 100644 --- a/TLang.Parser/SetVariableNode.cs +++ b/TLang.Parser/SetVariableNode.cs @@ -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; } }