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.

107 rindas
2.4 KiB

  1. from ..utils import compare
  2. from functools import cmp_to_key
  3. from ..tree import Tree, Visitor_NoRecurse
  4. # Standard ambiguity resolver (uses comparison)
  5. #
  6. # Author: Erez Sh
  7. def _compare_rules(rule1, rule2):
  8. c = -compare( len(rule1.expansion), len(rule2.expansion))
  9. if rule1.origin.startswith('__'): # XXX hack! We should set priority in parser, not here
  10. c = -c
  11. return c
  12. def _sum_priority(tree):
  13. p = 0
  14. for n in tree.iter_subtrees():
  15. try:
  16. p += n.rule.options.priority or 0
  17. except AttributeError:
  18. pass
  19. return p
  20. def _compare_priority(tree1, tree2):
  21. tree1.iter_subtrees()
  22. def _compare_drv(tree1, tree2):
  23. rule1 = getattr(tree1, 'rule', None)
  24. rule2 = getattr(tree2, 'rule', None)
  25. if None == rule1 == rule2:
  26. return compare(tree1, tree2)
  27. elif rule1 is None:
  28. return -1
  29. elif rule2 is None:
  30. return 1
  31. assert tree1.data != '_ambig'
  32. assert tree2.data != '_ambig'
  33. p1 = _sum_priority(tree1)
  34. p2 = _sum_priority(tree2)
  35. c = (p1 or p2) and compare(p1, p2)
  36. if c:
  37. return c
  38. c = _compare_rules(tree1.rule, tree2.rule)
  39. if c:
  40. return c
  41. # rules are "equal", so compare trees
  42. if len(tree1.children) == len(tree2.children):
  43. for t1, t2 in zip(tree1.children, tree2.children):
  44. c = _compare_drv(t1, t2)
  45. if c:
  46. return c
  47. return compare(len(tree1.children), len(tree2.children))
  48. def _standard_resolve_ambig(tree):
  49. assert tree.data == '_ambig'
  50. key_f = cmp_to_key(_compare_drv)
  51. best = max(tree.children, key=key_f)
  52. assert best.data == 'drv'
  53. tree.set('drv', best.children)
  54. tree.rule = best.rule # needed for applying callbacks
  55. def standard_resolve_ambig(tree):
  56. for ambig in tree.find_data('_ambig'):
  57. _standard_resolve_ambig(ambig)
  58. return tree
  59. # Anti-score Sum
  60. #
  61. # Author: Uriva (https://github.com/uriva)
  62. def _antiscore_sum_drv(tree):
  63. if not isinstance(tree, Tree):
  64. return 0
  65. assert tree.data != '_ambig'
  66. return _sum_priority(tree)
  67. def _antiscore_sum_resolve_ambig(tree):
  68. assert tree.data == '_ambig'
  69. best = min(tree.children, key=_antiscore_sum_drv)
  70. assert best.data == 'drv'
  71. tree.set('drv', best.children)
  72. tree.rule = best.rule # needed for applying callbacks
  73. def antiscore_sum_resolve_ambig(tree):
  74. for ambig in tree.find_data('_ambig'):
  75. _antiscore_sum_resolve_ambig(ambig)
  76. return tree