public override bool VisitArrayAccess(ArrayAccessAST arrayAccess) { //esto es para quedarme con el scope actual arrayAccess.CurrentScope = _scope; arrayAccess.ReturnType = TigerType.GetType <ErrorType>(); //visit the expression represeting the array arrayAccess.Array.Accept(this); //verifico que la expresion 'array' sea de tipo ArrayType var arrayType = arrayAccess.Array.ReturnType as ArrayType; if (arrayType != null) { arrayAccess.Indexer.Accept(this); //verifico que la expresion que indexada sea del tipo IntType var intType = arrayAccess.Indexer.ReturnType as IntType; if (intType != null) { arrayAccess.ReturnType = arrayType.BaseType; return(arrayAccess.AlwaysReturn = true); } _errorListener.Add(new AnalysisError(AnalysisError.LoadMessage("ArrayIndex"), arrayAccess.Line, arrayAccess.Columns)); return(false); } _errorListener.Add(new AnalysisError(AnalysisError.LoadMessage("Index"), arrayAccess.Line, arrayAccess.Columns)); return(false); }
public override Unit VisitArrayAccess(ArrayAccessAST arrayAccess) { //---> bool pushOnStack = code.PushOnStack; ILGenerator il = code.Method.GetILGenerator(); //cargar el array if (pushOnStack) { code.PushOnStack = true; arrayAccess.Array.Accept(this); //cargar el indexer code.PushOnStack = true; arrayAccess.Indexer.Accept(this); //aca tengo que pedir el tipo del array , y luego el type asociado a el. string typeCodeName = arrayAccess.CurrentScope.GetTypeInfo(arrayAccess.Array.ReturnType.TypeID).CodeName; Type t = code.DefinedType[typeCodeName]; il.Emit(OpCodes.Ldelem, t.IsArray ? t.GetElementType() : t); } //<--- code.PushOnStack = pushOnStack; return(Unit.Create()); }
public override AstNode VisitPrefixExpr(TigerParser.PrefixExprContext context) { LHSExpressionAST res = new VarAST(context.id.Text);; if (context.prefixAccess() != null) { foreach (var prefixAccess in context.prefixAccess()) { if (prefixAccess.ID() != null) { res = new RecordAccessAST(prefixAccess.ID().GetText(), res); } else if (prefixAccess.exp() != null) { res = new ArrayAccessAST(res, (ExpressionAst)prefixAccess.exp().Accept(this)); } } } return(res); }
public override bool VisitArrayAccess(ArrayAccessAST arrayAccess) { throw new NotImplementedException(); }
public abstract T VisitArrayAccess(ArrayAccessAST arrayAccess);
public ILGeneratorArrayAssignment(ILCodeGenerator codeGenerator, ArrayAccessAST arrayAccess) : base(codeGenerator) { _arrayAccess = arrayAccess; }