internal static int GetNextToken(string source, int position, out Token token, Token prevToken = null) { char symbol = source[position]; token = null; if (DoubleToken.IsStartSymbol(symbol)) { token = new DoubleToken().FromString(source, ref position); return position; } if (BracketToken.IsStartSymbol(symbol)) { token = BracketToken.GetBracket(symbol, prevToken); return position + 1; } if (OperationToken.TryGetOperation(symbol, prevToken, out token)) { return position + 1; } if (FunctionToken.IsStartSymbol(symbol)) { token = new FunctionToken().FromString(source, ref position); return position; } throw new ArgumentOutOfRangeException("symbol", symbol, "Unexpected symbol"); }
public OpenBracket(Token prevToken) { if (prevToken != null && (prevToken.TokenType != TokenType.Operation && prevToken.TokenType != TokenType.OpenBracket)) { throw new InvalidOperationException("Open bracket can't follow after: " + prevToken.TokenType); } }
public static BracketToken GetBracket(char symbol, Token prevToken = null) { switch (symbol) { case '(': return new OpenBracket(prevToken); case ')': return new CloseBracket(prevToken); default: throw new ArgumentOutOfRangeException("symbol", symbol, string.Format("Have not this bracket: '{0}'", symbol)); } }
public CloseBracket(Token prevToken) { if (prevToken == null) throw new InvalidOperationException("Close bracket be first in expression."); if (prevToken.TokenType != TokenType.Value && prevToken.TokenType != TokenType.CloseBracket) { throw new InvalidOperationException("Close bracket can't follow after: " + prevToken.TokenType); } }
protected static bool TryGetUnary(char symbol, Token prevToken, out Token unaryOperation) { unaryOperation = null; return (prevToken == null || prevToken.AllowUnaryAfter) && UnarySpecialChars.TryGetValue(symbol, out unaryOperation); }
public static bool TryGetOperation(char symbol, Token prevToken, out Token token) { return TryGetUnary(symbol, prevToken, out token) || SpecialChars.TryGetValue(symbol, out token); }