using System.Collections.Generic; using System.Text.RegularExpressions; using YesNt.Interpreter.Attributes; using YesNt.Interpreter.Enums; namespace YesNt.Interpreter.Statements { internal class VariableStatements : StatementRuntimeInformation { [Statement("<", SearchMode.StartOfLine, SpaceAround.None, Priority = Priority.VeryLow)] public void DefineVariable(string args) { string[] parts = args.Split('='); if (parts.Length == 2) { string key = parts[0].Trim(); if (key.Contains(' ')) { RuntimeInfo.Exit("Invalid Syntax", true); } if (RuntimeInfo.Variables.ContainsKey(key)) { RuntimeInfo.Variables[key] = parts[1].Trim(); } else { RuntimeInfo.Variables.Add(key, parts[1].Trim()); } } else { RuntimeInfo.Exit("Invalid syntax", true); return; } } [Statement("!<", SearchMode.StartOfLine, SpaceAround.None, Priority = Priority.VeryLow)] public void DefineGlobalVariable(string args) { string[] parts = args.Split('='); if (parts.Length == 2) { string key = parts[0].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; } } [Statement("del", SearchMode.StartOfLine, SpaceAround.End, System.ConsoleColor.Red, Priority = Priority.VeryLow)] public void DeleteVariable(string args) { string key = args.Trim(); if (RuntimeInfo.Variables.ContainsKey(key)) { RuntimeInfo.Variables.Remove(key); } else if (RuntimeInfo.GloablVariables.ContainsKey(key)) { RuntimeInfo.GloablVariables.Remove(key); } else { RuntimeInfo.Exit($"Variable \"{key}\" not found", true); } } [StaticStatement(ExecuteInSearchLabelMode = true)] public void ReadVariable() { if (!RuntimeInfo.CurrentLine.Contains('>')) { return; } foreach (KeyValuePair variable in RuntimeInfo.Variables) { RuntimeInfo.CurrentLine = RuntimeInfo.CurrentLine.Replace($">{variable.Key}", variable.Value); } foreach (KeyValuePair variable in RuntimeInfo.GloablVariables) { RuntimeInfo.CurrentLine = RuntimeInfo.CurrentLine.Replace($">{variable.Key}", variable.Value); } if (RuntimeInfo.IsSearching) { return; } MatchCollection matches = Regex.Matches(RuntimeInfo.CurrentLine, @">[a-zA-Z0-9]+"); for (int i = 0; i < matches.Count; i++) { string varName = matches[i].Value.Replace(">", string.Empty); if (!RuntimeInfo.Variables.ContainsKey(varName) && !RuntimeInfo.GloablVariables.ContainsKey(varName)) { RuntimeInfo.Exit($"Variable \"{varName}\" not found", true); return; } } } } }