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 void BuildAssignment(Assignment node, VarAccess varAccess) { var varDef = GetVarDefinition(varAccess); node.RightOperand.Accept(this); if (!node.IsStatementExpression) { _emitter.Emit(OpCodes.Dup); } _emitter.Emit(OpCodes.Stloc, varDef); }
private IADomain AssignTransfer(AssignStmt assignStmt, IADomain domain) { var newDomain = CopyDomain(domain); if (domain.IsBottom()) { return(newDomain); } var ident = assignStmt.Left switch { VarAccess varAccess => varAccess.Left, ArrayAccess arrayAccess => arrayAccess.Left, RecordAccess recordAccess => recordAccess.Right, }; var newValue = assignStmt.Left switch { VarAccess varAccess => IAUtil.Arithmetic(assignStmt.Right, domain), RecordAccess recordAccess => IAUtil.Arithmetic(assignStmt.Right, domain), ArrayAccess arrayAccess => IAUtil.Arithmetic(assignStmt.Right, domain) .Join(domain[ident]), //.Join(IAUtil.Arithmetic(arrayAccess.Right, domain)), }; if (assignStmt.Left is ArrayAccess) { var ra = assignStmt.Left as ArrayAccess; var indexInterval = IAUtil.Arithmetic(ra.Right, domain); if (indexInterval.IsBottom) { return(Bottom().GetDomain()); } var arrayIndices = new Interval(new ExtendedZ(0), new ExtendedZ(ra.Left.Size - 1)); var meet = indexInterval.Meet(arrayIndices); if (indexInterval.Meet(arrayIndices).IsBottom) { return(Bottom().GetDomain()); } } if (newValue.IsBottom) { return(Bottom().GetDomain()); } newDomain[ident] = newValue.ToIntervalK(_program); return(newDomain); }
public VarDecl(Block block, Token id, TypeSpec typeSpec, VarAccess accessType) { if (block.FindVar(new VarExpr(block, id), throws: false) != null) { CName = "x" + block.Vars[id.Text].CName; } else { CName = Compiler.Prefix + id.Text; } Block = block; Id = id; TypeSpec = typeSpec; AccessType = accessType; }
public override IAstNode VisitAssignStmt(MicroCParser.AssignStmtContext context) { var label = ++_label; var name = context.IDENT().GetText(); var symbol = _symbolTable.LookupSymbol(name); var ident = new Identifier(name, symbol.Type, symbol.Id); // TODO: Type check the symbol VarAccess left = new VarAccess(ident); IAExpr right = Visit(context.a_expr()) as IAExpr; var assignStmt = new AssignStmt(left, right); assignStmt.Label = label; return(assignStmt); }
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); }
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(), });
private DSDomain AssignTransfer(AssignStmt assignStmt, DSDomain domain) { var ident = assignStmt.Left switch { VarAccess varAccess => varAccess.Left, ArrayAccess arrayAccess => arrayAccess.Left, RecordAccess recordAccess => recordAccess.Right, }; var newDomain = CopyDomain(domain); var newValue = assignStmt.Left switch { VarAccess varAccess => DSUtil.Arithmetic(assignStmt.Right, domain), RecordAccess recordAccess => DSUtil.Arithmetic(assignStmt.Right, domain), ArrayAccess arrayAccess => DSUtil.Arithmetic(assignStmt.Right, domain) .Union(domain[ident]) //.Union(DSUtil.Arithmetic(arrayAccess.Right, domain)), }; newDomain[ident] = newValue.ToHashSet(); return(newDomain); }
private FVDomain AssignTransfer(AssignStmt assignStmt, FVDomain domain) { var ident = assignStmt.Left switch { VarAccess varAccess => varAccess.Left, ArrayAccess arrayAccess => arrayAccess.Left, RecordAccess recordAccess => recordAccess.Right, }; if (!domain.Contains(ident)) { return(domain); } var fv = AnalysisUtil.FreeVariables(assignStmt.Right); var fv2 = assignStmt.Left switch { ArrayAccess arrayAccess => AnalysisUtil.FreeVariables(arrayAccess.Right), _ => new HashSet <Identifier>(), }; var freeVariables = fv.Union(fv2); return(domain.Except(ident.Singleton()).Union(freeVariables).ToFVDomain()); }
public void VisitVarAccess(VarAccess node) => InferSimpleType(node.GetVarDeclaration().Type);
private VariableDefinition GetVarDefinition(VarAccess varAccess) { var declaration = varAccess.GetVarDeclaration(); return(GetVarDefinition(declaration)); }
public void VisitVarAccess(VarAccess node) { var varDef = GetVarDefinition(node); _emitter.Emit(OpCodes.Ldloc, varDef); }