コード例 #1
0
ファイル: StmtVisitor.cs プロジェクト: tornado12345/CppSharp
        public virtual bool VisitCompoundStmt(CompoundStmt stmt)
        {
            if (!VisitStmt(stmt))
            {
                return(false);
            }

            return(true);
        }
コード例 #2
0
 public bool VisitCompoundStmt(CompoundStmt stmt)
 {
     throw new NotImplementedException();
 }
コード例 #3
0
        private (IExprTerm, List <IPStmt>) SimplifyExpression(IPExpr expr)
        {
            Antlr4.Runtime.ParserRuleContext location = expr.SourceLocation;
            List <IPStmt> deps = new List <IPStmt>();

#pragma warning disable CCN0002 // Non exhaustive patterns in switch block
            switch (expr)
            {
            case IExprTerm term:
                return(term, deps);

            case BinOpExpr binOpExpr:
                (IExprTerm lhsTemp, List <IPStmt> lhsDeps) = SimplifyExpression(binOpExpr.Lhs);
                (IExprTerm rhsTemp, List <IPStmt> rhsDeps) = SimplifyExpression(binOpExpr.Rhs);

                if (binOpExpr.Operation == BinOpType.And)
                {
                    // And is short-circuiting, so we need to treat it differently from other binary operators
                    deps.AddRange(lhsDeps);
                    (VariableAccessExpr andTemp, IPStmt andInitialStore) = SaveInTemporary(new CloneExpr(lhsTemp));
                    deps.Add(andInitialStore);
                    CompoundStmt reassignFromRhs = new CompoundStmt(location, rhsDeps.Append(new AssignStmt(location, andTemp, new CloneExpr(rhsTemp))));
                    deps.Add(new IfStmt(location, andTemp, reassignFromRhs, null));
                    return(andTemp, deps);
                }
                else if (binOpExpr.Operation == BinOpType.Or)
                {
                    // Or is short-circuiting, so we need to treat it differently from other binary operators
                    deps.AddRange(lhsDeps);
                    (VariableAccessExpr orTemp, IPStmt orInitialStore) = SaveInTemporary(new CloneExpr(lhsTemp));
                    deps.Add(orInitialStore);
                    CompoundStmt reassignFromRhs = new CompoundStmt(location, rhsDeps.Append(new AssignStmt(location, orTemp, new CloneExpr(rhsTemp))));
                    deps.Add(new IfStmt(location, orTemp, new NoStmt(location), reassignFromRhs));
                    return(orTemp, deps);
                }
                else
                {
                    (VariableAccessExpr binOpTemp, IPStmt binOpStore) =
                        SaveInTemporary(new BinOpExpr(location, binOpExpr.Operation, lhsTemp, rhsTemp));
                    deps.AddRange(lhsDeps.Concat(rhsDeps));
                    deps.Add(binOpStore);
                    return(binOpTemp, deps);
                }

            case CastExpr castExpr:
                (IExprTerm castSubExpr, List <IPStmt> castDeps) = SimplifyExpression(castExpr.SubExpr);
                (VariableAccessExpr castTemp, IPStmt castStore) = SaveInTemporary(new CastExpr(location, new CloneExpr(castSubExpr), castExpr.Type));
                deps.AddRange(castDeps);
                deps.Add(castStore);
                return(castTemp, deps);

            case ChooseExpr chooseExpr:
                if (chooseExpr.SubExpr != null)
                {
                    (IExprTerm chooseSubExpr, List <IPStmt> chooseDeps) = SimplifyExpression(chooseExpr.SubExpr);
                    (VariableAccessExpr chooseTemp, IPStmt chooseStore) = SaveInTemporary(new ChooseExpr(location, chooseSubExpr, chooseExpr.Type));
                    deps.AddRange(chooseDeps);
                    deps.Add(chooseStore);
                    return(chooseTemp, deps);
                }
                else
                {
                    (VariableAccessExpr chooseTemp, IPStmt chooseStore) = SaveInTemporary(chooseExpr);
                    deps.Add(chooseStore);
                    return(chooseTemp, deps);
                }

            case CoerceExpr coerceExpr:
                (IExprTerm coerceSubExpr, List <IPStmt> coerceDeps) = SimplifyExpression(coerceExpr.SubExpr);
                (VariableAccessExpr coerceTemp, IPStmt coerceStore) =
                    SaveInTemporary(new CoerceExpr(location, coerceSubExpr, coerceExpr.NewType));
                deps.AddRange(coerceDeps);
                deps.Add(coerceStore);
                return(coerceTemp, deps);

            case ContainsExpr containsKeyExpr:
                (IExprTerm contKeyExpr, List <IPStmt> contKeyDeps) = SimplifyExpression(containsKeyExpr.Item);
                (IExprTerm contMapExpr, List <IPStmt> contMapDeps) = SimplifyExpression(containsKeyExpr.Collection);
                (VariableAccessExpr contTemp, IPStmt contStore)    =
                    SaveInTemporary(new ContainsExpr(location, contKeyExpr, contMapExpr));
                deps.AddRange(contKeyDeps.Concat(contMapDeps));
                deps.Add(contStore);
                return(contTemp, deps);

            case CtorExpr ctorExpr:
                (IReadOnlyList <IVariableRef> ctorArgs, List <IPStmt> ctorArgDeps) = SimplifyArgPack(ctorExpr.Arguments);
                deps.AddRange(ctorArgDeps);
                (VariableAccessExpr ctorTemp, IPStmt ctorStore) = SaveInTemporary(new CtorExpr(location, ctorExpr.Interface, ctorArgs));
                deps.Add(ctorStore);
                return(ctorTemp, deps);

            case DefaultExpr defaultExpr:
                (VariableAccessExpr defTemp, IPStmt defStore) = SaveInTemporary(defaultExpr);
                deps.Add(defStore);
                return(defTemp, deps);

            case FairNondetExpr fairNondetExpr:
                (VariableAccessExpr fndTemp, IPStmt fndStore) = SaveInTemporary(fairNondetExpr);
                deps.Add(fndStore);
                return(fndTemp, deps);

            case FunCallExpr funCallExpr:
                (ILinearRef[] funArgs, List <IPStmt> funArgsDeps) = SimplifyFunArgs(funCallExpr.Arguments);
                deps.AddRange(funArgsDeps);
                (VariableAccessExpr funTemp, IPStmt funStore) = SaveInTemporary(new FunCallExpr(location, funCallExpr.Function, funArgs));
                deps.Add(funStore);
                return(funTemp, deps);

            case KeysExpr keysExpr:
                (IExprTerm keysColl, List <IPStmt> keysDeps)    = SimplifyExpression(keysExpr.Expr);
                (VariableAccessExpr keysTemp, IPStmt keysStore) = SaveInTemporary(new KeysExpr(location, keysColl, keysExpr.Type));
                deps.AddRange(keysDeps);
                deps.Add(keysStore);
                return(keysTemp, deps);

            case MapAccessExpr mapAccessExpr:
                (IExprTerm mapExpr, List <IPStmt> mapDeps)            = SimplifyExpression(mapAccessExpr.MapExpr);
                (IExprTerm mapIdxExpr, List <IPStmt> mapIdxDeps)      = SimplifyExpression(mapAccessExpr.IndexExpr);
                (VariableAccessExpr mapItemTemp, IPStmt mapItemStore) =
                    SaveInTemporary(new MapAccessExpr(location, mapExpr, mapIdxExpr, mapAccessExpr.Type));
                deps.AddRange(mapDeps.Concat(mapIdxDeps));
                deps.Add(mapItemStore);
                return(mapItemTemp, deps);

            case NamedTupleAccessExpr namedTupleAccessExpr:
                (IExprTerm ntSubExpr, List <IPStmt> ntSubDeps) = SimplifyExpression(namedTupleAccessExpr.SubExpr);
                (VariableAccessExpr ntTemp, IPStmt ntStore)    =
                    SaveInTemporary(new NamedTupleAccessExpr(location, ntSubExpr, namedTupleAccessExpr.Entry));
                deps.AddRange(ntSubDeps);
                deps.Add(ntStore);
                return(ntTemp, deps);

            case NamedTupleExpr namedTupleExpr:
                (IReadOnlyList <IVariableRef> args, List <IPStmt> argDeps) = SimplifyArgPack(namedTupleExpr.TupleFields);
                deps.AddRange(argDeps);

                (VariableAccessExpr ntVal, IPStmt ntValStore) =
                    SaveInTemporary(new NamedTupleExpr(location, args, namedTupleExpr.Type));
                deps.Add(ntValStore);
                return(ntVal, deps);

            case NondetExpr nondetExpr:
                (VariableAccessExpr ndTemp, IPStmt ndStore) = SaveInTemporary(nondetExpr);
                deps.Add(ndStore);
                return(ndTemp, deps);

            case SeqAccessExpr seqAccessExpr:
                (IExprTerm seqExpr, List <IPStmt> seqDeps)        = SimplifyExpression(seqAccessExpr.SeqExpr);
                (IExprTerm seqIdx, List <IPStmt> seqIdxDeps)      = SimplifyExpression(seqAccessExpr.IndexExpr);
                (VariableAccessExpr seqElem, IPStmt seqElemStore) =
                    SaveInTemporary(new SeqAccessExpr(location, seqExpr, seqIdx, seqAccessExpr.Type));
                deps.AddRange(seqDeps.Concat(seqIdxDeps));
                deps.Add(seqElemStore);
                return(seqElem, deps);

            case SizeofExpr sizeofExpr:
                (IExprTerm sizeExpr, List <IPStmt> sizeDeps)    = SimplifyExpression(sizeofExpr.Expr);
                (VariableAccessExpr sizeTemp, IPStmt sizeStore) = SaveInTemporary(new SizeofExpr(location, sizeExpr));
                deps.AddRange(sizeDeps);
                deps.Add(sizeStore);
                return(sizeTemp, deps);

            case TupleAccessExpr tupleAccessExpr:
                (IExprTerm tupItemExpr, List <IPStmt> tupAccessDeps)  = SimplifyExpression(tupleAccessExpr.SubExpr);
                (VariableAccessExpr tupItemTemp, IPStmt tupItemStore) =
                    SaveInTemporary(new TupleAccessExpr(location,
                                                        tupItemExpr,
                                                        tupleAccessExpr.FieldNo,
                                                        tupleAccessExpr.Type));
                deps.AddRange(tupAccessDeps);
                deps.Add(tupItemStore);
                return(tupItemTemp, deps);

            case UnaryOpExpr unaryOpExpr:
                (IExprTerm unExpr, List <IPStmt> unDeps)    = SimplifyExpression(unaryOpExpr.SubExpr);
                (VariableAccessExpr unTemp, IPStmt unStore) = SaveInTemporary(new UnaryOpExpr(location, unaryOpExpr.Operation, unExpr));
                deps.AddRange(unDeps);
                deps.Add(unStore);
                return(unTemp, deps);

            case UnnamedTupleExpr unnamedTupleExpr:
                (IReadOnlyList <IVariableRef> tupFields, List <IPStmt> tupFieldDeps) = SimplifyArgPack(unnamedTupleExpr.TupleFields);
                deps.AddRange(tupFieldDeps);
                (VariableAccessExpr tupVal, IPStmt tupStore) = SaveInTemporary(new UnnamedTupleExpr(location, tupFields));
                deps.Add(tupStore);
                return(tupVal, deps);

            case ValuesExpr valuesExpr:
                (IExprTerm valuesColl, List <IPStmt> valuesDeps)    = SimplifyExpression(valuesExpr.Expr);
                (VariableAccessExpr valuesTemp, IPStmt valuesStore) =
                    SaveInTemporary(new ValuesExpr(location, valuesColl, valuesExpr.Type));
                deps.AddRange(valuesDeps);
                deps.Add(valuesStore);
                return(valuesTemp, deps);

            case StringExpr stringExpr:
                (IPExpr[] stringArgs, List <IPStmt> stringArgsDeps) = SimplifyFunArgs(stringExpr.Args);
                (VariableAccessExpr stringTemp, IPStmt stringStore) = SaveInTemporary(new StringExpr(location, stringExpr.BaseString, stringArgs.ToList()));
                deps.AddRange(stringArgsDeps);
                deps.Add(stringStore);
                return(stringTemp, deps);

            default:
                throw new ArgumentOutOfRangeException(nameof(expr));
            }
#pragma warning restore CCN0002 // Non exhaustive patterns in switch block
        }
コード例 #4
0
 public FuncDef(DeclnSpecs specs, Declr declr, CompoundStmt stmt) {
     this.Specs = specs;
     this.Declr = declr;
     this.Stmt = stmt;
 }
コード例 #5
0
ファイル: IRTransformer.cs プロジェクト: jzhang919/P
        private (IExprTerm, List <IPStmt>) SimplifyExpression(IPExpr expr)
        {
            var location = expr.SourceLocation;
            var deps     = new List <IPStmt>();

            switch (expr)
            {
            case IExprTerm term:
                return(term, deps);

            case BinOpExpr binOpExpr:
                var(lhsTemp, lhsDeps) = SimplifyExpression(binOpExpr.Lhs);
                var(rhsTemp, rhsDeps) = SimplifyExpression(binOpExpr.Rhs);

                if (binOpExpr.Operation == BinOpType.And)
                {
                    // And is short-circuiting, so we need to treat it differently from other binary operators
                    deps.AddRange(lhsDeps);
                    var(andTemp, andInitialStore) = SaveInTemporary(new CloneExpr(lhsTemp));
                    deps.Add(andInitialStore);
                    var reassignFromRhs = new CompoundStmt(location, rhsDeps.Append(new AssignStmt(location, andTemp, new CloneExpr(rhsTemp))));
                    deps.Add(new IfStmt(location, andTemp, reassignFromRhs, null));
                    return(andTemp, deps);
                }
                else if (binOpExpr.Operation == BinOpType.Or)
                {
                    // Or is short-circuiting, so we need to treat it differently from other binary operators
                    deps.AddRange(lhsDeps);
                    var(orTemp, orInitialStore) = SaveInTemporary(new CloneExpr(lhsTemp));
                    deps.Add(orInitialStore);
                    var reassignFromRhs = new CompoundStmt(location, rhsDeps.Append(new AssignStmt(location, orTemp, new CloneExpr(rhsTemp))));
                    deps.Add(new IfStmt(location, orTemp, new NoStmt(location), reassignFromRhs));
                    return(orTemp, deps);
                }
                else
                {
                    var(binOpTemp, binOpStore) =
                        SaveInTemporary(new BinOpExpr(location, binOpExpr.Operation, lhsTemp, rhsTemp));
                    deps.AddRange(lhsDeps.Concat(rhsDeps));
                    deps.Add(binOpStore);
                    return(binOpTemp, deps);
                }

            case CastExpr castExpr:
                var(castSubExpr, castDeps) = SimplifyExpression(castExpr.SubExpr);
                var(castTemp, castStore)   = SaveInTemporary(new CastExpr(location, castSubExpr, castExpr.Type));
                deps.AddRange(castDeps);
                deps.Add(castStore);
                return(castTemp, deps);

            case CoerceExpr coerceExpr:
                var(coerceSubExpr, coerceDeps) = SimplifyExpression(coerceExpr.SubExpr);
                var(coerceTemp, coerceStore)   =
                    SaveInTemporary(new CoerceExpr(location, coerceSubExpr, coerceExpr.NewType));
                deps.AddRange(coerceDeps);
                deps.Add(coerceStore);
                return(coerceTemp, deps);

            case ContainsExpr containsKeyExpr:
                var(contKeyExpr, contKeyDeps) = SimplifyExpression(containsKeyExpr.Item);
                var(contMapExpr, contMapDeps) = SimplifyExpression(containsKeyExpr.Collection);
                var(contTemp, contStore)      =
                    SaveInTemporary(new ContainsExpr(location, contKeyExpr, contMapExpr));
                deps.AddRange(contKeyDeps.Concat(contMapDeps));
                deps.Add(contStore);
                return(contTemp, deps);

            case CtorExpr ctorExpr:
                var(ctorArgs, ctorArgDeps) = SimplifyArgPack(ctorExpr.Arguments);
                deps.AddRange(ctorArgDeps);
                var(ctorTemp, ctorStore) = SaveInTemporary(new CtorExpr(location, ctorExpr.Interface, ctorArgs));
                deps.Add(ctorStore);
                return(ctorTemp, deps);

            case DefaultExpr defaultExpr:
                var(defTemp, defStore) = SaveInTemporary(defaultExpr);
                deps.Add(defStore);
                return(defTemp, deps);

            case FairNondetExpr fairNondetExpr:
                var(fndTemp, fndStore) = SaveInTemporary(fairNondetExpr);
                deps.Add(fndStore);
                return(fndTemp, deps);

            case FunCallExpr funCallExpr:
                var(funArgs, funArgsDeps) = SimplifyFunArgs(funCallExpr.Arguments);
                deps.AddRange(funArgsDeps);
                var(funTemp, funStore) = SaveInTemporary(new FunCallExpr(location, funCallExpr.Function, funArgs));
                deps.Add(funStore);
                return(funTemp, deps);

            case KeysExpr keysExpr:
                var(keysColl, keysDeps)  = SimplifyExpression(keysExpr.Expr);
                var(keysTemp, keysStore) = SaveInTemporary(new KeysExpr(location, keysColl, keysExpr.Type));
                deps.AddRange(keysDeps);
                deps.Add(keysStore);
                return(keysTemp, deps);

            case MapAccessExpr mapAccessExpr:
                var(mapExpr, mapDeps)          = SimplifyExpression(mapAccessExpr.MapExpr);
                var(mapIdxExpr, mapIdxDeps)    = SimplifyExpression(mapAccessExpr.IndexExpr);
                var(mapItemTemp, mapItemStore) =
                    SaveInTemporary(new MapAccessExpr(location, mapExpr, mapIdxExpr, mapAccessExpr.Type));
                deps.AddRange(mapDeps.Concat(mapIdxDeps));
                deps.Add(mapItemStore);
                return(mapItemTemp, deps);

            case NamedTupleAccessExpr namedTupleAccessExpr:
                var(ntSubExpr, ntSubDeps) = SimplifyExpression(namedTupleAccessExpr.SubExpr);
                var(ntTemp, ntStore)      =
                    SaveInTemporary(new NamedTupleAccessExpr(location, ntSubExpr, namedTupleAccessExpr.Entry));
                deps.AddRange(ntSubDeps);
                deps.Add(ntStore);
                return(ntTemp, deps);

            case NamedTupleExpr namedTupleExpr:
                var(args, argDeps) = SimplifyArgPack(namedTupleExpr.TupleFields);
                deps.AddRange(argDeps);

                var(ntVal, ntValStore) =
                    SaveInTemporary(new NamedTupleExpr(location, args, namedTupleExpr.Type));
                deps.Add(ntValStore);
                return(ntVal, deps);

            case NondetExpr nondetExpr:
                var(ndTemp, ndStore) = SaveInTemporary(nondetExpr);
                deps.Add(ndStore);
                return(ndTemp, deps);

            case SeqAccessExpr seqAccessExpr:
                var(seqExpr, seqDeps)      = SimplifyExpression(seqAccessExpr.SeqExpr);
                var(seqIdx, seqIdxDeps)    = SimplifyExpression(seqAccessExpr.IndexExpr);
                var(seqElem, seqElemStore) =
                    SaveInTemporary(new SeqAccessExpr(location, seqExpr, seqIdx, seqAccessExpr.Type));
                deps.AddRange(seqDeps.Concat(seqIdxDeps));
                deps.Add(seqElemStore);
                return(seqElem, deps);

            case SizeofExpr sizeofExpr:
                var(sizeExpr, sizeDeps)  = SimplifyExpression(sizeofExpr.Expr);
                var(sizeTemp, sizeStore) = SaveInTemporary(new SizeofExpr(location, sizeExpr));
                deps.AddRange(sizeDeps);
                deps.Add(sizeStore);
                return(sizeTemp, deps);

            case TupleAccessExpr tupleAccessExpr:
                var(tupItemExpr, tupAccessDeps) = SimplifyExpression(tupleAccessExpr.SubExpr);
                var(tupItemTemp, tupItemStore)  =
                    SaveInTemporary(new TupleAccessExpr(location,
                                                        tupItemExpr,
                                                        tupleAccessExpr.FieldNo,
                                                        tupleAccessExpr.Type));
                deps.AddRange(tupAccessDeps);
                deps.Add(tupItemStore);
                return(tupItemTemp, deps);

            case UnaryOpExpr unaryOpExpr:
                var(unExpr, unDeps)  = SimplifyExpression(unaryOpExpr.SubExpr);
                var(unTemp, unStore) = SaveInTemporary(new UnaryOpExpr(location, unaryOpExpr.Operation, unExpr));
                deps.AddRange(unDeps);
                deps.Add(unStore);
                return(unTemp, deps);

            case UnnamedTupleExpr unnamedTupleExpr:
                var(tupFields, tupFieldDeps) = SimplifyArgPack(unnamedTupleExpr.TupleFields);
                deps.AddRange(tupFieldDeps);
                var(tupVal, tupStore) = SaveInTemporary(new UnnamedTupleExpr(location, tupFields));
                deps.Add(tupStore);
                return(tupVal, deps);

            case ValuesExpr valuesExpr:
                var(valuesColl, valuesDeps)  = SimplifyExpression(valuesExpr.Expr);
                var(valuesTemp, valuesStore) =
                    SaveInTemporary(new ValuesExpr(location, valuesColl, valuesExpr.Type));
                deps.AddRange(valuesDeps);
                deps.Add(valuesStore);
                return(valuesTemp, deps);

            default:
                throw new ArgumentOutOfRangeException(nameof(expr));
            }
        }