Exemplo n.º 1
0
 private Token[] Get(int offset, int count)
 {
     var r = new Token[count];
     for (int i = 0; i < count; i++)
         r[i] = Get(offset + i);
     return r;
 }
Exemplo n.º 2
0
        public void The_bad_token_type_should_be_in_the_error_message1()
        {
            var givenToken = new Token(TokenType.Literal, "DD", 0, 2);
            var e = new UnexpectedTokenException(givenToken, TokenType.ArgumentValueDelimiter, null);

            Assert.IsTrue(e.Message.Contains("DD"));
        }
Exemplo n.º 3
0
 public void The_expected_token_type_should_be_in_the_error_message()
 {
     var givenToken = new Token(TokenType.Literal, "DD", 0, 2);
     
     Assert.IsTrue(new UnexpectedTokenException(givenToken, TokenType.ArgumentValueDelimiter, null).Message.Contains("'='"));
     Assert.IsTrue(new UnexpectedTokenException(givenToken, TokenType.Whitespace, null).Message.Contains("whitespace"));
     Assert.IsTrue(new UnexpectedTokenException(givenToken, TokenType.Literal, LiteralTypeHint.Argument).Message.Contains("argument name"));
     Assert.IsTrue(new UnexpectedTokenException(givenToken, TokenType.Literal, LiteralTypeHint.Value).Message.Contains("argument value"));
 }
Exemplo n.º 4
0
        public UnexpectedTokenException(Token token, TokenType expectedTokenType, LiteralTypeHint? literalTypeHint) : base(token)
        {
            if (expectedTokenType == TokenType.Literal && literalTypeHint == null)
                throw new ArgumentException($"If {nameof(expectedTokenType)} is {TokenType.Literal}, a {nameof(literalTypeHint)} has to be given.");
            if (literalTypeHint != null && expectedTokenType != TokenType.Literal)
                throw new ArgumentException($"{nameof(literalTypeHint)} has to be null if {nameof(expectedTokenType)} is not {nameof(TokenType.Literal)}");

            ExpectedTokenType = expectedTokenType;
            LiteralTypeHint = literalTypeHint;
        }
Exemplo n.º 5
0
 private void CheckTokenizer(string text, Token[] result)
 {
     CollectionAssert.AreEqual(result, new Tokenizer().Tokenize(text), new TokenComparer());
 }
Exemplo n.º 6
0
        public ICmdArgument[] Parse(Token[] tokens)
        {
            _tokens = tokens;
            _index = 0;

            var list = new List<ICmdArgument>();
            while (true)
            {
                if (Get(0) == null)
                    return list.ToArray();
                if (Get(0)?.Type == TokenType.Whitespace)
                {
                    _index++;
                    continue;
                }
                
                var rules = new[]
                {
                    IfTokenOrder
                        .Is(TokenType.ArgumentValueDelimiter)
                        .Throw<UnexpectedTokenException>(0, TokenType.Literal, LiteralTypeHint.Argument),

                    IfTokenOrder
                        .Is(TokenType.Literal, TokenType.ArgumentValueDelimiter, TokenType.ArgumentValueDelimiter)
                        .Throw<UnexpectedTokenException>(2, TokenType.Literal, LiteralTypeHint.Value),

                    IfTokenOrder
                        .Is(TokenType.Literal, TokenType.Whitespace, TokenType.ArgumentValueDelimiter)
                        .Throw<UnexpectedTokenException>(1, TokenType.ArgumentValueDelimiter),

                    IfTokenOrder
                        .Is(TokenType.Literal, TokenType.ArgumentValueDelimiter)
                        .AndEndsWithOneOfThese(TokenType.Whitespace, null)
                        .Throw<UnexpectedTokenException>(2, TokenType.Literal, LiteralTypeHint.Value),

                    IfTokenOrder
                        .Is(TokenType.Literal, TokenType.ArgumentValueDelimiter, TokenType.Literal)
                        .AndEndsWithOneOfThese(TokenType.Literal, TokenType.ArgumentValueDelimiter)
                        .Throw<UnexpectedTokenException>(3, TokenType.Whitespace),

                    IfTokenOrder
                        .Is(TokenType.Literal, TokenType.Literal)
                        .Throw<UnexpectedTokenException>(1, TokenType.Whitespace),

                    IfTokenOrder
                        .Is(TokenType.Literal)
                        .AndEndsWithOneOfThese(null, TokenType.Literal, TokenType.Whitespace)
                        .NameIsOnIndex(0),

                    IfTokenOrder
                        .Is(TokenType.Literal, TokenType.ArgumentValueDelimiter, TokenType.Literal)
                        .AndEndsWithOneOfThese(null, TokenType.Whitespace)
                        .NameIsOnIndex(0)
                        .ArgumentIsOnIndex(2)
                };

                var matchingRule = FindFirstMatchingRule(rules);

                if (matchingRule == null)
                    throw new SyntaxErrorException(Get(0));

                if (matchingRule.ExceptionToThrow != null)
                    throw CreateExceptionFromRule(matchingRule);

                list.Add(CreateArgumentFromRule(matchingRule));
                _index += matchingRule.TokensCount;
            }
        }
Exemplo n.º 7
0
 public SyntaxErrorException(Token badToken)
 {
     BadToken = badToken;
 }
Exemplo n.º 8
0
 public void The_bad_token_type_should_be_in_the_error_message2()
 {
     var givenToken = new Token(TokenType.Whitespace, "  ", 0, 2);
     Assert.IsTrue(new UnexpectedTokenException(givenToken, TokenType.ArgumentValueDelimiter, null).Message.Contains("whitespace"));
 }