mirror of
https://github.com/ZuneDev/ZuneUIXTools.git
synced 2026-07-27 13:11:59 -07:00
Add OperandDataType and rename LexerMaps
This commit is contained in:
@@ -1,106 +0,0 @@
|
|||||||
using Microsoft.Iris.Markup;
|
|
||||||
|
|
||||||
namespace Microsoft.Iris.Asm;
|
|
||||||
|
|
||||||
internal static class LexerMaps
|
|
||||||
{
|
|
||||||
public static OperationType OperationMnemonicToType(string mnemonic) => OperationMnemonicMap[mnemonic.ToUpperInvariant()];
|
|
||||||
public static OperationType? TryOperationMnemonicToType(string mnemonic)
|
|
||||||
{
|
|
||||||
return OperationMnemonicMap.TryGetRight(mnemonic.ToUpperInvariant(), out var type)
|
|
||||||
? type : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static OpCode MnemonicToOpCode(string mnemonic)
|
|
||||||
{
|
|
||||||
if (MnemonicMap.TryGetRight(mnemonic, out var opCode))
|
|
||||||
return opCode;
|
|
||||||
else if (OperationMnemonicMap.TryGetRight(mnemonic, out _))
|
|
||||||
return OpCode.Operation;
|
|
||||||
|
|
||||||
throw new System.ArgumentException($"'{mnemonic}' is not a known UIXA instruction.", nameof(mnemonic));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetMnemonic(OpCode opCode, OperationType? opType = null)
|
|
||||||
{
|
|
||||||
if (MnemonicMap.TryGetLeft(opCode, out var mnemonic))
|
|
||||||
return mnemonic;
|
|
||||||
else if (opType.HasValue && OperationMnemonicMap.TryGetLeft(opType.Value, out var operationMnemonic))
|
|
||||||
return operationMnemonic;
|
|
||||||
|
|
||||||
throw new System.ArgumentException($"'{opCode}' is not a known UIXA instruction.", nameof(opCode));
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static readonly DoubleDictionary<string, OperationType> OperationMnemonicMap =
|
|
||||||
[
|
|
||||||
("ADD", OperationType.MathAdd),
|
|
||||||
("SUB", OperationType.MathSubtract),
|
|
||||||
("MUL", OperationType.MathMultiply),
|
|
||||||
("DIV", OperationType.MathDivide),
|
|
||||||
("MOD", OperationType.MathModulus),
|
|
||||||
("NEG", OperationType.MathModulus),
|
|
||||||
("AND", OperationType.LogicalAnd),
|
|
||||||
("ORR", OperationType.LogicalOr),
|
|
||||||
("NOT", OperationType.LogicalNot),
|
|
||||||
("REQ", OperationType.RelationalEquals),
|
|
||||||
("RNE", OperationType.RelationalNotEquals),
|
|
||||||
("RLT", OperationType.RelationalLessThan),
|
|
||||||
("RGT", OperationType.RelationalGreaterThan),
|
|
||||||
("RLE", OperationType.RelationalLessThanEquals),
|
|
||||||
("RGE", OperationType.RelationalGreaterThanEquals),
|
|
||||||
("RIS", OperationType.RelationalIs),
|
|
||||||
("INC", OperationType.PostIncrement),
|
|
||||||
("DEC", OperationType.PostDecrement),
|
|
||||||
];
|
|
||||||
|
|
||||||
internal static readonly DoubleDictionary<string, OpCode> MnemonicMap =
|
|
||||||
[
|
|
||||||
("COBJ", OpCode.ConstructObject),
|
|
||||||
("COBJI", OpCode.ConstructObjectIndirect),
|
|
||||||
("COBP", OpCode.ConstructObjectParam),
|
|
||||||
("CSTR", OpCode.ConstructFromString),
|
|
||||||
("CBIN", OpCode.ConstructFromBinary),
|
|
||||||
("INIT", OpCode.InitializeInstance),
|
|
||||||
("INITI", OpCode.InitializeInstanceIndirect),
|
|
||||||
("LSYM", OpCode.LookupSymbol),
|
|
||||||
("WSYM", OpCode.WriteSymbol),
|
|
||||||
("WSYMP", OpCode.WriteSymbolPeek),
|
|
||||||
("CSYM", OpCode.ClearSymbol),
|
|
||||||
("PINI", OpCode.PropertyInitialize),
|
|
||||||
("PINII", OpCode.PropertyInitializeIndirect),
|
|
||||||
("PLAD", OpCode.PropertyListAdd),
|
|
||||||
("PDAD", OpCode.PropertyDictionaryAdd),
|
|
||||||
("PASS", OpCode.PropertyAssign),
|
|
||||||
("PASST", OpCode.PropertyAssignStatic),
|
|
||||||
("PGET", OpCode.PropertyGet),
|
|
||||||
("PGETP", OpCode.PropertyGetPeek),
|
|
||||||
("PGETT", OpCode.PropertyGetStatic),
|
|
||||||
("MINV", OpCode.MethodInvoke),
|
|
||||||
("MINVP", OpCode.MethodInvokePeek),
|
|
||||||
("MINVT", OpCode.MethodInvokeStatic),
|
|
||||||
("MINVA", OpCode.MethodInvokePushLastParam),
|
|
||||||
("MINVAT", OpCode.MethodInvokeStaticPushLastParam), // Avoid using "LT" as suffix
|
|
||||||
("VTC", OpCode.VerifyTypeCast),
|
|
||||||
("CON", OpCode.ConvertType),
|
|
||||||
("OPR", OpCode.Operation), // Generic operation, allow dynamic invocations of operators
|
|
||||||
("ISC", OpCode.IsCheck),
|
|
||||||
("ASC", OpCode.As),
|
|
||||||
("TYP", OpCode.TypeOf),
|
|
||||||
("PSHN", OpCode.PushNull),
|
|
||||||
("PSHC", OpCode.PushConstant),
|
|
||||||
("PSHT", OpCode.PushThis),
|
|
||||||
("DIS", OpCode.DiscardValue),
|
|
||||||
("RET", OpCode.ReturnValue),
|
|
||||||
("RETV", OpCode.ReturnVoid),
|
|
||||||
("JMPF", OpCode.JumpIfFalse),
|
|
||||||
("JMPFP", OpCode.JumpIfFalsePeek),
|
|
||||||
("JMPTP", OpCode.JumpIfTruePeek),
|
|
||||||
("JMPD", OpCode.JumpIfDictionaryContains),
|
|
||||||
("JMPNP", OpCode.JumpIfNullPeek),
|
|
||||||
("JMP", OpCode.Jump),
|
|
||||||
("CLIS", OpCode.ConstructListenerStorage),
|
|
||||||
("LIS", OpCode.Listen),
|
|
||||||
("LISD", OpCode.DestructiveListen),
|
|
||||||
("DBG", OpCode.EnterDebugState),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
@@ -6,39 +6,22 @@ using System.Text;
|
|||||||
|
|
||||||
namespace Microsoft.Iris.Asm.Models;
|
namespace Microsoft.Iris.Asm.Models;
|
||||||
|
|
||||||
[DebuggerDisplay("{ToString()} " + DebuggerDisplay)]
|
|
||||||
public record Instruction(string Mnemonic, IEnumerable<Operand> Operands) : BodyItem
|
|
||||||
{
|
|
||||||
public Instruction(OpCode opCode, OperationType? operationType, IEnumerable<Operand> Operands)
|
|
||||||
: this(LexerMaps.GetMnemonic(opCode, operationType), Operands)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
public Instruction(OpCode opCode, IEnumerable<Operand> Operands)
|
|
||||||
: this(opCode, null, Operands)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public OpCode OpCode => LexerMaps.MnemonicToOpCode(Mnemonic);
|
|
||||||
public OperationType? OperationType => LexerMaps.TryOperationMnemonicToType(Mnemonic);
|
|
||||||
|
|
||||||
public override string ToString() => ToString(true);
|
|
||||||
|
|
||||||
public string ToString(bool uppercase)
|
|
||||||
{
|
|
||||||
var mnemonic = uppercase ? Mnemonic.ToUpperInvariant() : Mnemonic.ToLowerInvariant();
|
|
||||||
return Operands.Any()
|
|
||||||
? $"{mnemonic} {string.Join(", ", Operands)}"
|
|
||||||
: mnemonic;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerDisplay("{Name} " + DebuggerDisplay)]
|
[DebuggerDisplay("{Name} " + DebuggerDisplay)]
|
||||||
public record Label(string Name) : BodyItem
|
public record Label(string Name) : BodyItem
|
||||||
{
|
{
|
||||||
public override string ToString() => $"{Name}:";
|
public override string ToString() => $"{Name}:";
|
||||||
}
|
}
|
||||||
|
|
||||||
public record Operand(object Value, string Content = null) : AsmItem
|
public enum OperandDataType : byte
|
||||||
|
{
|
||||||
|
Byte,
|
||||||
|
UInt16,
|
||||||
|
UInt32,
|
||||||
|
Int32,
|
||||||
|
Bytes,
|
||||||
|
}
|
||||||
|
|
||||||
|
public record Operand(object Value, OperandDataType DataType, string Content = null) : AsmItem
|
||||||
{
|
{
|
||||||
public override string ToString() => Content ?? Value.ToString();
|
public override string ToString() => Content ?? Value.ToString();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user