1from .utils import Serialize 2 3###{standalone 4 5class Symbol(Serialize): 6 __slots__ = ('name',) 7 8 is_term = NotImplemented 9 10 def __init__(self, name): 11 self.name = name 12 13 def __eq__(self, other): 14 assert isinstance(other, Symbol), other 15 return self.is_term == other.is_term and self.name == other.name 16 17 def __ne__(self, other): 18 return not (self == other) 19 20 def __hash__(self): 21 return hash(self.name) 22 23 def __repr__(self): 24 return '%s(%r)' % (type(self).__name__, self.name) 25 26 fullrepr = property(__repr__) 27 28 29class Terminal(Symbol): 30 __serialize_fields__ = 'name', 'filter_out' 31 32 is_term = True 33 34 def __init__(self, name, filter_out=False): 35 self.name = name 36 self.filter_out = filter_out 37 38 @property 39 def fullrepr(self): 40 return '%s(%r, %r)' % (type(self).__name__, self.name, self.filter_out) 41 42 43 44class NonTerminal(Symbol): 45 __serialize_fields__ = 'name', 46 47 is_term = False 48 49 50 51class RuleOptions(Serialize): 52 __serialize_fields__ = 'keep_all_tokens', 'expand1', 'priority', 'template_source', 'empty_indices' 53 54 def __init__(self, keep_all_tokens=False, expand1=False, priority=None, template_source=None, empty_indices=()): 55 self.keep_all_tokens = keep_all_tokens 56 self.expand1 = expand1 57 self.priority = priority 58 self.template_source = template_source 59 self.empty_indices = empty_indices 60 61 def __repr__(self): 62 return 'RuleOptions(%r, %r, %r, %r)' % ( 63 self.keep_all_tokens, 64 self.expand1, 65 self.priority, 66 self.template_source 67 ) 68 69 70class Rule(Serialize): 71 """ 72 origin : a symbol 73 expansion : a list of symbols 74 order : index of this expansion amongst all rules of the same name 75 """ 76 __slots__ = ('origin', 'expansion', 'alias', 'options', 'order', '_hash') 77 78 __serialize_fields__ = 'origin', 'expansion', 'order', 'alias', 'options' 79 __serialize_namespace__ = Terminal, NonTerminal, RuleOptions 80 81 def __init__(self, origin, expansion, order=0, alias=None, options=None): 82 self.origin = origin 83 self.expansion = expansion 84 self.alias = alias 85 self.order = order 86 self.options = options or RuleOptions() 87 self._hash = hash((self.origin, tuple(self.expansion))) 88 89 def _deserialize(self): 90 self._hash = hash((self.origin, tuple(self.expansion))) 91 92 def __str__(self): 93 return '<%s : %s>' % (self.origin.name, ' '.join(x.name for x in self.expansion)) 94 95 def __repr__(self): 96 return 'Rule(%r, %r, %r, %r)' % (self.origin, self.expansion, self.alias, self.options) 97 98 def __hash__(self): 99 return self._hash 100 101 def __eq__(self, other): 102 if not isinstance(other, Rule): 103 return False 104 return self.origin == other.origin and self.expansion == other.expansion 105 106 107 108###} 109