public void Visit(ReadStmt readStmt) { TreeLevel++; PrintNode("ReadStm"); readStmt.Variable.Accept(this); TreeLevel--; }
public override IAstNode VisitReadFieldStmt(MicroCParser.ReadFieldStmtContext context) { var label = ++_label; string recName = context.name.Text; string fieldName = context.field.Text; var recSymbol = _symbolTable.LookupSymbol(recName); if (recSymbol == null) { throw new ArgumentException($"Record: {recName} does not exist"); } var fieldSymbol = recSymbol.Children.SingleOrDefault(f => f.Name == fieldName); if (fieldSymbol == null) { throw new ArgumentException($"Record: {recName} does not include a field: {fieldName}"); } var recIdent = new Identifier(recName, recSymbol.Type, recSymbol.Id); var fieldIdent = new Identifier(fieldName, fieldSymbol.Type, fieldSymbol.Id); RecordAccess sa = new RecordAccess(recIdent, fieldIdent); var readStmt = new ReadStmt(sa); readStmt.Label = label; return(readStmt); }
private IADomain ReadTransfer(ReadStmt readStmt, IADomain domain) { var newDomain = CopyDomain(domain); if (domain.IsBottom()) { return(newDomain); } var ident = readStmt.Left switch { VarAccess varAccess => varAccess.Left, ArrayAccess arrayAccess => arrayAccess.Left, RecordAccess recordAccess => recordAccess.Right, }; if (readStmt.Left is ArrayAccess) { var ra = readStmt.Left as ArrayAccess; var indexInterval = IAUtil.Arithmetic(ra.Right, domain); if (indexInterval.IsBottom) { return(Bottom().GetDomain()); } } newDomain[ident] = new Interval(ExtendedZ.NegativeInfinity(), ExtendedZ.PositiveInfinity()).ToIntervalK(_program); return(newDomain); }
public override IAstNode VisitReadStmt(MicroCParser.ReadStmtContext context) { var label = ++_label; string name = context.IDENT().GetText(); var symbol = _symbolTable.LookupSymbol(name); var ident = new Identifier(symbol.Name, symbol.Type, symbol.Id); IStateAccess sa = new VarAccess(ident); var readStmt = new ReadStmt(sa); readStmt.Label = label; return(readStmt); }
private DSDomain ReadTransfer(ReadStmt readStmt, DSDomain domain) { var ident = readStmt.Left switch { VarAccess varAccess => varAccess.Left, ArrayAccess arrayAccess => arrayAccess.Left, RecordAccess recordAccess => recordAccess.Right, }; var newDomain = CopyDomain(domain); newDomain[ident] = new HashSet <DSSign>() { DSSign.Negative, DSSign.Positive, DSSign.Zero }; 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)); }
private FVDomain ReadTransfer(ReadStmt readStmt, FVDomain domain) { var ident = readStmt.Left switch { VarAccess varAccess => varAccess.Left, ArrayAccess arrayAccess => arrayAccess.Left, RecordAccess recordAccess => recordAccess.Right, }; if (!domain.Contains(ident)) { return(domain); } return(readStmt.Left switch { ArrayAccess arrayAccess => domain.Union(AnalysisUtil.FreeVariables(arrayAccess.Right)).ToFVDomain(), _ => domain.Except(ident.Singleton()).ToFVDomain(), });
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)); }