Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
 public override bool VisitArrayAccess(ArrayAccessAST arrayAccess)
 {
     throw new NotImplementedException();
 }
Esempio n. 5
0
 public abstract T VisitArrayAccess(ArrayAccessAST arrayAccess);
 public ILGeneratorArrayAssignment(ILCodeGenerator codeGenerator, ArrayAccessAST arrayAccess) : base(codeGenerator)
 {
     _arrayAccess = arrayAccess;
 }