public override IAstNode VisitAssignRecStmt(MicroCParser.AssignRecStmtContext context) { var label = ++_label; string name = context.IDENT().GetText(); IList <IAExpr> expressions = context.a_expr().Select(x => Visit(x) as IAExpr).ToList(); var symbol = _symbolTable.LookupSymbol(name); if (symbol.Size != expressions.Count) { throw new ArgumentException( $"Cannot assign {expressions.Count} values to record of size {symbol.Size}"); } var children = _recordDecls.First(r => r.Id == symbol.Id).Fields.ToList(); var ident = new Identifier(name, symbol.Type, symbol.Id); ident.Children = children; // TODO: Type check the symbol var recAssignStmt = new RecAssignStmt(ident, expressions); recAssignStmt.Label = label; return(recAssignStmt); }
private IADomain RecAssignTransfer(RecAssignStmt recAssignStmt, IADomain domain) { var newDomain = CopyDomain(domain); if (domain.IsBottom()) { return(newDomain); } for (int i = 0; i < recAssignStmt.Left.Children.Count; i++) { var ident = recAssignStmt.Left.Children[i]; var expr = recAssignStmt.Right[i]; var newInterval = IAUtil.Arithmetic(expr, domain); if (newInterval.IsBottom) { return(Bottom().GetDomain()); } newDomain[ident] = newInterval.ToIntervalK(_program); } return(newDomain); }
private FVDomain RecAssignTransfer(RecAssignStmt recAssignStmt, FVDomain domain) { // This needs to be the children of the record var ident = recAssignStmt.Left; if (!domain.Contains(ident)) { return(domain); } var fv = recAssignStmt.Right.SelectMany(e => AnalysisUtil.FreeVariables(e)); return(domain.Except(ident.Singleton()).Union(fv).ToFVDomain()); }
private DSDomain RecAssignTransfer(RecAssignStmt recAssignStmt, DSDomain domain) { var newDomain = CopyDomain(domain); for (int i = 0; i < recAssignStmt.Left.Children.Count; i++) { var ident = recAssignStmt.Left.Children[i]; var expr = recAssignStmt.Right[i]; newDomain[ident] = DSUtil.Arithmetic(expr, domain); } return(newDomain); }
protected override ILattice <FVDomain> TransferFunctions(int label) { var block = GetBlock(label); var domain = _analysisCircle[label].GetDomain(); var newDomain = block switch { AssignStmt assignStmt => AssignTransfer(assignStmt, domain), RecAssignStmt recAssignStmt => RecAssignTransfer(recAssignStmt, domain), IfStmt ifStmt => ConditionTransfer(ifStmt.Condition, domain), IfElseStmt ifElseStmt => ConditionTransfer(ifElseStmt.Condition, domain), WhileStmt whileStmt => ConditionTransfer(whileStmt.Condition, domain), WriteStmt writeStmt => WriteTransfer(writeStmt, domain), ReadStmt readStmt => ReadTransfer(readStmt, domain), _ => new FVDomain(), }; return(new FVLattice(newDomain)); }
protected override ILattice <IADomain> TransferFunctions(int label) { var block = GetBlock(label); var domain = _analysisCircle[label].GetDomain(); var newDomain = block switch { IntDecl intDecl => IntDeclTransfer(intDecl, domain), ArrayDecl arrayDecl => ArrayDeclTransfer(arrayDecl, domain), RecordDecl recordDecl => RecDeclTransfer(recordDecl, domain), AssignStmt assignStmt => AssignTransfer(assignStmt, domain), RecAssignStmt recAssignStmt => RecAssignTransfer(recAssignStmt, domain), IfStmt ifStmt => IdTransfer(ifStmt, domain), IfElseStmt ifElseStmt => IdTransfer(ifElseStmt, domain), WhileStmt whileStmt => IdTransfer(whileStmt, domain), WriteStmt writeStmt => IdTransfer(writeStmt, domain), ReadStmt readStmt => ReadTransfer(readStmt, domain), _ => Bottom().GetDomain(), }; return(new IALattice(newDomain)); }