示例#1
0
		private IEnumerable<CoreToken> Scan (IToken token, IMathRegionViewModel region)
		{
			if (token is ITextToken) {
				var t = token as ITextToken;
				double value;
				if (double.TryParse (t.Text, out value))
					yield return new NumberCoreToken (new Location (region), value);
				else
					yield return new IdentifierCoreToken (new Location (region), t.Text);
			}

			if (token is IPlusToken)
				yield return new CoreToken (new Location (region), TokenType.Plus);

			if (token is IMinusToken)
				yield return new CoreToken (new Location (region), TokenType.Minus);

			if (token is IMultiplicationToken)
				yield return new CoreToken (new Location (region), TokenType.Multiplication);

			if (token is IFractionToken) {
				var fraction = token as IFractionToken;

				yield return new CoreToken (new Location (region), TokenType.OpenParentheses);
				foreach (var coreToken in Scan(fraction.Dividend, region))
					yield return coreToken;
				yield return new CoreToken (new Location (region), TokenType.CloseParentheses);

				yield return new CoreToken (new Location (region), TokenType.Division);

				yield return new CoreToken (new Location (region), TokenType.OpenParentheses);
				foreach (var t in Scan(fraction.Divisor, region))
					yield return t;
				yield return new CoreToken (new Location (region), TokenType.CloseParentheses); 
			}

			if (token is IHBoxToken) {
				var box = token as IHBoxToken;
				foreach (var t in box.Tokens)
					foreach (var coreToken in Scan(t, region))
						yield return coreToken;
			}

			if (token is IAssignmentToken) {
				yield return new CoreToken (new Location (region), TokenType.Assignment);
			}

			if (token is IParenthesesToken) {
				var parentheses = token as IParenthesesToken;

				yield return new CoreToken (new Location (region), TokenType.OpenParentheses);
				foreach (var coreToken in Scan(parentheses.Child, region))
					yield return coreToken;

				if (parentheses.ShowCloseParentheses)
					yield return new CoreToken (new Location (region), TokenType.CloseParentheses);
			}

			if (token is ICommaToken)
				yield return new CoreToken (new Location (region), TokenType.Comma);

			if (token is IExponentiationToken) {
				var exponentiation = token as IExponentiationToken;

				yield return new IdentifierCoreToken (new Location (region), "^pow");
				yield return new CoreToken (new Location (region), TokenType.OpenParentheses);
				foreach (var coreToken in Scan(exponentiation.Base, region))
					yield return coreToken;

				yield return new CoreToken (new Location (region), TokenType.Comma);

				foreach (var coreToken in Scan(exponentiation.Power, region))
					yield return coreToken;
				yield return new CoreToken (new Location (region), TokenType.CloseParentheses); 
			}

			if (token is ISquareRootToken) {
				var squareRoot = token as ISquareRootToken;

				yield return new IdentifierCoreToken (new Location (region), "^sqrt");
				yield return new CoreToken (new Location (region), TokenType.OpenParentheses);
				foreach (var coreToken in Scan(squareRoot.Child, region))
					yield return coreToken;			
				yield return new CoreToken (new Location (region), TokenType.CloseParentheses); 
			}

			if (token is IAbsoluteToken) {
				var absolute = token as IAbsoluteToken;

				yield return new IdentifierCoreToken (new Location (region), "^abs");
				yield return new CoreToken (new Location (region), TokenType.OpenParentheses);
				foreach (var coreToken in Scan(absolute.Child, region))
					yield return coreToken;			
				yield return new CoreToken (new Location (region), TokenType.CloseParentheses); 
			}
		}
示例#2
0
		public Location (IMathRegionViewModel region)
		{
			Region = region;
		}