mirror of
https://github.com/creeperlv/SVM.git
synced 2026-01-11 04:49:53 +00:00
The assembler is partially working now.
This commit is contained in:
@@ -13,7 +13,7 @@ namespace SVM.Assembler.Core
|
|||||||
@"
|
@"
|
||||||
Match:
|
Match:
|
||||||
|
|
||||||
D [0-9]
|
D \d
|
||||||
Number {D}+
|
Number {D}+
|
||||||
InstMath bmath
|
InstMath bmath
|
||||||
InstCvt cvt
|
InstCvt cvt
|
||||||
@@ -24,18 +24,14 @@ Register \${D}+
|
|||||||
LabelCode \.code\:
|
LabelCode \.code\:
|
||||||
LabelData \.data\:
|
LabelData \.data\:
|
||||||
LabelConst \.const\:
|
LabelConst \.const\:
|
||||||
word \w*
|
word [\w\d]+
|
||||||
GenericLabel {word}\:
|
GenericLabel {word}\:
|
||||||
LineEnd \n
|
LineEnd \n
|
||||||
string "".*""
|
string ""\"".*\""""
|
||||||
|
|
||||||
OpAdd add
|
|
||||||
OpSub sub
|
|
||||||
OpMul mul
|
|
||||||
OpDiv div
|
|
||||||
|
|
||||||
Id:
|
Id:
|
||||||
|
word Word
|
||||||
InstMath inst
|
InstMath inst
|
||||||
InstCvt inst
|
InstCvt inst
|
||||||
InstSystem inst
|
InstSystem inst
|
||||||
@@ -64,7 +60,6 @@ LabelConstant InternalLbl
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Console.WriteLine("Lexer Definition load failed.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ISA = isaDefinition;
|
ISA = isaDefinition;
|
||||||
@@ -76,10 +71,13 @@ LabelConstant InternalLbl
|
|||||||
var r = lexer.Lex();
|
var r = lexer.Lex();
|
||||||
if (r.HasError()) return r;
|
if (r.HasError()) return r;
|
||||||
if (r.Result == null) return r;
|
if (r.Result == null) return r;
|
||||||
|
|
||||||
if (r.Result.LexSegmentId != null && r.Result.LexMatchedItemId != null)
|
if (r.Result.LexSegmentId != null && r.Result.LexMatchedItemId != null)
|
||||||
{
|
{
|
||||||
|
if (r.Result.LexSegmentId == "LE") continue;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private OperationResult<(string, string)?> ParseKVPair(ILexer lexer, LexSegment currentSeg)
|
private OperationResult<(string, string)?> ParseKVPair(ILexer lexer, LexSegment currentSeg)
|
||||||
@@ -121,11 +119,9 @@ LabelConstant InternalLbl
|
|||||||
}
|
}
|
||||||
if (!ISA.InstructionDefinitionAliases.TryGetValue(LexDef.Content ?? "", out var instructionDef))
|
if (!ISA.InstructionDefinitionAliases.TryGetValue(LexDef.Content ?? "", out var instructionDef))
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Cannot find matching instruction:{LexDef.Content}");
|
|
||||||
operationResult.AddError(new Error());
|
operationResult.AddError(new Error());
|
||||||
return operationResult;
|
return operationResult;
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Found:{instructionDef.PrimaryInstruction}");
|
|
||||||
intermediateInstruction.inst = instructionDef.PrimaryInstruction;
|
intermediateInstruction.inst = instructionDef.PrimaryInstruction;
|
||||||
foreach (var item in instructionDef.ParameterPattern)
|
foreach (var item in instructionDef.ParameterPattern)
|
||||||
{
|
{
|
||||||
@@ -148,14 +144,12 @@ LabelConstant InternalLbl
|
|||||||
}
|
}
|
||||||
intermediateInstruction.Parameters.Add(next.Result);
|
intermediateInstruction.Parameters.Add(next.Result);
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Parsed:{intermediateInstruction.inst}");
|
|
||||||
return intermediateInstruction;
|
return intermediateInstruction;
|
||||||
}
|
}
|
||||||
public OperationResult<IntermediateObject> AssembleIntermediateObject(string input, string ID = "main.asm")
|
public OperationResult<IntermediateObject> AssembleIntermediateObject(string input, string ID = "main.asm")
|
||||||
{
|
{
|
||||||
StringLexer lexer = new StringLexer();
|
StringLexer lexer = new StringLexer();
|
||||||
lexer.SetDefinition(definition);
|
lexer.SetDefinition(definition);
|
||||||
Console.WriteLine(input);
|
|
||||||
lexer.Content = input;
|
lexer.Content = input;
|
||||||
lexer.SourceID = ID;
|
lexer.SourceID = ID;
|
||||||
OperationResult<IntermediateObject> operationResult = new OperationResult<IntermediateObject>(new IntermediateObject());
|
OperationResult<IntermediateObject> operationResult = new OperationResult<IntermediateObject>(new IntermediateObject());
|
||||||
@@ -163,7 +157,6 @@ LabelConstant InternalLbl
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
var lexResult = Lex(lexer);
|
var lexResult = Lex(lexer);
|
||||||
Console.WriteLine($"{lexResult.Result?.Content ?? "<null>"}");
|
|
||||||
if (lexResult.Result == null) break;
|
if (lexResult.Result == null) break;
|
||||||
var r = lexResult.Result;
|
var r = lexResult.Result;
|
||||||
switch (r.LexSegmentId)
|
switch (r.LexSegmentId)
|
||||||
@@ -189,7 +182,6 @@ LabelConstant InternalLbl
|
|||||||
{
|
{
|
||||||
case InternalLabel.Code:
|
case InternalLabel.Code:
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Code Seg:{r.Content}");
|
|
||||||
OperationResult<IntermediateInstruction?> instR = r.LexSegmentId switch
|
OperationResult<IntermediateInstruction?> instR = r.LexSegmentId switch
|
||||||
{
|
{
|
||||||
"LblG" => ParseInstruction(lexer, r, r),
|
"LblG" => ParseInstruction(lexer, r, r),
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ namespace SVM.Assembler.Core
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
instruction.ParameterPattern.Add(parameter);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
static bool ParseDefinition(XmlNode node, ref ISADefinition definition)
|
static bool ParseDefinition(XmlNode node, ref ISADefinition definition)
|
||||||
@@ -120,7 +121,6 @@ namespace SVM.Assembler.Core
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Definition of: {pi}");
|
|
||||||
instDefinition.PrimaryInstruction = pi;
|
instDefinition.PrimaryInstruction = pi;
|
||||||
foreach (XmlNode item in node.ChildNodes)
|
foreach (XmlNode item in node.ChildNodes)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ namespace SVM.Assembler.Core
|
|||||||
SVMNativeTypes.Double => sizeof(double),
|
SVMNativeTypes.Double => sizeof(double),
|
||||||
_ => 0,
|
_ => 0,
|
||||||
};
|
};
|
||||||
Buffer.MemoryCopy(dataStart, inst + Pos * sizeof(byte), size, size);
|
Buffer.MemoryCopy(dataStart, ((byte*)inst) + Pos * sizeof(byte), size, size);
|
||||||
}
|
}
|
||||||
public unsafe static bool ParseAndWriteData(SVMInstruction* inst, SVMNativeTypes nativeType, int Pos, string value)
|
public unsafe static bool ParseAndWriteData(SVMInstruction* inst, SVMNativeTypes nativeType, int Pos, string value)
|
||||||
{
|
{
|
||||||
@@ -291,7 +291,6 @@ namespace SVM.Assembler.Core
|
|||||||
offset += (uint)data2.Length;
|
offset += (uint)data2.Length;
|
||||||
Data.Add(data);
|
Data.Add(data);
|
||||||
}
|
}
|
||||||
Console.WriteLine($"Instruction Count:{Obj.instructions.Count}");
|
|
||||||
foreach (var item in Obj.instructions)
|
foreach (var item in Obj.instructions)
|
||||||
{
|
{
|
||||||
if (definition.InstructionDefinitions.TryGetValue(item.inst, out var def))
|
if (definition.InstructionDefinitions.TryGetValue(item.inst, out var def))
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="LibCLCC.NET" Version="1.34.35" />
|
<PackageReference Include="LibCLCC.NET" Version="1.35.36" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -18,33 +18,33 @@
|
|||||||
<Parameters>
|
<Parameters>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<MatchingItems>
|
<MatchingItems>
|
||||||
<Item Id="String"/>
|
<Item Id="Word"/>
|
||||||
</MatchingItems>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="UInt8" Pos="1" Converter="InternalEnum:bOp" />
|
<ExpectedValue Type="UInt8" Pos="1" Converter="InternalEnum:bOp" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<MatchingItems>
|
<MatchingItems>
|
||||||
<Item Id="String"/>
|
<Item Id="Word"/>
|
||||||
</MatchingItems>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="UInt8" Pos="2" Converter="InternalEnum:NativeType" />
|
<ExpectedValue Type="UInt8" Pos="2" Converter="InternalEnum:NativeType" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<MatchingItems>
|
<MatchingItems>
|
||||||
<Item Id="String"/>
|
<Item Id="Word"/>
|
||||||
<Item Id="Register"/>
|
<Item Id="Register"/>
|
||||||
</MatchingItems>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="UInt8" Pos="3" Converter="Register" />
|
<ExpectedValue Type="UInt8" Pos="3" Converter="Register" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<MatchingItems>
|
<MatchingItems>
|
||||||
<Item Id="String"/>
|
<Item Id="Word"/>
|
||||||
<Item Id="Register"/>
|
<Item Id="Register"/>
|
||||||
</MatchingItems>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="UInt8" Pos="4" Converter="Register" />
|
<ExpectedValue Type="UInt8" Pos="4" Converter="Register" />
|
||||||
</InstructionParameter>
|
</InstructionParameter>
|
||||||
<InstructionParameter>
|
<InstructionParameter>
|
||||||
<MatchingItems>
|
<MatchingItems>
|
||||||
<Item Id="String"/>
|
<Item Id="Word"/>
|
||||||
<Item Id="Register"/>
|
<Item Id="Register"/>
|
||||||
</MatchingItems>
|
</MatchingItems>
|
||||||
<ExpectedValue Type="UInt8" Pos="5" Converter="Register" />
|
<ExpectedValue Type="UInt8" Pos="5" Converter="Register" />
|
||||||
|
|||||||
@@ -40,11 +40,6 @@ namespace SVM.Assembler
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var item in files)
|
|
||||||
{
|
|
||||||
Console.WriteLine(item);
|
|
||||||
}
|
|
||||||
Assembler.Core.Assembler assembler = new Core.Assembler(def);
|
Assembler.Core.Assembler assembler = new Core.Assembler(def);
|
||||||
foreach (var item in files)
|
foreach (var item in files)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user