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)); }
private bool Predicate(AutomataContext context) { var stateEntryContext = (PriorityStateEntryContext)context.GetTopStateEntryContext(_state); var pr = stateEntryContext?.Priority ?? 0; return(_priority >= pr); }
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); }
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() }; }
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)); }
protected override PredicateResult Pass(AutomataContext context) { return(Predicate(context)); }
internal PredicateResult PassInternal(AutomataContext context) { return(Pass(context)); }
protected abstract PredicateResult Pass(AutomataContext context);