Esempio n. 1
0
            public TDfaState EvalPredicates(AutomataContext context)
            {
                var predicate       = ((ExecutionPath)Predicate).Predicate;
                var predicateResult = predicate.PassInternal(context) != null;

                return(TryGetPredicateState(predicateResult) ?? Builder.BuildPredicateState(-1, (TDfaState)this, predicateResult));
            }
Esempio n. 2
0
                private bool Predicate(AutomataContext context)
                {
                    var stateEntryContext = (PriorityStateEntryContext)context.GetTopStateEntryContext(_state);
                    var pr = stateEntryContext?.Priority ?? 0;

                    return(_priority >= pr);
                }
Esempio n. 3
0
            private void Dispose()
            {
                ClearThreads();

                _parallelThreads           = _parallelThreads.DisposeExchange();
                _executionPathQueueBuilder = _executionPathQueueBuilder.DisposeExchange();
                _currentThread.Dispose(this);
                _currentThread    = Thread.Empty;
                _executionMethods = null;
                _partialRun       = false;

                Context.ProcessField = DummyProcess;
                Context = null;

                _processResources = null;
                _automata.ReleaseProcess(this);
            }
Esempio n. 4
0
            internal void Initialize(IInstructionReader instructionReader, AutomataContext context)
            {
                if (ReferenceEquals(context.ProcessField, DummyProcess) == false)
                {
                    throw new InvalidOperationException("Context is busy");
                }

                _processResources          = ProcessResources.ThreadLocalInstance.Value;
                _executionPathQueueBuilder = _processResources.ExecutionPathGroupBuilderPool.Get().AddReference();
                _parallelThreads           = _processResources.ThreadListPool.Get().AddReference();
                _executionMethods          = _automata.GetExecutionMethods(context);

                Context = context;
                Context.ProcessField = this;

                var entryPoint = context.EntryPoint;

                if (!(entryPoint is FiniteState state))
                {
                    return;
                }

                var instructionQueue = _processResources.InstructionQueuePool.Get().Mount(instructionReader, _automata);

                _entryPointSubGraph = _automata.EnsureSubGraph(state);

                var initNode = _entryPointSubGraph.InitNode;

                if (initNode.Safe == false)
                {
                    initNode.MakeSafe();
                }

                _currentThread = new Thread(initNode, instructionQueue, context.CreateContextStateInternal())
                {
                    Stack                = _processResources.StackPool.Get().AddReference(),
                    ExecutionQueue       = _processResources.ExecutionPathPool.Get().AddReference(),
                    PredicateResultQueue = _processResources.PredicateResultPool.Get().AddReference()
                };
            }
Esempio n. 5
0
                    protected override PredicateResult Pass(AutomataContext context)
                    {
                        if (_finish)
                        {
                            CallSubParserContext.ParserAutomataContext.LexemeSource.Position = CallSubParserContext.Offset + SubParseResult.InstructionStreamPosition;
                            CallSubParserContext.ParserAutomataContext.AdvanceInstructionPosition();

                            return(_poolCollection.PredicateResultPool.Get().Mount(this));
                        }

                        var result = SubParseResult.RunSecond();

                        try
                        {
                            if (result is Automata <Lexeme <TSubToken>, TSubToken> .SuccessAutomataResult localResult)
                            {
                                CallSubParserContext.ParserAutomataContext.LexemeSource.Position = CallSubParserContext.Offset + localResult.InstructionPosition;
                                CallSubParserContext.ParserAutomataContext.AdvanceInstructionPosition();

                                return(_poolCollection.PredicateResultPool.Get().Mount(this));
                            }

                            if (result is Automata <Lexeme <TSubToken>, TSubToken> .ForkAutomataResult forkResult)
                            {
                                var firstBranch  = _poolCollection.ForkBranchPool.Get().Mount(CallSubParserContext, forkResult, true);
                                var secondBranch = _poolCollection.ForkBranchPool.Get().Mount(CallSubParserContext, forkResult, false);

                                return(_poolCollection.ForkPredicateResultPool.Get().Mount(firstBranch, secondBranch));
                            }

                            return(null);
                        }
                        finally
                        {
                            result.Dispose();
                        }
                    }
                public PredicateResult <Lexeme <TSubToken> > SubLex(AutomataContext automataContext)
                {
                    var parserContext = (ParserAutomataContext)automataContext;

                    return(parserContext.CallSubLexer(this, out var parseResult) ? new LocalPredicateResult <Lexeme <TSubToken> >(parseResult) : null);
                }
                private PredicateResult SubParse(AutomataContext automataContext)
                {
                    var parserContext = (ParserAutomataContext)automataContext;

                    return(parserContext.CallSubParser(this));
                }
Esempio n. 8
0
 protected override PredicateResult Pass(AutomataContext context)
 {
     return(Predicate(context));
 }
Esempio n. 9
0
 internal PredicateResult PassInternal(AutomataContext context)
 {
     return(Pass(context));
 }
Esempio n. 10
0
 protected abstract PredicateResult Pass(AutomataContext context);