/// <summary> /// Builds a new parser for the specified grammar and input using the supplied rules. /// </summary> /// <param name="grammar">The grammar to use.</param> /// <param name="inputText">The input text to use.</param> /// <param name="option">The parsing options to use.</param> /// <returns>A new <see cref="Parser"/> instance.</returns> /// <exception cref="GrammarException">No parser found for specified grammar.</exception> /// <exception cref="ArgumentNullException"><paramref name="grammar"/> is <see langword="null" />.</exception> /// <exception cref="ArgumentNullException"><paramref name="inputText"/> is <see langword="null" />.</exception> public Parser BuildParserWithOptions([NotNull] GrammarReference grammar, [NotNull] string inputText, ParseOption option) { if (grammar is null) { throw new ArgumentNullException(nameof(grammar)); } if (inputText is null) { throw new ArgumentNullException(nameof(inputText)); } if (grammar.Parser == null) { throw new GrammarException($"No parser found for grammar \"{grammar.GrammarName}\""); } var loader = new Grammar.Loader(); var inputStream = new AntlrInputStream(inputText); var lexer = loader.LoadLexer(grammar, inputStream); var commonTokenStream = new CommonTokenStream(lexer); commonTokenStream.Fill(); Tokens = commonTokenStream.GetTokens(); SyntaxTokens = ConvertTokensToSyntaxTokens(lexer, Tokens); if (option.HasFlag(ParseOption.Tokens)) { foreach (var token in Tokens) { Console.WriteLine(token.ToString()); } } var parser = loader.LoadParser(grammar, commonTokenStream); // Handle Tree parsing option parser.BuildParseTree = option.HasFlag(ParseOption.Tree); // Handle Diagnostics parsing option if (option.HasFlag(ParseOption.Diagnostics)) { parser.AddErrorListener(new DiagnosticErrorListener()); parser.Interpreter.PredictionMode = Antlr4.Runtime.Atn.PredictionMode.LlExactAmbigDetection; } // Handle Sll parsing option if (option.HasFlag(ParseOption.Sll)) { parser.Interpreter.PredictionMode = Antlr4.Runtime.Atn.PredictionMode.Sll; } // Handle Trace parsing option parser.Trace = option.HasFlag(ParseOption.Trace); return(parser); }
/// <summary> /// Tokenizes the grammar text and returns the tokens. /// </summary> /// <param name="grammar">The grammar.</param> /// <param name="inputText">The input text.</param> /// <returns>A new <see cref="IList{IToken}" />.</returns> /// <exception cref="ArgumentNullException"><paramref name="grammar"/> is <see langword="null"/>.</exception> /// <exception cref="ArgumentNullException"><paramref name="inputText"/> is <see langword="null"/> or empty.</exception> /// <exception cref="T:System.IO.FileLoadException">Grammar assembly could not be loaded.</exception> /// <exception cref="T:System.IO.FileNotFoundException">The grammar assembly path is an empty string ("") or does not exist.</exception> /// <exception cref="T:System.BadImageFormatException">The grammar assembly path is not a valid assembly.</exception> public IList <IToken> Tokenize([NotNull] GrammarReference grammar, [NotNull] string inputText) { if (grammar is null) { throw new ArgumentNullException(nameof(grammar)); } if (inputText is null) { throw new ArgumentNullException(nameof(inputText)); } var loader = new Grammar.Loader(); var inputStream = new AntlrInputStream(inputText); var lexer = loader.LoadLexer(grammar, inputStream); lexer.RemoveErrorListeners(); var commonTokenStream = new CommonTokenStream(lexer); commonTokenStream.Fill(); Tokens = commonTokenStream.GetTokens(); SyntaxTokens = ConvertTokensToSyntaxTokens(lexer, Tokens); return(Tokens); }