public override void Init(AstContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); // prefixexp args if (treeNode.ChildNodes.Count == 2) { Target = AddChild(String.Empty, treeNode.ChildNodes[0]) as LuaNode; Arguments = AddChild(String.Empty, treeNode.ChildNodes[1]) as LuaNode; Name = null; } // prefixexp `:´ Name args else if (treeNode.ChildNodes.Count == 4) { Target = AddChild(String.Empty, treeNode.ChildNodes[0]) as LuaNode; Name = AddChild(String.Empty, treeNode.ChildNodes[2]) as LuaNode; Arguments = AddChild(String.Empty, treeNode.ChildNodes[3]) as LuaNode; } //foreach (var node in treeNode.ChildNodes) //{ // if (node.Term.Name == "identifier") // name += node.FindTokenAndGetText(); // if (node.Term.Flags.IsSet(TermFlags.IsOperator)) // name += node.Term.Name; // if (node.Term.Name == "expr list") // Arguments = AddChild("Args", node); //} AsString = "Function Call"; }
public override void Init(AstContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); if (treeNode.ChildNodes.Count != 4) { return; } Expression = AddChild("elseif expr", treeNode.ChildNodes[1]) as LuaNode; ElseIfBlock = AddChild("elseif block", treeNode.ChildNodes[3]) as LuaBlockNode; }
public void AddChild(string role, LuaNode child) { if (child == null) { return; } child.Role = role; child.Parent = this; ChildNodes.Add(child); }
private DeclarationType GetDeclarationType(LuaNode variable, LuaBlockNode block, out Declaration namespaces) { namespaces = null; if (variable is LuaIdentifierNode) { foreach (var localDeclaration in block.Locals) { if (variable.AsString == localDeclaration.Name) { return DeclarationType.None; } } foreach (var globalDeclaration in block.Globals) { if (variable.AsString == globalDeclaration.Name) { return DeclarationType.None; } } } else if (variable is LuaTableAccessNode) { foreach (var localDeclaration in block.Locals) { //List<string> names = new List<string>(variable.AsString.Split('.')); Declaration dummyDeclaration = DeclarationHelper.BuildDeclaration(variable.AsString); if (dummyDeclaration.Equal(localDeclaration)) return DeclarationType.None; if (dummyDeclaration.NameSpace != null && dummyDeclaration.NameSpace.Equal(localDeclaration)) { namespaces = localDeclaration; return DeclarationType.Local; } } foreach (var globalDeclaration in block.Globals) { //List<string> names = new List<string>(variable.AsString.Split('.')); Declaration dummyDeclaration = DeclarationHelper.BuildDeclaration(variable.AsString); if (dummyDeclaration.Equal(globalDeclaration)) return DeclarationType.None; if (dummyDeclaration.NameSpace != null && dummyDeclaration.NameSpace.Equal(globalDeclaration)) { namespaces = globalDeclaration; return DeclarationType.Global; } } } return DeclarationType.Global; }
public override void Init(AstContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); if (treeNode.ChildNodes.Count != 5) { return; } Expression = treeNode.ChildNodes[1].AstNode as LuaNode; Block = treeNode.ChildNodes[3].AstNode as LuaNode; AddChild("while loop expr", Expression); AddChild("while loop block", Block); }
public override void Init(AstContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); if (treeNode.ChildNodes.Count > 1) { Name = AddChild("key", treeNode.ChildNodes[0]) as LuaNode; Expression = AddChild("value", treeNode.ChildNodes[2]) as LuaNode; AsString = "key/value field"; } else { Name = null; Expression = AddChild("entry", treeNode.ChildNodes[0]) as LuaNode; AsString = "list field"; } }
public override void Init(AstContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); // prefixexp `.´ Name if (treeNode.ChildNodes.Count == 3) { AsString = (treeNode.ChildNodes[0].AstNode as LuaNode) + "." + (treeNode.ChildNodes[2].AstNode as LuaNode); PrefixNode = AddChild(String.Empty, treeNode.ChildNodes[0]) as LuaNode; Expr = AddChild(String.Empty, treeNode.ChildNodes[2]) as LuaNode; } // prefixexp `[´ exp `]´ if (treeNode.ChildNodes.Count == 4) { } }
public void GetDeclarations(LuaBlockNode block, LuaModel model) { for (int i = 0; i < VariableList.Count; ++i) { LuaNode variable = VariableList[i]; Declaration namespaces, sibling = null; bool isDeclarationAssign = false; if (i < ExpressionList.Count) isDeclarationAssign = DeclarationHelper.TryGetExpressionDeclaration(ExpressionList[i], block, model, out sibling); DeclarationType type = GetDeclarationType(variable, block, out namespaces); if (type == DeclarationType.Global && variable is LuaIdentifierNode) { Declaration declaration = new Declaration(variable.AsString, String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine, int.MaxValue, int.MaxValue)); if (isDeclarationAssign) sibling.AddSibling(declaration); block.Globals.Add(declaration); } else if (type == DeclarationType.Global && variable is LuaTableAccessNode) { string[] names = variable.AsString.Split('.'); Declaration declaration = new Declaration(names[names.Length - 1], String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine, int.MaxValue, int.MaxValue), namespaces); if (isDeclarationAssign) sibling.AddSibling(declaration); block.Globals.Add(declaration); } else if (type == DeclarationType.Local) { string[] names = variable.AsString.Split('.'); Declaration declaration = new Declaration(names[names.Length - 1], String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine, block.Span.EndPosition, block.EndLine), namespaces); if (isDeclarationAssign) sibling.AddSibling(declaration); block.Locals.Add(declaration); } } }
public override void Init(AstContext context, ParseTreeNode treeNode) { base.Init(context, treeNode); Expression = AddChild("Test", treeNode.ChildNodes[1]) as LuaNode; IfTrue = AddChild("IfTrue", treeNode.ChildNodes[3]) as LuaBlockNode; foreach (ParseTreeNode variable in treeNode.ChildNodes) { if (variable.ToString() == "ElseIfClause*" && variable.ChildNodes.Count > 0) { foreach (var elseIf in variable.ChildNodes) { AddChild("ElseIf", elseIf); } } if (variable.ToString() == "ElseClause" && variable.ChildNodes.Count > 0) { IfFalse = AddChild("IfFalse", variable.ChildNodes[1]) as LuaNode; } } }
private void AddDeclarationsForTableField(LuaBlockNode block, LuaModel model, Declaration namespaces, LuaNode expr) { if (expr is LuaTableNode) { foreach (var field in ((LuaTableNode)expr).FieldList) { AddDeclarationsForTableField(block, model, namespaces, field); } } if (expr is LuaField && ((LuaField)expr).Name != null) { LuaNode variable = ((LuaField)expr).Name; Declaration declaration = new Declaration(variable.AsString, String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine, block.Span.EndPosition, block.EndLine), namespaces); block.Locals.Add(declaration); AddDeclarationsForTableField(block, model, declaration, ((LuaField)expr).Expression); } }
public void GetDeclarations(LuaBlockNode block, LuaModel model) { for (int i = 0; i < VariableList.Count && i < ExpressionList.Count; ++i) { LuaNode variable = VariableList[i]; Declaration declaration = new Declaration(variable.AsString, String.Empty, model.FilePath, new ScopeSpan(variable.Span.EndPosition, variable.EndLine, block.Span.EndPosition, block.EndLine)); //block.Locals.Add(declaration); if (i < ExpressionList.Count) { if (ExpressionList[i] is LuaTableNode) { declaration.Type = LuaDeclarationType.Table; AddDeclarationsForTableField(block, model, declaration, ExpressionList[i]); } else if (ExpressionList[i] is LuaIdentifierNode || ExpressionList[i] is LuaTableAccessNode) { Declaration sibling = null; if (DeclarationHelper.TryGetExpressionDeclaration(ExpressionList[i], block, model, out sibling)) { declaration.Type = sibling.Type; sibling.AddSibling(declaration); } } } // add declaration as the end in case of circling sibling which lead to stackoverflow block.Locals.Add(declaration); } }
public static bool TryGetExpressionDeclaration(LuaNode expr, LuaBlockNode block, LuaModel model, out Declaration declaration) { declaration = null; if (expr is LuaIdentifierNode) { foreach (var localDeclaration in block.Locals) { if (expr.AsString == localDeclaration.Name) { declaration = localDeclaration; return(true); } } foreach (var globalDeclaration in block.Globals) { if (expr.AsString == globalDeclaration.Name) { declaration = globalDeclaration; return(true); } } foreach (var globalDeclaration in block.Requires) { if (expr.AsString == globalDeclaration.Name) { declaration = globalDeclaration; // clear siblings in case of adding duplicate declaration declaration.ClearSiblingsinFile(model.FilePath); return(true); } } } else if (expr is LuaTableAccessNode) { foreach (var localDeclaration in block.Locals) { Declaration dummyDeclaration = BuildDeclaration(expr.AsString); if (dummyDeclaration.Equal(localDeclaration)) { declaration = localDeclaration; return(true); } } foreach (var globalDeclaration in block.Globals) { Declaration dummyDeclaration = BuildDeclaration(expr.AsString); if (dummyDeclaration.Equal(globalDeclaration)) { declaration = globalDeclaration; return(true); } } foreach (var globalDeclaration in block.Requires) { Declaration dummyDeclaration = BuildDeclaration(expr.AsString); if (dummyDeclaration.Equal(globalDeclaration)) { declaration = globalDeclaration; // clear siblings in case of adding duplicate declaration declaration.ClearSiblingsinFile(model.FilePath); return(true); } } } return(false); }