This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

92 rindas
2.7 KiB

  1. """This module implements a LALR(1) Parser
  2. """
  3. # Author: Erez Shinan (2017)
  4. # Email : erezshin@gmail.com
  5. from ..common import UnexpectedToken
  6. from .lalr_analysis import LALR_Analyzer, Shift
  7. class Parser:
  8. def __init__(self, parser_conf):
  9. assert all(r.options is None or r.options.priority is None
  10. for r in parser_conf.rules), "LALR doesn't yet support prioritization"
  11. self.analysis = analysis = LALR_Analyzer(parser_conf)
  12. analysis.compute_lookahead()
  13. callbacks = {rule: getattr(parser_conf.callback, rule.alias or rule.origin, None)
  14. for rule in parser_conf.rules}
  15. self.parser_conf = parser_conf
  16. self.parser = _Parser(analysis.parse_table, callbacks)
  17. self.parse = self.parser.parse
  18. ###{standalone
  19. class _Parser:
  20. def __init__(self, parse_table, callbacks):
  21. self.states = parse_table.states
  22. self.start_state = parse_table.start_state
  23. self.end_state = parse_table.end_state
  24. self.callbacks = callbacks
  25. def parse(self, seq, set_state=None):
  26. i = 0
  27. token = None
  28. stream = iter(seq)
  29. states = self.states
  30. state_stack = [self.start_state]
  31. value_stack = []
  32. if set_state: set_state(self.start_state)
  33. def get_action(key):
  34. state = state_stack[-1]
  35. try:
  36. return states[state][key]
  37. except KeyError:
  38. expected = states[state].keys()
  39. raise UnexpectedToken(token, expected, seq, i)
  40. def reduce(rule):
  41. size = len(rule.expansion)
  42. if size:
  43. s = value_stack[-size:]
  44. del state_stack[-size:]
  45. del value_stack[-size:]
  46. else:
  47. s = []
  48. value = self.callbacks[rule](s)
  49. _action, new_state = get_action(rule.origin)
  50. assert _action is Shift
  51. state_stack.append(new_state)
  52. value_stack.append(value)
  53. # Main LALR-parser loop
  54. for i, token in enumerate(stream):
  55. while True:
  56. action, arg = get_action(token.type)
  57. assert arg != self.end_state
  58. if action is Shift:
  59. state_stack.append(arg)
  60. value_stack.append(token)
  61. if set_state: set_state(arg)
  62. break # next token
  63. else:
  64. reduce(arg)
  65. while True:
  66. _action, arg = get_action('$END')
  67. if _action is Shift:
  68. assert arg == self.end_state
  69. val ,= value_stack
  70. return val
  71. else:
  72. reduce(arg)
  73. ###}