From c5d27b65e99b160dff13bc80146757294707c5f0 Mon Sep 17 00:00:00 2001 From: Creeper Lv Date: Wed, 23 Jul 2025 00:33:42 +1000 Subject: [PATCH] ISADefinition parser is now done. --- src/SVM.Assembler.Core/ISADefinition.cs | 51 +++++++++++++++++++++++++ src/SVM.Assembler/ISA.xml | 3 ++ src/SVM.Assembler/Program.cs | 8 ++-- src/SVM.Assembler/SVM.Assembler.csproj | 4 ++ 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/SVM.Assembler.Core/ISADefinition.cs b/src/SVM.Assembler.Core/ISADefinition.cs index c974933..312e843 100644 --- a/src/SVM.Assembler.Core/ISADefinition.cs +++ b/src/SVM.Assembler.Core/ISADefinition.cs @@ -12,6 +12,7 @@ namespace SVM.Assembler.Core [Serializable] public class ISADefinition { + public Dictionary> Enums = new Dictionary>(); public Dictionary InstructionDefinitions = new Dictionary(); [NonSerialized] public Dictionary InstructionDefinitionAliases = new Dictionary(); @@ -111,6 +112,13 @@ namespace SVM.Assembler.Core { Console.WriteLine($"ParseDefinition:{node.Name}"); InstructionDefinition instDefinition = new InstructionDefinition(); + var PIAttr = node.Attributes.GetNamedItem("PrimaryInstruction"); + if (PIAttr == null) return false; + if (!Enum.TryParse(PIAttr.InnerText, out var pi)) + { + return false; + } + instDefinition.PrimaryInstruction = pi; foreach (XmlNode item in node.ChildNodes) { Console.WriteLine($"{item.Name}"); @@ -152,6 +160,7 @@ namespace SVM.Assembler.Core break; } } + definition.InstructionDefinitions.Add(pi, instDefinition); return true; } static bool ParseDefinitions(XmlNode node, ref ISADefinition definition) @@ -188,6 +197,48 @@ namespace SVM.Assembler.Core switch (item.Name) { case "Enums": + { + foreach (XmlNode enumNode in item.ChildNodes) + { + if (enumNode.Name == "Enum") + { + Dictionary enumItem = new Dictionary(); + var EnumNameAttr = enumNode.Attributes.GetNamedItem("Name"); + if (EnumNameAttr == null) + { + definition = null; + return false; + } + foreach (XmlNode enumItemNode in enumNode.ChildNodes) + { + + if (enumItemNode.Name == "Item") + { + + var keyAttr = enumItemNode.Attributes.GetNamedItem("Key"); + var valueAttr = enumItemNode.Attributes.GetNamedItem("Value"); + if (keyAttr == null || valueAttr == null) + { + definition = null; + return false; + } + enumItem.Add(keyAttr.InnerText, valueAttr.InnerText); + } + else + { + definition = null; + return false; + } + } + isaDefinition.Enums.Add(EnumNameAttr.InnerText, enumItem); + } + else + { + definition = null; + return false; + } + } + } break; case "Definitions": if (ParseDefinitions(item, ref isaDefinition) == false) diff --git a/src/SVM.Assembler/ISA.xml b/src/SVM.Assembler/ISA.xml index 389a69e..0b8e82e 100644 --- a/src/SVM.Assembler/ISA.xml +++ b/src/SVM.Assembler/ISA.xml @@ -1,5 +1,8 @@ + + + diff --git a/src/SVM.Assembler/Program.cs b/src/SVM.Assembler/Program.cs index ddd79c9..65d8716 100644 --- a/src/SVM.Assembler/Program.cs +++ b/src/SVM.Assembler/Program.cs @@ -1,7 +1,6 @@ -using SVM.Assembler.Core; +using Newtonsoft.Json; +using SVM.Assembler.Core; using System.Reflection; -using System.Runtime.Serialization; -using System.Xml.Serialization; namespace SVM.Assembler { @@ -15,11 +14,12 @@ namespace SVM.Assembler Console.WriteLine("Cannot find ISA definition!"); return; } - if(!ISADefinition.TryParse(fs, out var def)) + if (!ISADefinition.TryParse(fs, out var def)) { Console.WriteLine("Cannot load ISA definition!"); return; } + Console.WriteLine(JsonConvert.SerializeObject(def, Formatting.Indented)); } } } diff --git a/src/SVM.Assembler/SVM.Assembler.csproj b/src/SVM.Assembler/SVM.Assembler.csproj index 2f6f22f..6754003 100644 --- a/src/SVM.Assembler/SVM.Assembler.csproj +++ b/src/SVM.Assembler/SVM.Assembler.csproj @@ -21,4 +21,8 @@ + + + +