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); }
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); }