Working on ISADefinition.

This commit is contained in:
2025-07-22 22:27:15 +10:00
parent b8a371b3a9
commit 31ff6dbb1f
2 changed files with 99 additions and 26 deletions

View File

@@ -58,17 +58,68 @@ namespace SVM.Assembler.Core
} }
} }
} }
static bool ParseParameter(XmlNode node, ref InstructionDefinition instruction)
{
Console.WriteLine("Parse:Parameter");
InstructionParameter parameter = new InstructionParameter();
foreach (XmlNode subNode in node)
{
switch (subNode.Name)
{
case "MatchingItems":
foreach (XmlNode item in subNode.ChildNodes)
{
if (item.Name == "Item")
{
var result = item.Attributes.GetNamedItem("Id");
if (result == null) return false;
Console.WriteLine($"Item:{result.InnerText}");
parameter.AllowedTokenIds.Add(result.InnerText);
}
}
break;
case "ExpectedValue":
{
var TypeAttr = subNode.Attributes.GetNamedItem("Type");
var PosAttr = subNode.Attributes.GetNamedItem("Pos");
var ConverterAttr = subNode.Attributes.GetNamedItem("Converter");
if (TypeAttr == null) return false;
if (PosAttr == null) return false;
if (ConverterAttr == null) return false;
if (!Enum.TryParse<SVMNativeTypes>(TypeAttr.InnerText, out var nType))
{
Console.WriteLine($"ParseSVMNativeTypes:{TypeAttr.InnerText}");
return false;
}
if (!int.TryParse(PosAttr.InnerText, out var pos))
{
Console.WriteLine($"ParseInt:{PosAttr.InnerText}");
return false;
}
parameter.ExpectdValue.Type = nType;
parameter.ExpectdValue.Pos = pos;
parameter.ExpectdValue.Converter = ConverterAttr.InnerText;
}
break;
default:
return false;
}
}
return true;
}
static bool ParseDefinition(XmlNode node, ref ISADefinition definition) static bool ParseDefinition(XmlNode node, ref ISADefinition definition)
{ {
Console.WriteLine($"ParseDefinition:{node.Name}");
InstructionDefinition instDefinition = new InstructionDefinition(); InstructionDefinition instDefinition = new InstructionDefinition();
foreach (XmlNode item in node.ChildNodes) foreach (XmlNode item in node.ChildNodes)
{ {
Console.WriteLine($"{item.Name}");
switch (item.Name) switch (item.Name)
{ {
case "Aliases": case "Aliases":
foreach (XmlNode aliasNode in item.ChildNodes) foreach (XmlNode aliasNode in item.ChildNodes)
{ {
Console.WriteLine($"Aliases->{aliasNode.Name}");
if (aliasNode.Name == "Alias") if (aliasNode.Name == "Alias")
{ {
instDefinition.Aliases.Add(aliasNode.Attributes["Name"].Value); instDefinition.Aliases.Add(aliasNode.Attributes["Name"].Value);
@@ -80,27 +131,41 @@ namespace SVM.Assembler.Core
} }
break; break;
case "Parameters": case "Parameters":
foreach (XmlNode parameterNode in item.ChildNodes)
break; {
default: Console.WriteLine($"Parameters->{parameterNode.Name}");
break; if (parameterNode.Name == "InstructionParameter")
} {
if (item.Name != "InstructionDefinition") if (!ParseParameter(parameterNode, ref instDefinition))
{ {
return false; return false;
} }
} }
else
{
return false;
}
}
break;
default:
Console.WriteLine($"???{item.Name}");
break;
}
}
return true; return true;
} }
static bool ParseDefinitions(XmlNode node, ref ISADefinition definition) static bool ParseDefinitions(XmlNode node, ref ISADefinition definition)
{ {
Console.WriteLine("Parse:Definitions");
foreach (XmlNode item in node.ChildNodes) foreach (XmlNode item in node.ChildNodes)
{ {
if (item.Name != "InstructionDefinition") if (item.Name != "InstructionDefinition")
{ {
Console.WriteLine($"Not Matching:{item.Name}");
return false; return false;
} }
if (ParseDefinition(node, ref definition) == false) if (ParseDefinition(item, ref definition) == false)
{ {
return false; return false;
} }
@@ -112,9 +177,14 @@ namespace SVM.Assembler.Core
XmlDocument xmlDocument = new XmlDocument(); XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(inputStream); xmlDocument.Load(inputStream);
ISADefinition isaDefinition = new ISADefinition(); ISADefinition isaDefinition = new ISADefinition();
foreach (XmlNode item in xmlDocument.ChildNodes) foreach (XmlNode rootNode in xmlDocument.ChildNodes)
{ {
ShowNode(item, 0); //ShowNode(rootNode, 0);
if (rootNode.Name == "ISARoot")
{
foreach (XmlNode item in rootNode)
{
switch (item.Name) switch (item.Name)
{ {
case "Enums": case "Enums":
@@ -127,11 +197,14 @@ namespace SVM.Assembler.Core
} }
break; break;
default: default:
Console.WriteLine("Unknown Node!");
break; break;
} }
} }
definition = null; }
return false; }
definition = isaDefinition;
return true;
} }
} }
} }

View File

@@ -13,34 +13,34 @@
<MatchingItems> <MatchingItems>
<Item Id="String"/> <Item Id="String"/>
</MatchingItems> </MatchingItems>
<ExpectedValue Type="Byte" Pos="1" Converter="InternalEnum:bOp" /> <ExpectedValue Type="UInt8" Pos="1" Converter="InternalEnum:bOp" />
</InstructionParameter> </InstructionParameter>
<InstructionParameter> <InstructionParameter>
<MatchingItems> <MatchingItems>
<Item Id="String"/> <Item Id="String"/>
</MatchingItems> </MatchingItems>
<ExpectedValue Type="Byte" Pos="2" Converter="InternalEnum:NativeType" /> <ExpectedValue Type="UInt8" Pos="2" Converter="InternalEnum:NativeType" />
</InstructionParameter> </InstructionParameter>
<InstructionParameter> <InstructionParameter>
<MatchingItems> <MatchingItems>
<Item Id="String"/> <Item Id="String"/>
<Item Id="Register"/> <Item Id="Register"/>
</MatchingItems> </MatchingItems>
<ExpectedValue Type="Byte" Pos="3" Converter="Register" /> <ExpectedValue Type="UInt8" Pos="3" Converter="Register" />
</InstructionParameter> </InstructionParameter>
<InstructionParameter> <InstructionParameter>
<MatchingItems> <MatchingItems>
<Item Id="String"/> <Item Id="String"/>
<Item Id="Register"/> <Item Id="Register"/>
</MatchingItems> </MatchingItems>
<ExpectedValue Type="Byte" Pos="4" Converter="Register" /> <ExpectedValue Type="UInt8" Pos="4" Converter="Register" />
</InstructionParameter> </InstructionParameter>
<InstructionParameter> <InstructionParameter>
<MatchingItems> <MatchingItems>
<Item Id="String"/> <Item Id="String"/>
<Item Id="Register"/> <Item Id="Register"/>
</MatchingItems> </MatchingItems>
<ExpectedValue Type="Byte" Pos="5" Converter="Register" /> <ExpectedValue Type="UInt8" Pos="5" Converter="Register" />
</InstructionParameter> </InstructionParameter>
</Parameters> </Parameters>
</InstructionDefinition> </InstructionDefinition>