コード例 #1
0
ファイル: Analyzer.cs プロジェクト: tnsr1/Grun.Net
        /// <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);
        }
コード例 #2
0
ファイル: Analyzer.cs プロジェクト: tnsr1/Grun.Net
        /// <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);
        }