Ejemplo n.º 1
0
        private ArmExpressionToken Expect(ref ArmExpressionTokenizer tokenizer, ArmExpressionTokenType expectedTokenType)
        {
            ArmExpressionToken token = tokenizer.NextToken();

            if (token.Type != expectedTokenType)
            {
                throw Error($"Expected token of type '{expectedTokenType}' but instead got '{token}' at index {tokenizer.PreviousIndex} in input '{tokenizer.Input}'");
            }

            return(token);
        }
Ejemplo n.º 2
0
        private ArmOperation ParseIdentifierExpression(ref ArmExpressionTokenizer tokenizer, ArmExpressionIdentifierToken identifier)
        {
            ArmExpressionToken token = tokenizer.NextToken();

            switch (token.Type)
            {
            case ArmExpressionTokenType.OpenParen:
                ArmOperation expression = ParseCallExpression(ref tokenizer, identifier);
                return(ParseDotExpression(ref tokenizer, expression));

            default:
                throw Error($"Expected a token of type '{ArmExpressionTokenType.OpenParen}' but instead got '{token}' in '{tokenizer.Input}' at index '{tokenizer.PreviousIndex}'");
            }
        }
Ejemplo n.º 3
0
        private IArmString ParseInnerExpression(ref ArmExpressionTokenizer tokenizer, bool noLiteral = false)
        {
            ArmExpressionToken token = tokenizer.NextToken();

            switch (token.Type)
            {
            case ArmExpressionTokenType.String:
                if (noLiteral)
                {
                    throw Error($"Expected a literal token but found a string in '{tokenizer.Input}' at index {tokenizer.PreviousIndex}");
                }
                return(new ArmStringLiteral(token.CoerceToString()));

            case ArmExpressionTokenType.Identifier:
                return(ParseIdentifierExpression(ref tokenizer, (ArmExpressionIdentifierToken)token));

            default:
                throw Error($"Expected an expression token but found '{token}' in '{tokenizer.Input}' at index {tokenizer.PreviousIndex}");
            }
        }
Ejemplo n.º 4
0
        private ArmOperation ParseDotExpression(ref ArmExpressionTokenizer tokenizer, ArmOperation lhs)
        {
            ArmExpressionToken token = tokenizer.NextToken();

            switch (token.Type)
            {
            case ArmExpressionTokenType.Dot:
                token = tokenizer.NextToken();
                switch (token.Type)
                {
                case ArmExpressionTokenType.Identifier:
                    return(ParseDotExpression(ref tokenizer, new ArmMemberAccessExpression(lhs, new ArmStringLiteral(((ArmExpressionIdentifierToken)token).Identifier))));

                default:
                    throw Error($"Expected token of type '{ArmExpressionTokenType.Identifier}' after '.' but instead got '{token}' at index {tokenizer.PreviousIndex} in input '{tokenizer.Input}'");
                }

            default:
                tokenizer.UngetToken(token);
                return(lhs);
            }
        }
Ejemplo n.º 5
0
 public void UngetToken(ArmExpressionToken token)
 {
     _i = _oldIndex;
 }