This repo contains code to mirror other repos. It also contains the code that is getting mirrored.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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