private void Visit(ArrayVariableExpr variable) { var il = CurrentMethodIL; var varSymbol = variable.VariableSymbol; if (varSymbol is GlobalSymbol) { var globalVar = varSymbol as GlobalSymbol; il.Emit(OpCodes.Ldsfld, globalVar.CILField); } else if (varSymbol is VariableSymbol) { var localVar = varSymbol as VariableSymbol; il.Emit(OpCodes.Ldloc, localVar.CILLocal); } else if (varSymbol is ParameterSymbol) { var paramVar = varSymbol as ParameterSymbol; il.Emit(OpCodes.Ldarg, paramVar.CILParameter.Position - 1); } else { throw new Exception("Unexpected symboltype " + varSymbol.GetType()); } Visit((dynamic)variable.SubscriptExpr); il.Emit(OpCodes.Ldelem, varSymbol.Type.CILType.GetElementType()); ApplyExprSign(variable); }
private void Visit(ArrayVariableExpr arrayVariableExpr) { Symbol symbol = Symbols.Lookup(arrayVariableExpr.ArrayIdentifier); if (symbol != null) { arrayVariableExpr.VariableSymbol = symbol; Visit((dynamic)arrayVariableExpr.SubscriptExpr); TypeInfo subscriptType = TypeStack.Pop(); if (!symbol.Type.IsArray) { AddError(string.Format("Variable '{0}' is not declared as an array", arrayVariableExpr.ArrayIdentifier), arrayVariableExpr); TypeStack.Push(TypeInfo.BasicVoid); } else if (IsNotVoid(subscriptType) && !subscriptType.SameAs(ExprType.Int)) { AddError("Array subscript expression has to be of type Int", arrayVariableExpr); TypeStack.Push(TypeInfo.BasicVoid); } else { TypeStack.Push(TypeInfo.GetInstance(symbol.Type.BasicType)); arrayVariableExpr.Type = TypeInfo.GetInstance(symbol.Type.BasicType); } } else { AddError(string.Format("Undeclared variable '{0}'", arrayVariableExpr.ArrayIdentifier), arrayVariableExpr); TypeStack.Push(TypeInfo.BasicVoid); } }
private VariableExprBase ParseVariable() { Token idToken = Match(TokenType.Identifier); string id = AcceptedToken.Content; if (Accept(TokenType.LBracket)) { ArrayVariableExpr expr = new ArrayVariableExpr(idToken); expr.ArrayIdentifier = id; expr.SubscriptExpr = ParseExpression(); Match(TokenType.RBracket); return(expr); } return(new VariableExpr(idToken)); }