Upsilon/Ycicle/Program.cs

139 lines
4.9 KiB
C#
Raw Normal View History

2018-11-10 12:11:36 +00:00
using System;
2018-11-17 18:13:05 +00:00
using System.Collections.Generic;
using System.Text;
2018-11-11 09:26:52 +00:00
using Upsilon;
2018-11-10 12:11:36 +00:00
using Upsilon.Evaluator;
2018-11-23 11:55:28 +00:00
using Upsilon.StandardLibraries;
2018-11-10 12:11:36 +00:00
namespace Ycicle
2018-11-10 12:11:36 +00:00
{
internal static class Program
2018-11-10 12:11:36 +00:00
{
private static void Main()
2018-11-10 12:11:36 +00:00
{
Console.WriteLine("Upsilon REPL");
Script script = null;
var options = new ScriptOptions()
{
ThrowExceptionOnError = false
};
2018-11-23 11:55:28 +00:00
2018-11-10 12:11:36 +00:00
while (true)
{
Console.Write("» ");
var input = Console.ReadLine();
2018-11-17 14:18:51 +00:00
if (input == "exit") return;
2018-11-23 11:55:28 +00:00
script = script == null
? Executor.ParseInput(input, options)
2018-11-26 15:55:10 +00:00
: Executor.ContinueWith(script, input);
2018-11-15 14:51:05 +00:00
if (script.Diagnostics.Errors.Count > 0)
2018-11-11 09:26:52 +00:00
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Errors were found during parsing");
foreach (var diagnosticsMessage in script.Diagnostics.Errors)
2018-11-11 09:26:52 +00:00
{
LogMessage(DiagnosticLevel.Error, diagnosticsMessage);
2018-11-11 09:26:52 +00:00
}
Console.ResetColor();
continue;
}
2019-01-17 16:48:10 +00:00
script.Bind();
if (script.Diagnostics.Errors.Count > 0)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Errors were found during parsing");
foreach (var diagnosticsMessage in script.Diagnostics.Errors)
{
LogMessage(DiagnosticLevel.Error, diagnosticsMessage);
}
Console.ResetColor();
continue;
}
//Console.WriteLine(script.PrettyPrintSyntaxTree());
var evaluate = script.Evaluate();
2018-11-11 09:26:52 +00:00
if (script.Diagnostics.Errors.Count > 0)
2018-11-11 09:26:52 +00:00
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Errors were found during evaluating");
foreach (var diagnosticsMessage in script.Diagnostics.Errors)
{
LogMessage(DiagnosticLevel.Error, diagnosticsMessage);
}
Console.ResetColor();
2018-11-11 09:26:52 +00:00
}
else
{
foreach (var diagnosticsMessage in script.Diagnostics.Warnings)
{
LogMessage(DiagnosticLevel.Warning, diagnosticsMessage);
}
Console.ResetColor();
2018-11-16 13:11:27 +00:00
if (evaluate == null)
continue;
Console.ForegroundColor = ConsoleColor.Cyan;
2018-11-17 18:13:05 +00:00
Console.WriteLine(ParseEvaluated(evaluate));
Console.ResetColor();
}
2018-11-10 12:11:36 +00:00
}
}
2018-11-11 09:26:52 +00:00
private static void LogMessage(DiagnosticLevel level, DiagnosticsMessage message)
2018-11-11 09:26:52 +00:00
{
if (level == DiagnosticLevel.Error)
Console.ForegroundColor = ConsoleColor.Red;
else if (level == DiagnosticLevel.Warning)
Console.ForegroundColor = ConsoleColor.DarkYellow;
2018-11-11 09:26:52 +00:00
Console.WriteLine(message.Message);
Console.ForegroundColor = ConsoleColor.Gray;
2018-11-17 13:20:43 +00:00
Console.Write(message.GetDiagnosticPosition() + " ");
Console.Write(message.LineBeforeError());
2018-11-11 09:26:52 +00:00
if (level == DiagnosticLevel.Error)
Console.ForegroundColor = ConsoleColor.Red;
else if (level == DiagnosticLevel.Warning)
Console.ForegroundColor = ConsoleColor.DarkYellow;
2018-11-11 09:26:52 +00:00
Console.Write(message.AtError());
Console.ForegroundColor = ConsoleColor.Gray;
Console.Write(message.LineAfterError());
2018-11-11 09:26:52 +00:00
Console.WriteLine();
}
2018-11-17 18:13:05 +00:00
private static string ParseEvaluated(object o, int jumps = 0)
{
var sb = new StringBuilder();
if (o is Dictionary<string, object> dic)
{
for (var i = 0; i < jumps; i++) sb.Append(" ");
sb.Append("{\n");
foreach (var (key, value) in dic)
{
for (var i = 0; i < jumps; i++) sb.Append(" ");
sb.Append(" {");
sb.Append("\"");
sb.Append(key);
sb.Append("\": ");
sb.Append(ParseEvaluated(value, jumps + 1));
sb.Append(" }");
sb.Append(",\n");
}
for (var i = 0; i < jumps; i++) sb.Append(" ");
sb.Append("}\n");
}
else
{
2018-11-23 12:28:11 +00:00
sb.Append(o);
2018-11-17 18:13:05 +00:00
}
return sb.ToString();
}
2018-11-10 12:11:36 +00:00
}
}