lrama 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/codespell.yaml +1 -1
  4. data/.github/workflows/gh-pages.yml +5 -6
  5. data/.github/workflows/test.yaml +25 -14
  6. data/Gemfile +4 -3
  7. data/NEWS.md +370 -35
  8. data/README.md +7 -88
  9. data/Rakefile +3 -2
  10. data/Steepfile +11 -5
  11. data/doc/Index.md +1 -1
  12. data/doc/development/compressed_state_table/parser.rb +2 -0
  13. data/doc/development/profiling.md +44 -0
  14. data/exe/lrama +1 -1
  15. data/lib/lrama/bitmap.rb +18 -5
  16. data/lib/lrama/command.rb +95 -43
  17. data/lib/lrama/context.rb +22 -24
  18. data/lib/lrama/counterexamples/derivation.rb +14 -4
  19. data/lib/lrama/counterexamples/example.rb +47 -22
  20. data/lib/lrama/counterexamples/node.rb +30 -0
  21. data/lib/lrama/counterexamples/path.rb +12 -14
  22. data/lib/lrama/counterexamples/state_item.rb +24 -1
  23. data/lib/lrama/counterexamples/triple.rb +27 -9
  24. data/lib/lrama/counterexamples.rb +216 -88
  25. data/lib/lrama/diagram.rb +77 -0
  26. data/lib/lrama/digraph.rb +28 -7
  27. data/lib/lrama/erb.rb +29 -0
  28. data/lib/lrama/grammar/auxiliary.rb +6 -1
  29. data/lib/lrama/grammar/binding.rb +37 -25
  30. data/lib/lrama/grammar/code/destructor_code.rb +11 -0
  31. data/lib/lrama/grammar/code/initial_action_code.rb +3 -0
  32. data/lib/lrama/grammar/code/no_reference_code.rb +3 -0
  33. data/lib/lrama/grammar/code/printer_code.rb +11 -0
  34. data/lib/lrama/grammar/code/rule_action.rb +17 -0
  35. data/lib/lrama/grammar/code.rb +16 -1
  36. data/lib/lrama/grammar/counter.rb +10 -0
  37. data/lib/lrama/grammar/destructor.rb +14 -1
  38. data/lib/lrama/grammar/error_token.rb +14 -1
  39. data/lib/lrama/grammar/inline/resolver.rb +80 -0
  40. data/lib/lrama/grammar/inline.rb +3 -0
  41. data/lib/lrama/grammar/{parameterizing_rule → parameterized}/resolver.rb +19 -8
  42. data/lib/lrama/grammar/{parameterizing_rule → parameterized}/rhs.rb +7 -2
  43. data/lib/lrama/grammar/parameterized/rule.rb +36 -0
  44. data/lib/lrama/grammar/parameterized.rb +5 -0
  45. data/lib/lrama/grammar/percent_code.rb +12 -1
  46. data/lib/lrama/grammar/precedence.rb +43 -1
  47. data/lib/lrama/grammar/printer.rb +9 -0
  48. data/lib/lrama/grammar/reference.rb +13 -0
  49. data/lib/lrama/grammar/rule.rb +61 -1
  50. data/lib/lrama/grammar/rule_builder.rb +84 -69
  51. data/lib/lrama/grammar/stdlib.y +68 -48
  52. data/lib/lrama/grammar/symbol.rb +63 -19
  53. data/lib/lrama/grammar/symbols/resolver.rb +64 -3
  54. data/lib/lrama/grammar/type.rb +13 -1
  55. data/lib/lrama/grammar/union.rb +12 -1
  56. data/lib/lrama/grammar.rb +231 -35
  57. data/lib/lrama/lexer/location.rb +25 -8
  58. data/lib/lrama/lexer/token/base.rb +73 -0
  59. data/lib/lrama/lexer/token/char.rb +15 -2
  60. data/lib/lrama/lexer/token/empty.rb +14 -0
  61. data/lib/lrama/lexer/token/ident.rb +2 -2
  62. data/lib/lrama/lexer/token/instantiate_rule.rb +4 -4
  63. data/lib/lrama/lexer/token/int.rb +14 -0
  64. data/lib/lrama/lexer/token/str.rb +11 -0
  65. data/lib/lrama/lexer/token/tag.rb +2 -2
  66. data/lib/lrama/lexer/token/token.rb +11 -0
  67. data/lib/lrama/lexer/token/user_code.rb +63 -37
  68. data/lib/lrama/lexer/token.rb +6 -56
  69. data/lib/lrama/lexer.rb +51 -23
  70. data/lib/lrama/logger.rb +12 -2
  71. data/lib/lrama/option_parser.rb +63 -9
  72. data/lib/lrama/options.rb +25 -7
  73. data/lib/lrama/output.rb +4 -11
  74. data/lib/lrama/parser.rb +854 -723
  75. data/lib/lrama/reporter/conflicts.rb +44 -0
  76. data/lib/lrama/reporter/grammar.rb +39 -0
  77. data/lib/lrama/reporter/precedences.rb +54 -0
  78. data/lib/lrama/reporter/profile/call_stack.rb +45 -0
  79. data/lib/lrama/reporter/profile/memory.rb +44 -0
  80. data/lib/lrama/reporter/profile.rb +4 -0
  81. data/lib/lrama/reporter/rules.rb +43 -0
  82. data/lib/lrama/reporter/states.rb +387 -0
  83. data/lib/lrama/reporter/terms.rb +44 -0
  84. data/lib/lrama/reporter.rb +39 -0
  85. data/lib/lrama/state/action/goto.rb +33 -0
  86. data/lib/lrama/state/action/reduce.rb +71 -0
  87. data/lib/lrama/state/action/shift.rb +39 -0
  88. data/lib/lrama/state/action.rb +5 -0
  89. data/lib/lrama/state/inadequacy_annotation.rb +140 -0
  90. data/lib/lrama/{states → state}/item.rb +33 -4
  91. data/lib/lrama/state/reduce_reduce_conflict.rb +14 -1
  92. data/lib/lrama/state/resolved_conflict.rb +38 -4
  93. data/lib/lrama/state/shift_reduce_conflict.rb +14 -1
  94. data/lib/lrama/state.rb +301 -200
  95. data/lib/lrama/states.rb +447 -175
  96. data/lib/lrama/tracer/actions.rb +22 -0
  97. data/lib/lrama/tracer/closure.rb +30 -0
  98. data/lib/lrama/tracer/duration.rb +38 -0
  99. data/lib/lrama/tracer/only_explicit_rules.rb +24 -0
  100. data/lib/lrama/tracer/rules.rb +23 -0
  101. data/lib/lrama/tracer/state.rb +33 -0
  102. data/lib/lrama/tracer.rb +51 -0
  103. data/lib/lrama/version.rb +2 -1
  104. data/lib/lrama/warnings/conflicts.rb +27 -0
  105. data/lib/lrama/warnings/implicit_empty.rb +29 -0
  106. data/lib/lrama/warnings/name_conflicts.rb +63 -0
  107. data/lib/lrama/warnings/redefined_rules.rb +23 -0
  108. data/lib/lrama/warnings/required.rb +23 -0
  109. data/lib/lrama/warnings/useless_precedence.rb +25 -0
  110. data/lib/lrama/warnings.rb +33 -0
  111. data/lib/lrama.rb +5 -5
  112. data/parser.y +495 -404
  113. data/rbs_collection.lock.yaml +27 -3
  114. data/rbs_collection.yaml +2 -0
  115. data/sig/generated/lrama/bitmap.rbs +12 -4
  116. data/sig/generated/lrama/counterexamples/derivation.rbs +36 -0
  117. data/sig/generated/lrama/counterexamples/example.rbs +58 -0
  118. data/sig/generated/lrama/counterexamples/node.rbs +18 -0
  119. data/sig/generated/lrama/counterexamples/path.rbs +23 -0
  120. data/sig/generated/lrama/counterexamples/state_item.rbs +19 -0
  121. data/sig/generated/lrama/counterexamples/triple.rbs +32 -0
  122. data/sig/generated/lrama/counterexamples.rbs +98 -0
  123. data/sig/generated/lrama/diagram.rbs +34 -0
  124. data/sig/generated/lrama/digraph.rbs +26 -6
  125. data/sig/generated/lrama/erb.rbs +14 -0
  126. data/sig/generated/lrama/grammar/auxiliary.rbs +16 -0
  127. data/sig/generated/lrama/grammar/binding.rbs +18 -12
  128. data/sig/generated/lrama/grammar/code/destructor_code.rbs +26 -0
  129. data/sig/{lrama → generated/lrama}/grammar/code/initial_action_code.rbs +6 -0
  130. data/sig/{lrama → generated/lrama}/grammar/code/no_reference_code.rbs +6 -0
  131. data/sig/generated/lrama/grammar/code/printer_code.rbs +26 -0
  132. data/sig/generated/lrama/grammar/code/rule_action.rbs +63 -0
  133. data/sig/generated/lrama/grammar/code.rbs +38 -0
  134. data/sig/{lrama → generated/lrama}/grammar/counter.rbs +4 -0
  135. data/sig/generated/lrama/grammar/destructor.rbs +19 -0
  136. data/sig/generated/lrama/grammar/error_token.rbs +19 -0
  137. data/sig/generated/lrama/grammar/inline/resolver.rbs +26 -0
  138. data/sig/generated/lrama/grammar/parameterized/resolver.rbs +42 -0
  139. data/sig/generated/lrama/grammar/parameterized/rhs.rbs +21 -0
  140. data/sig/generated/lrama/grammar/parameterized/rule.rbs +28 -0
  141. data/sig/{lrama → generated/lrama}/grammar/percent_code.rbs +8 -0
  142. data/sig/generated/lrama/grammar/precedence.rbs +45 -0
  143. data/sig/{lrama/grammar/error_token.rbs → generated/lrama/grammar/printer.rbs} +8 -3
  144. data/sig/generated/lrama/grammar/reference.rbs +31 -0
  145. data/sig/generated/lrama/grammar/rule.rbs +83 -0
  146. data/sig/generated/lrama/grammar/rule_builder.rbs +91 -0
  147. data/sig/generated/lrama/grammar/symbol.rbs +89 -0
  148. data/sig/generated/lrama/grammar/symbols/resolver.rbs +131 -0
  149. data/sig/generated/lrama/grammar/type.rbs +21 -0
  150. data/sig/generated/lrama/grammar/union.rbs +17 -0
  151. data/sig/generated/lrama/grammar.rbs +289 -0
  152. data/sig/generated/lrama/lexer/location.rbs +12 -3
  153. data/sig/generated/lrama/lexer/token/base.rbs +53 -0
  154. data/sig/generated/lrama/lexer/token/char.rbs +9 -2
  155. data/sig/generated/lrama/lexer/token/empty.rbs +11 -0
  156. data/sig/generated/lrama/lexer/token/ident.rbs +2 -2
  157. data/sig/generated/lrama/lexer/token/instantiate_rule.rbs +5 -5
  158. data/sig/generated/lrama/lexer/token/int.rbs +13 -0
  159. data/sig/generated/lrama/lexer/token/str.rbs +10 -0
  160. data/sig/generated/lrama/lexer/token/tag.rbs +2 -2
  161. data/sig/generated/lrama/lexer/token/token.rbs +10 -0
  162. data/sig/generated/lrama/lexer/token/user_code.rbs +2 -2
  163. data/sig/generated/lrama/lexer/token.rbs +1 -39
  164. data/sig/generated/lrama/lexer.rbs +54 -0
  165. data/sig/generated/lrama/logger.rbs +6 -0
  166. data/sig/generated/lrama/option_parser.rbs +52 -0
  167. data/sig/{lrama → generated/lrama}/options.rbs +27 -3
  168. data/sig/generated/lrama/reporter/conflicts.rbs +18 -0
  169. data/sig/generated/lrama/reporter/grammar.rbs +13 -0
  170. data/sig/generated/lrama/reporter/precedences.rbs +15 -0
  171. data/sig/generated/lrama/reporter/profile/call_stack.rbs +19 -0
  172. data/sig/generated/lrama/reporter/profile/memory.rbs +19 -0
  173. data/sig/generated/lrama/reporter/rules.rbs +13 -0
  174. data/sig/generated/lrama/reporter/states.rbs +69 -0
  175. data/sig/generated/lrama/reporter/terms.rbs +13 -0
  176. data/sig/generated/lrama/reporter.rbs +13 -0
  177. data/sig/generated/lrama/state/action/goto.rbs +28 -0
  178. data/sig/generated/lrama/state/action/reduce.rbs +49 -0
  179. data/sig/generated/lrama/state/action/shift.rbs +33 -0
  180. data/sig/generated/lrama/state/inadequacy_annotation.rbs +45 -0
  181. data/sig/generated/lrama/state/item.rbs +75 -0
  182. data/sig/generated/lrama/state/reduce_reduce_conflict.rbs +19 -0
  183. data/sig/generated/lrama/state/resolved_conflict.rbs +38 -0
  184. data/sig/generated/lrama/state/shift_reduce_conflict.rbs +19 -0
  185. data/sig/generated/lrama/state.rbs +231 -0
  186. data/sig/generated/lrama/states.rbs +215 -0
  187. data/sig/generated/lrama/tracer/actions.rbs +13 -0
  188. data/sig/generated/lrama/tracer/closure.rbs +13 -0
  189. data/sig/generated/lrama/tracer/duration.rbs +18 -0
  190. data/sig/generated/lrama/tracer/only_explicit_rules.rbs +13 -0
  191. data/sig/generated/lrama/tracer/rules.rbs +13 -0
  192. data/sig/generated/lrama/tracer/state.rbs +16 -0
  193. data/sig/generated/lrama/tracer.rbs +23 -0
  194. data/sig/generated/lrama/version.rbs +5 -0
  195. data/sig/generated/lrama/warnings/conflicts.rbs +13 -0
  196. data/sig/generated/lrama/warnings/implicit_empty.rbs +17 -0
  197. data/sig/generated/lrama/warnings/name_conflicts.rbs +31 -0
  198. data/sig/generated/lrama/warnings/redefined_rules.rbs +13 -0
  199. data/sig/generated/lrama/warnings/required.rbs +13 -0
  200. data/sig/generated/lrama/warnings/useless_precedence.rbs +13 -0
  201. data/sig/generated/lrama/warnings.rbs +11 -0
  202. data/sig/railroad_diagrams/railroad_diagrams.rbs +16 -0
  203. data/template/bison/_yacc.h +8 -0
  204. data/template/diagram/diagram.html +102 -0
  205. metadata +126 -66
  206. data/lib/lrama/counterexamples/production_path.rb +0 -19
  207. data/lib/lrama/counterexamples/start_path.rb +0 -23
  208. data/lib/lrama/counterexamples/transition_path.rb +0 -19
  209. data/lib/lrama/diagnostics.rb +0 -36
  210. data/lib/lrama/grammar/parameterizing_rule/rule.rb +0 -24
  211. data/lib/lrama/grammar/parameterizing_rule.rb +0 -5
  212. data/lib/lrama/grammar_validator.rb +0 -37
  213. data/lib/lrama/report/duration.rb +0 -27
  214. data/lib/lrama/report/profile.rb +0 -16
  215. data/lib/lrama/report.rb +0 -4
  216. data/lib/lrama/state/reduce.rb +0 -37
  217. data/lib/lrama/state/shift.rb +0 -15
  218. data/lib/lrama/states_reporter.rb +0 -362
  219. data/lib/lrama/trace_reporter.rb +0 -45
  220. data/sig/generated/lrama/trace_reporter.rbs +0 -25
  221. data/sig/lrama/counterexamples/derivation.rbs +0 -33
  222. data/sig/lrama/counterexamples/example.rbs +0 -45
  223. data/sig/lrama/counterexamples/path.rbs +0 -21
  224. data/sig/lrama/counterexamples/production_path.rbs +0 -11
  225. data/sig/lrama/counterexamples/start_path.rbs +0 -13
  226. data/sig/lrama/counterexamples/state_item.rbs +0 -10
  227. data/sig/lrama/counterexamples/transition_path.rbs +0 -11
  228. data/sig/lrama/counterexamples/triple.rbs +0 -20
  229. data/sig/lrama/counterexamples.rbs +0 -29
  230. data/sig/lrama/grammar/auxiliary.rbs +0 -10
  231. data/sig/lrama/grammar/code/destructor_code.rbs +0 -14
  232. data/sig/lrama/grammar/code/printer_code.rbs +0 -14
  233. data/sig/lrama/grammar/code/rule_action.rbs +0 -19
  234. data/sig/lrama/grammar/code.rbs +0 -24
  235. data/sig/lrama/grammar/destructor.rbs +0 -13
  236. data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +0 -24
  237. data/sig/lrama/grammar/parameterizing_rule/rhs.rbs +0 -14
  238. data/sig/lrama/grammar/parameterizing_rule/rule.rbs +0 -16
  239. data/sig/lrama/grammar/parameterizing_rule.rbs +0 -6
  240. data/sig/lrama/grammar/precedence.rbs +0 -13
  241. data/sig/lrama/grammar/printer.rbs +0 -13
  242. data/sig/lrama/grammar/reference.rbs +0 -22
  243. data/sig/lrama/grammar/rule.rbs +0 -45
  244. data/sig/lrama/grammar/rule_builder.rbs +0 -47
  245. data/sig/lrama/grammar/symbol.rbs +0 -38
  246. data/sig/lrama/grammar/symbols/resolver.rbs +0 -60
  247. data/sig/lrama/grammar/type.rbs +0 -11
  248. data/sig/lrama/grammar/union.rbs +0 -12
  249. data/sig/lrama/grammar.rbs +0 -108
  250. data/sig/lrama/report/duration.rbs +0 -11
  251. data/sig/lrama/report/profile.rbs +0 -7
  252. data/sig/lrama/state/reduce.rbs +0 -20
  253. data/sig/lrama/state/reduce_reduce_conflict.rbs +0 -13
  254. data/sig/lrama/state/resolved_conflict.rbs +0 -14
  255. data/sig/lrama/state/shift.rbs +0 -14
  256. data/sig/lrama/state/shift_reduce_conflict.rbs +0 -13
  257. data/sig/lrama/state.rbs +0 -79
  258. data/sig/lrama/states/item.rbs +0 -30
  259. data/sig/lrama/states.rbs +0 -101
  260. data/sig/lrama/warning.rbs +0 -16
@@ -1,24 +1,54 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
6
  class Symbols
6
7
  class Resolver
7
- attr_reader :terms, :nterms
8
-
8
+ # @rbs!
9
+ #
10
+ # interface _DelegatedMethods
11
+ # def symbols: () -> Array[Grammar::Symbol]
12
+ # def nterms: () -> Array[Grammar::Symbol]
13
+ # def terms: () -> Array[Grammar::Symbol]
14
+ # def add_nterm: (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?) -> Grammar::Symbol
15
+ # def add_term: (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?, ?token_id: Integer?, ?replace: bool) -> Grammar::Symbol
16
+ # def find_symbol_by_number!: (Integer number) -> Grammar::Symbol
17
+ # def find_symbol_by_id!: (Lexer::Token::Base id) -> Grammar::Symbol
18
+ # def token_to_symbol: (Lexer::Token::Base token) -> Grammar::Symbol
19
+ # def find_symbol_by_s_value!: (::String s_value) -> Grammar::Symbol
20
+ # def fill_nterm_type: (Array[Grammar::Type] types) -> void
21
+ # def fill_symbol_number: () -> void
22
+ # def fill_printer: (Array[Grammar::Printer] printers) -> void
23
+ # def fill_destructor: (Array[Destructor] destructors) -> (Destructor | bot)
24
+ # def fill_error_token: (Array[Grammar::ErrorToken] error_tokens) -> void
25
+ # def sort_by_number!: () -> Array[Grammar::Symbol]
26
+ # end
27
+ #
28
+ # @symbols: Array[Grammar::Symbol]?
29
+ # @number: Integer
30
+ # @used_numbers: Hash[Integer, bool]
31
+
32
+ attr_reader :terms #: Array[Grammar::Symbol]
33
+ attr_reader :nterms #: Array[Grammar::Symbol]
34
+
35
+ # @rbs () -> void
9
36
  def initialize
10
37
  @terms = []
11
38
  @nterms = []
12
39
  end
13
40
 
41
+ # @rbs () -> Array[Grammar::Symbol]
14
42
  def symbols
15
43
  @symbols ||= (@terms + @nterms)
16
44
  end
17
45
 
46
+ # @rbs () -> Array[Grammar::Symbol]
18
47
  def sort_by_number!
19
48
  symbols.sort_by!(&:number)
20
49
  end
21
50
 
51
+ # @rbs (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?, ?token_id: Integer?, ?replace: bool) -> Grammar::Symbol
22
52
  def add_term(id:, alias_name: nil, tag: nil, token_id: nil, replace: false)
23
53
  if token_id && (sym = find_symbol_by_token_id(token_id))
24
54
  if replace
@@ -43,6 +73,7 @@ module Lrama
43
73
  term
44
74
  end
45
75
 
76
+ # @rbs (id: Lexer::Token::Base, ?alias_name: String?, ?tag: Lexer::Token::Tag?) -> Grammar::Symbol
46
77
  def add_nterm(id:, alias_name: nil, tag: nil)
47
78
  if (sym = find_symbol_by_id(id))
48
79
  return sym
@@ -57,32 +88,39 @@ module Lrama
57
88
  nterm
58
89
  end
59
90
 
91
+ # @rbs (::String s_value) -> Grammar::Symbol?
60
92
  def find_term_by_s_value(s_value)
61
93
  terms.find { |s| s.id.s_value == s_value }
62
94
  end
63
95
 
96
+ # @rbs (::String s_value) -> Grammar::Symbol?
64
97
  def find_symbol_by_s_value(s_value)
65
98
  symbols.find { |s| s.id.s_value == s_value }
66
99
  end
67
100
 
101
+ # @rbs (::String s_value) -> Grammar::Symbol
68
102
  def find_symbol_by_s_value!(s_value)
69
103
  find_symbol_by_s_value(s_value) || (raise "Symbol not found. value: `#{s_value}`")
70
104
  end
71
105
 
106
+ # @rbs (Lexer::Token::Base id) -> Grammar::Symbol?
72
107
  def find_symbol_by_id(id)
73
108
  symbols.find do |s|
74
109
  s.id == id || s.alias_name == id.s_value
75
110
  end
76
111
  end
77
112
 
113
+ # @rbs (Lexer::Token::Base id) -> Grammar::Symbol
78
114
  def find_symbol_by_id!(id)
79
115
  find_symbol_by_id(id) || (raise "Symbol not found. #{id}")
80
116
  end
81
117
 
118
+ # @rbs (Integer token_id) -> Grammar::Symbol?
82
119
  def find_symbol_by_token_id(token_id)
83
120
  symbols.find {|s| s.token_id == token_id }
84
121
  end
85
122
 
123
+ # @rbs (Integer number) -> Grammar::Symbol
86
124
  def find_symbol_by_number!(number)
87
125
  sym = symbols[number]
88
126
 
@@ -92,6 +130,7 @@ module Lrama
92
130
  sym
93
131
  end
94
132
 
133
+ # @rbs () -> void
95
134
  def fill_symbol_number
96
135
  # YYEMPTY = -2
97
136
  # YYEOF = 0
@@ -102,6 +141,7 @@ module Lrama
102
141
  fill_nterms_number
103
142
  end
104
143
 
144
+ # @rbs (Array[Grammar::Type] types) -> void
105
145
  def fill_nterm_type(types)
106
146
  types.each do |type|
107
147
  nterm = find_nterm_by_id!(type.id)
@@ -109,6 +149,7 @@ module Lrama
109
149
  end
110
150
  end
111
151
 
152
+ # @rbs (Array[Grammar::Printer] printers) -> void
112
153
  def fill_printer(printers)
113
154
  symbols.each do |sym|
114
155
  printers.each do |printer|
@@ -126,6 +167,7 @@ module Lrama
126
167
  end
127
168
  end
128
169
 
170
+ # @rbs (Array[Destructor] destructors) -> (Array[Grammar::Symbol] | bot)
129
171
  def fill_destructor(destructors)
130
172
  symbols.each do |sym|
131
173
  destructors.each do |destructor|
@@ -143,6 +185,7 @@ module Lrama
143
185
  end
144
186
  end
145
187
 
188
+ # @rbs (Array[Grammar::ErrorToken] error_tokens) -> void
146
189
  def fill_error_token(error_tokens)
147
190
  symbols.each do |sym|
148
191
  error_tokens.each do |token|
@@ -160,28 +203,33 @@ module Lrama
160
203
  end
161
204
  end
162
205
 
206
+ # @rbs (Lexer::Token::Base token) -> Grammar::Symbol
163
207
  def token_to_symbol(token)
164
208
  case token
165
- when Lrama::Lexer::Token
209
+ when Lrama::Lexer::Token::Base
166
210
  find_symbol_by_id!(token)
167
211
  else
168
212
  raise "Unknown class: #{token}"
169
213
  end
170
214
  end
171
215
 
216
+ # @rbs () -> void
172
217
  def validate!
173
218
  validate_number_uniqueness!
174
219
  validate_alias_name_uniqueness!
220
+ validate_symbols!
175
221
  end
176
222
 
177
223
  private
178
224
 
225
+ # @rbs (Lexer::Token::Base id) -> Grammar::Symbol
179
226
  def find_nterm_by_id!(id)
180
227
  @nterms.find do |s|
181
228
  s.id == id
182
229
  end || (raise "Symbol not found. #{id}")
183
230
  end
184
231
 
232
+ # @rbs () -> void
185
233
  def fill_terms_number
186
234
  # Character literal in grammar file has
187
235
  # token id corresponding to ASCII code by default,
@@ -245,6 +293,7 @@ module Lrama
245
293
  end
246
294
  end
247
295
 
296
+ # @rbs () -> void
248
297
  def fill_nterms_number
249
298
  token_id = 0
250
299
 
@@ -266,6 +315,7 @@ module Lrama
266
315
  end
267
316
  end
268
317
 
318
+ # @rbs () -> Hash[Integer, bool]
269
319
  def used_numbers
270
320
  return @used_numbers if defined?(@used_numbers)
271
321
 
@@ -276,6 +326,7 @@ module Lrama
276
326
  @used_numbers
277
327
  end
278
328
 
329
+ # @rbs () -> void
279
330
  def validate_number_uniqueness!
280
331
  invalid = symbols.group_by(&:number).select do |number, syms|
281
332
  syms.count > 1
@@ -286,6 +337,7 @@ module Lrama
286
337
  raise "Symbol number is duplicated. #{invalid}"
287
338
  end
288
339
 
340
+ # @rbs () -> void
289
341
  def validate_alias_name_uniqueness!
290
342
  invalid = symbols.select(&:alias_name).group_by(&:alias_name).select do |alias_name, syms|
291
343
  syms.count > 1
@@ -295,6 +347,15 @@ module Lrama
295
347
 
296
348
  raise "Symbol alias name is duplicated. #{invalid}"
297
349
  end
350
+
351
+ # @rbs () -> void
352
+ def validate_symbols!
353
+ symbols.each { |sym| sym.id.validate }
354
+ errors = symbols.map { |sym| sym.id.errors }.flatten.compact
355
+ return if errors.empty?
356
+
357
+ raise errors.join("\n")
358
+ end
298
359
  end
299
360
  end
300
361
  end
@@ -1,15 +1,27 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
6
  class Type
6
- attr_reader :id, :tag
7
+ # TODO: rbs-inline 0.11.0 doesn't support instance variables.
8
+ # Move these type declarations above instance variable definitions, once it's supported.
9
+ # see: https://github.com/soutaro/rbs-inline/pull/149
10
+ #
11
+ # @rbs!
12
+ # @id: Lexer::Token::Base
13
+ # @tag: Lexer::Token::Tag
7
14
 
15
+ attr_reader :id #: Lexer::Token::Base
16
+ attr_reader :tag #: Lexer::Token::Tag
17
+
18
+ # @rbs (id: Lexer::Token::Base, tag: Lexer::Token::Tag) -> void
8
19
  def initialize(id:, tag:)
9
20
  @id = id
10
21
  @tag = tag
11
22
  end
12
23
 
24
+ # @rbs (Grammar::Type other) -> bool
13
25
  def ==(other)
14
26
  self.class == other.class &&
15
27
  self.id == other.id &&
@@ -1,8 +1,19 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
- class Union < Struct.new(:code, :lineno, keyword_init: true)
6
+ class Union
7
+ attr_reader :code #: Grammar::Code::NoReferenceCode
8
+ attr_reader :lineno #: Integer
9
+
10
+ # @rbs (code: Grammar::Code::NoReferenceCode, lineno: Integer) -> void
11
+ def initialize(code:, lineno:)
12
+ @code = code
13
+ @lineno = lineno
14
+ end
15
+
16
+ # @rbs () -> String
6
17
  def braces_less_code
7
18
  # Braces is already removed by lexer
8
19
  code.s_value