using Microsoft.Iris.Asm.Models; using Sprache; using System.Linq; namespace Microsoft.Iris.Asm; public static partial class Lexer { public static readonly Parser AlphanumericText = Parse.LetterOrDigit.AtLeastOnce().Text(); public static readonly Parser WordText = Parse.Letter.AtLeastOnce().Text(); public static readonly Parser WholeNumber = Parse.Digit.AtLeastOnce().Text(); public static readonly Parser Identifier = Parse.LetterOrDigit.Or(Parse.Chars('_', '-')).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 QualifiedTypeName = ParseQualifiedTypeName; public static readonly Parser Import = ParseImport; public static readonly Parser Directive = ParseDirective; public static readonly Parser BodyItem = ParseBodyItem; public static readonly Parser Program = from body in BodyItem.Many() select new Program(body); private static IInput ConsumeWhitespace(IInput input) => Parse.WhiteSpace.Many()(input).Remainder; private static IResult ParseQualifiedTypeName(IInput input) { var line = input.Line; var col = input.Column; var typePrefixResult = Identifier(input); input = typePrefixResult.Remainder; if (!typePrefixResult.WasSuccessful) return Result.Failure(input, "Invalid type name", ["Expected a valid namespace prefix"]); var typeNamespaceDelimitterResult = Parse.Char(':')(input); input = typeNamespaceDelimitterResult.Remainder; string typeName, typePrefix; if (typeNamespaceDelimitterResult.WasSuccessful) { var typeNameResult = Identifier(input); input = typeNameResult.Remainder; if (!typeNameResult.WasSuccessful) return Result.Failure(input, "Invalid type name", ["Expected a valid type name"]); typePrefix = typePrefixResult.Value; typeName = typeNameResult.Value; } else { typePrefix = null; typeName = typePrefixResult.Value; } QualifiedTypeName qualifiedName = new(typePrefix, typeName) { Line = line, Column = col, }; return Result.Success(qualifiedName, input); } }