diff --git a/ZuneUIXTools.sln b/ZuneUIXTools.sln index 51af850..6e35e1d 100644 --- a/ZuneUIXTools.sln +++ b/ZuneUIXTools.sln @@ -21,6 +21,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UIX.RenderApi", "libs\Micro EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libs", "libs", "{470F14DD-0489-4BE5-BB4B-421EDB4021AC}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UIX.Asm", "libs\UIX.Asm\UIX.Asm.csproj", "{D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UIX.Test", "libs\UIX.Test\UIX.Test.csproj", "{C401799F-64DA-41E2-BC37-BE3C304FAE19}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -113,6 +117,30 @@ Global {CB2B7609-C7B8-4E2A-82D8-DD631B70B621}.Release|x64.Build.0 = Release|x64 {CB2B7609-C7B8-4E2A-82D8-DD631B70B621}.Release|x86.ActiveCfg = Release|x86 {CB2B7609-C7B8-4E2A-82D8-DD631B70B621}.Release|x86.Build.0 = Release|x86 + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Debug|x64.ActiveCfg = Debug|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Debug|x64.Build.0 = Debug|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Debug|x86.Build.0 = Debug|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Release|Any CPU.Build.0 = Release|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Release|x64.ActiveCfg = Release|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Release|x64.Build.0 = Release|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Release|x86.ActiveCfg = Release|Any CPU + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6}.Release|x86.Build.0 = Release|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Debug|x64.ActiveCfg = Debug|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Debug|x64.Build.0 = Debug|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Debug|x86.ActiveCfg = Debug|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Debug|x86.Build.0 = Debug|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Release|Any CPU.Build.0 = Release|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Release|x64.ActiveCfg = Release|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Release|x64.Build.0 = Release|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Release|x86.ActiveCfg = Release|Any CPU + {C401799F-64DA-41E2-BC37-BE3C304FAE19}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -123,6 +151,8 @@ Global {1FF973F0-C293-439C-83F8-D2C02B624C2D} = {0CB0EB34-BA9C-4D36-AE45-380F3F0D12ED} {78A8B08C-C0E9-4BAC-9AF6-58D3A55C05C9} = {470F14DD-0489-4BE5-BB4B-421EDB4021AC} {CB2B7609-C7B8-4E2A-82D8-DD631B70B621} = {470F14DD-0489-4BE5-BB4B-421EDB4021AC} + {D311AFFC-CA27-4349-8B01-D5CF0E5FC2B6} = {470F14DD-0489-4BE5-BB4B-421EDB4021AC} + {C401799F-64DA-41E2-BC37-BE3C304FAE19} = {470F14DD-0489-4BE5-BB4B-421EDB4021AC} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4FFAF324-5FC4-4AAF-A0D7-BAA0D81C2B4C} diff --git a/libs/UIX.Asm/Instruction.cs b/libs/UIX.Asm/Instruction.cs new file mode 100644 index 0000000..7124273 --- /dev/null +++ b/libs/UIX.Asm/Instruction.cs @@ -0,0 +1,35 @@ +using Microsoft.Iris.Markup; +using System.Collections.Generic; +using System.Linq; + +namespace UIX.Asm; + +public interface IBodyItem { } + +public record Instruction(string Mnemonic, IEnumerable Operands) : IBodyItem +{ + public OpCode OpCode => LexerMaps.MnemonicToOpCode(Mnemonic); + public OperationType? OperationType => LexerMaps.TryOperationMnemonicToType(Mnemonic); + + public override string ToString() => $"{Mnemonic} {string.Join(", ", Operands)}"; +} + +public record Label(string Name) : IBodyItem +{ + public override string ToString() => $"{Name}:"; +} + +public record Operand(string Content) +{ + public override string ToString() => Content; +} + +public record Import(string Uri, string Name) +{ + public override string ToString() => $".import {Uri} as {Name}"; +} + +public record Program(IEnumerable Imports, IEnumerable Body) +{ + public override string ToString() => string.Join("\r\n", Imports.Select(i => i.ToString()).Concat(Body.Select(b => b.ToString()))); +} diff --git a/libs/UIX.Asm/Lexer.cs b/libs/UIX.Asm/Lexer.cs new file mode 100644 index 0000000..c6ad1ed --- /dev/null +++ b/libs/UIX.Asm/Lexer.cs @@ -0,0 +1,86 @@ +using Sprache; +using System.Collections.Generic; +using System.Linq; + +namespace UIX.Asm; + +public static class Lexer +{ + public static readonly Parser AlphanumericText = Parse.LetterOrDigit.AtLeastOnce().Text(); + + public static readonly Parser Uri = Parse.LetterOrDigit.Or(Parse.Chars(":/!._-")).AtLeastOnce().Text(); + + public static readonly Parser StatementEnd = Parse.Char(';').Return(";").Or(Parse.LineTerminator); + + public static readonly Parser Import = + from _ in Parse.String(".import").Token() + from uri in Uri.Token() + from __ in Parse.String("as").Token() + from name in AlphanumericText + from end in StatementEnd + select new Import(uri, name); + + public static readonly Parser Mnemonic = Parse.Letter.AtLeastOnce().Text().Token(); + + public static readonly Parser