private static bool TryTakeDateTime(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token) { if (stringKeeper.IsNext("datetime'")) { var work = stringKeeper.Take(8); Debug.Assert(work.Next == '\''); StringKeeper literalEnd; Token literalToken; TryTakeStringLiteral(work, out literalEnd, out literalToken); newStringKeeper = literalEnd; if (literalToken.TokenType == TokenType.Error) { token = new Token(TokenType.Error, literalEnd.Difference(stringKeeper)); return(true); } literalToken.TokenType = TokenType.DateTimeLiteral; token = literalToken; return(true); } newStringKeeper = stringKeeper; token = null; return(false); }
private static bool TryTakeStringLiteral(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token) { if (stringKeeper.Next == '\'') { var start = stringKeeper.Take(); var work = new StringKeeper(start); while (!work.IsEmpty) { if (work.IsNext("\'\'")) { work = work.Take(2); } else { if (work.Next == '\'') { var literalValue = work.Difference(start).Replace("''", "'"); token = new Token(TokenType.StringLiteral, literalValue); work = work.Take(); newStringKeeper = work; if (!IsTerminator(work)) { do { work = work.Take(); } while (!work.IsEmpty && !work.IsWhitespace); token.TokenType = TokenType.Error; return(true); } return(true); } else { work = work.Take(); } } } newStringKeeper = work; token = new Token(TokenType.Error, work.Difference(stringKeeper)); return(true); } newStringKeeper = stringKeeper; token = null; return(false); }
private static bool TryTakeParens(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token) { var thisParens = _parens.FirstOrDefault(x => stringKeeper.IsNext(x.Key)); if (thisParens.Key != null) { var work = stringKeeper.Take(thisParens.Key.Length); newStringKeeper = work; token = thisParens.Value; return(true); } newStringKeeper = stringKeeper; token = null; return(false); }
private static bool TryTakeOperator(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token) { var thisOp = _operators.FirstOrDefault(x => stringKeeper.IsNext(x.Key)); if (thisOp.Key != null) { var work = stringKeeper.Take(thisOp.Key.Length); if (work.IsEmpty || work.IsWhitespace || work.IsNext("(")) { newStringKeeper = work; token = thisOp.Value; return(true); } } newStringKeeper = stringKeeper; token = null; return(false); }