//========================================================================================= public StateScannerState GetNextState(Literal literal) { foreach (var oEntry in this.Entries) { if (string.Compare(oEntry.Key.Name, literal.Name, true) == 0) return oEntry.Value; } return this.ElseState; }
//========================================================================================= internal void AddLink(Literal literal, StateScannerState state) { this.Entries.Add(literal, state); }
//========================================================================================= Literal[] GetLiteralsFromString(string definition) { string[] textLiterals = definition.Split(); Literal[] literals = new Literal[textLiterals.Length]; for (int i = 0; i < textLiterals.Length; i++) { var oLiteral = this.GetLiteralByName(textLiterals[i]); if (oLiteral == null) throw new NullReferenceException(textLiterals[i]); literals[i] = oLiteral; } return literals; }
//========================================================================================= /// <summary>Создать новое состояние или взять уже существующее, в которое мы переходим из указанного при получении на входе указанного символа.</summary> StateScannerState CreateOrGetState(StateScannerState from, Literal incoming, string stateName, string tokenName) { StateScannerState oState; if (from.Entries.TryGetValue(incoming, out oState)) { if (oState == this.EndState) { string sMsg = string.Format("Ambiguous link {0}->{1}: {2} or {3}.", from.Name, incoming.Name, from.ResultTokenName, tokenName); throw new ArgumentException(sMsg); } return oState; } StateScannerState oNewState = new StateScannerState(stateName); from.AddLink(incoming, oNewState); this.States.Add(oNewState); oNewState.ResultTokenName = tokenName; return oNewState; }