/brainfuck/bin/brainfuck.rb

https://github.com/vybirjan/MI-RUB-ukoly · Ruby · 149 lines · 128 code · 21 blank · 0 comment · 12 complexity · 0e62e498c67e65355a569510969ccaf5 MD5 · raw file

  1. require_relative '../lib/brainfuck_ast.rb'
  2. require_relative '../lib/brainfuck_interpreter.rb'
  3. require_relative '../lib/brainfuck_parser.rb'
  4. require_relative '../lib/bf_c_translator.rb'
  5. def print_help
  6. puts "Brainfuck interpreter, arguments:"
  7. puts " -help - prints this help"
  8. puts " -i - start in interactive mode"
  9. puts " <input file> - parse brainfuck code from input file"
  10. puts " <input file> -to_c - optional argument, parses brainfuck code from file, converts"
  11. puts " it into C language and prints result to standard output"
  12. exit
  13. end
  14. def run_interactive
  15. puts "Brainfuck in ruby v 0.1, interactive console"
  16. puts
  17. puts "Type in brainfuck commands, press Enter to run"
  18. puts "Type 'help' for list of available commands"
  19. puts ""
  20. context = BrainfuckContext.new
  21. regex = /^mem (\d+)$/
  22. run = true
  23. while run do
  24. cmd = STDIN.gets.chomp
  25. case cmd
  26. when "exit"
  27. run = false
  28. when "help"
  29. print_interactive_help
  30. when "reset"
  31. context.reset
  32. puts "\nContext reset\n\n"
  33. when "mem"
  34. puts
  35. puts "Memory content (^ - current pointer):"
  36. context.print_memory
  37. puts
  38. else
  39. result = regex.match(cmd)
  40. if(result == nil)
  41. parser = BrainfuckParser.new
  42. begin
  43. parser.parse_code(cmd)
  44. ast = parser.get_start
  45. BrainfuckInterpreter.interpret(ast, context)
  46. puts "\n\nCommand executed"
  47. rescue BrainfuckParseError => err
  48. puts "Failed to parse command: " << err.message
  49. rescue RangeError => err
  50. puts "Moved outside allocated memory - " << err.message
  51. end
  52. else
  53. puts
  54. puts "Memory content around address " << result[1] << ":"
  55. context.print_memory(Integer(result[1]))
  56. end
  57. puts
  58. end
  59. end
  60. exit(0)
  61. end
  62. def print_interactive_help
  63. puts ""
  64. puts "Available commands:"
  65. puts " help - prints this help"
  66. puts " exit - closes brainfuck console"
  67. puts " mem - prints content of memory around pointer"
  68. puts " mem <address> - prints content of memory around given address"
  69. puts " reset - restarts context to initital value"
  70. end
  71. def parse_source(source_file)
  72. begin
  73. ast = parse_ast_from_file(source_file)
  74. context = BrainfuckContext.new
  75. BrainfuckInterpreter.interpret(ast, context)
  76. rescue BrainfuckParseError => err
  77. puts "Parse error on line " << err.line.to_s << ", column " << err.column.to_s << " in file '" << source_file << "': " << err.message
  78. exit(2)
  79. rescue => err
  80. puts "Error: " << err.message
  81. exit(3)
  82. end
  83. exit(0)
  84. end
  85. def parse_ast_from_file(file_name)
  86. parser = BrainfuckParser.new
  87. File.open(file_name, "r") do |infile|
  88. while(line = infile.gets)
  89. parser.parse_code(line << '\n')
  90. end
  91. end
  92. return parser.get_start
  93. end
  94. def convert_to_c(source_file)
  95. begin
  96. ast = parse_ast_from_file(source_file)
  97. c_source = BrainfuckCTranslator.to_c_source(ast)
  98. puts c_source
  99. rescue BrainfuckParseError => err
  100. puts "Parse error on line " << err.line.to_s << ", column " << err.column.to_s << " in file '" << source_file << "': " << err.message
  101. exit(2)
  102. rescue => err
  103. puts "Error: " << err.message
  104. exit(3)
  105. end
  106. exit(0)
  107. end
  108. if(ARGV.empty?)
  109. puts "Arguments missing, for help run application with -help parameter"
  110. exit(1)
  111. end
  112. case ARGV[0]
  113. when "-help"
  114. print_help
  115. when "-i"
  116. run_interactive
  117. else
  118. source_file = ARGV[0]
  119. if(ARGV.length == 1)
  120. parse_source(source_file)
  121. else
  122. if(ARGV.length == 2 and ARGV[1] == "-to_c")
  123. convert_to_c(source_file)
  124. end
  125. end
  126. end
  127. puts "Unrecognized arguments, for help run application with -help parameter"
  128. exit(1)