public ParserProduction(ParserAutomata automata, Grammar <TToken> .ParserRule parserRule, Grammar <TToken> .ParserProduction grammarParserProduction, List <ParserProduction> productions)
                    : base(grammarParserProduction.Entries.Select(automata.CreateParserEntry))
                {
                    Name     = grammarParserProduction.Name ?? automata.GenerateProductionName();
                    IsInline = parserRule.IsInline;
                    GrammarParserProduction = grammarParserProduction;
                    ProductionIndex         = productions.Count;

                    productions.Add(this);

                    Flatten();

                    if (IsInline)
                    {
                        return;
                    }

                    Binder = grammarParserProduction.Binding switch
                    {
                        Grammar <TToken> .ConstructorParserProductionBinding _ => new CtorParserProductionBinder(this),
                        Grammar <TToken> .SyntaxFactoryParserProductionBinding _ => new SyntaxFactoryProductionBinder(this),
                        null => null,
                        _ => throw new InvalidOperationException("Unknown binder")
                    };
                }
Example #2
0
                public SyntaxTreeAutomataContext MountSyntaxTreeContext(ParserAutomata parserAutomata, LexemeSource <TToken> lexemeSource, ParserContext parserContext, Parser <TGrammar, TToken> parser)
                {
                    SyntaxTreeAutomataContext context;

                    lock (SyntaxTreeContextPool)
                        context = SyntaxTreeContextPool.Count > 0 ? SyntaxTreeContextPool.Pop() : new SyntaxTreeAutomataContext(this, parserAutomata);

                    context.Mount(lexemeSource, parserContext, parser);

                    return(context);
                }
Example #3
0
                public ProcessAutomataContext MountProcessContext(ParserAutomata parserAutomata, LexemeSource <TToken> lexemeSource, ParserContext parserContext, Parser <TGrammar, TToken> parser)
                {
                    ProcessAutomataContext context;

                    lock (ProcessContextPool)
                        context = ProcessContextPool.Count > 0 ? ProcessContextPool.Pop() : new ProcessAutomataContext(this, parserAutomata);

                    context.Mount(lexemeSource, parserContext, parser);

                    return(context);
                }
Example #4
0
                public VisitorAutomataContext MountVisitorContext(Visitor visitor, ParserAutomata parserAutomata, LexemeSource <TToken> lexemeSource, ParserContext parserContext, Parser <TGrammar, TToken> parser)
                {
                    var pool = GetVisitorContextPool(visitor.GetType());

                    VisitorAutomataContext context;

                    lock (pool)
                        context = pool.Count > 0 ? pool.Pop() : new VisitorAutomataContext(visitor, this, parserAutomata);

                    context.Mount(lexemeSource, parserContext, parser);

                    return(context);
                }
                protected ValueParserAutomataContext(ParserState state, ParserAutomata parserAutomata) : base(state, parserAutomata)
                {
                    var productionsCount = parserAutomata.Productions.Count;

                    _productionBuilderPool = new ProductionInstanceBuilderPool[productionsCount];

                    for (var i = 0; i < productionsCount; i++)
                    {
                        var automataProduction = Automata.Productions[i];

                        if (automataProduction.IsInline == false)
                        {
                            _productionBuilderPool[i] = new ProductionInstanceBuilderPool(automataProduction);
                        }
                    }
                }
 public VisitorAutomataContext(Visitor visitor, ParserState state, ParserAutomata parserAutomata) : base(state, parserAutomata)
 {
     Visitor = visitor;
 }
Example #7
0
 protected ParserAutomataContext(ParserState state, ParserAutomata parserAutomata) : base(state)
 {
     Automata = parserAutomata;
 }
 public ProcessAutomataContext(ParserState state, ParserAutomata parserAutomata) : base(state, parserAutomata)
 {
 }
 public SyntaxTreeAutomataContext(ParserState state, ParserAutomata parserAutomata) : base(state, parserAutomata)
 {
 }