Example #1
0
        protected override object?Visit(Expression.Subscript sub)
        {
            base.Visit(sub);
            // Check if the indexed thing is even an array
            var indexedType = System.TypeOf(sub.Array);

            if (!(indexedType is Type.Array arrayType))
            {
                // TODO
                throw new NotImplementedException("Can't index non-array!");
            }
            // Check if the index is an integer
            var indexType = System.TypeOf(sub.Index);

            if (!(indexType is Type.Prim prim && prim.Type is Lir.Types.Type.Int))
            {
                // TODO
                throw new NotImplementedException("Can't index with non-integer!");
            }
            return(null);
        }
Example #2
0
        private Expression ParsePostfixExpression(ExprState state)
        {
            var result = ParseAtomicExpression(state);

            while (true)
            {
                var peek = Peek();
                if (PostfixOperators.Contains(peek.Type))
                {
                    var op = Next();
                    result = new Expression.Postfix(result, op);
                }
                else if (peek.Type == TokenType.OpenParen)
                {
                    var openParen = Expect(null, null, TokenType.OpenParen);
                    // Call expression
                    var args = new List <WithComma <Expression> >();
                    while (Peek().Type != TokenType.CloseParen)
                    {
                        var arg      = ParseExpression(ExprState.None);
                        var hasComma = Match(TokenType.Comma, out var comma);
                        args.Add(new WithComma <Expression>(arg, comma));
                        if (!hasComma)
                        {
                            break;
                        }
                    }
                    var closeParen = Expect("call expression", openParen, TokenType.CloseParen);
                    result = new Expression.Call(result, openParen, args, closeParen);
                }
                else if (peek.Type == TokenType.OpenBracket)
                {
                    var openBracket = Expect(null, null, TokenType.OpenBracket);
                    // Subscript expression
                    var index        = ParseExpression(ExprState.None);
                    var closeBracket = Expect("subscript expression", openBracket, TokenType.CloseBracket);
                    result = new Expression.Subscript(result, openBracket, index, closeBracket);
                }
                else if (!state.HasFlag(ExprState.TypeOnly) &&
                         !state.HasFlag(ExprState.NoBraced) &&
                         peek.Type == TokenType.OpenBrace)
                {
                    // Struct instantiation
                    var openBrace = Expect(null, null, TokenType.OpenBrace);
                    var fields    = new List <Expression.StructValue.Field>();
                    while (Peek().Type != TokenType.CloseBrace)
                    {
                        fields.Add(ParseStructValueField());
                    }
                    var closeBrace = Expect("struct instantiation", openBrace, TokenType.CloseBrace);
                    result = new Expression.StructValue(result, openBrace, fields, closeBrace);
                }
                else if (peek.Type == TokenType.Dot)
                {
                    // Dot path
                    var dot   = Expect(null, null, TokenType.Dot);
                    var ident = Expect("dot path expression", null, TokenType.Identifier);
                    result = new Expression.DotPath(result, dot, ident);
                }
                else
                {
                    break;
                }
            }
            return(result);
        }