Ast.Assignment ParseAssign(ParseTreeNode node) { if (node.Term.Name == "Assignment") { Ast.Assignment assign = new Ast.Assignment(); var left = node.ChildNodes[0]; var right = node.ChildNodes[1]; assign.Variables.Add(ParseVariable(left.ChildNodes[0])); assign.Expressions.Add(ParseExpression(right.ChildNodes[0])); left = left.ChildNodes[1]; right = right.ChildNodes[1]; while (left.ChildNodes.Count > 0) { left = left.ChildNodes[0]; assign.Variables.Add(ParseVariable(left.ChildNodes[0])); left = left.ChildNodes[1]; } while (right.ChildNodes.Count > 0) { right = right.ChildNodes[0]; assign.Expressions.Add(ParseExpression(right.ChildNodes[0])); right = right.ChildNodes[1]; } return(assign); } throw new Exception("Invalid Assignment node"); }
Ast.Assignment ParseFunctionDecl(ParseTreeNode node) { if (node.Term.Name == "FunctionDecl") { Ast.IAssignable expr = ParseVariable(node.ChildNodes[1]); ParseTreeNode argsNode = node.ChildNodes[3].ChildNodes[0]; ParseTreeNode chunkNode = node.ChildNodes[4]; Ast.Block block = ParseBlock(chunkNode); Ast.FunctionDefinition def = new Ast.FunctionDefinition(); def.Arguments = new List <Ast.Argument>(); var nameNode = node.ChildNodes[2]; if (nameNode.ChildNodes.Count > 0) { def.Arguments.Add(new Ast.Argument() { Name = "self" }); expr = new Ast.Variable() { Name = nameNode.ChildNodes[0].Token.ValueString, Prefix = expr }; } def.Body = block; if (argsNode.ChildNodes.Count > 0) { argsNode = argsNode.ChildNodes[0]; while (argsNode.ChildNodes.Count > 0) { string ident = argsNode.ChildNodes[0].Token.ValueString; def.Arguments.Add(new Ast.Argument() { Name = ident }); if (argsNode.ChildNodes.Count == 1) { break; } argsNode = argsNode.ChildNodes[1]; } } Ast.Assignment assign = new Ast.Assignment(); assign.Variables.Add(expr); assign.Expressions.Add(def); return(assign); } throw new Exception("Invalid FunctionDecl node"); }
static Expression CompileAssignment(Ast.Assignment assign, Expression Context) { var variable = Expression.Parameter(typeof(LuaArguments), "vars"); var stats = new List <Expression>(); stats.Add(Expression.Assign(variable, Expression.New(LuaArguments_New_void))); foreach (IExpression expr in assign.Expressions) { var ret = CompileExpression(expr, Context); stats.Add(Expression.Call(variable, LuaArguments_Concat, ret)); } int i = 0; foreach (IAssignable var in assign.Variables) { var arg = GetArgument(variable, i); if (var is Ast.Variable) { var x = var as Ast.Variable; stats.Add(SetVariable(x, arg, Context)); } else if (var is Ast.TableAccess) { var x = var as Ast.TableAccess; var expression = CompileSingleExpression(x.Expression, Context); var index = CompileSingleExpression(x.Index, Context); var set = Expression.Property(expression, "Item", index); stats.Add(Expression.Assign(set, arg)); } i++; } return(Expression.Block(new[] { variable }, stats.ToArray())); }
Ast.Assignment ParseFunctionDecl(ParseTreeNode node) { if (node.Term.Name == "FunctionDecl") { Ast.IAssignable expr = ParseVariable(node.ChildNodes[1]); ParseTreeNode argsNode = node.ChildNodes[3].ChildNodes[0]; ParseTreeNode chunkNode = node.ChildNodes[4]; Ast.Block block = ParseBlock(chunkNode); Ast.FunctionDefinition def = new Ast.FunctionDefinition(); def.Arguments = new List<Ast.Argument>(); var nameNode = node.ChildNodes[2]; if (nameNode.ChildNodes.Count > 0) { def.Arguments.Add(new Ast.Argument() { Name = "self" }); expr = new Ast.Variable() { Name = nameNode.ChildNodes[0].Token.ValueString, Prefix = expr }; } def.Body = block; if (argsNode.ChildNodes.Count > 0) { argsNode = argsNode.ChildNodes[0]; while (argsNode.ChildNodes.Count > 0) { string ident = argsNode.ChildNodes[0].Token.ValueString; def.Arguments.Add(new Ast.Argument() { Name = ident }); if (argsNode.ChildNodes.Count == 1) break; argsNode = argsNode.ChildNodes[1]; } } Ast.Assignment assign = new Ast.Assignment(); assign.Variables.Add(expr); assign.Expressions.Add(def); return assign; } throw new Exception("Invalid FunctionDecl node"); }
Ast.Assignment ParseAssign(ParseTreeNode node) { if (node.Term.Name == "Assignment") { Ast.Assignment assign = new Ast.Assignment(); var left = node.ChildNodes[0]; var right = node.ChildNodes[1]; assign.Variables.Add(ParseVariable(left.ChildNodes[0])); assign.Expressions.Add(ParseExpression(right.ChildNodes[0])); left = left.ChildNodes[1]; right = right.ChildNodes[1]; while (left.ChildNodes.Count > 0) { left = left.ChildNodes[0]; assign.Variables.Add(ParseVariable(left.ChildNodes[0])); left = left.ChildNodes[1]; } while (right.ChildNodes.Count > 0) { right = right.ChildNodes[0]; assign.Expressions.Add(ParseExpression(right.ChildNodes[0])); right = right.ChildNodes[1]; } return assign; } throw new Exception("Invalid Assignment node"); }