From acada40141c13b704fb7159a82a16a12349ca8b0 Mon Sep 17 00:00:00 2001 From: ninemine <106434473+NINEMINEsigma@users.noreply.github.com> Date: Fri, 4 Jul 2025 23:00:41 +0800 Subject: [PATCH] EP Symboliztion +Namespace --- Convention/[Symbolization]/Detail/Keyword.cs | 72 +++++++++++++++++-- .../[Symbolization]/Detail/Namespace.cs | 2 +- .../Runner/SymbolizationContext.cs | 10 ++- .../Runner/SymbolizationReader.cs | 8 +-- 4 files changed, 80 insertions(+), 12 deletions(-) diff --git a/Convention/[Symbolization]/Detail/Keyword.cs b/Convention/[Symbolization]/Detail/Keyword.cs index eda7f1b..9e086d4 100644 --- a/Convention/[Symbolization]/Detail/Keyword.cs +++ b/Convention/[Symbolization]/Detail/Keyword.cs @@ -18,7 +18,14 @@ namespace Convention.Symbolization.Internal return this.GetType() == other.GetType(); } - public abstract Keyword ControlContext(SymbolizationContext context, ScriptWordVariable next); + public virtual Keyword ControlContext(SymbolizationContext context, int line, int wordIndex, Variable next) + { + return ControlContext(context, next); + } + protected virtual Keyword ControlContext(SymbolizationContext context, Variable next) + { + return null; + } } public abstract class Keyword : Keyword where T : Keyword, new() @@ -56,15 +63,19 @@ namespace Convention.Symbolization.Keyword private ToolFile ImportFile = new("./"); private string buffer = ""; - public override Internal.Keyword ControlContext(SymbolizationContext context, Internal.ScriptWordVariable next) + protected override Internal.Keyword ControlContext(SymbolizationContext context, Internal.Variable next) { - if (next.word == ";") + if (next is not Internal.ScriptWordVariable swv) + { + throw new InvalidGrammarException($"Not expected a key word: {next}"); + } + if (swv.word == ";") { var importContext = new SymbolizationContext(context); importContext.Compile(ImportFile); return null; } - else if(next.word==".") + else if (swv.word == ".") { ImportFile = ImportFile | buffer; buffer = ""; @@ -73,7 +84,7 @@ namespace Convention.Symbolization.Keyword } else { - buffer += next.word; + buffer += swv.word; } return this; } @@ -87,6 +98,57 @@ namespace Convention.Symbolization.Keyword public Namespace() : base("namespace") { } + + public override Internal.Keyword CloneVariable(string targetSymbolName) + { + return new Namespace(); + } + + private enum Pause + { + Name, Body + } + + private Pause pause = Pause.Name; + private int layer = 0; + private SymbolizationContext bulidingContext = null; + private Dictionary> subScriptWords = new(); + + public override Internal.Keyword ControlContext(SymbolizationContext context,int line,int wordIndex, Internal.Variable next) + { + if (next is not Internal.ScriptWordVariable swv) + { + throw new InvalidGrammarException($"Not expected a key word: {next}"); + } + if (pause == Pause.Name) + { + bulidingContext = new(context, context.CurrentNamespace.CreateOrGetSubNamespace(swv.word)); + bulidingContext.CurrentNamespace.BeginUpdate(); + pause = Pause.Body; + } + else + { + if (swv.word == "{") + layer++; + else if (swv.word == "}") + layer--; + if (layer == 0) + { + bulidingContext.Compile(subScriptWords); + bulidingContext.CurrentNamespace.EndAndTryApplyUpdate(); + return null; + } + else + { + if (subScriptWords.TryGetValue(line, out var rline) == false) + { + subScriptWords.Add(line, rline = new()); + } + rline.Add(wordIndex, next); + } + } + return this; + } } /// diff --git a/Convention/[Symbolization]/Detail/Namespace.cs b/Convention/[Symbolization]/Detail/Namespace.cs index 1130d52..f3e846b 100644 --- a/Convention/[Symbolization]/Detail/Namespace.cs +++ b/Convention/[Symbolization]/Detail/Namespace.cs @@ -45,7 +45,7 @@ namespace Convention.Symbolization.Internal Structures.Add(structure.SymbolInfo.SymbolName, structure); } - public bool EndAndTApplyUpdate() + public bool EndAndTryApplyUpdate() { Updateable--; if (Updateable == 0) diff --git a/Convention/[Symbolization]/Runner/SymbolizationContext.cs b/Convention/[Symbolization]/Runner/SymbolizationContext.cs index f1ce415..4f4b204 100644 --- a/Convention/[Symbolization]/Runner/SymbolizationContext.cs +++ b/Convention/[Symbolization]/Runner/SymbolizationContext.cs @@ -17,15 +17,21 @@ namespace Convention.Symbolization private readonly SymbolizationContext ParentContext; public readonly Internal.Namespace CurrentNamespace; + + public void Compile(Dictionary> scriptWords) + { + } + + public void Compile(string allText) { // Create a new reader to parse the script words Internal.SymbolizationReader reader = new(); foreach (char ch in allText) reader.ReadChar(ch); - var ScriptWords = reader.ScriptWords; + var scriptWords = reader.ScriptWords; // Turn the script words into scope words - reader.CompleteScopeWord(this); + this.Compile(scriptWords); } public void Compile(ToolFile file) diff --git a/Convention/[Symbolization]/Runner/SymbolizationReader.cs b/Convention/[Symbolization]/Runner/SymbolizationReader.cs index d84e39c..4eb9f57 100644 --- a/Convention/[Symbolization]/Runner/SymbolizationReader.cs +++ b/Convention/[Symbolization]/Runner/SymbolizationReader.cs @@ -13,7 +13,7 @@ namespace Convention.Symbolization.Internal private string buffer = ""; private int lineContext = 1; private bool isOutOfStringline = true; - public Dictionary> ScriptWords = new() { { 1, new() } }; + public Dictionary> ScriptWords = new() { { 1, new() } }; private static HashSet ControllerCharSet = new() { @@ -76,11 +76,11 @@ namespace Convention.Symbolization.Internal } if (Internal.Keyword.Keywords.TryGetValue(buffer, out var keyword)) { - line.Add(keyword.Clone() as Internal.Variable); + line.Add(line.Count + 1, keyword.Clone() as Internal.Variable); } else { - line.Add(new ScriptWordVariable(buffer)); + line.Add(line.Count + 1, new ScriptWordVariable(buffer)); } buffer = ""; } @@ -127,7 +127,7 @@ namespace Convention.Symbolization.Internal } else { - currentKey = currentKey.ControlContext(rootContext, word); + currentKey = currentKey.ControlContext(rootContext, line.Key, word.Key, word.Value); } wordCounter++; }