using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace OCamlC.Tests { class AstToString : ASTVisitor { private StringBuilder _str = new StringBuilder(); public override string ToString() { return _str.ToString(); } public static string Read(AST.Base node) { AstToString visitor = new AstToString(); node.Accept(visitor); return visitor.ToString(); } #region ASTVisitor Members public void Visit(OCamlC.AST.CharLiteral node) { _str.Append(node.Value); } public void Visit(OCamlC.AST.InfixExpression node) { putChildrenInParens(node); } private void putChildrenInParens(OCamlC.AST.Base node) { _str.Append("("); foreach (AST.Base child in node.ChildNodes) { child.Accept(this); _str.Append(" "); } if (_str.Length > 1) _str.Length--; _str.Append(")"); } public void Visit(OCamlC.AST.FloatLiteral node) { _str.Append(node.Value); } public void Visit(OCamlC.AST.Identifier node) { _str.Append(node.Name); } public void Visit(OCamlC.AST.InfixSymbol node) { _str.Append(node.Name); } public void Visit(OCamlC.AST.IntLiteral node) { _str.Append(node.Value); } public void Visit(OCamlC.AST.Keyword node) { _str.Append(node.AsString); } public void Visit(OCamlC.AST.Label node) { _str.Append(node.Name); } public void Visit(OCamlC.AST.OperatorSymbol node) { _str.Append(node.Name); } public void Visit(OCamlC.AST.OptLabel node) { _str.Append(node.Name); } public void Visit(OCamlC.AST.PrefixSymbol node) { _str.Append(node.Name); } public void Visit(OCamlC.AST.StringLiteral node) { _str.Append(node.Value); } public void Visit(OCamlC.AST.PrefixExpression node) { putChildrenInParens(node); } public void Visit(OCamlC.AST.FunctionApplication node) { putChildrenInParens(node); } #endregion } }