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); }
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); }