Пример #1
0
        public override bool VisitRecordAccess(RecordAccessAST recordAccess)
        {
            var other = _other as RecordAccessAST;

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

            return(other.FieldId == recordAccess.FieldId &&
                   IsEqualNodes(other.ExpressionRecord, recordAccess.ExpressionRecord));
        }
Пример #2
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);
        }
Пример #3
0
        public override bool VisitRecordAccess(RecordAccessAST recordAccess)
        {
            recordAccess.CurrentScope = _scope;
            recordAccess.ExpressionRecord.Accept(this);
            TigerType record = recordAccess.ExpressionRecord.ReturnType;

            if (record is RecordType)
            {
                //verificar que el record contiene el campo
                var r = (RecordType)record;
                if (r.Contains(recordAccess.FieldId))
                {
                    recordAccess.ReturnType = r[recordAccess.FieldId];
                    return(recordAccess.AlwaysReturn = true);
                }
                _errorListener.Add(AnalysisError.RecordFieldDoNotExists(recordAccess));
                recordAccess.ReturnType = TigerType.GetType <ErrorType>();
                return(false);
            }
            //la expresion no es un record
            recordAccess.ReturnType = TigerType.GetType <ErrorType>();
            _errorListener.Add(AnalysisError.ExpressionIsNotARecord(recordAccess));
            return(false);
        }
Пример #4
0
        public override Unit VisitRecordAccess(RecordAccessAST recordAccess)
        {
            ILGenerator il = code.Method.GetILGenerator();
            //--->
            bool pushOnStack = code.PushOnStack;

            //cargando el valor del campo del record
            code.PushOnStack = true;
            recordAccess.ExpressionRecord.Accept(this);

            string typeCodeName = recordAccess.CurrentScope.GetTypeInfo(recordAccess.ExpressionRecord.ReturnType.TypeID).CodeName;
            Type   recordType   = code.DefinedType[typeCodeName];

            il.Emit(OpCodes.Ldfld, recordType.GetField(recordAccess.FieldId));

            //<---
            if (!pushOnStack)
            {
                il.Emit(OpCodes.Pop);
            }
            code.PushOnStack = pushOnStack;

            return(Unit.Create());
        }
Пример #5
0
 public abstract T VisitRecordAccess(RecordAccessAST recordAccess);
Пример #6
0
 public ILGeneratorRecordFieldAssignment(ILCodeGenerator ilCodeGenerator, RecordAccessAST assignExpression) : base(ilCodeGenerator)
 {
 }
Пример #7
0
 public static AnalysisError ExpressionIsNotARecord(RecordAccessAST recordAccess) =>
 new AnalysisError(LoadMessage("RecAccess"), recordAccess.Line, recordAccess.Columns);
Пример #8
0
 public static AnalysisError RecordFieldDoNotExists(RecordAccessAST recordAccess) =>
 new AnalysisError(
     string.Format(LoadMessage("RecField"), recordAccess.ExpressionRecord.ReturnType.TypeID,
                   recordAccess.FieldId), recordAccess.Line,
     recordAccess.Columns);