lrama 0.6.9 → 0.6.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yaml +19 -0
  3. data/.gitignore +2 -0
  4. data/Gemfile +6 -3
  5. data/NEWS.md +220 -0
  6. data/README.md +41 -4
  7. data/Rakefile +2 -0
  8. data/Steepfile +6 -17
  9. data/exe/lrama +1 -0
  10. data/lib/lrama/bitmap.rb +2 -0
  11. data/lib/lrama/command.rb +8 -14
  12. data/lib/lrama/context.rb +8 -6
  13. data/lib/lrama/counterexamples/derivation.rb +2 -0
  14. data/lib/lrama/counterexamples/example.rb +2 -0
  15. data/lib/lrama/counterexamples/path.rb +2 -0
  16. data/lib/lrama/counterexamples/production_path.rb +2 -0
  17. data/lib/lrama/counterexamples/start_path.rb +2 -0
  18. data/lib/lrama/counterexamples/state_item.rb +2 -0
  19. data/lib/lrama/counterexamples/transition_path.rb +2 -0
  20. data/lib/lrama/counterexamples/triple.rb +2 -0
  21. data/lib/lrama/counterexamples.rb +17 -15
  22. data/lib/lrama/diagnostics.rb +36 -0
  23. data/lib/lrama/digraph.rb +2 -0
  24. data/lib/lrama/grammar/auxiliary.rb +2 -0
  25. data/lib/lrama/grammar/binding.rb +12 -1
  26. data/lib/lrama/grammar/code/destructor_code.rb +2 -0
  27. data/lib/lrama/grammar/code/initial_action_code.rb +2 -0
  28. data/lib/lrama/grammar/code/no_reference_code.rb +2 -0
  29. data/lib/lrama/grammar/code/printer_code.rb +2 -0
  30. data/lib/lrama/grammar/code/rule_action.rb +7 -3
  31. data/lib/lrama/grammar/code.rb +7 -5
  32. data/lib/lrama/grammar/counter.rb +2 -0
  33. data/lib/lrama/grammar/destructor.rb +2 -0
  34. data/lib/lrama/grammar/error_token.rb +2 -0
  35. data/lib/lrama/grammar/parameterizing_rule/resolver.rb +7 -1
  36. data/lib/lrama/grammar/parameterizing_rule/rhs.rb +5 -2
  37. data/lib/lrama/grammar/parameterizing_rule/rule.rb +6 -0
  38. data/lib/lrama/grammar/parameterizing_rule.rb +2 -0
  39. data/lib/lrama/grammar/percent_code.rb +2 -0
  40. data/lib/lrama/grammar/precedence.rb +2 -0
  41. data/lib/lrama/grammar/printer.rb +2 -0
  42. data/lib/lrama/grammar/reference.rb +2 -0
  43. data/lib/lrama/grammar/rule.rb +10 -3
  44. data/lib/lrama/grammar/rule_builder.rb +64 -65
  45. data/lib/lrama/grammar/symbol.rb +2 -0
  46. data/lib/lrama/grammar/symbols/resolver.rb +5 -1
  47. data/lib/lrama/grammar/symbols.rb +2 -0
  48. data/lib/lrama/grammar/type.rb +2 -0
  49. data/lib/lrama/grammar/union.rb +2 -0
  50. data/lib/lrama/grammar.rb +51 -30
  51. data/lib/lrama/grammar_validator.rb +37 -0
  52. data/lib/lrama/lexer/grammar_file.rb +2 -0
  53. data/lib/lrama/lexer/location.rb +2 -0
  54. data/lib/lrama/lexer/token/char.rb +2 -0
  55. data/lib/lrama/lexer/token/ident.rb +2 -0
  56. data/lib/lrama/lexer/token/instantiate_rule.rb +2 -0
  57. data/lib/lrama/lexer/token/tag.rb +2 -0
  58. data/lib/lrama/lexer/token/user_code.rb +3 -1
  59. data/lib/lrama/lexer/token.rb +7 -5
  60. data/lib/lrama/lexer.rb +11 -8
  61. data/lib/lrama/{warning.rb → logger.rb} +5 -13
  62. data/lib/lrama/option_parser.rb +58 -33
  63. data/lib/lrama/options.rb +5 -2
  64. data/lib/lrama/output.rb +38 -69
  65. data/lib/lrama/parser.rb +650 -779
  66. data/lib/lrama/report/duration.rb +2 -0
  67. data/lib/lrama/report/profile.rb +2 -0
  68. data/lib/lrama/report.rb +4 -2
  69. data/lib/lrama/state/reduce.rb +3 -0
  70. data/lib/lrama/state/reduce_reduce_conflict.rb +2 -0
  71. data/lib/lrama/state/resolved_conflict.rb +3 -1
  72. data/lib/lrama/state/shift.rb +2 -0
  73. data/lib/lrama/state/shift_reduce_conflict.rb +2 -0
  74. data/lib/lrama/state.rb +7 -5
  75. data/lib/lrama/states/item.rb +5 -3
  76. data/lib/lrama/states.rb +18 -46
  77. data/lib/lrama/states_reporter.rb +60 -19
  78. data/lib/lrama/trace_reporter.rb +30 -0
  79. data/lib/lrama/version.rb +3 -1
  80. data/lib/lrama.rb +22 -17
  81. data/lrama.gemspec +3 -1
  82. data/parser.y +110 -229
  83. data/sig/lrama/grammar/auxiliary.rbs +10 -0
  84. data/sig/lrama/grammar/binding.rbs +4 -0
  85. data/sig/lrama/grammar/code/destructor_code.rbs +3 -4
  86. data/sig/lrama/grammar/code/initial_action_code.rbs +15 -0
  87. data/sig/lrama/grammar/code/no_reference_code.rbs +15 -0
  88. data/sig/lrama/grammar/code/printer_code.rbs +3 -4
  89. data/sig/lrama/grammar/code/rule_action.rbs +19 -0
  90. data/sig/lrama/grammar/code.rbs +3 -3
  91. data/sig/lrama/grammar/destructor.rbs +3 -1
  92. data/sig/lrama/grammar/error_token.rbs +4 -2
  93. data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +2 -1
  94. data/sig/lrama/grammar/parameterizing_rule/rhs.rbs +1 -1
  95. data/sig/lrama/grammar/precedence.rbs +3 -1
  96. data/sig/lrama/grammar/printer.rbs +3 -1
  97. data/sig/lrama/grammar/rule.rbs +35 -3
  98. data/sig/lrama/grammar/rule_builder.rbs +10 -9
  99. data/sig/lrama/grammar/symbol.rbs +6 -6
  100. data/sig/lrama/grammar/symbols/resolver.rbs +22 -3
  101. data/sig/lrama/grammar/type.rbs +2 -2
  102. data/sig/lrama/grammar/union.rbs +12 -0
  103. data/sig/lrama/grammar.rbs +91 -1
  104. data/sig/lrama/options.rbs +3 -2
  105. data/sig/lrama/state/reduce.rbs +20 -0
  106. data/sig/lrama/state/reduce_reduce_conflict.rbs +13 -0
  107. data/sig/lrama/state/resolved_conflict.rbs +14 -0
  108. data/sig/lrama/state/shift.rbs +14 -0
  109. data/sig/lrama/state/shift_reduce_conflict.rbs +13 -0
  110. data/sig/lrama/states/item.rbs +30 -0
  111. data/template/bison/yacc.c +24 -19
  112. metadata +17 -6
  113. data/sample/calc.output +0 -263
  114. data/sample/calc.y +0 -101
  115. data/sample/parse.y +0 -59
data/lib/lrama/output.rb CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "erb"
2
4
  require "forwardable"
3
- require "lrama/report/duration"
5
+ require_relative "report/duration"
4
6
 
5
7
  module Lrama
6
8
  class Output
@@ -63,37 +65,29 @@ module Lrama
63
65
 
64
66
  # A part of b4_token_enums
65
67
  def token_enums
66
- str = ""
67
-
68
- @context.yytokentype.each do |s_value, token_id, display_name|
68
+ @context.yytokentype.map do |s_value, token_id, display_name|
69
69
  s = sprintf("%s = %d%s", s_value, token_id, token_id == yymaxutok ? "" : ",")
70
70
 
71
71
  if display_name
72
- str << sprintf(" %-30s /* %s */\n", s, display_name)
72
+ sprintf(" %-30s /* %s */\n", s, display_name)
73
73
  else
74
- str << sprintf(" %s\n", s)
74
+ sprintf(" %s\n", s)
75
75
  end
76
- end
77
-
78
- str
76
+ end.join
79
77
  end
80
78
 
81
79
  # b4_symbol_enum
82
80
  def symbol_enum
83
- str = ""
84
-
85
81
  last_sym_number = @context.yysymbol_kind_t.last[1]
86
- @context.yysymbol_kind_t.each do |s_value, sym_number, display_name|
82
+ @context.yysymbol_kind_t.map do |s_value, sym_number, display_name|
87
83
  s = sprintf("%s = %d%s", s_value, sym_number, (sym_number == last_sym_number) ? "" : ",")
88
84
 
89
85
  if display_name
90
- str << sprintf(" %-40s /* %s */\n", s, display_name)
86
+ sprintf(" %-40s /* %s */\n", s, display_name)
91
87
  else
92
- str << sprintf(" %s\n", s)
88
+ sprintf(" %s\n", s)
93
89
  end
94
- end
95
-
96
- str
90
+ end.join
97
91
  end
98
92
 
99
93
  def yytranslate
@@ -132,12 +126,10 @@ module Lrama
132
126
  end
133
127
 
134
128
  def symbol_actions_for_printer
135
- str = ""
136
-
137
- @grammar.symbols.each do |sym|
129
+ @grammar.symbols.map do |sym|
138
130
  next unless sym.printer
139
131
 
140
- str << <<-STR
132
+ <<-STR
141
133
  case #{sym.enum_name}: /* #{sym.comment} */
142
134
  #line #{sym.printer.lineno} "#{@grammar_file_path}"
143
135
  {#{sym.printer.translated_code(sym.tag)}}
@@ -145,18 +137,14 @@ module Lrama
145
137
  break;
146
138
 
147
139
  STR
148
- end
149
-
150
- str
140
+ end.join
151
141
  end
152
142
 
153
143
  def symbol_actions_for_destructor
154
- str = ""
155
-
156
- @grammar.symbols.each do |sym|
144
+ @grammar.symbols.map do |sym|
157
145
  next unless sym.destructor
158
146
 
159
- str << <<-STR
147
+ <<-STR
160
148
  case #{sym.enum_name}: /* #{sym.comment} */
161
149
  #line #{sym.destructor.lineno} "#{@grammar_file_path}"
162
150
  {#{sym.destructor.translated_code(sym.tag)}}
@@ -164,9 +152,7 @@ module Lrama
164
152
  break;
165
153
 
166
154
  STR
167
- end
168
-
169
- str
155
+ end.join
170
156
  end
171
157
 
172
158
  # b4_user_initial_action
@@ -236,12 +222,10 @@ module Lrama
236
222
  end
237
223
 
238
224
  def symbol_actions_for_error_token
239
- str = ""
240
-
241
- @grammar.symbols.each do |sym|
225
+ @grammar.symbols.map do |sym|
242
226
  next unless sym.error_token
243
227
 
244
- str << <<-STR
228
+ <<-STR
245
229
  case #{sym.enum_name}: /* #{sym.comment} */
246
230
  #line #{sym.error_token.lineno} "#{@grammar_file_path}"
247
231
  {#{sym.error_token.translated_code(sym.tag)}}
@@ -249,22 +233,18 @@ module Lrama
249
233
  break;
250
234
 
251
235
  STR
252
- end
253
-
254
- str
236
+ end.join
255
237
  end
256
238
 
257
239
  # b4_user_actions
258
240
  def user_actions
259
- str = ""
260
-
261
- @context.states.rules.each do |rule|
241
+ action = @context.states.rules.map do |rule|
262
242
  next unless rule.token_code
263
243
 
264
244
  code = rule.token_code
265
245
  spaces = " " * (code.column - 1)
266
246
 
267
- str << <<-STR
247
+ <<-STR
268
248
  case #{rule.id + 1}: /* #{rule.as_comment} */
269
249
  #line #{code.line} "#{@grammar_file_path}"
270
250
  #{spaces}{#{rule.translated_code}}
@@ -272,14 +252,12 @@ module Lrama
272
252
  break;
273
253
 
274
254
  STR
275
- end
255
+ end.join
276
256
 
277
- str << <<-STR
257
+ action + <<-STR
278
258
 
279
259
  #line [@oline@] [@ofile@]
280
260
  STR
281
-
282
- str
283
261
  end
284
262
 
285
263
  def omit_blanks(param)
@@ -343,7 +321,7 @@ module Lrama
343
321
 
344
322
  # b4_parse_param_use
345
323
  def parse_param_use(val, loc)
346
- str = <<-STR
324
+ str = <<-STR.dup
347
325
  YY_USE (#{val});
348
326
  YY_USE (#{loc});
349
327
  STR
@@ -357,7 +335,8 @@ module Lrama
357
335
 
358
336
  # b4_yylex_formals
359
337
  def yylex_formals
360
- ary = ["&yylval", "&yylloc"]
338
+ ary = ["&yylval"]
339
+ ary << "&yylloc" if @grammar.locations
361
340
 
362
341
  if @grammar.lex_param
363
342
  ary << lex_param_name
@@ -397,17 +376,9 @@ module Lrama
397
376
  def int_array_to_string(ary)
398
377
  last = ary.count - 1
399
378
 
400
- s = ary.each_with_index.each_slice(10).map do |slice|
401
- str = " "
402
-
403
- slice.each do |e, i|
404
- str << sprintf("%6d%s", e, (i == last) ? "" : ",")
405
- end
406
-
407
- str
408
- end
409
-
410
- s.join("\n")
379
+ ary.each_with_index.each_slice(10).map do |slice|
380
+ " " + slice.map { |e, i| sprintf("%6d%s", e, (i == last) ? "" : ",") }.join
381
+ end.join("\n")
411
382
  end
412
383
 
413
384
  def spec_mapped_header_file
@@ -457,26 +428,24 @@ module Lrama
457
428
  end
458
429
 
459
430
  def template_dir
460
- File.expand_path("../../../template", __FILE__)
431
+ File.expand_path('../../template', __dir__)
461
432
  end
462
433
 
463
434
  def string_array_to_string(ary)
464
- str = ""
435
+ result = ""
465
436
  tmp = " "
466
437
 
467
438
  ary.each do |s|
468
- s = s.gsub('\\', '\\\\\\\\')
469
- s = s.gsub('"', '\\"')
470
-
471
- if (tmp + s + " \"\",").length > 75
472
- str << tmp << "\n"
473
- tmp = " \"#{s}\","
439
+ replaced = s.gsub('\\', '\\\\\\\\').gsub('"', '\\"')
440
+ if (tmp + replaced + " \"\",").length > 75
441
+ result = "#{result}#{tmp}\n"
442
+ tmp = " \"#{replaced}\","
474
443
  else
475
- tmp << " \"#{s}\","
444
+ tmp = "#{tmp} \"#{replaced}\","
476
445
  end
477
446
  end
478
447
 
479
- str << tmp
448
+ result + tmp
480
449
  end
481
450
 
482
451
  def replace_special_variables(str, ofile)