blob: 29750494610d1ec509f6f958b35b2c2a9c86035b [file] [edit]
// Template generated code from Antlr4BuildTasks.dotnet-antlr v 1.3
using Antlr4.Runtime;
using Antlr4.Runtime.Misc;
using Antlr4.Runtime.Tree;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
public class TreeOutput
{
private static int changed = 0;
private static bool first_time = true;
public static StringBuilder OutputTree(IParseTree tree, Lexer lexer, Parser parser, CommonTokenStream stream)
{
changed = 0;
first_time = true;
var sb = new StringBuilder();
ParenthesizedAST(tree, sb, lexer, parser, stream);
return sb;
}
private static void ParenthesizedAST(IParseTree tree, StringBuilder sb, Lexer lexer, Parser parser, CommonTokenStream stream, int level = 0)
{
if (tree as TerminalNodeImpl != null)
{
TerminalNodeImpl tok = tree as TerminalNodeImpl;
Interval interval = tok.SourceInterval;
IList<IToken> inter = null;
if (tok.Symbol.TokenIndex >= 0)
inter = stream?.GetHiddenTokensToLeft(tok.Symbol.TokenIndex);
if (inter != null)
foreach (var t in inter)
{
var ty = tok.Symbol.Type;
var name = lexer.Vocabulary.GetSymbolicName(ty);
StartLine(sb, level);
sb.AppendLine("(" + name + " text = " + PerformEscapes(t.Text) + " " + lexer.ChannelNames[t.Channel]);
}
{
var ty = tok.Symbol.Type;
var name = lexer.Vocabulary.GetSymbolicName(ty);
StartLine(sb, level);
sb.AppendLine("( " + name + " i =" + tree.SourceInterval.a
+ " txt =" + PerformEscapes(tree.GetText())
+ " tt =" + tok.Symbol.Type
+ " " + lexer.ChannelNames[tok.Symbol.Channel]);
}
}
else
{
var x = tree as RuleContext;
var ri = x.RuleIndex;
var name = parser.RuleNames[ri];
StartLine(sb, level);
sb.Append("( " + name);
sb.AppendLine();
}
for (int i = 0; i<tree.ChildCount; ++i)
{
var c = tree.GetChild(i);
ParenthesizedAST(c, sb, lexer, parser, stream, level + 1);
}
if (level == 0)
{
for (int k = 0; k < 1 + changed - level; ++k) sb.Append(") ");
sb.AppendLine();
changed = 0;
}
}
private static void StartLine(StringBuilder sb, int level = 0)
{
if (changed - level >= 0)
{
if (!first_time)
{
for (int j = 0; j < level; ++j) sb.Append(" ");
for (int k = 0; k < 1 + changed - level; ++k) sb.Append(") ");
sb.AppendLine();
}
changed = 0;
first_time = false;
}
changed = level;
for (int j = 0; j < level; ++j) sb.Append(" ");
}
private static string ToLiteral(string input)
{
using (var writer = new StringWriter())
{
var literal = input;
literal = literal.Replace("\\", "\\\\");
return literal;
}
}
public static string PerformEscapes(string s)
{
StringBuilder new_s = new StringBuilder();
new_s.Append(ToLiteral(s));
return new_s.ToString();
}
}