public static bool TryCreate(Scanner scanner, ILogger logger, out CommandletParserBase parser)
        {
            var anchor = scanner.MakeAnchor();

            if (!scanner.Expect('+'))
            {
                logger.Report(LogLevel.Error, scanner.Pointer.AsRange(scanner.Source), Messages.Error_InstructionExpected);
                parser = null;
                return(false);
            }

            scanner.SkipWhitespaces();

            var  name = scanner.Read(c => char.IsLetterOrDigit(c) || c == '-');
            Type parserType;

            if (!CommandletParsers.TryGetValue(name.ToLowerInvariant(), out parserType))
            {
                logger.Report(LogLevel.Error, scanner.Pointer.AsRange(scanner.Source), Messages.Error_UnknownInstruction);
                parser = null;
                return(false);
            }

            var nameNode = new LiteralNode <string>($"+{name}", anchor.Range);

            parser = (CommandletParserBase)Activator.CreateInstance(parserType);
            parser.CommandletNameNode = nameNode;
            return(true);
        }
Exemple #2
0
        public static bool TryReadBaseNoteName(Scanner scanner, ILogger logger,
                                               out LiteralNode <BaseNoteName> baseNoteNameNode)
        {
            var          noteNameChar = scanner.Read();
            BaseNoteName baseNoteName;

            if (!BaseNoteNames.TryParse(noteNameChar, out baseNoteName))
            {
                baseNoteNameNode = null;
                return(false);
            }

            baseNoteNameNode = new LiteralNode <BaseNoteName>(baseNoteName, scanner.LastReadRange);
            return(true);
        }