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); } }
public Location (IMathRegionViewModel region) { Region = region; }