//========================================================================================= public ParserSpecification() { this.States = new List<StateParserState>(); this.StartState = new StateParserState("<start>"); this.EndState = new StateParserState("<end>"); this.FailState = new StateParserState("<fail>"); this.States.Add(this.StartState); this.States.Add(this.EndState); this.States.Add(this.FailState); this.StartState.SetDefaultLink(this.FailState); this.FailState.SetDefaultLink(this.EndState); }
//========================================================================================= public ParserSpecification() { this.States = new List <StateParserState>(); this.StartState = new StateParserState("<start>"); this.EndState = new StateParserState("<end>"); this.FailState = new StateParserState("<fail>"); this.States.Add(this.StartState); this.States.Add(this.EndState); this.States.Add(this.FailState); this.StartState.SetDefaultLink(this.FailState); this.FailState.SetDefaultLink(this.EndState); }
//========================================================================================= void GetNextSentence() { ///Становимся на начальное состояние this.CurrentState = this.Spec.StartState; if (!this.ReadNextToken()) { return; } while (true) { ///Ищем следующее состояние на основании текущего символа var oNewState = this.CurrentState.GetNextState(this.CurrentToken); ///Если мы перешли в состоянии ошибки, генерим ошибку if (oNewState == this.Spec.FailState) { this.Errors.Add(this.CurrentState.GetExpectationToString()); } ///Если пора выходить if (oNewState == this.Spec.EndState) { this.Scanner.BackToToken(); return; } if (oNewState == null) { throw new NullReferenceException(this.CurrentState.Name); } this.CurrentState = oNewState; if (this.Scanner.StartLimiterLength > 0) { this.EnqueueBoundedToken(); } else { this.CurrentToken.Style = this.Settings.GetStyleFor(this.CurrentToken, this.CurrentState.StyleName); this.EnqueueMultilineToken(this.CurrentToken.Text, this.CurrentToken.Start, this.CurrentToken.End); //this.TokenPool.Enqueue(this.CurrentToken); } ///Читаем новый токен if (!this.ReadNextToken()) { return; } } }
//========================================================================================= void GetNextSentence() { ///Становимся на начальное состояние this.CurrentState = this.Spec.StartState; if (!this.ReadNextToken()) return; while (true) { ///Ищем следующее состояние на основании текущего символа var oNewState = this.CurrentState.GetNextState(this.CurrentToken); ///Если мы перешли в состоянии ошибки, генерим ошибку if (oNewState == this.Spec.FailState) { this.Errors.Add(this.CurrentState.GetExpectationToString()); } ///Если пора выходить if (oNewState == this.Spec.EndState) { this.Scanner.BackToToken(); return; } if (oNewState == null) throw new NullReferenceException(this.CurrentState.Name); this.CurrentState = oNewState; if (this.Scanner.StartLimiterLength > 0) this.EnqueueBoundedToken(); else { this.CurrentToken.Style = this.Settings.GetStyleFor(this.CurrentToken, this.CurrentState.StyleName); this.EnqueueMultilineToken(this.CurrentToken.Text, this.CurrentToken.Start, this.CurrentToken.End); //this.TokenPool.Enqueue(this.CurrentToken); } ///Читаем новый токен if (!this.ReadNextToken()) return; } }
//========================================================================================= /// <summary>Переход по умолчанию, который выполняется, если не срабатывают условия других переходов.</summary> internal void SetDefaultLink(StateParserState state) { this.ElseState = state; }
//========================================================================================= internal void AddLink(string tokenType, StateParserState state) { this.Entries.Add(tokenType, state); }
//========================================================================================= /// <summary>Переход по умолчанию, который выполняется, если не срабатывают условия других переходов.</summary> internal void SetDefaultLink(StateParserState state) { this.ElseState = state; }
//========================================================================================= internal void AddLink(string tokenType, StateParserState state) { this.Entries.Add(tokenType, state); }