コード例 #1
0
        /// <summary>
        /// Parse the fragment of the source code already given.
        /// </summary>
        /// <param name="parser"></param>
        /// <param name="tokenStream"></param>
        private static CstNode ParseFragment(TParser parser, CommonTokenStream tokenStream)
        {
            var builder = new CstBuilderForAntlr3WithMemorizingError(
                tokenStream, parser.TokenNames);

            parser.TreeAdaptor = builder;
            tokenStream.Mark();
            var methodInfos =
                parser.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance);

            foreach (var methodInfo in methodInfos)
            {
                if (methodInfo.ReturnType.IsSubclassOf(typeof(ParserRuleContext)) &&
                    methodInfo.GetParameters().Length == 0)
                {
                    builder.Initialize();
                    parser.Reset();
                    var ret = methodInfo.Invoke(parser, new object[0]);
                    if (!builder.HasErrors)
                    {
                        return(builder.FinishParsing((CstNode)ret));
                    }
                }
            }
            throw builder.LastException;
        }