public Token?AcceptNextCharacter(ITokenizerStateContext stateContext, char character)
        {
            if (CharacterDoesNotFit())
            {
                return(Fallback(stateContext, ConsumedCharacters.Append(character)));
            }

            _nextCharacter++;

            if (RemainingCharacters())
            {
                return(null);
            }

            stateContext.State = _originalState;
            return(_onMatch(stateContext));

            bool CharacterDoesNotFit()
            {
                return(_expectedCharacters[_nextCharacter] != character);
            }

            bool RemainingCharacters()
            {
                return(_expectedCharacters.Length > _nextCharacter);
            }
        }
        private Token?Fallback(ITokenizerStateContext stateContext, IEnumerable <char> consumedCharacters)
        {
            Token?token = null;

            foreach (var character in consumedCharacters)
            {
                var returnedToken = _originalState.AcceptNextCharacter(stateContext, character);
                if (CanHoldToken(returnedToken))
                {
                    token = returnedToken;
                }
                else if (returnedToken.HasValue)
                {
                    throw new TokenizationException("FallbackState returned more than 1 tokens.");
                }
            }

            stateContext.State = _originalState;
            return(token);

            bool CanHoldToken(Token?returnedToken)
            {
                return(returnedToken.HasValue && !token.HasValue);
            }
        }
Example #3
0
        public override Token?AcceptNextCharacter(ITokenizerStateContext stateContext, char character)
        {
            switch (character)
            {
            case '"':
                return(Quote(stateContext));

            default:
                return(NormalOrEscapedCharacter(stateContext, character));
            }
        }
Example #4
0
        protected Token?StartOfRecordDelimiter(ITokenizerStateContext stateContext)
        {
            var intermediateState = new StringMatchingState(StateHolder.Default, "\n", context =>
            {
                context.WasLastTokenInRecord = true;
                return(Token.CreateValueToken(stateContext.ResetToken()));
            });

            stateContext.State = intermediateState;
            return(null);
        }
        public override Token?AcceptNextCharacter(ITokenizerStateContext stateContext, char character)
        {
            if (character == '"')
            {
                return(Quote(stateContext));
            }

            if (character == _configuration.FieldDelimiter)
            {
                return(TokenFinished(stateContext));
            }

            if (character == '\r')
            {
                return(StartOfRecordDelimiter(stateContext));
            }

            return(NormalCharacter());
        }
Example #6
0
 public void SetUpBase()
 {
     TokenizerStateContext = A.Fake <ITokenizerStateContext>();
 }
Example #7
0
 private Token?NormalOrEscapedCharacter(ITokenizerStateContext stateContext, char character)
 {
     stateContext.AppendCharacter(character);
     return(null);
 }
Example #8
0
 private Token?Quote(ITokenizerStateContext stateContext)
 {
     stateContext.State = StateHolder.EscapedWithOneQuote;
     return(null);
 }
Example #9
0
 public override Token?Finish(ITokenizerStateContext stateContext)
 {
     throw new TokenizationException("Escaped field not closed. Unexpected end of input.");
 }
 private Token?Quote(ITokenizerStateContext stateContext)
 {
     stateContext.State = StateHolder.Escaped;
     stateContext.AppendCharacter('"');
     return(null);
 }
 private Token?TokenFinished(ITokenizerStateContext stateContext)
 {
     stateContext.State = StateHolder.Default;
     return(Token.CreateValueToken(stateContext.ResetToken()));
 }
 public override Token?Finish(ITokenizerStateContext stateContext)
 {
     return(Token.CreateValueToken(stateContext.ResetToken()));
 }
Example #13
0
 private Token?TokenFinished(ITokenizerStateContext stateContext)
 {
     return(Token.CreateValueToken(stateContext.ResetToken()));
 }
 public Token?Finish(ITokenizerStateContext stateContext)
 {
     return(Fallback(stateContext, ConsumedCharacters));
 }
Example #15
0
 private Token?Quote(ITokenizerStateContext stateContext)
 {
     stateContext.State = StateHolder.Escaped;
     // TODO Throw error, if quote not at start
     return(null);
 }
Example #16
0
 public abstract Token?Finish(ITokenizerStateContext stateContext);
Example #17
0
 public abstract Token?AcceptNextCharacter(ITokenizerStateContext stateContext, char character);