コード例 #1
0
		//=========================================================================================
		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;
		}
コード例 #2
0
		//=========================================================================================
		internal void AddLink(Literal literal, StateScannerState state)
		{
			this.Entries.Add(literal, state);
		}
コード例 #3
0
		//=========================================================================================
		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;
		}
コード例 #4
0
		//=========================================================================================
		/// <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;
		}