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,40 +1,49 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
- class ParameterizingRule
6
+ class Parameterized
6
7
  class Resolver
7
- attr_accessor :rules, :created_lhs_list
8
+ attr_accessor :rules #: Array[Rule]
9
+ attr_accessor :created_lhs_list #: Array[Lexer::Token::Base]
8
10
 
11
+ # @rbs () -> void
9
12
  def initialize
10
13
  @rules = []
11
14
  @created_lhs_list = []
12
15
  end
13
16
 
14
- def add_parameterizing_rule(rule)
17
+ # @rbs (Rule rule) -> Array[Rule]
18
+ def add_rule(rule)
15
19
  @rules << rule
16
20
  end
17
21
 
22
+ # @rbs (Lexer::Token::InstantiateRule token) -> Rule?
18
23
  def find_rule(token)
19
24
  select_rules(@rules, token).last
20
25
  end
21
26
 
27
+ # @rbs (Lexer::Token::Base token) -> Rule?
22
28
  def find_inline(token)
23
- @rules.reverse.find { |rule| rule.name == token.s_value && rule.is_inline }
29
+ @rules.reverse.find { |rule| rule.name == token.s_value && rule.inline? }
24
30
  end
25
31
 
32
+ # @rbs (String lhs_s_value) -> Lexer::Token::Base?
26
33
  def created_lhs(lhs_s_value)
27
34
  @created_lhs_list.reverse.find { |created_lhs| created_lhs.s_value == lhs_s_value }
28
35
  end
29
36
 
37
+ # @rbs () -> Array[Rule]
30
38
  def redefined_rules
31
39
  @rules.select { |rule| @rules.count { |r| r.name == rule.name && r.required_parameters_count == rule.required_parameters_count } > 1 }
32
40
  end
33
41
 
34
42
  private
35
43
 
44
+ # @rbs (Array[Rule] rules, Lexer::Token::InstantiateRule token) -> Array[Rule]
36
45
  def select_rules(rules, token)
37
- rules = select_not_inline_rules(rules)
46
+ rules = reject_inline_rules(rules)
38
47
  rules = select_rules_by_name(rules, token.rule_name)
39
48
  rules = rules.select { |rule| rule.required_parameters_count == token.args_count }
40
49
  if rules.empty?
@@ -44,14 +53,16 @@ module Lrama
44
53
  end
45
54
  end
46
55
 
47
- def select_not_inline_rules(rules)
48
- rules.select { |rule| !rule.is_inline }
56
+ # @rbs (Array[Rule] rules) -> Array[Rule]
57
+ def reject_inline_rules(rules)
58
+ rules.reject(&:inline?)
49
59
  end
50
60
 
61
+ # @rbs (Array[Rule] rules, String rule_name) -> Array[Rule]
51
62
  def select_rules_by_name(rules, rule_name)
52
63
  rules = rules.select { |rule| rule.name == rule_name }
53
64
  if rules.empty?
54
- raise "Parameterizing rule does not exist. `#{rule_name}`"
65
+ raise "Parameterized rule does not exist. `#{rule_name}`"
55
66
  else
56
67
  rules
57
68
  end
@@ -1,17 +1,22 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
- class ParameterizingRule
6
+ class Parameterized
6
7
  class Rhs
7
- attr_accessor :symbols, :user_code, :precedence_sym
8
+ attr_accessor :symbols #: Array[Lexer::Token::Base]
9
+ attr_accessor :user_code #: Lexer::Token::UserCode?
10
+ attr_accessor :precedence_sym #: Grammar::Symbol?
8
11
 
12
+ # @rbs () -> void
9
13
  def initialize
10
14
  @symbols = []
11
15
  @user_code = nil
12
16
  @precedence_sym = nil
13
17
  end
14
18
 
19
+ # @rbs (Grammar::Binding bindings) -> Lexer::Token::UserCode?
15
20
  def resolve_user_code(bindings)
16
21
  return unless user_code
17
22
 
@@ -0,0 +1,36 @@
1
+ # rbs_inline: enabled
2
+ # frozen_string_literal: true
3
+
4
+ module Lrama
5
+ class Grammar
6
+ class Parameterized
7
+ class Rule
8
+ attr_reader :name #: String
9
+ attr_reader :parameters #: Array[Lexer::Token::Base]
10
+ attr_reader :rhs #: Array[Rhs]
11
+ attr_reader :required_parameters_count #: Integer
12
+ attr_reader :tag #: Lexer::Token::Tag?
13
+
14
+ # @rbs (String name, Array[Lexer::Token::Base] parameters, Array[Rhs] rhs, tag: Lexer::Token::Tag?, is_inline: bool) -> void
15
+ def initialize(name, parameters, rhs, tag: nil, is_inline: false)
16
+ @name = name
17
+ @parameters = parameters
18
+ @rhs = rhs
19
+ @tag = tag
20
+ @is_inline = is_inline
21
+ @required_parameters_count = parameters.count
22
+ end
23
+
24
+ # @rbs () -> String
25
+ def to_s
26
+ "#{@name}(#{@parameters.map(&:s_value).join(', ')})"
27
+ end
28
+
29
+ # @rbs () -> bool
30
+ def inline?
31
+ @is_inline
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'parameterized/resolver'
4
+ require_relative 'parameterized/rhs'
5
+ require_relative 'parameterized/rule'
@@ -1,10 +1,21 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
6
  class PercentCode
6
- attr_reader :name, :code
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
+ # @name: String
13
+ # @code: String
7
14
 
15
+ attr_reader :name #: String
16
+ attr_reader :code #: String
17
+
18
+ # @rbs (String name, String code) -> void
8
19
  def initialize(name, code)
9
20
  @name = name
10
21
  @code = code
@@ -1,13 +1,55 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
- class Precedence < Struct.new(:type, :precedence, keyword_init: true)
6
+ class Precedence < Struct.new(:type, :symbol, :precedence, :s_value, :lineno, keyword_init: true)
6
7
  include Comparable
8
+ # @rbs!
9
+ # type type_enum = :left | :right | :nonassoc | :precedence
10
+ #
11
+ # attr_accessor type: type_enum
12
+ # attr_accessor symbol: Grammar::Symbol
13
+ # attr_accessor precedence: Integer
14
+ # attr_accessor s_value: String
15
+ # attr_accessor lineno: Integer
16
+ #
17
+ # def initialize: (?type: type_enum, ?symbol: Grammar::Symbol, ?precedence: Integer, ?s_value: ::String, ?lineno: Integer) -> void
7
18
 
19
+ attr_reader :used_by_lalr #: Array[State::ResolvedConflict]
20
+ attr_reader :used_by_ielr #: Array[State::ResolvedConflict]
21
+
22
+ # @rbs (Precedence other) -> Integer
8
23
  def <=>(other)
9
24
  self.precedence <=> other.precedence
10
25
  end
26
+
27
+ # @rbs (State::ResolvedConflict resolved_conflict) -> void
28
+ def mark_used_by_lalr(resolved_conflict)
29
+ @used_by_lalr ||= [] #: Array[State::ResolvedConflict]
30
+ @used_by_lalr << resolved_conflict
31
+ end
32
+
33
+ # @rbs (State::ResolvedConflict resolved_conflict) -> void
34
+ def mark_used_by_ielr(resolved_conflict)
35
+ @used_by_ielr ||= [] #: Array[State::ResolvedConflict]
36
+ @used_by_ielr << resolved_conflict
37
+ end
38
+
39
+ # @rbs () -> bool
40
+ def used_by?
41
+ used_by_lalr? || used_by_ielr?
42
+ end
43
+
44
+ # @rbs () -> bool
45
+ def used_by_lalr?
46
+ !@used_by_lalr.nil? && !@used_by_lalr.empty?
47
+ end
48
+
49
+ # @rbs () -> bool
50
+ def used_by_ielr?
51
+ !@used_by_ielr.nil? && !@used_by_ielr.empty?
52
+ end
11
53
  end
12
54
  end
13
55
  end
@@ -1,8 +1,17 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
6
  class Printer < Struct.new(:ident_or_tags, :token_code, :lineno, keyword_init: true)
7
+ # @rbs!
8
+ # attr_accessor ident_or_tags: Array[Lexer::Token::Ident|Lexer::Token::Tag]
9
+ # attr_accessor token_code: Lexer::Token::UserCode
10
+ # attr_accessor lineno: Integer
11
+ #
12
+ # def initialize: (?ident_or_tags: Array[Lexer::Token::Ident|Lexer::Token::Tag], ?token_code: Lexer::Token::UserCode, ?lineno: Integer) -> void
13
+
14
+ # @rbs (Lexer::Token::Tag tag) -> String
6
15
  def translated_code(tag)
7
16
  Code::PrinterCode.new(type: :printer, token_code: token_code, tag: tag).translated_code
8
17
  end
@@ -1,3 +1,4 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
@@ -8,6 +9,18 @@ module Lrama
8
9
  # index: Integer
9
10
  # ex_tag: "$<tag>1" (Optional)
10
11
  class Reference < Struct.new(:type, :name, :number, :index, :ex_tag, :first_column, :last_column, keyword_init: true)
12
+ # @rbs!
13
+ # attr_accessor type: ::Symbol
14
+ # attr_accessor name: String
15
+ # attr_accessor number: Integer
16
+ # attr_accessor index: Integer
17
+ # attr_accessor ex_tag: Lexer::Token::Base?
18
+ # attr_accessor first_column: Integer
19
+ # attr_accessor last_column: Integer
20
+ #
21
+ # def initialize: (type: ::Symbol, ?name: String, ?number: Integer, ?index: Integer, ?ex_tag: Lexer::Token::Base?, first_column: Integer, last_column: Integer) -> void
22
+
23
+ # @rbs () -> (String|Integer)
11
24
  def value
12
25
  name || number
13
26
  end
@@ -1,11 +1,38 @@
1
+ # rbs_inline: enabled
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Lrama
4
5
  class Grammar
5
6
  # _rhs holds original RHS element. Use rhs to refer to Symbol.
6
7
  class Rule < Struct.new(:id, :_lhs, :lhs, :lhs_tag, :_rhs, :rhs, :token_code, :position_in_original_rule_rhs, :nullable, :precedence_sym, :lineno, keyword_init: true)
7
- attr_accessor :original_rule
8
+ # @rbs!
9
+ #
10
+ # interface _DelegatedMethods
11
+ # def lhs: -> Grammar::Symbol
12
+ # def rhs: -> Array[Grammar::Symbol]
13
+ # end
14
+ #
15
+ # attr_accessor id: Integer
16
+ # attr_accessor _lhs: Lexer::Token::Base
17
+ # attr_accessor lhs: Grammar::Symbol
18
+ # attr_accessor lhs_tag: Lexer::Token::Tag?
19
+ # attr_accessor _rhs: Array[Lexer::Token::Base]
20
+ # attr_accessor rhs: Array[Grammar::Symbol]
21
+ # attr_accessor token_code: Lexer::Token::UserCode?
22
+ # attr_accessor position_in_original_rule_rhs: Integer
23
+ # attr_accessor nullable: bool
24
+ # attr_accessor precedence_sym: Grammar::Symbol?
25
+ # attr_accessor lineno: Integer?
26
+ #
27
+ # def initialize: (
28
+ # ?id: Integer, ?_lhs: Lexer::Token::Base?, ?lhs: Lexer::Token::Base, ?lhs_tag: Lexer::Token::Tag?, ?_rhs: Array[Lexer::Token::Base], ?rhs: Array[Grammar::Symbol],
29
+ # ?token_code: Lexer::Token::UserCode?, ?position_in_original_rule_rhs: Integer?, ?nullable: bool,
30
+ # ?precedence_sym: Grammar::Symbol?, ?lineno: Integer?
31
+ # ) -> void
8
32
 
33
+ attr_accessor :original_rule #: Rule
34
+
35
+ # @rbs (Rule other) -> bool
9
36
  def ==(other)
10
37
  self.class == other.class &&
11
38
  self.lhs == other.lhs &&
@@ -18,12 +45,14 @@ module Lrama
18
45
  self.lineno == other.lineno
19
46
  end
20
47
 
48
+ # @rbs () -> String
21
49
  def display_name
22
50
  l = lhs.id.s_value
23
51
  r = empty_rule? ? "ε" : rhs.map {|r| r.id.s_value }.join(" ")
24
52
  "#{l} -> #{r}"
25
53
  end
26
54
 
55
+ # @rbs () -> String
27
56
  def display_name_without_action
28
57
  l = lhs.id.s_value
29
58
  r = empty_rule? ? "ε" : rhs.map do |r|
@@ -33,7 +62,18 @@ module Lrama
33
62
  "#{l} -> #{r}"
34
63
  end
35
64
 
65
+ # @rbs () -> (RailroadDiagrams::Skip | RailroadDiagrams::Sequence)
66
+ def to_diagrams
67
+ if rhs.empty?
68
+ RailroadDiagrams::Skip.new
69
+ else
70
+ RailroadDiagrams::Sequence.new(*rhs_to_diagram)
71
+ end
72
+ end
73
+
36
74
  # Used by #user_actions
75
+ #
76
+ # @rbs () -> String
37
77
  def as_comment
38
78
  l = lhs.id.s_value
39
79
  r = empty_rule? ? "%empty" : rhs.map(&:display_name).join(" ")
@@ -41,35 +81,55 @@ module Lrama
41
81
  "#{l}: #{r}"
42
82
  end
43
83
 
84
+ # @rbs () -> String
44
85
  def with_actions
45
86
  "#{display_name} {#{token_code&.s_value}}"
46
87
  end
47
88
 
48
89
  # opt_nl: ε <-- empty_rule
49
90
  # | '\n' <-- not empty_rule
91
+ #
92
+ # @rbs () -> bool
50
93
  def empty_rule?
51
94
  rhs.empty?
52
95
  end
53
96
 
97
+ # @rbs () -> Precedence?
54
98
  def precedence
55
99
  precedence_sym&.precedence
56
100
  end
57
101
 
102
+ # @rbs () -> bool
58
103
  def initial_rule?
59
104
  id == 0
60
105
  end
61
106
 
107
+ # @rbs () -> String?
62
108
  def translated_code
63
109
  return nil unless token_code
64
110
 
65
111
  Code::RuleAction.new(type: :rule_action, token_code: token_code, rule: self).translated_code
66
112
  end
67
113
 
114
+ # @rbs () -> bool
68
115
  def contains_at_reference?
69
116
  return false unless token_code
70
117
 
71
118
  token_code.references.any? {|r| r.type == :at }
72
119
  end
120
+
121
+ private
122
+
123
+ # @rbs () -> Array[(RailroadDiagrams::Terminal | RailroadDiagrams::NonTerminal)]
124
+ def rhs_to_diagram
125
+ rhs.map do |r|
126
+ if r.term
127
+ RailroadDiagrams::Terminal.new(r.id.s_value)
128
+ else
129
+ RailroadDiagrams::NonTerminal.new(r.id.s_value)
130
+ end
131
+ end
132
+ end
73
133
  end
74
134
  end
75
135
  end