From 4faef5337b0f5b1d386df233754cf8a426128139 Mon Sep 17 00:00:00 2001 From: Creeper Lv Date: Sun, 27 Jul 2025 04:43:13 +1000 Subject: [PATCH] Working on the assembler. --- src/SVM.Assembler.Core/Assembler.cs | 22 +++++++++++++++++----- src/SVM.Assembler.Core/ISADefinition.cs | 6 ++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/SVM.Assembler.Core/Assembler.cs b/src/SVM.Assembler.Core/Assembler.cs index f39f518..379be0f 100644 --- a/src/SVM.Assembler.Core/Assembler.cs +++ b/src/SVM.Assembler.Core/Assembler.cs @@ -15,7 +15,7 @@ Match: D [0-9] Number {D}+ -InstMath math +InstMath bmath InstCvt cvt InstSystem system InstSys sys @@ -23,11 +23,11 @@ InstSD sd Register \${D}+ LabelCode \.code\: LabelData \.data\: - \.const\: -string "".*"" +LabelConst \.const\: word \w* GenericLabel {word}\: LineEnd \n +string "".*"" OpAdd add OpSub sub @@ -62,6 +62,10 @@ LabelConstant InternalLbl { definition.Substitute(); } + else + { + Console.WriteLine("Lexer Definition load failed."); + } ISA = isaDefinition; } @@ -115,10 +119,14 @@ LabelConstant InternalLbl { return operationResult; } - if (!ISA.InstructionDefinitionAliases.TryGetValue(LexDef.LexMatchedItemId, out var instructionDef)) + if (!ISA.InstructionDefinitionAliases.TryGetValue(LexDef.Content ?? "", out var instructionDef)) { + Console.WriteLine($"Cannot find matching instruction:{LexDef.Content}"); + operationResult.AddError(new Error()); return operationResult; } + Console.WriteLine($"Found:{instructionDef.PrimaryInstruction}"); + intermediateInstruction.inst = instructionDef.PrimaryInstruction; foreach (var item in instructionDef.ParameterPattern) { var next = Lex(lexer); @@ -140,12 +148,14 @@ LabelConstant InternalLbl } intermediateInstruction.Parameters.Add(next.Result); } + Console.WriteLine($"Parsed:{intermediateInstruction.inst}"); return intermediateInstruction; } public OperationResult AssembleIntermediateObject(string input, string ID = "main.asm") { StringLexer lexer = new StringLexer(); lexer.SetDefinition(definition); + Console.WriteLine(input); lexer.Content = input; lexer.SourceID = ID; OperationResult operationResult = new OperationResult(new IntermediateObject()); @@ -153,6 +163,7 @@ LabelConstant InternalLbl while (true) { var lexResult = Lex(lexer); + Console.WriteLine($"{lexResult.Result?.Content ?? ""}"); if (lexResult.Result == null) break; var r = lexResult.Result; switch (r.LexSegmentId) @@ -178,9 +189,10 @@ LabelConstant InternalLbl { case InternalLabel.Code: { + Console.WriteLine($"Code Seg:{r.Content}"); OperationResult instR = r.LexSegmentId switch { - "GenericLabel" => ParseInstruction(lexer, r, r), + "LblG" => ParseInstruction(lexer, r, r), _ => ParseInstruction(lexer, r, null), }; if (operationResult.CheckAndInheritErrorAndWarnings(instR)) diff --git a/src/SVM.Assembler.Core/ISADefinition.cs b/src/SVM.Assembler.Core/ISADefinition.cs index 3d6ce9a..75bd3b5 100644 --- a/src/SVM.Assembler.Core/ISADefinition.cs +++ b/src/SVM.Assembler.Core/ISADefinition.cs @@ -120,6 +120,7 @@ namespace SVM.Assembler.Core { return false; } + Console.WriteLine($"Definition of: {pi}"); instDefinition.PrimaryInstruction = pi; foreach (XmlNode item in node.ChildNodes) { @@ -163,6 +164,11 @@ namespace SVM.Assembler.Core } } definition.InstructionDefinitions.Add(pi, instDefinition); + foreach (var item in instDefinition.Aliases) + { + + definition.InstructionDefinitionAliases.Add(item, instDefinition); + } return true; } static bool ParseDefinitions(XmlNode node, ref ISADefinition definition)