public FieldExpressionList(Position pos, Symbol name, Expression init, FieldExpressionList tail) { Pos = pos; Name = name; Init = init; Tail = tail; }
ExpressionType TranslateExpression(RecordExpression e) { Types.Type eType = Env.TypeEnvironment[e.Type] as Types.Type; if (eType == null) { Error.Report(e.Pos, "Undefined record type " + e.Type.ToString()); return(new ExpressionType(null, Types.Type._int)); } eType = eType.Actual; if (!(eType is Types.RECORD)) { Error.Report(e.Pos, "Record type required"); return(new ExpressionType(null, Types.Type._int)); } FieldExpressionList eFields = e.Fields; Types.RECORD eRecord = (Types.RECORD)eType; ExpressionType et; List <Exp> fieldList = new List <Exp>(); for (; eFields != null; eFields = eFields.Tail, eRecord = eRecord.Tail) { if (eRecord == null) { Error.Report(eFields.Pos, "Field " + eFields.Name.ToString() + " has not been declared"); break; } if (eRecord.FieldName != eFields.Name) { Error.Report(eFields.Pos, eRecord.FieldName.ToString() + " field dismatch"); break; } et = TranslateExpression(eFields.Init); fieldList.Add(et.Exp); if (!et.Type.CoerceTo(eRecord.FieldType)) { Error.Report(eFields.Pos, "Type mismatch in record field"); } } if (eRecord != null) { Error.Report(eFields.Pos, "Missing record fields"); } return(new ExpressionType(Translate.TranslateRecordExp(Level, fieldList), eType)); }
void PrintFieldExpressionList(FieldExpressionList f, int d) { Indent(d); SayLn("FieldExpressionList("); if (f != null) { SayLn(""); Say(f.Name.ToString()); SayLn(","); PrintExpression(f.Init, d + 1); SayLn(","); PrintFieldExpressionList(f.Tail, d + 1); } Say(")"); }
public RecordExpression(Position pos, Symbol type, FieldExpressionList fields) { Pos = pos; Type = type; Fields = fields; }
public void TraverseExpression(int depth, Expression exp) { if (exp == null) { return; } else if (exp is VariableExpression) { TraverseVariable(depth, (exp as VariableExpression).Var); } else if (exp is CallExpression) { for (ExpressionList el = (exp as CallExpression).Args; el != null; el = el.Tail) { TraverseExpression(depth, el.Head); } } else if (exp is OperatorExpression) { TraverseExpression(depth, (exp as OperatorExpression).Left); TraverseExpression(depth, (exp as OperatorExpression).Right); } else if (exp is RecordExpression) { for (FieldExpressionList el = (exp as RecordExpression).Fields; el != null; el = el.Tail) { TraverseExpression(depth, el.Init); } } else if (exp is SequenceExpression) { for (ExpressionList el = (exp as SequenceExpression).Exps; el != null; el = el.Tail) { TraverseExpression(depth, el.Head); } } else if (exp is AssignExpression) { TraverseVariable(depth, (exp as AssignExpression).Var); TraverseExpression(depth, (exp as AssignExpression).Exp); } else if (exp is IfExpression) { TraverseExpression(depth, (exp as IfExpression).Test); TraverseExpression(depth, (exp as IfExpression).Then); TraverseExpression(depth, (exp as IfExpression).Else); } else if (exp is WhileExpression) { TraverseExpression(depth, (exp as WhileExpression).Test); TraverseExpression(depth, (exp as WhileExpression).Body); } else if (exp is ForExpression) { TraverseDeclaration(depth, (exp as ForExpression).VarDec); TraverseExpression(depth, (exp as ForExpression).High); TraverseExpression(depth, (exp as ForExpression).Body); } else if (exp is LetExpression) { for (DeclarationList dl = (exp as LetExpression).Decs; dl != null; dl = dl.Tail) { TraverseDeclaration(depth, dl.Head); } TraverseExpression(depth, (exp as LetExpression).Body); } else if (exp is ArrayExpression) { TraverseExpression(depth, (exp as ArrayExpression).Size); TraverseExpression(depth, (exp as ArrayExpression).Init); } }