From 80fda48944c68b51e9b58275d5a96b14ccce76b0 Mon Sep 17 00:00:00 2001 From: Stone-Red-Code <56473591+Stone-Red-Code@users.noreply.github.com> Date: Wed, 13 Oct 2021 22:16:57 +0200 Subject: [PATCH] - Add global variables - Add task id's - Fixed editor bugs - Fix input handler bugs --- YesNt-Interpreter/Runtime/DebugEventArgs.cs | 2 ++ .../Runtime/RuntimeInformation.cs | 8 +++++ YesNt-Interpreter/Runtime/YesNtInterpreter.cs | 11 ++++-- .../Statements/ProcessingStatements.cs | 2 +- .../Statements/VariableStatements.cs | 35 ++++++++++++++++++- YesNt.CodeEditor/Editor.cs | 33 +++++++++++------ YesNt.CodeEditor/InputHandler.cs | 18 ++++++---- YesNt.CodeEditor/SyntaxHighlighter.cs | 8 ++++- 8 files changed, 95 insertions(+), 22 deletions(-) diff --git a/YesNt-Interpreter/Runtime/DebugEventArgs.cs b/YesNt-Interpreter/Runtime/DebugEventArgs.cs index ab99766..798d860 100644 --- a/YesNt-Interpreter/Runtime/DebugEventArgs.cs +++ b/YesNt-Interpreter/Runtime/DebugEventArgs.cs @@ -7,5 +7,7 @@ namespace YesNt.Interpreter.Runtime public int LineNumber { get; internal set; } public string CurrentLine { get; internal set; } public string OriginalLine { get; internal set; } + public int TaskId { get; internal set; } + public bool IsTask { get; internal set; } } } \ No newline at end of file diff --git a/YesNt-Interpreter/Runtime/RuntimeInformation.cs b/YesNt-Interpreter/Runtime/RuntimeInformation.cs index 4d7b7ae..c5ca149 100644 --- a/YesNt-Interpreter/Runtime/RuntimeInformation.cs +++ b/YesNt-Interpreter/Runtime/RuntimeInformation.cs @@ -9,8 +9,11 @@ namespace YesNt.Interpreter internal class RuntimeInformation { private RuntimeInformation parentRuntimeInformation; + private static int internalTaskId = 0; + private int taskId = 0; public Dictionary Variables { get; } = new(); + public Dictionary GloablVariables { get; set; } = new(); public Dictionary Labels { get; } = new(); public List Lines { get; set; } = new(); public string CurrentLine { get; set; } = string.Empty; @@ -23,6 +26,8 @@ namespace YesNt.Interpreter public string CurrentFilePath { get; set; } = string.Empty; public bool IsTask => ParentRuntimeInformation is not null; + public int TaskId => IsTask ? taskId : 0; + public RuntimeInformation ParentRuntimeInformation { get => parentRuntimeInformation; @@ -126,6 +131,7 @@ namespace YesNt.Interpreter { Lines.Clear(); Variables.Clear(); + GloablVariables.Clear(); Labels.Clear(); LabelStack.Clear(); ParentRuntimeInformation = null; @@ -136,6 +142,8 @@ namespace YesNt.Interpreter StopAllTasks = false; IsDebugMode = false; LineNumber = 0; + taskId = internalTaskId + 1; + internalTaskId++; } } } \ No newline at end of file diff --git a/YesNt-Interpreter/Runtime/YesNtInterpreter.cs b/YesNt-Interpreter/Runtime/YesNtInterpreter.cs index 5e35f46..ae14c25 100644 --- a/YesNt-Interpreter/Runtime/YesNtInterpreter.cs +++ b/YesNt-Interpreter/Runtime/YesNtInterpreter.cs @@ -96,13 +96,14 @@ namespace YesNt.Interpreter Execute(); } - internal void Execute(List lines, int startLine, RuntimeInformation parentRuntimeInformation) + internal void Execute(List lines, Dictionary gloablVariables, int startLine, RuntimeInformation parentRuntimeInformation) { runtimeInfo.Reset(); runtimeInfo.IsDebugMode = parentRuntimeInformation.IsDebugMode; runtimeInfo.Lines = lines; runtimeInfo.LineNumber = startLine; runtimeInfo.ParentRuntimeInformation = parentRuntimeInformation; + runtimeInfo.GloablVariables = gloablVariables; if (parentRuntimeInformation.StopAllTasks) { runtimeInfo.Exit($"Parent task was terminated!", parentRuntimeInformation.StopAllTasks); @@ -125,7 +126,9 @@ namespace YesNt.Interpreter DebugEventArgs debugEventArgs = new DebugEventArgs() { LineNumber = runtimeInfo.LineNumber + 1, - OriginalLine = runtimeInfo.CurrentLine.FromSaveString() + OriginalLine = runtimeInfo.CurrentLine.FromSaveString(), + IsTask = runtimeInfo.IsTask, + TaskId = runtimeInfo.TaskId }; if (string.IsNullOrWhiteSpace(runtimeInfo.CurrentLine)) @@ -217,6 +220,10 @@ namespace YesNt.Interpreter { runtimeInfo.Exit($"Label \"{runtimeInfo.SearchLabel}\" not found", true); } + if (runtimeInfo.IsDebugMode) + { + runtimeInfo.LineExecuted(null); + } } } diff --git a/YesNt-Interpreter/Statements/ProcessingStatements.cs b/YesNt-Interpreter/Statements/ProcessingStatements.cs index 9360727..9ae513a 100644 --- a/YesNt-Interpreter/Statements/ProcessingStatements.cs +++ b/YesNt-Interpreter/Statements/ProcessingStatements.cs @@ -46,7 +46,7 @@ namespace YesNt.Interpreter.Statements { YesNtInterpreter interpreter = new YesNtInterpreter(); interpreter.Initialize(); - interpreter.Execute(lines, lineNumer, RuntimeInfo); + interpreter.Execute(lines, RuntimeInfo.GloablVariables, lineNumer, RuntimeInfo); }); RuntimeInfo.CurrentLine = string.Empty; diff --git a/YesNt-Interpreter/Statements/VariableStatements.cs b/YesNt-Interpreter/Statements/VariableStatements.cs index f7716f0..2de1b29 100644 --- a/YesNt-Interpreter/Statements/VariableStatements.cs +++ b/YesNt-Interpreter/Statements/VariableStatements.cs @@ -13,7 +13,7 @@ namespace YesNt.Interpreter.Statements string[] parts = args.Split('='); if (parts.Length == 2) { - string key = parts[0].Replace("<", "").Trim(); + string key = parts[0].Replace("<", string.Empty).Trim(); if (key.Contains(' ')) { RuntimeInfo.Exit("Invalid Syntax", true); @@ -35,6 +35,34 @@ namespace YesNt.Interpreter.Statements } } + [Statement("!<", SearchMode.StartOfLine, SpaceAround.None, Priority = Priority.VeryLow, IgnoreSyntaxHighlighting = true)] + public void DefineGlobalVariable(string args) + { + string[] parts = args.Split('='); + if (parts.Length == 2) + { + string key = parts[0].Replace("!<", string.Empty).Trim(); + if (key.Contains(' ')) + { + RuntimeInfo.Exit("Invalid Syntax", true); + } + + if (RuntimeInfo.GloablVariables.ContainsKey(key)) + { + RuntimeInfo.GloablVariables[key] = parts[1].Trim(); + } + else + { + RuntimeInfo.GloablVariables.Add(key, parts[1].Trim()); + } + } + else + { + RuntimeInfo.Exit("Invalid syntax", true); + return; + } + } + [StaticStatement(ExecuteInSearchLabelMode = true)] public void ReadVariable() { @@ -47,6 +75,11 @@ namespace YesNt.Interpreter.Statements { RuntimeInfo.CurrentLine = RuntimeInfo.CurrentLine.Replace($">{variable.Key}", variable.Value); } + + foreach (KeyValuePair variable in RuntimeInfo.GloablVariables) + { + RuntimeInfo.CurrentLine = RuntimeInfo.CurrentLine.Replace($">{variable.Key}", variable.Value); + } } } } \ No newline at end of file diff --git a/YesNt.CodeEditor/Editor.cs b/YesNt.CodeEditor/Editor.cs index b179d83..fa9f793 100644 --- a/YesNt.CodeEditor/Editor.cs +++ b/YesNt.CodeEditor/Editor.cs @@ -13,7 +13,6 @@ namespace YesNt.CodeEditor private readonly List debugOutput = new(); public YesNtInterpreter yesNtInterpreter { get; } = new(); - public int LineOffset { get; set; } = 0; public List Lines { get; } = new(); public Point CursorPosition { get; } = new(0, 0); @@ -47,12 +46,15 @@ namespace YesNt.CodeEditor { Display(false); } while (inputHandler.HandleInput()); + Console.Clear(); } public void Display(bool drawAll) { Console.CursorVisible = false; + Console.ForegroundColor = ConsoleColor.Gray; + Console.BackgroundColor = ConsoleColor.Black; Console.SetCursorPosition(0, 0); @@ -138,6 +140,10 @@ namespace YesNt.CodeEditor return false; } } + if (string.IsNullOrEmpty(Path.GetExtension(path))) + { + path = Path.ChangeExtension(path, "ynt"); + } CurrentPath = path; } else if (!string.IsNullOrWhiteSpace(CurrentPath)) @@ -151,7 +157,7 @@ namespace YesNt.CodeEditor } else { - inputHandler.WriteStatus("File path is empty!"); + inputHandler.WriteStatus("File path is empty! (Save the file before you can use this command)"); return false; } @@ -187,17 +193,22 @@ namespace YesNt.CodeEditor { lock (Console.Out) { - Console.ForegroundColor = ConsoleColor.Magenta; - if (e.OriginalLine == e.CurrentLine) + if (e is not null) { - Console.WriteLine($"{Environment.NewLine}[{e.LineNumber}] [{e.CurrentLine}] ==>"); - } - else - { - Console.WriteLine($"{Environment.NewLine}[{e.LineNumber}] [{e.OriginalLine}] => [{e.CurrentLine}] ==>"); - } - Console.ResetColor(); + Console.ForegroundColor = ConsoleColor.Magenta; + string taskId = e.IsTask ? $"[Task: {e.TaskId}] " : string.Empty; + if (e.OriginalLine == e.CurrentLine) + { + Console.WriteLine($"{Environment.NewLine}{taskId}[{e.LineNumber}] [{e.CurrentLine}] ==>"); + } + else + { + Console.WriteLine($"{Environment.NewLine}{taskId}[{e.LineNumber}] [{e.OriginalLine}] => [{e.CurrentLine}] ==>"); + } + Console.ForegroundColor = ConsoleColor.Gray; + + } string[] outputs = debugOutput.ToArray(); debugOutput.Clear(); diff --git a/YesNt.CodeEditor/InputHandler.cs b/YesNt.CodeEditor/InputHandler.cs index f8f55a7..a72f0d7 100644 --- a/YesNt.CodeEditor/InputHandler.cs +++ b/YesNt.CodeEditor/InputHandler.cs @@ -13,6 +13,10 @@ namespace YesNt.CodeEditor public bool HandleInput() { + while (Console.KeyAvailable) + { + Console.ReadKey(true); + } if (textEditor.EditMode == Mode.Edit) { ConsoleKeyInfo keyInfo = Console.ReadKey(true); @@ -23,7 +27,7 @@ namespace YesNt.CodeEditor { case ConsoleKey.C: textEditor.EditMode = Mode.Command; - break; + return true; case ConsoleKey.B: int position = textEditor.Lines.Count; @@ -31,18 +35,18 @@ namespace YesNt.CodeEditor textEditor.LineOffset = Math.Max(position - Console.WindowHeight + 3, 0); textEditor.Display(true); - break; + return true; case ConsoleKey.T: textEditor.CursorPosition.Y = 0; textEditor.LineOffset = 0; textEditor.Display(true); - break; + return true; case ConsoleKey.S: textEditor.CursorPosition.X = 0; - break; + return true; case ConsoleKey.E: if (textEditor.Lines.Count > textEditor.CursorPosition.Y) @@ -53,10 +57,10 @@ namespace YesNt.CodeEditor { textEditor.CursorPosition.X = 0; } - break; + return true; } } - else if (keyInfo.Key == ConsoleKey.DownArrow) + if (keyInfo.Key == ConsoleKey.DownArrow) { textEditor.CursorPosition.Y++; if (textEditor.CursorPosition.Y - textEditor.LineOffset >= Console.WindowHeight - 3) @@ -228,6 +232,7 @@ namespace YesNt.CodeEditor { textEditor.EditMode = Mode.Debug; Console.Clear(); + Console.CursorVisible = true; textEditor.yesNtInterpreter.Execute(textEditor.CurrentPath); while (Console.KeyAvailable) { @@ -244,6 +249,7 @@ namespace YesNt.CodeEditor { textEditor.EditMode = Mode.Debug; Console.Clear(); + Console.CursorVisible = true; textEditor.yesNtInterpreter.Execute(textEditor.CurrentPath, true); while (Console.KeyAvailable) { diff --git a/YesNt.CodeEditor/SyntaxHighlighter.cs b/YesNt.CodeEditor/SyntaxHighlighter.cs index 53f9b40..c1a2657 100644 --- a/YesNt.CodeEditor/SyntaxHighlighter.cs +++ b/YesNt.CodeEditor/SyntaxHighlighter.cs @@ -65,6 +65,12 @@ namespace YesNt.CodeEditor input = AddColorInformation(input, matches[i].Value, ConsoleColor.DarkCyan, SearchMode.StartOfLine); } + matches = Regex.Matches(input, @"^!<[a-zA-Z0-9]+"); + for (int i = 0; i < matches.Count; i++) + { + input = AddColorInformation(input, matches[i].Value, ConsoleColor.Blue, SearchMode.StartOfLine); + } + foreach (string part in input.Split("\0")) { ConsoleColor consoleColor; @@ -88,7 +94,7 @@ namespace YesNt.CodeEditor } Console.ForegroundColor = consoleColor; Console.Write(messagePart, consoleColor); - Console.ResetColor(); + Console.ForegroundColor = ConsoleColor.Gray; } }