main.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/python
  2. """
  3. Shell front-end for the mathematical term rewriting system. This shell will
  4. parse mathematical expressions into an expression tree, produce possible
  5. rewrite steps and, if requested, provide a hint to rewrite the last entered
  6. expression.
  7. """
  8. import argparse
  9. import sys
  10. import os
  11. from src.backend.backend import app
  12. def init_readline():
  13. try:
  14. import readline
  15. except ImportError:
  16. return
  17. histfile = os.path.join(os.path.expanduser("~"), ".trs_hist")
  18. try:
  19. readline.read_history_file(histfile)
  20. except IOError:
  21. pass
  22. import atexit
  23. atexit.register(readline.write_history_file, histfile)
  24. def get_args():
  25. parser = argparse.ArgumentParser(prog='trs', description=__doc__)
  26. parser.add_argument('--debug', '-d', action='store_true',
  27. default=False,
  28. help='Enable debug mode in bison and flex.')
  29. parser.add_argument('--verbose', '-v', action='store_true',
  30. default=False,
  31. help='Enable verbose output messages (printed to stdout).')
  32. parser.add_argument('--keepfiles', '-k', action='store_true',
  33. default=False,
  34. help='Keep temporary generated bison and lex files.')
  35. parser.add_argument('--batch', '-b', action='store_true', default=False,
  36. help='Disable interactive mode and execute expressions in batch' \
  37. ' mode.')
  38. parser.add_argument('--interactive', action='store_true',
  39. default=sys.stdin.isatty(),
  40. help='Enable interactive mode (default). This is the inverse of' \
  41. ' --batch.')
  42. parser.add_argument('--backend', action='store_true',
  43. default=False,
  44. help='Start term rewriting system backend (default: disabled).' \
  45. ' This is the backend for the web frontend.')
  46. parser.add_argument('port', type=int, default=8080, nargs='?',
  47. help='Port number for system backend (default: 8080).')
  48. return parser.parse_args()
  49. def main():
  50. from src.parser import Parser
  51. args = get_args()
  52. if args.backend:
  53. sys.argv[1] = str(args.port)
  54. return app.run()
  55. interactive = args.interactive and not args.batch
  56. p = Parser(verbose=args.verbose,
  57. keepfiles=args.keepfiles,
  58. interactive=interactive)
  59. node = p.run(debug=args.debug)
  60. # Clear the line, when the shell exits.
  61. if interactive:
  62. print
  63. return node
  64. if __name__ == '__main__':
  65. init_readline()
  66. main()