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)); }
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 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); }
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()); }
public abstract T VisitRecordAccess(RecordAccessAST recordAccess);
public ILGeneratorRecordFieldAssignment(ILCodeGenerator ilCodeGenerator, RecordAccessAST assignExpression) : base(ilCodeGenerator) { }
public static AnalysisError ExpressionIsNotARecord(RecordAccessAST recordAccess) => new AnalysisError(LoadMessage("RecAccess"), recordAccess.Line, recordAccess.Columns);
public static AnalysisError RecordFieldDoNotExists(RecordAccessAST recordAccess) => new AnalysisError( string.Format(LoadMessage("RecField"), recordAccess.ExpressionRecord.ReturnType.TypeID, recordAccess.FieldId), recordAccess.Line, recordAccess.Columns);