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.Diagnostics.CodeAnalysis;
using System.IO; using System.IO;
using System.Xml; using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization; using System.Xml.Serialization;
namespace SVM.Assembler.Core namespace SVM.Assembler.Core
@@ -18,7 +19,7 @@ namespace SVM.Assembler.Core
{ {
foreach (var item in InstructionDefinitions) 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)) 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) public static bool TryParse(Stream inputStream, [MaybeNullWhen(false)] out ISADefinition definition)
{ {
XmlDocument xmlDocument = new XmlDocument(); XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(inputStream); xmlDocument.Load(inputStream);
ISADefinition isaDefinition = new ISADefinition();
foreach (XmlNode item in xmlDocument.ChildNodes) foreach (XmlNode item in xmlDocument.ChildNodes)
{ {
ShowNode(item, 0); 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; definition = null;
return false; return false;

View File

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

View File

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