예제 #1
0
        public override bool VisitArrayDeclaration(ArrayDeclarationAST arrayDeclaration)
        {
            arrayDeclaration.CurrentScope = _scope;

            //la clase base chequea q el id sea valido
            if (VisitTypeDeclaration(arrayDeclaration))
            {
                TigerType tt;
                if (_scope.HasType(arrayDeclaration.BaseTypeID, out tt) != ScopeLocation.NotDeclared)
                {
                    var at = new ArrayType(tt, arrayDeclaration.TypeId);
                    _scope.AddType(arrayDeclaration.TypeId, at);
                    return(true);
                }
                int savedErrorPos = _errorListener.Count;
                _scope.TypeAdded += (sender, args) =>
                {
                    if (args.TypeName == arrayDeclaration.BaseTypeID)
                    {
                        _scope.AddType(arrayDeclaration.TypeId, new ArrayType(args.NewType, arrayDeclaration.TypeId));
                    }
                };
                _scope.FinalizeScope += (sender, args) =>
                {
                    if (sender.HasType(arrayDeclaration.BaseTypeID) == ScopeLocation.NotDeclared)
                    {
                        _errorListener.Insert(savedErrorPos, AnalysisError.TypeIsNotDefined(arrayDeclaration, arrayDeclaration.BaseTypeID));
                        arrayDeclaration.ReturnType = TigerType.GetType <ErrorType>();
                    }
                };
                return(true);
            }
            return(false);
        }
예제 #2
0
        public override bool VisitArrayDeclaration(ArrayDeclarationAST arrayDeclaration)
        {
            var other = _other as ArrayDeclarationAST;

            if (other == null)
            {
                return(false);
            }

            return(other.TypeId == arrayDeclaration.TypeId &&
                   other.BaseTypeID == arrayDeclaration.BaseTypeID);
        }
예제 #3
0
        public override Unit VisitArrayDeclaration(ArrayDeclarationAST arrayDeclaration)
        {
            //quedandome con el TypeInfo de tipo base del array.
            TypeInfo t = arrayDeclaration.CurrentScope.GetTypeInfo(arrayDeclaration.BaseTypeID);

            //en este momento es posible que el tipo del array no halla sido creado en el codigo il.
            //este tipo puede ser un array ,un alias o un record ,incluso una clase si se quiere extender esto un poco mas

            //creando el tipo del array
            Type arrayType = CreateTypeNotFounded(arrayDeclaration, t.TypeId).MakeArrayType();

            //annadir el tipo si es necesario.
            string arrayCodeName = arrayDeclaration.CurrentScope.GetTypeInfo(arrayDeclaration.TypeId).CodeName;

            if (!code.DefinedType.ContainsKey(arrayCodeName))
            {
                code.DefinedType.Add(arrayCodeName, arrayType);
            }

            return(Unit.Create());
        }
예제 #4
0
 public abstract T VisitArrayDeclaration(ArrayDeclarationAST arrayDeclaration);