mirror of
https://github.com/creeperlv/SVM.git
synced 2026-01-11 12:59:54 +00:00
Working on ISADefinition.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user