public void CustomVisitorTest() { var source = MultiLine( "function func(c: System.Int32): System.Void do" + " var b = 45; " + " if (b == 10)" + " skip;" + " end;" + "end;" ); var result = ParseWithAbstractTreeVisitor(Compiler, source); var text = new StringBuilder(); var visitor = new TreeVisitorBase<object>(); visitor .Clear() .If<BinaryExpressionNode>((_visitor, node) => { _visitor.VisitChild(node.Left); text.Append(" " + node.Operator.Operator + " "); _visitor.VisitChild(node.Right); var op = node.Operator.Operator; return null; }) .If<VariableDeclarationStatementNode>((_visitor, node) => _visitor.VisitChild(node.InitialValue)) .If<BlockStatementNode>((_visitor, node) => text.Append(string.Join(Environment.NewLine, node.Statements.Select(_visitor.VisitChild)))) .If<NumberConstantLiteralNode>((_visitor, node) => text.Append(node.Value.ToString(CultureInfo.InvariantCulture))) .VisitChild(result); text.Clear().AppendLine("digraph {"); var nodes = new List<Tuple<string, string>>(); visitor.Clear() .DefaultVisitor((_visitor, node) => { var name = "node" + nodes.Count; var type = node.GetType().Name.First().ToString(); nodes.Add(Tuple.Create(name, type)); if (!node.Children.Any()) text.Append(name + ";"); foreach (var child in node.Children) { text.Append(name + "->"); _visitor.VisitChild(child); } return null; }) .VisitChild(result); text.AppendLine(); foreach (var tuple in nodes) text.AppendLine(string.Format("{0} [label=\"{1}\"];", tuple.Item1, tuple.Item2)); var dot = text.AppendLine("}").ToString(); }
public void CustomVisitorGraphConverterTest() { var source = MultiLine( "function a(c: System.Int32): System.Int32 do" + " var b = 45; " + " if (b == 10)" + " skip;" + " end;" + "end;" ); var result = ParseWithAbstractTreeVisitor(Compiler, source); var text = new StringBuilder(); var visitor = new TreeVisitorBase<string>(); var nodes = new List<Tuple<string, string>>(); var edges = new List<Tuple<string, string>>(); visitor .Clear() .DefaultVisitor((_visitor, node) => { var name = "node" + nodes.Count; var type = node.GetType().Name; nodes.Add(Tuple.Create(name, type)); foreach (var child in node.Children) { var childName = _visitor.VisitChild(child); edges.Add(Tuple.Create(name, childName)); } return name; }) .VisitChild(result); foreach (var node in nodes) text.AppendLine(string.Format("g.addNode(\"{0}\", {{ label: \"{1}\" }});", node.Item1, node.Item2)); foreach (var edge in edges) text.AppendLine(string.Format("g.addEdge(\"{0}\", \"{1}\");", edge.Item1, edge.Item2)); var js = text.ToString(); }