public static StringBuilder OutputTree(this IParseTree tree, CommonTokenStream stream, Lexer lexer) { var sb = new StringBuilder(); tree.ParenthesizedAST(sb, stream, lexer); return(sb); }
public static void ParenthesizedAST(this IParseTree tree, StringBuilder sb, string file_name, CommonTokenStream stream, int level = 0) { // Antlr always names a non-terminal with first letter lowercase, // but renames it when creating the type in C#. So, remove the prefix, // lowercase the first letter, and remove the trailing "Context" part of // the name. Saves big time on output! if (tree as TerminalNodeImpl != null) { TerminalNodeImpl tok = tree as TerminalNodeImpl; Interval interval = tok.SourceInterval; System.Collections.Generic.IList <IToken> inter = tok.Symbol.TokenIndex >= 0 ? stream.GetHiddenTokensToLeft(tok.Symbol.TokenIndex) : null; if (inter != null) { foreach (IToken t in inter) { StartLine(sb, file_name, tree, stream, level); sb.AppendLine("( HIDDEN text=" + t.Text.PerformEscapes()); } } StartLine(sb, file_name, tree, stream, level); sb.AppendLine("( TOKEN i=" + tree.SourceInterval.a + " t=" + tree.GetText().PerformEscapes()); } else { string fixed_name = tree.GetType().ToString() .Replace("Antlr4.Runtime.Tree.", ""); fixed_name = Regex.Replace(fixed_name, "^.*[+]", ""); fixed_name = fixed_name.Substring(0, fixed_name.Length - "Context".Length); fixed_name = fixed_name[0].ToString().ToLower() + fixed_name.Substring(1); StartLine(sb, file_name, tree, stream, level); sb.Append("( " + fixed_name); if (level == 0) { sb.Append(" File=\"" + file_name + "\""); } sb.AppendLine(); } for (int i = 0; i < tree.ChildCount; ++i) { IParseTree c = tree.GetChild(i); c.ParenthesizedAST(sb, file_name, stream, level + 1); } if (level == 0) { for (int k = 0; k < 1 + changed - level; ++k) { sb.Append(") "); } sb.AppendLine(); changed = 0; } }
public static StringBuilder OutputTree(this IParseTree tree, CommonTokenStream stream) { StringBuilder sb = new StringBuilder(); changed = 0; first_time = true; tree.ParenthesizedAST(sb, stream); return(sb); }