Working on the new Definition.

This commit is contained in:
2025-07-21 04:06:11 +08:00
parent 49d6d463bd
commit b8a371b3a9
3 changed files with 111 additions and 44 deletions

View File

@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace SVM.Assembler.Core
@@ -18,7 +19,7 @@ namespace SVM.Assembler.Core
{
foreach (var item in InstructionDefinitions)
{
foreach (var alias in item.Value.aliases)
foreach (var alias in item.Value.Aliases)
{
if (!InstructionDefinitionAliases.TryAdd(alias, item.Value))
{
@@ -57,13 +58,77 @@ namespace SVM.Assembler.Core
}
}
}
static bool ParseDefinition(XmlNode node, ref ISADefinition definition)
{
InstructionDefinition instDefinition = new InstructionDefinition();
foreach (XmlNode item in node.ChildNodes)
{
switch (item.Name)
{
case "Aliases":
foreach (XmlNode aliasNode in item.ChildNodes)
{
if (aliasNode.Name == "Alias")
{
instDefinition.Aliases.Add(aliasNode.Attributes["Name"].Value);
}
else
{
return false;
}
}
break;
case "Parameters":
break;
default:
break;
}
if (item.Name != "InstructionDefinition")
{
return false;
}
}
return true;
}
static bool ParseDefinitions(XmlNode node, ref ISADefinition definition)
{
foreach (XmlNode item in node.ChildNodes)
{
if (item.Name != "InstructionDefinition")
{
return false;
}
if (ParseDefinition(node, ref definition) == false)
{
return false;
}
}
return true;
}
public static bool TryParse(Stream inputStream, [MaybeNullWhen(false)] out ISADefinition definition)
{
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(inputStream);
ISADefinition isaDefinition = new ISADefinition();
foreach (XmlNode item in xmlDocument.ChildNodes)
{
ShowNode(item, 0);
switch (item.Name)
{
case "Enums":
break;
case "Definitions":
if (ParseDefinitions(item, ref isaDefinition) == false)
{
definition = null;
return false;
}
break;
default:
break;
}
}
definition = null;
return false;

View File

@@ -8,7 +8,7 @@ namespace SVM.Assembler.Core
public class InstructionDefinition
{
public PrimaryInstruction PrimaryInstruction = PrimaryInstruction.Nop;
public List<string> aliases = new List<string>();
public List<string> Aliases = new List<string>();
public List<InstructionParameter> ParameterPattern = new List<InstructionParameter>();
}
}

View File

@@ -1,46 +1,48 @@
<ISARoot>
<Enums>
</Enums>
<InstructionDefinition PrimaryInstruction="BMath">
<aliases>
<alias name="bmath"/>
<alias name="b.math"/>
<alias name="math.b"/>
</aliases>
<Parameters>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="1" Converter="InternalEnum:bOp" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="2" Converter="InternalEnum:NativeType" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
<Text content="Register"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="3" Converter="Register" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
<Text content="Register"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="4" Converter="Register" />
</InstructionParameter>
<InstructionParameter>
<AllowedIds>
<Text content="String"/>
<Text content="Register"/>
</AllowedIds>
<ExpectedValue Type="Byte" Pos="5" Converter="Register" />
</InstructionParameter>
</Parameters>
</InstructionDefinition>
<Definitions>
<InstructionDefinition PrimaryInstruction="BMath">
<Aliases>
<Alias Name="bmath"/>
<Alias Name="b.math"/>
<Alias Name="math.b"/>
</Aliases>
<Parameters>
<InstructionParameter>
<MatchingItems>
<Item Id="String"/>
</MatchingItems>
<ExpectedValue Type="Byte" Pos="1" Converter="InternalEnum:bOp" />
</InstructionParameter>
<InstructionParameter>
<MatchingItems>
<Item Id="String"/>
</MatchingItems>
<ExpectedValue Type="Byte" Pos="2" Converter="InternalEnum:NativeType" />
</InstructionParameter>
<InstructionParameter>
<MatchingItems>
<Item Id="String"/>
<Item Id="Register"/>
</MatchingItems>
<ExpectedValue Type="Byte" Pos="3" Converter="Register" />
</InstructionParameter>
<InstructionParameter>
<MatchingItems>
<Item Id="String"/>
<Item Id="Register"/>
</MatchingItems>
<ExpectedValue Type="Byte" Pos="4" Converter="Register" />
</InstructionParameter>
<InstructionParameter>
<MatchingItems>
<Item Id="String"/>
<Item Id="Register"/>
</MatchingItems>
<ExpectedValue Type="Byte" Pos="5" Converter="Register" />
</InstructionParameter>
</Parameters>
</InstructionDefinition>
</Definitions>
</ISARoot>