mirror of
https://github.com/creeperlv/SVM.git
synced 2026-01-11 12:59:54 +00:00
Working on the new Definition.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,46 +1,48 @@
|
|||||||
<ISARoot>
|
<ISARoot>
|
||||||
<Enums>
|
<Enums>
|
||||||
</Enums>
|
</Enums>
|
||||||
|
<Definitions>
|
||||||
<InstructionDefinition PrimaryInstruction="BMath">
|
<InstructionDefinition PrimaryInstruction="BMath">
|
||||||
<aliases>
|
<Aliases>
|
||||||
<alias name="bmath"/>
|
<Alias Name="bmath"/>
|
||||||
<alias name="b.math"/>
|
<Alias Name="b.math"/>
|
||||||
<alias name="math.b"/>
|
<Alias Name="math.b"/>
|
||||||
</aliases>
|
</Aliases>
|
||||||
<Parameters>
|
<Parameters>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<AllowedIds>
|
<MatchingItems>
|
||||||
<Text content="String"/>
|
<Item Id="String"/>
|
||||||
</AllowedIds>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="Byte" Pos="1" Converter="InternalEnum:bOp" />
|
<ExpectedValue Type="Byte" Pos="1" Converter="InternalEnum:bOp" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<AllowedIds>
|
<MatchingItems>
|
||||||
<Text content="String"/>
|
<Item Id="String"/>
|
||||||
</AllowedIds>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="Byte" Pos="2" Converter="InternalEnum:NativeType" />
|
<ExpectedValue Type="Byte" Pos="2" Converter="InternalEnum:NativeType" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<AllowedIds>
|
<MatchingItems>
|
||||||
<Text content="String"/>
|
<Item Id="String"/>
|
||||||
<Text content="Register"/>
|
<Item Id="Register"/>
|
||||||
</AllowedIds>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="Byte" Pos="3" Converter="Register" />
|
<ExpectedValue Type="Byte" Pos="3" Converter="Register" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<AllowedIds>
|
<MatchingItems>
|
||||||
<Text content="String"/>
|
<Item Id="String"/>
|
||||||
<Text content="Register"/>
|
<Item Id="Register"/>
|
||||||
</AllowedIds>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="Byte" Pos="4" Converter="Register" />
|
<ExpectedValue Type="Byte" Pos="4" Converter="Register" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<AllowedIds>
|
<MatchingItems>
|
||||||
<Text content="String"/>
|
<Item Id="String"/>
|
||||||
<Text content="Register"/>
|
<Item Id="Register"/>
|
||||||
</AllowedIds>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="Byte" Pos="5" Converter="Register" />
|
<ExpectedValue Type="Byte" Pos="5" Converter="Register" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
</Parameters>
|
</Parameters>
|
||||||
</InstructionDefinition>
|
</InstructionDefinition>
|
||||||
|
</Definitions>
|
||||||
</ISARoot>
|
</ISARoot>
|
||||||
Reference in New Issue
Block a user