コード例 #1
0
        public void ReadEvaluatePrintLoop_WithNullParser_ThrowsArgumentNullException()
        {
            RunTimeEnvironment rte    = MakeRunTimeEnvironment("PRINT \"Windows\";");
            Parser             parser = null;

            var repl = new ReadEvaluatePrintLoop(rte, parser);
        }
コード例 #2
0
        public static void Run(RenderFromFileOptions o, RunTimeEnvironment rte, Helpers sys)
        {
            var ext             = (Path.GetExtension(o.Arguments)).ToLowerInvariant();
            var indirectOptions = new RenderOptions();

            switch (ext)
            {
            case ".yaml":
                indirectOptions =
                    sys.GetOrQuit(
                        () => new Deserializer().Deserialize <RenderOptions>(File.ReadAllText(o.Arguments)),
                        "Unable to load/parse argument file");
                break;

            case ".json":
                indirectOptions =
                    sys.GetOrQuit(() => JsonSerializer.Deserialize <RenderOptions>(File.ReadAllText(o.Arguments)),
                                  "Unable to load/parse argument file");
                break;

            default:
                sys.ExitHandler($"unrecognised extension '{ext}' for arguments file");
                return;
            }

            CmdRender.Run(indirectOptions, rte, sys);
        }
コード例 #3
0
        public void ReadEvaluatePrintLoop_WithNullRte_ThrowsArgumentNullException()
        {
            RunTimeEnvironment rte = null;
            var parser             = new Parser();

            var repl = new ReadEvaluatePrintLoop(rte, parser);
        }
コード例 #4
0
ファイル: PrintLine.cs プロジェクト: simis00873/basic
        public override EvaluateResult Execute(RunTimeEnvironment rte)
        {
            var result = base.Execute(rte);

            rte.InputOutput.WriteLine();
            return(result);
        }
コード例 #5
0
ファイル: Dim.cs プロジェクト: simis00873/basic
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            var name             = Array.Name;
            var indexesAsObjects = Array.Indexes
                                   .Select(i => i.GetExpression(rte.Variables))
                                   .Select(e => e.Calculate())
                                   .ToArray();
            var indexes = indexesAsObjects.Select(o => (int)o)
                          .ToArray();

            if (indexes.Any(index => index == 0))
            {
                throw new InvalidOperationException(ErrorMessages.ZeroArraySize);
            }

            if (indexes.Length < 1 || indexes.Length > 4)
            {
                throw new InvalidOperationException(ErrorMessages.UnsupportedArrayDimension);
            }

            rte.Variables[name] = CreateArrayAndFillWithZeros(indexes);

            var format = evaluateResultFormats[indexes.Length];

            return(new EvaluateResult(name + format, indexesAsObjects));
        }
コード例 #6
0
ファイル: Load.cs プロジェクト: simis00873/basic
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            rte.Load(Name);

            var message = string.Format(Messages.ProgramLoaded, rte.Variables.LastUsedProgramName);

            return(new EvaluateResult(message));
        }
コード例 #7
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            var seedException = Seed.GetExpression(rte.Variables);
            var seed          = seedException.Calculate();

            rte.Randomize((int)seed);

            return(new EvaluateResult(Messages.RandomizeSeedAccepted, seed));
        }
コード例 #8
0
ファイル: Save.cs プロジェクト: Gravicode/BASIC.TinyCLR
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            string name = GetFileName(rte);

            rte.Save(name);

            var message = string.Format(Messages.ProgramSaved, rte.Variables.LastUsedProgramName);

            return(new EvaluateResult(message));
        }
コード例 #9
0
ファイル: Goto.cs プロジェクト: Gravicode/BASIC.TinyCLR
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            var numberExpression = Number.GetExpression(rte.Variables);
            var number           = numberExpression.Calculate();
            var label            = number.ToString();

            rte.Goto(label);

            return(EvaluateResult.None);
        }
コード例 #10
0
        public virtual EvaluateResult Execute(RunTimeEnvironment rte)
        {
            if (!rte.IsLoopStarted)
            {
                var loop = CreateForLoop(rte.Variables);

                rte.StartLoop(loop);
            }

            return(EvaluateResult.None);
        }
コード例 #11
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            var left          = Left.GetExpression(rte.Variables);
            var right         = Right.GetExpression(rte.Variables);
            var rightAsObject = Expression.Convert(right, typeof(object));
            var assignment    = Expression.Assign(left, rightAsObject);
            var value         = assignment.Calculate();
            var result        = Constant.ToString(value);

            return(new EvaluateResult(result));
        }
コード例 #12
0
ファイル: Print.cs プロジェクト: Gravicode/BASIC.TinyCLR
        public virtual EvaluateResult Execute(RunTimeEnvironment rte)
        {
            foreach (var expression in Expressions)
            {
                var compiled      = expression.GetExpression(rte.Variables);
                var value         = compiled.Calculate();
                var valueAsString = value == null ? string.Empty : value.ToString();
                rte.InputOutput.Write(valueAsString);
            }

            return(EvaluateResult.None);
        }
コード例 #13
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            int start;
            int count;

            Range.GetBounds(rte, out start, out count);

            rte.RemoveRange(start, count);

            var message = string.Format(Messages.RemoveResult, count);

            return(new EvaluateResult(message));
        }
コード例 #14
0
ファイル: Program.cs プロジェクト: simis00873/basic
        private static void Main(string[] args)
        {
            var inputOutput       = new ConsoleInputOutput();
            var parser            = new Parser();
            var programRepository = new FileProgramRepository(parser);

            using (var rte = new RunTimeEnvironment(inputOutput, programRepository))
            {
                var readEvaluatePrintLoop = new ReadEvaluatePrintLoop(rte, parser);

                PrintSalute(inputOutput);
                Run(readEvaluatePrintLoop);
            }
        }
コード例 #15
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            rte.InputOutput.Write(Prompt);
            var line = rte.InputOutput.ReadLine();

            var rValue     = ParseToObjectExpression(line);
            var lValue     = LValue.GetExpression(rte.Variables);
            var assignment = Expression.Assign(lValue, rValue);

            var value  = assignment.Calculate();
            var result = value.ToString();

            return(new EvaluateResult(result));
        }
コード例 #16
0
        BasicReplEngine(string Uart, int BaudRate = 9600)
        {
            var inputOutput       = new SerialInputOutput(Uart, BaudRate);
            var parser            = new Parser();
            var programRepository = new FileProgramRepository(parser);

            using (var rte = new RunTimeEnvironment(inputOutput, programRepository))
            {
                var readEvaluatePrintLoop = new ReadEvaluatePrintLoop(rte, parser);

                PrintSalute(inputOutput);
                Run(readEvaluatePrintLoop);
            }
        }
コード例 #17
0
ファイル: Program.cs プロジェクト: gitter-badger/Textrude
 private static void Main(string[] args)
 {
     var rte    = new RunTimeEnvironment(new FileSystemOperations());
     var sys    = new Helpers();
     var result = Parser.Default
                  .ParseArguments(args,
                                  typeof(RenderOptions),
                                  typeof(RenderFromFileOptions),
                                  typeof(CmdInfo.Options)
                                  )
                  .WithParsed <CmdInfo.Options>(o => CmdInfo.Run(o, rte).Wait())
                  .WithParsed <RenderOptions>(o => CmdRender.Run(o, rte, sys))
                  .WithParsed <RenderFromFileOptions>(o => CmdRenderFromFile.Run(o, rte, sys))
     ;
 }
コード例 #18
0
        /// <summary>
        /// 当DbProviderFactories.GetFactory的注册机制无效时,再尝试使用反射方式查找DbProviderFactory
        /// </summary>
        /// <param name="providerName">数据提供者名称</param>
        /// <returns>与数据提供者名称对应的DbProviderFactory实例</returns>
        private static DbProviderFactory GetDbProviderFactoryViaReflection(string providerName)
        {
            Type factoryType = (from asm in RunTimeEnvironment.GetLoadAssemblies(true)
                                from t in asm.GetPublicTypes()
                                where t.Namespace == providerName && typeof(DbProviderFactory).IsAssignableFrom(t)
                                select t).FirstOrDefault();

            if (factoryType == null)
            {
                return(null);
            }

            return((DbProviderFactory)factoryType.InvokeMember("Instance",
                                                               BindingFlags.GetField | BindingFlags.Static | BindingFlags.Public, null, null, null));
        }
コード例 #19
0
        public override EvaluateResult Execute(RunTimeEnvironment rte)
        {
            EvaluateResult result;

            var loop = CreateForLoop(rte.Variables);

            do
            {
                result = Statement.Execute(rte);

                loop.TakeStep();
            }while (!loop.IsOver);

            return(result);
        }
コード例 #20
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            int start;
            int count;

            Range.GetBounds(rte, out start, out count);
            var filteredLines = rte.Lines.Skip(start).Take(count);

            foreach (var line in filteredLines)
            {
                rte.InputOutput.WriteLine(line.ToString());
            }

            return(EvaluateResult.None);
        }
コード例 #21
0
ファイル: Next.cs プロジェクト: Gravicode/BASIC.TinyCLR
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            rte.TakeLastLoopStep();

            if (rte.IsLastLoopOver)
            {
                rte.StopLastLoop();
            }
            else
            {
                rte.RepeatLastLoop();
            }

            return(EvaluateResult.None);
        }
コード例 #22
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            var result = rte.Run();

            if (result == ProgramResult.Broken)
            {
                return(new EvaluateResult(Messages.CtrlCPressed));
            }

            if (result == ProgramResult.Completed)
            {
                return(new EvaluateResult(Messages.ProgramCompleted));
            }

            throw new InvalidOperationException();
        }
コード例 #23
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            var conditionExpression = Condition.GetExpression(rte.Variables);
            var condition           = (bool)conditionExpression.Calculate();

            if (condition)
            {
                return(Then.Execute(rte));
            }

            if (Else != null)
            {
                return(Else.Execute(rte));
            }

            return(EvaluateResult.None);
        }
コード例 #24
0
        public static Assembly CompileCode(string code, string outputName = null, string tempOutPath = null)
        {
            SaveLastTempCode(code, tempOutPath);

            // 准备编译器参数
            CompilerParameters cp = new CompilerParameters();

            cp.GenerateExecutable = false;

            if (outputName == null)
            {
                cp.GenerateInMemory = true;
            }
            else
            {
                cp.OutputAssembly = outputName;
            }

            // 添加编译必须的程序集引用
            Assembly[] assemblies = RunTimeEnvironment.GetLoadAssemblies();
            foreach (Assembly assembly in assemblies)
            {
                if (assembly.IsDynamic)
                {
                    continue;
                }
                cp.ReferencedAssemblies.Add(assembly.Location);
            }


            // 创建编译器实例并编译代码
            CSharpCodeProvider csProvider = new CSharpCodeProvider();
            CompilerResults    cr         = csProvider.CompileAssemblyFromSource(cp, code);

            // 检查编译结果
            if (cr.Errors != null && cr.Errors.HasErrors)
            {
                SaveLastComplieError(cr, tempOutPath);
                throw new CompileException {
                          Code = code, CompilerResult = cr
                };
            }

            // 获取编译结果,它是编译后的程序集
            return(cr.CompiledAssembly);
        }
コード例 #25
0
        /// <summary>
        /// 获取带个指定修饰属性的程序集列表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static List <Assembly> GetAssemblyList <T>() where T : Attribute
        {
            List <Assembly> list = new List <Assembly>(128);

            ICollection assemblies = RunTimeEnvironment.GetLoadAssemblies(true);

            foreach (Assembly assembly in assemblies)
            {
                if (assembly.GetAttributes <T>().Length == 0)
                {
                    continue;
                }

                list.Add(assembly);
            }

            return(list);
        }
コード例 #26
0
ファイル: Save.cs プロジェクト: Gravicode/BASIC.TinyCLR
 private string GetFileName(RunTimeEnvironment rte)
 {
     if (Name == null)
     {
         if (rte.Variables.LastUsedProgramName == null)
         {
             rte.InputOutput.Write(Messages.InputProgramName);
             return(rte.InputOutput.ReadLine());
         }
         else
         {
             return(rte.Variables.LastUsedProgramName);
         }
     }
     else
     {
         return(Name);
     }
 }
コード例 #27
0
ファイル: CmdInfo.cs プロジェクト: gitter-badger/Textrude
        public static async Task Run(Options o, RunTimeEnvironment rte)
        {
#if HASGITVERSION
            var isDirty = GitVersionInformation.UncommittedChanges == "0"
                ? ""
                : " (dirty build)";
            Console.WriteLine(
                @$ "
Version {GitVersionInformation.SemVer} built {GitVersionInformation.CommitDate}   commit {GitVersionInformation.ShortSha} {isDirty} 

Useful links:
 - Textrude homepage:      https://github.com/NeilMacMullen/Textrude
 - Scriban language docs:  https://github.com/scriban/scriban/blob/master/doc/language.md
");

            var latestVersion = await UpgradeManager.GetLatestVersion();

            if (latestVersion.Supersedes(GitVersionInformation.SemVer))
            {
                Console.WriteLine($"Upgrade to version {latestVersion.Version} available");
                Console.WriteLine($"Please visit {UpgradeManager.ReleaseSite} for download");
            }
#endif
        }
コード例 #28
0
        public EvaluateResult Execute(RunTimeEnvironment rte)
        {
            rte.Close();

            return(new EvaluateResult(Messages.BasicInterpreterTerminated));
        }
コード例 #29
0
        public static void Run(RenderOptions options, RunTimeEnvironment rte, Helpers sys)
        {
            var cmd = new CmdRender(options, rte, sys);

            cmd.Run();
        }
コード例 #30
0
 public CmdRender(RenderOptions options, RunTimeEnvironment rte, Helpers sys)
 {
     _options = options;
     _runtime = rte;
     _sys     = sys;
 }