/BrainfuckNancy/BrainfuckCore/Interpreter.cs

https://gitlab.com/wipiano/BrainfuckNancy · C# · 65 lines · 38 code · 6 blank · 21 comment · 2 complexity · 708e143df5b45e0fe2ffd354c0544530 MD5 · raw file

  1. using System.Collections.Generic;
  2. namespace BrainfuckCore
  3. {
  4. public class Interpreter
  5. {
  6. private readonly Context context;
  7. /// <summary>
  8. /// 与えられたコードをすぐに実行して結果を返します。
  9. /// 使用した Interpreter のインスタンスは破棄されます
  10. /// </summary>
  11. public static IEnumerable<char> ExecuteOnce(int memorySize, string code, string input)
  12. {
  13. return new Interpreter(memorySize).Load(code).Execute(input);
  14. }
  15. /// <summary>
  16. /// 新しい Brainfuck インタプリタを生成します
  17. /// </summary>
  18. /// <param name="memorySize"></param>
  19. public Interpreter(int memorySize)
  20. {
  21. context = new Context(memorySize);
  22. }
  23. /// <summary>
  24. /// 初期化します
  25. /// </summary>
  26. /// <returns></returns>
  27. public Interpreter Init()
  28. {
  29. context.Init();
  30. return this;
  31. }
  32. /// <summary>
  33. /// プログラムを読み込みます
  34. /// </summary>
  35. /// <param name="originalCode"></param>
  36. /// <returns></returns>
  37. public Interpreter Load(string originalCode)
  38. {
  39. context.SetCommands(originalCode);
  40. return this;
  41. }
  42. /// <summary>
  43. /// コードを実行します
  44. /// </summary>
  45. /// <returns>実行結果</returns>
  46. public IEnumerable<char> Execute(string input)
  47. {
  48. context.SetInput(input);
  49. while (!context.Commands.IsEnd)
  50. {
  51. var yieldResult = context.Commands.ExecuteStep(context);
  52. if (yieldResult.HasValue)
  53. {
  54. yield return yieldResult.Value;
  55. }
  56. }
  57. }
  58. }
  59. }