private DSDomain RecDeclTransfer(RecordDecl recordDecl, DSDomain domain) { var newDomain = CopyDomain(domain); foreach (var field in recordDecl.Fields) { newDomain[field] = DSSign.Zero.Singleton().ToHashSet(); } return(newDomain); }
private IADomain RecDeclTransfer(RecordDecl recordDecl, IADomain domain) { var newDomain = CopyDomain(domain); if (domain.IsBottom()) { return(newDomain); } foreach (var field in recordDecl.Fields) { newDomain[field] = new Interval(new ExtendedZ(0), new ExtendedZ(0)).ToIntervalK(_program); } return(newDomain); }
public override IAstNode VisitRecDecl(MicroCParser.RecDeclContext context) { var label = ++_label; _symbolTable.AddScope(); IList <Identifier> fields = context.fieldDeclaration().Select(x => Visit(x) as Identifier).ToList(); var children = _symbolTable.RemoveScope(); string name = context.name.Text; var id = _symbolTable.InsertSymbol(name, children); var recDecl = new RecordDecl(name, fields); recDecl.Label = label; recDecl.Id = id; _recordDecls.Add(recDecl); return(recDecl); }
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)); }