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
@@ -0,0 +1,13 @@
1
+ # Generated from lib/lrama/warnings/redefined_rules.rb with RBS::Inline
2
+
3
+ module Lrama
4
+ class Warnings
5
+ class RedefinedRules
6
+ # @rbs (Lrama::Logger logger, bool warnings) -> void
7
+ def initialize: (Lrama::Logger logger, bool warnings) -> void
8
+
9
+ # @rbs (Lrama::Grammar grammar) -> void
10
+ def warn: (Lrama::Grammar grammar) -> void
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # Generated from lib/lrama/warnings/required.rb with RBS::Inline
2
+
3
+ module Lrama
4
+ class Warnings
5
+ class Required
6
+ # @rbs (Lrama::Logger logger, bool warnings) -> void
7
+ def initialize: (Lrama::Logger logger, bool warnings) -> void
8
+
9
+ # @rbs (Lrama::Grammar grammar) -> void
10
+ def warn: (Lrama::Grammar grammar) -> void
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # Generated from lib/lrama/warnings/useless_precedence.rb with RBS::Inline
2
+
3
+ module Lrama
4
+ class Warnings
5
+ class UselessPrecedence
6
+ # @rbs (Lrama::Logger logger, bool warnings) -> void
7
+ def initialize: (Lrama::Logger logger, bool warnings) -> void
8
+
9
+ # @rbs (Lrama::Grammar grammar, Lrama::States states) -> void
10
+ def warn: (Lrama::Grammar grammar, Lrama::States states) -> void
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # Generated from lib/lrama/warnings.rb with RBS::Inline
2
+
3
+ module Lrama
4
+ class Warnings
5
+ # @rbs (Logger logger, bool warnings) -> void
6
+ def initialize: (Logger logger, bool warnings) -> void
7
+
8
+ # @rbs (Lrama::Grammar grammar, Lrama::States states) -> void
9
+ def warn: (Lrama::Grammar grammar, Lrama::States states) -> void
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module RailroadDiagrams
2
+ class Terminal
3
+ def initialize: (*untyped) -> void
4
+ end
5
+ class NonTerminal
6
+ def initialize: (*untyped) -> void
7
+ end
8
+ class Sequence
9
+ def initialize: (*untyped) -> void
10
+ end
11
+ class Skip
12
+ def initialize: (*untyped) -> void
13
+ end
14
+ class Diagram
15
+ end
16
+ end
@@ -28,6 +28,7 @@ extern int yydebug;
28
28
  <%-# b4_declare_yylstype -%>
29
29
  <%-# b4_value_type_define -%>
30
30
  /* Value type. */
31
+ <% if output.grammar.union %>
31
32
  #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
32
33
  union YYSTYPE
33
34
  {
@@ -40,6 +41,13 @@ typedef union YYSTYPE YYSTYPE;
40
41
  # define YYSTYPE_IS_TRIVIAL 1
41
42
  # define YYSTYPE_IS_DECLARED 1
42
43
  #endif
44
+ <% else %>
45
+ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
46
+ typedef int YYSTYPE;
47
+ # define YYSTYPE_IS_TRIVIAL 1
48
+ # define YYSTYPE_IS_DECLARED 1
49
+ #endif
50
+ <% end %>
43
51
 
44
52
  <%-# b4_location_type_define -%>
45
53
  /* Location type. */
@@ -0,0 +1,102 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Lrama syntax diagrams</title>
5
+
6
+ <style>
7
+ <%= output.default_style %>
8
+ .diagram-header {
9
+ display: inline-block;
10
+ font-weight: bold;
11
+ font-size: 18px;
12
+ margin-bottom: -8px;
13
+ text-align: center;
14
+ }
15
+
16
+ svg {
17
+ width: 100%;
18
+ }
19
+
20
+ svg.railroad-diagram g.non-terminal text {
21
+ cursor: pointer;
22
+ }
23
+
24
+ h2.hover-header {
25
+ background-color: #90ee90;
26
+ }
27
+
28
+ svg.railroad-diagram g.non-terminal.hover-g rect {
29
+ fill: #eded91;
30
+ stroke: 5;
31
+ }
32
+
33
+ svg.railroad-diagram g.terminal.hover-g rect {
34
+ fill: #eded91;
35
+ stroke: 5;
36
+ }
37
+ </style>
38
+ </head>
39
+
40
+ <body align="center">
41
+ <%= output.diagrams %>
42
+ <script>
43
+ document.addEventListener("DOMContentLoaded", () => {
44
+ function addHoverEffect(selector, hoverClass, relatedSelector, relatedHoverClass, getTextElements) {
45
+ document.querySelectorAll(selector).forEach(element => {
46
+ element.addEventListener("mouseenter", () => {
47
+ element.classList.add(hoverClass);
48
+ getTextElements(element).forEach(textEl => {
49
+ if (!relatedSelector) return;
50
+ getElementsByText(relatedSelector, textEl.textContent).forEach(related => {
51
+ related.classList.add(relatedHoverClass);
52
+ });
53
+ });
54
+ });
55
+
56
+ element.addEventListener("mouseleave", () => {
57
+ element.classList.remove(hoverClass);
58
+ if (!relatedSelector) return;
59
+ getTextElements(element).forEach(textEl => {
60
+ getElementsByText(relatedSelector, textEl.textContent).forEach(related => {
61
+ related.classList.remove(relatedHoverClass);
62
+ });
63
+ });
64
+ });
65
+ });
66
+ }
67
+
68
+ function getElementsByText(selector, text) {
69
+ return [...document.querySelectorAll(selector)].filter(el => el.textContent.trim() === text.trim());
70
+ }
71
+
72
+ function getParentElementsByText(selector, text) {
73
+ return [...document.querySelectorAll(selector)].filter(el =>
74
+ [...el.querySelectorAll("text")].some(textEl => textEl.textContent.trim() === text.trim())
75
+ );
76
+ }
77
+
78
+ function scrollToMatchingHeader() {
79
+ document.querySelectorAll("g.non-terminal").forEach(element => {
80
+ element.addEventListener("click", () => {
81
+ const textElements = [...element.querySelectorAll("text")];
82
+ for (const textEl of textElements) {
83
+ const targetHeader = getElementsByText("h2", textEl.textContent)[0];
84
+ if (targetHeader) {
85
+ targetHeader.scrollIntoView({ behavior: "smooth", block: "start" });
86
+ break;
87
+ }
88
+ }
89
+ });
90
+ });
91
+ }
92
+
93
+ addHoverEffect("h2", "hover-header", "g.non-terminal", "hover-g", element => [element]);
94
+ addHoverEffect("g.non-terminal", "hover-g", "h2", "hover-header",
95
+ element => [...element.querySelectorAll("text")]
96
+ );
97
+ addHoverEffect("g.terminal", "hover-g", "", "", element => [element]);
98
+ scrollToMatchingHeader();
99
+ });
100
+ </script>
101
+ </body>
102
+ </html>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lrama
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuichiro Kaneko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-01-21 00:00:00.000000000 Z
11
+ date: 2025-12-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: LALR (1) parser generator written by Ruby
14
14
  email:
@@ -19,6 +19,7 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - ".codespellignore"
22
+ - ".gitattributes"
22
23
  - ".github/dependabot.yml"
23
24
  - ".github/workflows/codespell.yaml"
24
25
  - ".github/workflows/gh-pages.yml"
@@ -38,6 +39,7 @@ files:
38
39
  - doc/development/compressed_state_table/parse.output
39
40
  - doc/development/compressed_state_table/parse.y
40
41
  - doc/development/compressed_state_table/parser.rb
42
+ - doc/development/profiling.md
41
43
  - exe/lrama
42
44
  - lib/lrama.rb
43
45
  - lib/lrama/bitmap.rb
@@ -46,14 +48,13 @@ files:
46
48
  - lib/lrama/counterexamples.rb
47
49
  - lib/lrama/counterexamples/derivation.rb
48
50
  - lib/lrama/counterexamples/example.rb
51
+ - lib/lrama/counterexamples/node.rb
49
52
  - lib/lrama/counterexamples/path.rb
50
- - lib/lrama/counterexamples/production_path.rb
51
- - lib/lrama/counterexamples/start_path.rb
52
53
  - lib/lrama/counterexamples/state_item.rb
53
- - lib/lrama/counterexamples/transition_path.rb
54
54
  - lib/lrama/counterexamples/triple.rb
55
- - lib/lrama/diagnostics.rb
55
+ - lib/lrama/diagram.rb
56
56
  - lib/lrama/digraph.rb
57
+ - lib/lrama/erb.rb
57
58
  - lib/lrama/grammar.rb
58
59
  - lib/lrama/grammar/auxiliary.rb
59
60
  - lib/lrama/grammar/binding.rb
@@ -66,10 +67,12 @@ files:
66
67
  - lib/lrama/grammar/counter.rb
67
68
  - lib/lrama/grammar/destructor.rb
68
69
  - lib/lrama/grammar/error_token.rb
69
- - lib/lrama/grammar/parameterizing_rule.rb
70
- - lib/lrama/grammar/parameterizing_rule/resolver.rb
71
- - lib/lrama/grammar/parameterizing_rule/rhs.rb
72
- - lib/lrama/grammar/parameterizing_rule/rule.rb
70
+ - lib/lrama/grammar/inline.rb
71
+ - lib/lrama/grammar/inline/resolver.rb
72
+ - lib/lrama/grammar/parameterized.rb
73
+ - lib/lrama/grammar/parameterized/resolver.rb
74
+ - lib/lrama/grammar/parameterized/rhs.rb
75
+ - lib/lrama/grammar/parameterized/rule.rb
73
76
  - lib/lrama/grammar/percent_code.rb
74
77
  - lib/lrama/grammar/precedence.rb
75
78
  - lib/lrama/grammar/printer.rb
@@ -82,102 +85,159 @@ files:
82
85
  - lib/lrama/grammar/symbols/resolver.rb
83
86
  - lib/lrama/grammar/type.rb
84
87
  - lib/lrama/grammar/union.rb
85
- - lib/lrama/grammar_validator.rb
86
88
  - lib/lrama/lexer.rb
87
89
  - lib/lrama/lexer/grammar_file.rb
88
90
  - lib/lrama/lexer/location.rb
89
91
  - lib/lrama/lexer/token.rb
92
+ - lib/lrama/lexer/token/base.rb
90
93
  - lib/lrama/lexer/token/char.rb
94
+ - lib/lrama/lexer/token/empty.rb
91
95
  - lib/lrama/lexer/token/ident.rb
92
96
  - lib/lrama/lexer/token/instantiate_rule.rb
97
+ - lib/lrama/lexer/token/int.rb
98
+ - lib/lrama/lexer/token/str.rb
93
99
  - lib/lrama/lexer/token/tag.rb
100
+ - lib/lrama/lexer/token/token.rb
94
101
  - lib/lrama/lexer/token/user_code.rb
95
102
  - lib/lrama/logger.rb
96
103
  - lib/lrama/option_parser.rb
97
104
  - lib/lrama/options.rb
98
105
  - lib/lrama/output.rb
99
106
  - lib/lrama/parser.rb
100
- - lib/lrama/report.rb
101
- - lib/lrama/report/duration.rb
102
- - lib/lrama/report/profile.rb
107
+ - lib/lrama/reporter.rb
108
+ - lib/lrama/reporter/conflicts.rb
109
+ - lib/lrama/reporter/grammar.rb
110
+ - lib/lrama/reporter/precedences.rb
111
+ - lib/lrama/reporter/profile.rb
112
+ - lib/lrama/reporter/profile/call_stack.rb
113
+ - lib/lrama/reporter/profile/memory.rb
114
+ - lib/lrama/reporter/rules.rb
115
+ - lib/lrama/reporter/states.rb
116
+ - lib/lrama/reporter/terms.rb
103
117
  - lib/lrama/state.rb
104
- - lib/lrama/state/reduce.rb
118
+ - lib/lrama/state/action.rb
119
+ - lib/lrama/state/action/goto.rb
120
+ - lib/lrama/state/action/reduce.rb
121
+ - lib/lrama/state/action/shift.rb
122
+ - lib/lrama/state/inadequacy_annotation.rb
123
+ - lib/lrama/state/item.rb
105
124
  - lib/lrama/state/reduce_reduce_conflict.rb
106
125
  - lib/lrama/state/resolved_conflict.rb
107
- - lib/lrama/state/shift.rb
108
126
  - lib/lrama/state/shift_reduce_conflict.rb
109
127
  - lib/lrama/states.rb
110
- - lib/lrama/states/item.rb
111
- - lib/lrama/states_reporter.rb
112
- - lib/lrama/trace_reporter.rb
128
+ - lib/lrama/tracer.rb
129
+ - lib/lrama/tracer/actions.rb
130
+ - lib/lrama/tracer/closure.rb
131
+ - lib/lrama/tracer/duration.rb
132
+ - lib/lrama/tracer/only_explicit_rules.rb
133
+ - lib/lrama/tracer/rules.rb
134
+ - lib/lrama/tracer/state.rb
113
135
  - lib/lrama/version.rb
136
+ - lib/lrama/warnings.rb
137
+ - lib/lrama/warnings/conflicts.rb
138
+ - lib/lrama/warnings/implicit_empty.rb
139
+ - lib/lrama/warnings/name_conflicts.rb
140
+ - lib/lrama/warnings/redefined_rules.rb
141
+ - lib/lrama/warnings/required.rb
142
+ - lib/lrama/warnings/useless_precedence.rb
114
143
  - lrama.gemspec
115
144
  - parser.y
116
145
  - rbs_collection.lock.yaml
117
146
  - rbs_collection.yaml
118
147
  - sig/generated/lrama/bitmap.rbs
148
+ - sig/generated/lrama/counterexamples.rbs
149
+ - sig/generated/lrama/counterexamples/derivation.rbs
150
+ - sig/generated/lrama/counterexamples/example.rbs
151
+ - sig/generated/lrama/counterexamples/node.rbs
152
+ - sig/generated/lrama/counterexamples/path.rbs
153
+ - sig/generated/lrama/counterexamples/state_item.rbs
154
+ - sig/generated/lrama/counterexamples/triple.rbs
155
+ - sig/generated/lrama/diagram.rbs
119
156
  - sig/generated/lrama/digraph.rbs
157
+ - sig/generated/lrama/erb.rbs
158
+ - sig/generated/lrama/grammar.rbs
159
+ - sig/generated/lrama/grammar/auxiliary.rbs
120
160
  - sig/generated/lrama/grammar/binding.rbs
161
+ - sig/generated/lrama/grammar/code.rbs
162
+ - sig/generated/lrama/grammar/code/destructor_code.rbs
163
+ - sig/generated/lrama/grammar/code/initial_action_code.rbs
164
+ - sig/generated/lrama/grammar/code/no_reference_code.rbs
165
+ - sig/generated/lrama/grammar/code/printer_code.rbs
166
+ - sig/generated/lrama/grammar/code/rule_action.rbs
167
+ - sig/generated/lrama/grammar/counter.rbs
168
+ - sig/generated/lrama/grammar/destructor.rbs
169
+ - sig/generated/lrama/grammar/error_token.rbs
170
+ - sig/generated/lrama/grammar/inline/resolver.rbs
171
+ - sig/generated/lrama/grammar/parameterized/resolver.rbs
172
+ - sig/generated/lrama/grammar/parameterized/rhs.rbs
173
+ - sig/generated/lrama/grammar/parameterized/rule.rbs
174
+ - sig/generated/lrama/grammar/percent_code.rbs
175
+ - sig/generated/lrama/grammar/precedence.rbs
176
+ - sig/generated/lrama/grammar/printer.rbs
177
+ - sig/generated/lrama/grammar/reference.rbs
178
+ - sig/generated/lrama/grammar/rule.rbs
179
+ - sig/generated/lrama/grammar/rule_builder.rbs
180
+ - sig/generated/lrama/grammar/symbol.rbs
181
+ - sig/generated/lrama/grammar/symbols/resolver.rbs
182
+ - sig/generated/lrama/grammar/type.rbs
183
+ - sig/generated/lrama/grammar/union.rbs
184
+ - sig/generated/lrama/lexer.rbs
121
185
  - sig/generated/lrama/lexer/grammar_file.rbs
122
186
  - sig/generated/lrama/lexer/location.rbs
123
187
  - sig/generated/lrama/lexer/token.rbs
188
+ - sig/generated/lrama/lexer/token/base.rbs
124
189
  - sig/generated/lrama/lexer/token/char.rbs
190
+ - sig/generated/lrama/lexer/token/empty.rbs
125
191
  - sig/generated/lrama/lexer/token/ident.rbs
126
192
  - sig/generated/lrama/lexer/token/instantiate_rule.rbs
193
+ - sig/generated/lrama/lexer/token/int.rbs
194
+ - sig/generated/lrama/lexer/token/str.rbs
127
195
  - sig/generated/lrama/lexer/token/tag.rbs
196
+ - sig/generated/lrama/lexer/token/token.rbs
128
197
  - sig/generated/lrama/lexer/token/user_code.rbs
129
198
  - sig/generated/lrama/logger.rbs
130
- - sig/generated/lrama/trace_reporter.rbs
131
- - sig/lrama/counterexamples.rbs
132
- - sig/lrama/counterexamples/derivation.rbs
133
- - sig/lrama/counterexamples/example.rbs
134
- - sig/lrama/counterexamples/path.rbs
135
- - sig/lrama/counterexamples/production_path.rbs
136
- - sig/lrama/counterexamples/start_path.rbs
137
- - sig/lrama/counterexamples/state_item.rbs
138
- - sig/lrama/counterexamples/transition_path.rbs
139
- - sig/lrama/counterexamples/triple.rbs
140
- - sig/lrama/grammar.rbs
141
- - sig/lrama/grammar/auxiliary.rbs
142
- - sig/lrama/grammar/code.rbs
143
- - sig/lrama/grammar/code/destructor_code.rbs
144
- - sig/lrama/grammar/code/initial_action_code.rbs
145
- - sig/lrama/grammar/code/no_reference_code.rbs
146
- - sig/lrama/grammar/code/printer_code.rbs
147
- - sig/lrama/grammar/code/rule_action.rbs
148
- - sig/lrama/grammar/counter.rbs
149
- - sig/lrama/grammar/destructor.rbs
150
- - sig/lrama/grammar/error_token.rbs
151
- - sig/lrama/grammar/parameterizing_rule.rbs
152
- - sig/lrama/grammar/parameterizing_rule/resolver.rbs
153
- - sig/lrama/grammar/parameterizing_rule/rhs.rbs
154
- - sig/lrama/grammar/parameterizing_rule/rule.rbs
155
- - sig/lrama/grammar/percent_code.rbs
156
- - sig/lrama/grammar/precedence.rbs
157
- - sig/lrama/grammar/printer.rbs
158
- - sig/lrama/grammar/reference.rbs
159
- - sig/lrama/grammar/rule.rbs
160
- - sig/lrama/grammar/rule_builder.rbs
161
- - sig/lrama/grammar/symbol.rbs
162
- - sig/lrama/grammar/symbols/resolver.rbs
163
- - sig/lrama/grammar/type.rbs
164
- - sig/lrama/grammar/union.rbs
165
- - sig/lrama/options.rbs
166
- - sig/lrama/report/duration.rbs
167
- - sig/lrama/report/profile.rbs
168
- - sig/lrama/state.rbs
169
- - sig/lrama/state/reduce.rbs
170
- - sig/lrama/state/reduce_reduce_conflict.rbs
171
- - sig/lrama/state/resolved_conflict.rbs
172
- - sig/lrama/state/shift.rbs
173
- - sig/lrama/state/shift_reduce_conflict.rbs
174
- - sig/lrama/states.rbs
175
- - sig/lrama/states/item.rbs
176
- - sig/lrama/warning.rbs
199
+ - sig/generated/lrama/option_parser.rbs
200
+ - sig/generated/lrama/options.rbs
201
+ - sig/generated/lrama/reporter.rbs
202
+ - sig/generated/lrama/reporter/conflicts.rbs
203
+ - sig/generated/lrama/reporter/grammar.rbs
204
+ - sig/generated/lrama/reporter/precedences.rbs
205
+ - sig/generated/lrama/reporter/profile/call_stack.rbs
206
+ - sig/generated/lrama/reporter/profile/memory.rbs
207
+ - sig/generated/lrama/reporter/rules.rbs
208
+ - sig/generated/lrama/reporter/states.rbs
209
+ - sig/generated/lrama/reporter/terms.rbs
210
+ - sig/generated/lrama/state.rbs
211
+ - sig/generated/lrama/state/action/goto.rbs
212
+ - sig/generated/lrama/state/action/reduce.rbs
213
+ - sig/generated/lrama/state/action/shift.rbs
214
+ - sig/generated/lrama/state/inadequacy_annotation.rbs
215
+ - sig/generated/lrama/state/item.rbs
216
+ - sig/generated/lrama/state/reduce_reduce_conflict.rbs
217
+ - sig/generated/lrama/state/resolved_conflict.rbs
218
+ - sig/generated/lrama/state/shift_reduce_conflict.rbs
219
+ - sig/generated/lrama/states.rbs
220
+ - sig/generated/lrama/tracer.rbs
221
+ - sig/generated/lrama/tracer/actions.rbs
222
+ - sig/generated/lrama/tracer/closure.rbs
223
+ - sig/generated/lrama/tracer/duration.rbs
224
+ - sig/generated/lrama/tracer/only_explicit_rules.rbs
225
+ - sig/generated/lrama/tracer/rules.rbs
226
+ - sig/generated/lrama/tracer/state.rbs
227
+ - sig/generated/lrama/version.rbs
228
+ - sig/generated/lrama/warnings.rbs
229
+ - sig/generated/lrama/warnings/conflicts.rbs
230
+ - sig/generated/lrama/warnings/implicit_empty.rbs
231
+ - sig/generated/lrama/warnings/name_conflicts.rbs
232
+ - sig/generated/lrama/warnings/redefined_rules.rbs
233
+ - sig/generated/lrama/warnings/required.rbs
234
+ - sig/generated/lrama/warnings/useless_precedence.rbs
235
+ - sig/railroad_diagrams/railroad_diagrams.rbs
177
236
  - sig/stdlib/strscan/string_scanner.rbs
178
237
  - template/bison/_yacc.h
179
238
  - template/bison/yacc.c
180
239
  - template/bison/yacc.h
240
+ - template/diagram/diagram.html
181
241
  homepage: https://github.com/ruby/lrama
182
242
  licenses:
183
243
  - GPL-3.0-or-later
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lrama
4
- class Counterexamples
5
- class ProductionPath < Path
6
- def type
7
- :production
8
- end
9
-
10
- def transition?
11
- false
12
- end
13
-
14
- def production?
15
- true
16
- end
17
- end
18
- end
19
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lrama
4
- class Counterexamples
5
- class StartPath < Path
6
- def initialize(to_state_item)
7
- super nil, to_state_item
8
- end
9
-
10
- def type
11
- :start
12
- end
13
-
14
- def transition?
15
- false
16
- end
17
-
18
- def production?
19
- false
20
- end
21
- end
22
- end
23
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lrama
4
- class Counterexamples
5
- class TransitionPath < Path
6
- def type
7
- :transition
8
- end
9
-
10
- def transition?
11
- true
12
- end
13
-
14
- def production?
15
- false
16
- end
17
- end
18
- end
19
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lrama
4
- class Diagnostics
5
- def initialize(grammar, states, logger)
6
- @grammar = grammar
7
- @states = states
8
- @logger = logger
9
- end
10
-
11
- def run(diagnostic)
12
- if diagnostic
13
- diagnose_conflict
14
- diagnose_parameterizing_redefined
15
- end
16
- end
17
-
18
- private
19
-
20
- def diagnose_conflict
21
- if @states.sr_conflicts_count != 0
22
- @logger.warn("shift/reduce conflicts: #{@states.sr_conflicts_count} found")
23
- end
24
-
25
- if @states.rr_conflicts_count != 0
26
- @logger.warn("reduce/reduce conflicts: #{@states.rr_conflicts_count} found")
27
- end
28
- end
29
-
30
- def diagnose_parameterizing_redefined
31
- @grammar.parameterizing_rule_resolver.redefined_rules.each do |rule|
32
- @logger.warn("parameterizing rule redefined: #{rule}")
33
- end
34
- end
35
- end
36
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lrama
4
- class Grammar
5
- class ParameterizingRule
6
- class Rule
7
- attr_reader :name, :parameters, :rhs_list, :required_parameters_count, :tag, :is_inline
8
-
9
- def initialize(name, parameters, rhs_list, tag: nil, is_inline: false)
10
- @name = name
11
- @parameters = parameters
12
- @rhs_list = rhs_list
13
- @tag = tag
14
- @is_inline = is_inline
15
- @required_parameters_count = parameters.count
16
- end
17
-
18
- def to_s
19
- "#{@name}(#{@parameters.map(&:s_value).join(', ')})"
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'parameterizing_rule/resolver'
4
- require_relative 'parameterizing_rule/rhs'
5
- require_relative 'parameterizing_rule/rule'
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lrama
4
- class GrammarValidator
5
- def initialize(grammar, states, logger)
6
- @grammar = grammar
7
- @states = states
8
- @logger = logger
9
- end
10
-
11
- def valid?
12
- conflicts_within_threshold?
13
- end
14
-
15
- private
16
-
17
- def conflicts_within_threshold?
18
- return true unless @grammar.expect
19
-
20
- [sr_conflicts_within_threshold(@grammar.expect), rr_conflicts_within_threshold(0)].all?
21
- end
22
-
23
- def sr_conflicts_within_threshold(expected)
24
- return true if expected == @states.sr_conflicts_count
25
-
26
- @logger.error("shift/reduce conflicts: #{@states.sr_conflicts_count} found, #{expected} expected")
27
- false
28
- end
29
-
30
- def rr_conflicts_within_threshold(expected)
31
- return true if expected == @states.rr_conflicts_count
32
-
33
- @logger.error("reduce/reduce conflicts: #{@states.rr_conflicts_count} found, #{expected} expected")
34
- false
35
- end
36
- end
37
- end