Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/lark/grammar.py: 92%

73 statements  

« prev     ^ index     » next       coverage.py v7.3.1, created at 2023-09-25 06:30 +0000

1from typing import Optional, Tuple, ClassVar 

2 

3from .utils import Serialize 

4 

5###{standalone 

6TOKEN_DEFAULT_PRIORITY = 0 

7 

8 

9class Symbol(Serialize): 

10 __slots__ = ('name',) 

11 

12 name: str 

13 is_term: ClassVar[bool] = NotImplemented 

14 

15 def __init__(self, name: str) -> None: 

16 self.name = name 

17 

18 def __eq__(self, other): 

19 assert isinstance(other, Symbol), other 

20 return self.is_term == other.is_term and self.name == other.name 

21 

22 def __ne__(self, other): 

23 return not (self == other) 

24 

25 def __hash__(self): 

26 return hash(self.name) 

27 

28 def __repr__(self): 

29 return '%s(%r)' % (type(self).__name__, self.name) 

30 

31 fullrepr = property(__repr__) 

32 

33 def renamed(self, f): 

34 return type(self)(f(self.name)) 

35 

36 

37class Terminal(Symbol): 

38 __serialize_fields__ = 'name', 'filter_out' 

39 

40 is_term: ClassVar[bool] = True 

41 

42 def __init__(self, name, filter_out=False): 

43 self.name = name 

44 self.filter_out = filter_out 

45 

46 @property 

47 def fullrepr(self): 

48 return '%s(%r, %r)' % (type(self).__name__, self.name, self.filter_out) 

49 

50 def renamed(self, f): 

51 return type(self)(f(self.name), self.filter_out) 

52 

53 

54class NonTerminal(Symbol): 

55 __serialize_fields__ = 'name', 

56 

57 is_term: ClassVar[bool] = False 

58 

59 

60class RuleOptions(Serialize): 

61 __serialize_fields__ = 'keep_all_tokens', 'expand1', 'priority', 'template_source', 'empty_indices' 

62 

63 keep_all_tokens: bool 

64 expand1: bool 

65 priority: Optional[int] 

66 template_source: Optional[str] 

67 empty_indices: Tuple[bool, ...] 

68 

69 def __init__(self, keep_all_tokens: bool=False, expand1: bool=False, priority: Optional[int]=None, template_source: Optional[str]=None, empty_indices: Tuple[bool, ...]=()) -> None: 

70 self.keep_all_tokens = keep_all_tokens 

71 self.expand1 = expand1 

72 self.priority = priority 

73 self.template_source = template_source 

74 self.empty_indices = empty_indices 

75 

76 def __repr__(self): 

77 return 'RuleOptions(%r, %r, %r, %r)' % ( 

78 self.keep_all_tokens, 

79 self.expand1, 

80 self.priority, 

81 self.template_source 

82 ) 

83 

84 

85class Rule(Serialize): 

86 """ 

87 origin : a symbol 

88 expansion : a list of symbols 

89 order : index of this expansion amongst all rules of the same name 

90 """ 

91 __slots__ = ('origin', 'expansion', 'alias', 'options', 'order', '_hash') 

92 

93 __serialize_fields__ = 'origin', 'expansion', 'order', 'alias', 'options' 

94 __serialize_namespace__ = Terminal, NonTerminal, RuleOptions 

95 

96 def __init__(self, origin, expansion, order=0, alias=None, options=None): 

97 self.origin = origin 

98 self.expansion = expansion 

99 self.alias = alias 

100 self.order = order 

101 self.options = options or RuleOptions() 

102 self._hash = hash((self.origin, tuple(self.expansion))) 

103 

104 def _deserialize(self): 

105 self._hash = hash((self.origin, tuple(self.expansion))) 

106 

107 def __str__(self): 

108 return '<%s : %s>' % (self.origin.name, ' '.join(x.name for x in self.expansion)) 

109 

110 def __repr__(self): 

111 return 'Rule(%r, %r, %r, %r)' % (self.origin, self.expansion, self.alias, self.options) 

112 

113 def __hash__(self): 

114 return self._hash 

115 

116 def __eq__(self, other): 

117 if not isinstance(other, Rule): 

118 return False 

119 return self.origin == other.origin and self.expansion == other.expansion 

120 

121 

122###}