__init__.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import sys
  2. from argparse import ArgumentParser, FileType
  3. from textwrap import indent
  4. from logging import DEBUG, INFO, WARN, ERROR
  5. from typing import Optional
  6. import warnings
  7. from lark import Lark, logger
  8. try:
  9. from interegular import logger as interegular_logger
  10. has_interegular = True
  11. except ImportError:
  12. has_interegular = False
  13. lalr_argparser = ArgumentParser(add_help=False, epilog='Look at the Lark documentation for more info on the options')
  14. flags = [
  15. ('d', 'debug'),
  16. 'keep_all_tokens',
  17. 'regex',
  18. 'propagate_positions',
  19. 'maybe_placeholders',
  20. 'use_bytes'
  21. ]
  22. options = ['start', 'lexer']
  23. lalr_argparser.add_argument('-v', '--verbose', action='count', default=0, help="Increase Logger output level, up to three times")
  24. lalr_argparser.add_argument('-s', '--start', action='append', default=[])
  25. lalr_argparser.add_argument('-l', '--lexer', default='contextual', choices=('basic', 'contextual'))
  26. lalr_argparser.add_argument('-o', '--out', type=FileType('w', encoding='utf-8'), default=sys.stdout, help='the output file (default=stdout)')
  27. lalr_argparser.add_argument('grammar_file', type=FileType('r', encoding='utf-8'), help='A valid .lark file')
  28. for flag in flags:
  29. if isinstance(flag, tuple):
  30. options.append(flag[1])
  31. lalr_argparser.add_argument('-' + flag[0], '--' + flag[1], action='store_true')
  32. elif isinstance(flag, str):
  33. options.append(flag)
  34. lalr_argparser.add_argument('--' + flag, action='store_true')
  35. else:
  36. raise NotImplementedError("flags must only contain strings or tuples of strings")
  37. def build_lalr(namespace):
  38. logger.setLevel((ERROR, WARN, INFO, DEBUG)[min(namespace.verbose, 3)])
  39. if has_interegular:
  40. interegular_logger.setLevel(logger.getEffectiveLevel())
  41. if len(namespace.start) == 0:
  42. namespace.start.append('start')
  43. kwargs = {n: getattr(namespace, n) for n in options}
  44. return Lark(namespace.grammar_file, parser='lalr', **kwargs), namespace.out
  45. def showwarning_as_comment(message, category, filename, lineno, file=None, line=None):
  46. # Based on warnings._showwarnmsg_impl
  47. text = warnings.formatwarning(message, category, filename, lineno, line)
  48. text = indent(text, '# ')
  49. if file is None:
  50. file = sys.stderr
  51. if file is None:
  52. return
  53. try:
  54. file.write(text)
  55. except OSError:
  56. pass
  57. def make_warnings_comments():
  58. warnings.showwarning = showwarning_as_comment