Add tree renderer

This commit is contained in:
Alexander Luzgarev 2018-10-06 19:37:37 +02:00
parent 64d06ec02e
commit d2d631ac6c

View File

@ -8,42 +8,56 @@ using Semantics;
namespace ConsoleDemo namespace ConsoleDemo
{ {
internal class TreeRenderer
{
private static void RenderToken(SyntaxToken token, string indent, bool isLast)
{
Console.Write(indent + (isLast ? "└── " : "├── "));
Console.Write($"<{token.Kind}>");
Console.Write($" {token.Text}");
Console.WriteLine();
}
private static void RenderNode(SyntaxNode node, string indent, bool isLast)
{
Console.Write(indent);
Console.Write(isLast ? "└── " : "├── ");
Console.Write($"<{node.Kind}>");
Console.WriteLine();
var children = node.GetChildNodesAndTokens();
var last = children.Count - 1;
indent += isLast ? " " : "│ ";
for (var index = 0; index <= last; index++)
{
var child = children[index];
if (child.IsNode)
{
RenderNode(child.AsNode(), indent, index == last);
} else if (child.IsToken)
{
RenderToken(child.AsToken(), indent, index == last);
}
}
}
public static void Render(SyntaxNode node)
{
RenderNode(node, "", true);
}
}
class Program class Program
{ {
private static readonly string BaseDirectory; private static readonly string BaseDirectory;
private const string BaseDirectoryMacOs = @"/Applications/MATLAB_R2017b.app/toolbox/matlab/"; private const string BaseDirectoryMacOs = @"/Applications/MATLAB_R2017b.app/toolbox/matlab/";
private const string BaseDirectoryWindows = @"D:\Program Files\MATLAB\R2018a\toolbox\matlab\"; private const string BaseDirectoryWindows = @"D:\Program Files\MATLAB\R2018a\toolbox\matlab\";
private static readonly HashSet<string> SkipFiles = new HashSet<string>
{
@"codetools\private\template.m", // this is a template, so it contains '$' characters.
@"plottools\+matlab\+graphics\+internal\+propertyinspector\+views\CategoricalHistogramPropertyView.m", // this one contains a 0xA0 character (probably it's 'non-breakable space' in Win-1252).
@"plottools\+matlab\+graphics\+internal\+propertyinspector\+views\PrimitiveHistogram2PropertyView.m", // same
@"plottools\+matlab\+graphics\+internal\+propertyinspector\+views\PrimitiveHistogramPropertyView.m", // same
@"codetools/private/template.m", // this is a template, so it contains '$' characters.
@"plottools/+matlab/+graphics/+internal/+propertyinspector/+views/CategoricalHistogramPropertyView.m", // this one contains a 0xA0 character (probably it's 'non-breakable space' in Win-1252).
@"plottools/+matlab/+graphics/+internal/+propertyinspector/+views/PrimitiveHistogram2PropertyView.m", // same
@"plottools/+matlab/+graphics/+internal/+propertyinspector/+views/PrimitiveHistogramPropertyView.m", // same
};
private static MParser CreateParser(ITextWindow window) private static MParser CreateParser(ITextWindow window)
{ {
return new MParser(window); return new MParser(window);
} }
private static void ProcessFile(string fileName)
{
var text = File.ReadAllText(fileName);
var window = new TextWindowWithNull(text, fileName);
var parser = CreateParser(window);
var tree = parser.Parse();
var actual = tree.FullText;
if (actual != text)
{
throw new ApplicationException();
}
}
static Program() static Program()
{ {
switch (Environment.OSVersion.Platform) switch (Environment.OSVersion.Platform)
@ -58,40 +72,18 @@ namespace ConsoleDemo
} }
} }
private static int ProcessDirectory(string directory)
{
var counter = 0;
var files = Directory.GetFiles(directory, "*.m");
foreach (var file in files)
{
var relativePath = Path.GetRelativePath(BaseDirectory, file);
if (SkipFiles.Contains(relativePath))
{
continue;
}
ProcessFile(file);
counter++;
}
var subDirectories = Directory.GetDirectories(directory);
foreach (var subDirectory in subDirectories)
{
counter += ProcessDirectory(subDirectory);
}
return counter;
}
private static void ParserDemo() private static void ParserDemo()
{ {
Console.WriteLine("Hello World!"); Console.WriteLine("Hello World!");
var sw = new Stopwatch(); var text = @"
sw.Start(); function [a, b c] = functionName(d, e, f)
var processed = ProcessDirectory(BaseDirectory); a = d + e;
sw.Stop(); end
Console.WriteLine($"{processed} files parsed. Elapsed: {sw.Elapsed}."); ";
//AfterFunctionFinish(); var window = new TextWindowWithNull(text, "noname");
//FirstTokenFinish(); var parser = CreateParser(window);
var tree = parser.Parse();
TreeRenderer.Render(tree);
Console.ReadKey(); Console.ReadKey();
} }
@ -161,11 +153,11 @@ namespace ConsoleDemo
public static void Main(string[] args) public static void Main(string[] args)
{ {
//ParserDemo(); ParserDemo();
//SemanticsDemo(); //SemanticsDemo();
//ContextDemo(); //ContextDemo();
//DumbPrinterDemo(); //DumbPrinterDemo();
UsageDemo(); //UsageDemo();
Console.ReadKey(); Console.ReadKey();
} }
} }