Exemple #1
0
        public static IExpression OptionalDeclaration(IEnumerable <VariablePrototype> variables,
                                                      IEnumerable <IExpression> rhsOptions)
        {
            // todo: add support for spread
            if (variables.Count() != rhsOptions.Count())
            {
                throw new NotImplementedException();
            }

            // thanks to `and` parallel optional declaration uses shortcut computation
            // that is, evaluating rhs options stops on the first failure
            IExpression combined = null;

            foreach (Tuple <VariablePrototype, IExpression> pair in variables.SyncZip(rhsOptions))
            {
                VariablePrototype lhs = pair.Item1;
                IExpression       rhs = pair.Item2;

                IExpression decl = OptionalDeclaration(lhs.Name, lhs.TypeName, rhs);
                if (combined == null)
                {
                    combined = decl;
                }
                else
                {
                    combined = And(combined, decl);
                }
            }

            return(combined);
        }
Exemple #2
0
        public IInterpreter ParallelOptionalDeclaration()
        {
            var interpreter = new Interpreter.Interpreter();

            foreach (var mutability in Options.AllMutabilityModes)
            {
                var env = Language.Environment.Create(new Options()
                {
                    DebugThrowOnError = true,
                }.SetMutability(mutability));
                var root_ns = env.Root;

                IExpression opt_declaration = ExpressionFactory.OptionalDeclaration(new[] {
                    VariablePrototype.Create("x", NameFactory.Nat8NameReference()),
                    VariablePrototype.Create("y", NameFactory.Nat8NameReference())
                }, new[] {
                    ExpressionFactory.OptionOf(NameFactory.Nat8NameReference(), Nat8Literal.Create("2")),
                    ExpressionFactory.OptionOf(NameFactory.Nat8NameReference(), Nat8Literal.Create("7")),
                });

                root_ns.AddBuilder(FunctionBuilder.Create("main",
                                                          ExpressionReadMode.OptionalUse,
                                                          NameFactory.Nat8NameReference(),
                                                          Block.CreateStatement(
                                                              IfBranch.CreateIf(opt_declaration,
                                                                                Return.Create(ExpressionFactory.Add("x", "y")),
                                                                                IfBranch.CreateElse(
                                                                                    ExpressionFactory.GenericThrow()
                                                                                    ))
                                                              )));

                ExecValue result = interpreter.TestRun(env);

                Assert.AreEqual((byte)9, result.RetValue.PlainValue);
            }

            return(interpreter);
        }
        public override void GenerateHeaderCode(MibHeaderFile mibHeaderFile)
        {
            mibHeaderFile.Includes.Add(new PP_Include("lwip/apps/snmp_core.h"));

            mibHeaderFile.VariableDeclarations.Add(VariablePrototype.FromVariableDeclaration(GetExportDeclaration()));
        }
Exemple #4
0
        public IInterpreter ShortcutComputationInOptionalDeclaration()
        {
            var interpreter = new Interpreter.Interpreter();

            foreach (var mutability in Options.AllMutabilityModes)
            {
                // purpose: check if RHS of the optional declaration is computed only when it is needed
                // here we count RHS computations and since we declare two variables
                // let (x,y) =? (None,Some)
                // Some should not be executed, because `x` assigment fails first
                var env = Language.Environment.Create(new Options()
                {
                    DebugThrowOnError = true,
                    DiscardingAnyExpressionDuringTests = true,
                }.SetMutability(mutability));
                var root_ns = env.Root;

                root_ns.AddBuilder(TypeBuilder.Create("Mutator")
                                   .SetModifier(EntityModifier.Mutable)
                                   .With(VariableDeclaration.CreateStatement("c", NameFactory.IntNameReference(), null,
                                                                             env.Options.ReassignableModifier() | EntityModifier.Public)));

                // return Some or None depending on the `f` parameter, and also increments the count of option evaluations
                root_ns.AddBuilder(FunctionBuilder.Create("give", NameFactory.OptionNameReference(NameFactory.Nat8NameReference()),
                                                          Block.CreateStatement(
                                                              ExpressionFactory.Inc(() => NameReference.Create("m", "c")),
                                                              Return.Create(ExpressionFactory.Ternary(NameReference.Create("f"),
                                                                                                      ExpressionFactory.OptionOf(NameFactory.Nat8NameReference(), Nat8Literal.Create("11")),
                                                                                                      ExpressionFactory.OptionEmpty(NameFactory.Nat8NameReference())))
                                                              ))
                                   .Parameters(FunctionParameter.Create("f", NameFactory.BoolNameReference()),
                                               FunctionParameter.Create("m", NameFactory.ReferenceNameReference(NameReference.Create("Mutator")))));

                IExpression opt_declaration = ExpressionFactory.OptionalDeclaration(new[] {
                    VariablePrototype.Create("x", NameFactory.Nat8NameReference()),
                    VariablePrototype.Create("y", NameFactory.Nat8NameReference())
                }, new[] {
                    FunctionCall.Create("give", BoolLiteral.CreateFalse(), NameReference.Create("mut")),
                    FunctionCall.Create("give", BoolLiteral.CreateTrue(), NameReference.Create("mut")),
                });

                root_ns.AddBuilder(FunctionBuilder.Create("main",
                                                          ExpressionReadMode.OptionalUse,
                                                          NameFactory.Nat8NameReference(),
                                                          Block.CreateStatement(
                                                              VariableDeclaration.CreateStatement("mut", null, ExpressionFactory.StackConstructor(NameReference.Create("Mutator"))),

                                                              IfBranch.CreateIf(opt_declaration,
                                                                                new[] {
                    ExpressionFactory.Readout("x"),
                    ExpressionFactory.Readout("y"),
                    ExpressionFactory.GenericThrow(),
                },
                                                                                IfBranch.CreateElse(
                                                                                    // crucial check -- we should not evaluate the second option
                                                                                    ExpressionFactory.AssertEqual(IntLiteral.Create("1"), NameReference.Create("mut", "c"))
                                                                                    )),

                                                              Return.Create(Nat8Literal.Create("0"))
                                                              )));

                ExecValue result = interpreter.TestRun(env);

                Assert.AreEqual((byte)0, result.RetValue.PlainValue);
            }

            return(interpreter);
        }