private Assignment ParseFunctionDecl(ParseTreeNode node) { if (node.Term.Name == "FunctionDecl") { var expr = ParseVariable(node.ChildNodes[1]); var argsNode = node.ChildNodes[3].ChildNodes[0]; var chunkNode = node.ChildNodes[4]; var block = ParseBlock(chunkNode); var def = new FunctionDefinition(); def.Arguments = new List<Argument>(); var nameNode = node.ChildNodes[2]; if (nameNode.ChildNodes.Count > 0) { def.Arguments.Add(new Argument { Name = "self" }); /*expr = new Ast.Variable() { Name = nameNode.ChildNodes[0].Token.ValueString, Prefix = expr };*/ var token = nameNode.ChildNodes[0].Token; expr = new TableAccess { Expression = expr, Index = new StringLiteral { Value = token.ValueString, lineNumber = token.Location.Line, columnNumber = token.Location.Column, filename = curParseTree.FileName } }; } def.Body = block; if (argsNode.ChildNodes.Count > 0) { argsNode = argsNode.ChildNodes[0]; while (argsNode.ChildNodes.Count > 0) { if (argsNode.ChildNodes[0].Term.Name == "Varargs") { def.isVarargs = true; break; } var ident = argsNode.ChildNodes[0].Token.ValueString; def.Arguments.Add(new Argument { Name = ident }); if (argsNode.ChildNodes.Count == 1) break; argsNode = argsNode.ChildNodes[1]; } } var assign = new Assignment(); assign.Variables.Add(expr); assign.Expressions.Add(def); return assign; } throw new Exception("Invalid FunctionDecl node"); }
private Assignment ParseAssign(ParseTreeNode node) { if (node.Term.Name == "Assignment") { var assign = new 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"); }