racc 1.6.0 → 1.8.0

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.
@@ -7,8 +7,6 @@
7
7
  This library is free software.
8
8
  You can distribute/modify this program under the same terms of ruby.
9
9
 
10
- $originalId: cparse.c,v 1.8 2006/07/06 11:39:46 aamine Exp $
11
-
12
10
  */
13
11
 
14
12
  #include <ruby.h>
@@ -24,7 +22,7 @@
24
22
  Important Constants
25
23
  ----------------------------------------------------------------------- */
26
24
 
27
- #define RACC_VERSION "1.4.15"
25
+ #define RACC_VERSION STRINGIZE(RACC_INFO_VERSION)
28
26
 
29
27
  #define DEFAULT_TOKEN -1
30
28
  #define ERROR_TOKEN 1
@@ -72,12 +70,8 @@ static ID id_d_e_pop;
72
70
  # define LONG2NUM(i) INT2NUM(i)
73
71
  #endif
74
72
 
75
- #ifndef HAVE_RB_ARY_SUBSEQ
76
- # define rb_ary_subseq(ary, beg, len) rb_ary_new4(len, RARRAY_PTR(ary) + beg)
77
- #endif
78
-
79
- static ID value_to_id _((VALUE v));
80
- static inline long num_to_long _((VALUE n));
73
+ static ID value_to_id(VALUE v);
74
+ static inline long num_to_long(VALUE n);
81
75
 
82
76
  static ID
83
77
  value_to_id(VALUE v)
@@ -101,8 +95,8 @@ num_to_long(VALUE n)
101
95
  Parser Stack Interfaces
102
96
  ----------------------------------------------------------------------- */
103
97
 
104
- static VALUE get_stack_tail _((VALUE stack, long len));
105
- static void cut_stack_tail _((VALUE stack, long len));
98
+ static VALUE get_stack_tail(VALUE stack, long len);
99
+ static void cut_stack_tail(VALUE stack, long len);
106
100
 
107
101
  static VALUE
108
102
  get_stack_tail(VALUE stack, long len)
@@ -191,27 +185,27 @@ struct cparse_params {
191
185
  Parser Main Routines
192
186
  ----------------------------------------------------------------------- */
193
187
 
194
- static VALUE racc_cparse _((VALUE parser, VALUE arg, VALUE sysdebug));
195
- static VALUE racc_yyparse _((VALUE parser, VALUE lexer, VALUE lexmid,
196
- VALUE arg, VALUE sysdebug));
197
-
198
- static void call_lexer _((struct cparse_params *v));
199
- static VALUE lexer_i _((RB_BLOCK_CALL_FUNC_ARGLIST(block_args, data)));
200
-
201
- static VALUE assert_array _((VALUE a));
202
- static long assert_integer _((VALUE n));
203
- static VALUE assert_hash _((VALUE h));
204
- static VALUE initialize_params _((VALUE vparams, VALUE parser, VALUE arg,
205
- VALUE lexer, VALUE lexmid));
206
- static void cparse_params_mark _((void *ptr));
207
- static size_t cparse_params_memsize _((const void *ptr));
208
-
209
- static void parse_main _((struct cparse_params *v,
210
- VALUE tok, VALUE val, int resume));
211
- static void extract_user_token _((struct cparse_params *v,
212
- VALUE block_args, VALUE *tok, VALUE *val));
213
- static void shift _((struct cparse_params* v, long act, VALUE tok, VALUE val));
214
- static int reduce _((struct cparse_params* v, long act));
188
+ static VALUE racc_cparse(VALUE parser, VALUE arg, VALUE sysdebug);
189
+ static VALUE racc_yyparse(VALUE parser, VALUE lexer, VALUE lexmid,
190
+ VALUE arg, VALUE sysdebug);
191
+
192
+ static void call_lexer(struct cparse_params *v);
193
+ static VALUE lexer_i(RB_BLOCK_CALL_FUNC_ARGLIST(block_args, data));
194
+
195
+ static VALUE assert_array(VALUE a);
196
+ static long assert_integer(VALUE n);
197
+ static VALUE assert_hash(VALUE h);
198
+ static VALUE initialize_params(VALUE vparams, VALUE parser, VALUE arg,
199
+ VALUE lexer, VALUE lexmid);
200
+ static void cparse_params_mark(void *ptr);
201
+ static size_t cparse_params_memsize(const void *ptr);
202
+
203
+ static void parse_main(struct cparse_params *v,
204
+ VALUE tok, VALUE val, int resume);
205
+ static void extract_user_token(struct cparse_params *v,
206
+ VALUE block_args, VALUE *tok, VALUE *val);
207
+ static void shift(struct cparse_params* v, long act, VALUE tok, VALUE val);
208
+ static int reduce(struct cparse_params* v, long act);
215
209
  static rb_block_call_func reduce0;
216
210
 
217
211
  #ifdef DEBUG
@@ -280,28 +274,11 @@ racc_yyparse(VALUE parser, VALUE lexer, VALUE lexmid, VALUE arg, VALUE sysdebug)
280
274
  return v->retval;
281
275
  }
282
276
 
283
- #ifdef HAVE_RB_BLOCK_CALL
284
277
  static void
285
278
  call_lexer(struct cparse_params *v)
286
279
  {
287
280
  rb_block_call(v->lexer, v->lexmid, 0, NULL, lexer_i, v->value_v);
288
281
  }
289
- #else
290
- static VALUE
291
- lexer_iter(VALUE data)
292
- {
293
- struct cparse_params *v = rb_check_typeddata(data, &cparse_params_type);
294
-
295
- rb_funcall(v->lexer, v->lexmid, 0);
296
- return Qnil;
297
- }
298
-
299
- static void
300
- call_lexer(struct cparse_params *v)
301
- {
302
- rb_iterate(lexer_iter, v->value_v, lexer_i, v->value_v);
303
- }
304
- #endif
305
282
 
306
283
  static VALUE
307
284
  lexer_i(RB_BLOCK_CALL_FUNC_ARGLIST(block_args, data))
@@ -1,9 +1,8 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  #
3
3
 
4
4
  require 'mkmf'
5
+ require_relative '../../../lib/racc/info'
5
6
 
6
- have_func('rb_block_call')
7
- have_func('rb_ary_subseq')
8
-
7
+ $defs << "-D""RACC_INFO_VERSION=#{Racc::VERSION}"
9
8
  create_makefile 'racc/cparse'
data/lib/racc/grammar.rb CHANGED
@@ -27,6 +27,7 @@ module Racc
27
27
  @rules = [] # :: [Rule]
28
28
  @start = nil
29
29
  @n_expected_srconflicts = nil
30
+ @error_on_expect_mismatch = nil
30
31
  @prec_table = []
31
32
  @prec_table_closed = false
32
33
  @closed = false
@@ -36,6 +37,7 @@ module Racc
36
37
  attr_reader :start
37
38
  attr_reader :symboltable
38
39
  attr_accessor :n_expected_srconflicts
40
+ attr_accessor :error_on_expect_mismatch
39
41
 
40
42
  def [](x)
41
43
  @rules[x]
@@ -335,14 +337,14 @@ module Racc
335
337
  if action
336
338
  idbase = "#{type}@#{id}-#{@seqs[type] += 1}"
337
339
  target = _wrap(idbase, "#{idbase}-core", action)
338
- _regist("#{idbase}-core", &block)
340
+ _register("#{idbase}-core", &block)
339
341
  else
340
- target = _regist("#{type}@#{id}", &block)
342
+ target = _register("#{type}@#{id}", &block)
341
343
  end
342
344
  @grammar.intern(target)
343
345
  end
344
346
 
345
- def _regist(target_name)
347
+ def _register(target_name)
346
348
  target = target_name.intern
347
349
  unless _added?(@grammar.intern(target))
348
350
  yield(target).each_rule do |rule|
@@ -787,6 +789,81 @@ module Racc
787
789
  end
788
790
 
789
791
 
792
+ class OptionMark
793
+ def initialize(lineno)
794
+ @lineno = lineno
795
+ end
796
+
797
+ def name
798
+ '?'
799
+ end
800
+
801
+ alias inspect name
802
+
803
+ attr_reader :lineno
804
+ end
805
+
806
+
807
+ class ManyMark
808
+ def initialize(lineno)
809
+ @lineno = lineno
810
+ end
811
+
812
+ def name
813
+ '*'
814
+ end
815
+
816
+ alias inspect name
817
+
818
+ attr_reader :lineno
819
+ end
820
+
821
+
822
+ class Many1Mark
823
+ def initialize(lineno)
824
+ @lineno = lineno
825
+ end
826
+
827
+ def name
828
+ '+'
829
+ end
830
+
831
+ alias inspect name
832
+
833
+ attr_reader :lineno
834
+ end
835
+
836
+
837
+ class GroupStartMark
838
+ def initialize(lineno)
839
+ @lineno = lineno
840
+ end
841
+
842
+ def name
843
+ '('
844
+ end
845
+
846
+ alias inspect name
847
+
848
+ attr_reader :lineno
849
+ end
850
+
851
+
852
+ class GroupEndMark
853
+ def initialize(lineno)
854
+ @lineno = lineno
855
+ end
856
+
857
+ def name
858
+ ')'
859
+ end
860
+
861
+ alias inspect name
862
+
863
+ attr_reader :lineno
864
+ end
865
+
866
+
790
867
  class Prec
791
868
  def initialize(symbol, lineno)
792
869
  @symbol = symbol
@@ -993,10 +1070,6 @@ module Racc
993
1070
  @to_s = '$end'
994
1071
  @serialized = 'false'
995
1072
  @string = false
996
- when ErrorSymbolValue
997
- @to_s = 'error'
998
- @serialized = 'Object.new'
999
- @string = false
1000
1073
  else
1001
1074
  raise ArgumentError, "unknown symbol value: #{value.class}"
1002
1075
  end
@@ -76,6 +76,9 @@ module Racc
76
76
  raise CompileError, "`expect' seen twice"
77
77
  end
78
78
  @grammar.n_expected_srconflicts = num
79
+ }\
80
+ | seq(:ERROR_ON_EXPECT_MISMATCH) {|*|
81
+ @grammar.error_on_expect_mismatch = true
79
82
  }
80
83
 
81
84
  g.convdef = seq(:symbol, :STRING) {|sym, code|
@@ -133,6 +136,21 @@ module Racc
133
136
  | seq("|") {|*|
134
137
  OrMark.new(@scanner.lineno)
135
138
  }\
139
+ | seq("?") {|*|
140
+ OptionMark.new(@scanner.lineno)
141
+ }\
142
+ | seq("*") {|*|
143
+ ManyMark.new(@scanner.lineno)
144
+ }\
145
+ | seq("+") {|*|
146
+ Many1Mark.new(@scanner.lineno)
147
+ }\
148
+ | seq("(") {|*|
149
+ GroupStartMark.new(@scanner.lineno)
150
+ }\
151
+ | seq(")") {|*|
152
+ GroupEndMark.new(@scanner.lineno)
153
+ }\
136
154
  | seq("=", :symbol) {|_, sym|
137
155
  Prec.new(sym, @scanner.lineno)
138
156
  }\
@@ -210,27 +228,114 @@ module Racc
210
228
  end
211
229
 
212
230
  def add_rule_block(list)
213
- sprec = nil
214
231
  target = list.shift
215
232
  case target
216
- when OrMark, UserAction, Prec
233
+ when OrMark, OptionMark, ManyMark, Many1Mark, GroupStartMark, GroupEndMark, UserAction, Prec
217
234
  raise CompileError, "#{target.lineno}: unexpected symbol #{target.name}"
218
235
  end
236
+ enum = list.each.with_index
237
+ _, sym, idx = _add_rule_block(target, enum)
238
+ if idx
239
+ # sym is Racc::GroupEndMark
240
+ raise "#{sym.lineno}: unexpected symbol ')' at pos=#{idx}"
241
+ end
242
+ end
243
+
244
+ def _add_rule_block(target, enum)
245
+ rules = [] # [ [seqs, sprec], .. ]
219
246
  curr = []
220
- list.each do |i|
221
- case i
247
+ sprec = nil
248
+ while (sym, idx = enum.next rescue nil)
249
+ case sym
222
250
  when OrMark
223
- add_rule target, curr, sprec
251
+ rules << [curr, sprec]
224
252
  curr = []
225
253
  sprec = nil
254
+ when OptionMark
255
+ curr << _add_option_rule(curr.pop)
256
+ when ManyMark
257
+ curr << _add_many_rule(curr.pop)
258
+ when Many1Mark
259
+ curr << _add_many1_rule(curr.pop)
260
+ when GroupStartMark
261
+ curr << _add_group_rule(enum)
262
+ when GroupEndMark
263
+ rules << [curr, sprec]
264
+ return rules, sym, idx
226
265
  when Prec
227
266
  raise CompileError, "'=<prec>' used twice in one rule" if sprec
228
- sprec = i.symbol
267
+ sprec = sym.symbol
229
268
  else
230
- curr.push i
269
+ curr.push sym
231
270
  end
232
271
  end
233
- add_rule target, curr, sprec
272
+ rules << [curr, sprec]
273
+ rules.each do |syms, sprec|
274
+ add_rule target, syms, sprec
275
+ end
276
+ nil
277
+ end
278
+
279
+
280
+ def _add_option_rule(prev)
281
+ @option_rule_registry ||= {}
282
+ target = @option_rule_registry[prev.to_s]
283
+ return target if target
284
+ target = _gen_target_name("option", prev)
285
+ @option_rule_registry[prev.to_s] = target
286
+ act = UserAction.empty
287
+ @grammar.add Rule.new(target, [], act)
288
+ @grammar.add Rule.new(target, [prev], act)
289
+ target
290
+ end
291
+
292
+ def _add_many_rule(prev)
293
+ @many_rule_registry ||= {}
294
+ target = @many_rule_registry[prev.to_s]
295
+ return target if target
296
+ target = _gen_target_name("many", prev)
297
+ @many_rule_registry[prev.to_s] = target
298
+ src = SourceText.new("result = val[1] ? val[1].unshift(val[0]) : val", __FILE__, __LINE__)
299
+ act = UserAction.source_text(src)
300
+ @grammar.add Rule.new(target, [], act)
301
+ @grammar.add Rule.new(target, [prev, target], act)
302
+ target
303
+ end
304
+
305
+ def _add_many1_rule(prev)
306
+ @many1_rule_registry ||= {}
307
+ target = @many1_rule_registry[prev.to_s]
308
+ return target if target
309
+ target = _gen_target_name("many1", prev)
310
+ @many1_rule_registry[prev.to_s] = target
311
+ src = SourceText.new("result = val[1] ? val[1].unshift(val[0]) : val", __FILE__, __LINE__)
312
+ act = UserAction.source_text(src)
313
+ @grammar.add Rule.new(target, [prev], act)
314
+ @grammar.add Rule.new(target, [prev, target], act)
315
+ target
316
+ end
317
+
318
+ def _add_group_rule(enum)
319
+ target = @grammar.intern("-temp-group", true)
320
+ rules, _ = _add_rule_block(target, enum)
321
+ target_name = rules.map{|syms, sprec| syms.join("-")}.join("|")
322
+ @group_rule_registry ||= {}
323
+ unless target = @group_rule_registry[target_name]
324
+ target = @grammar.intern("-group@#{target_name}", true)
325
+ @group_rule_registry[target_name] = target
326
+ src = SourceText.new("result = val", __FILE__, __LINE__)
327
+ act = UserAction.source_text(src)
328
+ rules.each do |syms, sprec|
329
+ rule = Rule.new(target, syms, act)
330
+ rule.specified_prec = sprec
331
+ @grammar.add rule
332
+ end
333
+ end
334
+ target
335
+ end
336
+
337
+ def _gen_target_name(type, sym)
338
+ @grammar.intern("-#{type}@#{sym.value}", true)
234
339
  end
235
340
 
236
341
  def add_rule(target, list, sprec)
@@ -260,9 +365,9 @@ module Racc
260
365
  _, *blocks = *@scanner.epilogue.split(/^----/)
261
366
  blocks.each do |block|
262
367
  header, *body = block.lines.to_a
263
- label0, pathes = *header.sub(/\A-+/, '').split('=', 2)
368
+ label0, paths = *header.sub(/\A-+/, '').split('=', 2)
264
369
  label = canonical_label(label0)
265
- (pathes ? pathes.strip.split(' ') : []).each do |path|
370
+ (paths ? paths.strip.split(' ') : []).each do |path|
266
371
  add_user_code label, SourceText.new(File.read(path), path, 1)
267
372
  end
268
373
  add_user_code label, SourceText.new(body.join(''), @filename, line + 1)
@@ -391,6 +496,7 @@ module Racc
391
496
  'options' => :OPTION,
392
497
  'start' => :START,
393
498
  'expect' => :EXPECT,
499
+ 'error_on_expect_mismatch' => :ERROR_ON_EXPECT_MISMATCH,
394
500
  'class' => :CLASS,
395
501
  'rule' => :RULE,
396
502
  'end' => :END
data/lib/racc/info.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  #--
2
3
  #
3
4
  #
@@ -11,7 +12,7 @@
11
12
  #++
12
13
 
13
14
  module Racc
14
- VERSION = '1.6.0'
15
+ VERSION = '1.8.0'
15
16
  Version = VERSION
16
17
  Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
17
18
  end
@@ -1,6 +1,5 @@
1
1
  module Racc
2
2
  PARSER_TEXT = <<'__end_of_file__'
3
- # frozen_string_literal: false
4
3
  #--
5
4
  # Copyright (c) 1999-2006 Minero Aoki
6
5
  #
@@ -12,17 +11,23 @@ module Racc
12
11
  # without restriction.
13
12
  #++
14
13
 
15
- require 'racc/info'
14
+ unless $".find {|p| p.end_with?('/racc/info.rb')}
15
+ $".push "#{__dir__}/racc/info.rb"
16
+
17
+ module Racc
18
+ VERSION = '1.8.0'
19
+ Version = VERSION
20
+ Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
21
+ end
16
22
 
17
- unless defined?(NotImplementedError)
18
- NotImplementedError = NotImplementError # :nodoc:
19
23
  end
20
24
 
25
+
21
26
  module Racc
22
27
  class ParseError < StandardError; end
23
28
  end
24
29
  unless defined?(::ParseError)
25
- ParseError = Racc::ParseError
30
+ ParseError = Racc::ParseError # :nodoc:
26
31
  end
27
32
 
28
33
  # Racc is a LALR(1) parser generator.
@@ -55,10 +60,12 @@ end
55
60
  # [-v, --verbose]
56
61
  # verbose mode. create +filename+.output file, like yacc's y.output file.
57
62
  # [-g, --debug]
58
- # add debug code to parser class. To display debuggin information,
63
+ # add debug code to parser class. To display debugging information,
59
64
  # use this '-g' option and set @yydebug true in parser class.
60
65
  # [-E, --embedded]
61
66
  # Output parser which doesn't need runtime files (racc/parser.rb).
67
+ # [-F, --frozen]
68
+ # Output parser which declares frozen_string_literals: true
62
69
  # [-C, --check-only]
63
70
  # Check syntax of racc grammar file and quit.
64
71
  # [-S, --output-status]
@@ -262,11 +269,11 @@ module Racc
262
269
  # def next_token
263
270
  # @q.shift
264
271
  # end
265
- class_eval %{
272
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
266
273
  def do_parse
267
274
  #{Racc_Main_Parsing_Routine}(_racc_setup(), false)
268
275
  end
269
- }
276
+ RUBY
270
277
 
271
278
  # The method to fetch next token.
272
279
  # If you use #do_parse method, you must implement #next_token.
@@ -324,11 +331,11 @@ module Racc
324
331
  #
325
332
  # RECEIVER#METHOD_ID is a method to get next token.
326
333
  # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
327
- class_eval %{
334
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
328
335
  def yyparse(recv, mid)
329
336
  #{Racc_YY_Parse_Method}(recv, mid, _racc_setup(), false)
330
337
  end
331
- }
338
+ RUBY
332
339
 
333
340
  def _racc_yyparse_rb(recv, mid, arg, c_debug)
334
341
  action_table, action_check, action_default, action_pointer,
@@ -537,7 +544,7 @@ module Racc
537
544
  #
538
545
  # If this method returns, parsers enter "error recovering mode".
539
546
  def on_error(t, val, vstack)
540
- raise ParseError, sprintf("\nparse error on value %s (%s)",
547
+ raise ParseError, sprintf("parse error on value %s (%s)",
541
548
  val.inspect, token_to_str(t) || '?')
542
549
  end
543
550
 
data/lib/racc/parser.rb CHANGED
@@ -1,4 +1,4 @@
1
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
2
2
  #--
3
3
  # Copyright (c) 1999-2006 Minero Aoki
4
4
  #
@@ -12,15 +12,11 @@
12
12
 
13
13
  require 'racc/info'
14
14
 
15
- unless defined?(NotImplementedError)
16
- NotImplementedError = NotImplementError # :nodoc:
17
- end
18
-
19
15
  module Racc
20
16
  class ParseError < StandardError; end
21
17
  end
22
18
  unless defined?(::ParseError)
23
- ParseError = Racc::ParseError
19
+ ParseError = Racc::ParseError # :nodoc:
24
20
  end
25
21
 
26
22
  # Racc is a LALR(1) parser generator.
@@ -53,10 +49,12 @@ end
53
49
  # [-v, --verbose]
54
50
  # verbose mode. create +filename+.output file, like yacc's y.output file.
55
51
  # [-g, --debug]
56
- # add debug code to parser class. To display debuggin information,
52
+ # add debug code to parser class. To display debugging information,
57
53
  # use this '-g' option and set @yydebug true in parser class.
58
54
  # [-E, --embedded]
59
55
  # Output parser which doesn't need runtime files (racc/parser.rb).
56
+ # [-F, --frozen]
57
+ # Output parser which declares frozen_string_literals: true
60
58
  # [-C, --check-only]
61
59
  # Check syntax of racc grammar file and quit.
62
60
  # [-S, --output-status]
@@ -260,11 +258,11 @@ module Racc
260
258
  # def next_token
261
259
  # @q.shift
262
260
  # end
263
- class_eval %{
261
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
264
262
  def do_parse
265
263
  #{Racc_Main_Parsing_Routine}(_racc_setup(), false)
266
264
  end
267
- }
265
+ RUBY
268
266
 
269
267
  # The method to fetch next token.
270
268
  # If you use #do_parse method, you must implement #next_token.
@@ -322,11 +320,11 @@ module Racc
322
320
  #
323
321
  # RECEIVER#METHOD_ID is a method to get next token.
324
322
  # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
325
- class_eval %{
323
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
326
324
  def yyparse(recv, mid)
327
325
  #{Racc_YY_Parse_Method}(recv, mid, _racc_setup(), false)
328
326
  end
329
- }
327
+ RUBY
330
328
 
331
329
  def _racc_yyparse_rb(recv, mid, arg, c_debug)
332
330
  action_table, action_check, action_default, action_pointer,
@@ -535,7 +533,7 @@ module Racc
535
533
  #
536
534
  # If this method returns, parsers enter "error recovering mode".
537
535
  def on_error(t, val, vstack)
538
- raise ParseError, sprintf("\nparse error on value %s (%s)",
536
+ raise ParseError, sprintf("parse error on value %s (%s)",
539
537
  val.inspect, token_to_str(t) || '?')
540
538
  end
541
539
 
@@ -45,6 +45,7 @@ module Racc
45
45
  bool_attr :convert_line
46
46
  bool_attr :convert_line_all
47
47
  bool_attr :embed_runtime
48
+ bool_attr :frozen_strings
48
49
  bool_attr :make_executable
49
50
  attr_accessor :interpreter
50
51
 
@@ -64,6 +65,7 @@ module Racc
64
65
  self.convert_line = true
65
66
  self.convert_line_all = false
66
67
  self.embed_runtime = false
68
+ self.frozen_strings = false
67
69
  self.make_executable = false
68
70
  self.interpreter = nil
69
71
  end
@@ -122,6 +124,7 @@ module Racc
122
124
  end
123
125
 
124
126
  def notice
127
+ line %q[# frozen_string_literal: true] if @params.frozen_strings?
125
128
  line %q[#]
126
129
  line %q[# DO NOT MODIFY!!!!]
127
130
  line %Q[# This file is automatically generated by Racc #{Racc::Version}]
@@ -135,8 +138,8 @@ module Racc
135
138
 
136
139
  def embed_library(src)
137
140
  line %[###### #{src.filename} begin]
138
- line %[unless $".index '#{src.filename}']
139
- line %[$".push '#{src.filename}']
141
+ line %[unless $".find {|p| p.end_with?('/#{src.filename}')}]
142
+ line %[$".push "\#{__dir__}/#{src.filename}"]
140
143
  put src, @params.convert_line?
141
144
  line %[end]
142
145
  line %[###### #{src.filename} end]
@@ -310,8 +313,10 @@ module Racc
310
313
  racc_reduce_n,
311
314
  racc_use_result_var ]
312
315
  End
316
+ line "Ractor.make_shareable(Racc_arg) if defined?(Ractor)"
313
317
  line
314
318
  string_list 'Racc_token_to_s_table', table.token_to_s_table
319
+ line "Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)"
315
320
  line
316
321
  line "Racc_debug_parser = #{table.debug_parser}"
317
322
  line
data/lib/racc/state.rb CHANGED
@@ -73,6 +73,10 @@ module Racc
73
73
  (n_srconflicts() != @grammar.n_expected_srconflicts)
74
74
  end
75
75
 
76
+ def should_error_on_expect_mismatch?
77
+ should_report_srconflict? && @grammar.error_on_expect_mismatch
78
+ end
79
+
76
80
  def srconflict_exist?
77
81
  n_srconflicts() != 0
78
82
  end
@@ -216,7 +216,7 @@ module Racc
216
216
  end
217
217
  i = ii
218
218
  end
219
- Regexp.compile(map, 'n')
219
+ Regexp.compile(map, Regexp::NOENCODING)
220
220
  end
221
221
 
222
222
  def set_table(entries, dummy, tbl, chk, ptr)