racc 1.7.3 → 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 846dee114d1ef9fb3a80c99ea23a02a452412fa2817ad083848d6f0aabc76931
4
- data.tar.gz: 2eabf79dc8515992c8b764e664f39c4a38da10c5683c3850156698070fa1348d
3
+ metadata.gz: 69b370f19f8eac7c705b49dd5d6c005a52c07ea1e00198453628d3eb68ac0e74
4
+ data.tar.gz: abad1bf0e54c19b185f043a9e37517c3fcb0240103e6dfa268ee5a7a5ade62fe
5
5
  SHA512:
6
- metadata.gz: e56e63a9cdf7826b79985833bf5402a0a0121e548ffe3c7531922b2f2cf139186189eda45fbc086b27c7686224e28922b4abd3687189d86262fa08d1f14a3bec
7
- data.tar.gz: f55154a97d29a2b680d67688f05d324ded7cba0f8182e8154042de9f40fb9d14543c97e011a708ea3a038e8a12208ee73f92f33d1e4a79e3e523d36ade5c91cd
6
+ metadata.gz: 532d1963e4f214b026d6286e8ff357f676467e45d63dc3d4cd46bd48290f66c242f3fc177090109fe9faca73a30f79b1171f17c94e9e59c5796fb6f5448fe59d
7
+ data.tar.gz: d85b06738c817c235aae22521dd2cfda5b7b7b3ca914dc08f554a34d6ed76a665d72e89b46367ca6ae61ba275b44d563cd3bfebe997bae537098165d0e341c78
data/BSDL ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
data/COPYING CHANGED
@@ -1,22 +1,56 @@
1
- Copyright (C) 2019 Yukihiro Matsumoto. All rights reserved.
2
-
3
- Redistribution and use in source and binary forms, with or without
4
- modification, are permitted provided that the following conditions
5
- are met:
6
- 1. Redistributions of source code must retain the above copyright
7
- notice, this list of conditions and the following disclaimer.
8
- 2. Redistributions in binary form must reproduce the above copyright
9
- notice, this list of conditions and the following disclaimer in the
10
- documentation and/or other materials provided with the distribution.
11
-
12
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
- SUCH DAMAGE.
1
+ Ruby is copyrighted free software by Yukihiro Matsumoto <matz@netlab.jp>.
2
+ You can redistribute it and/or modify it under either the terms of the
3
+ 2-clause BSDL (see the file BSDL), or the conditions below:
4
+
5
+ 1. You may make and give away verbatim copies of the source form of the
6
+ software without restriction, provided that you duplicate all of the
7
+ original copyright notices and associated disclaimers.
8
+
9
+ 2. You may modify your copy of the software in any way, provided that
10
+ you do at least ONE of the following:
11
+
12
+ a. place your modifications in the Public Domain or otherwise
13
+ make them Freely Available, such as by posting said
14
+ modifications to Usenet or an equivalent medium, or by allowing
15
+ the author to include your modifications in the software.
16
+
17
+ b. use the modified software only within your corporation or
18
+ organization.
19
+
20
+ c. give non-standard binaries non-standard names, with
21
+ instructions on where to get the original software distribution.
22
+
23
+ d. make other distribution arrangements with the author.
24
+
25
+ 3. You may distribute the software in object code or binary form,
26
+ provided that you do at least ONE of the following:
27
+
28
+ a. distribute the binaries and library files of the software,
29
+ together with instructions (in the manual page or equivalent)
30
+ on where to get the original distribution.
31
+
32
+ b. accompany the distribution with the machine-readable source of
33
+ the software.
34
+
35
+ c. give non-standard binaries non-standard names, with
36
+ instructions on where to get the original software distribution.
37
+
38
+ d. make other distribution arrangements with the author.
39
+
40
+ 4. You may modify and include the part of the software into any other
41
+ software (possibly commercial). But some files in the distribution
42
+ are not written by the author, so that they are not under these terms.
43
+
44
+ For the list of those files and their copying conditions, see the
45
+ file LEGAL.
46
+
47
+ 5. The scripts and library files supplied as input to or produced as
48
+ output from the software do not automatically fall under the
49
+ copyright of the software, but belong to whomever generated them,
50
+ and may be sold commercially, and may be aggregated with this
51
+ software.
52
+
53
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
54
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
55
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56
+ PURPOSE.
data/ChangeLog CHANGED
@@ -253,7 +253,7 @@ Mon Jul 3 04:34:32 2006 Minero Aoki <aamine@loveruby.net>
253
253
 
254
254
  * lib/racc/grammar.rb: class RuleTable -> Grammar.
255
255
 
256
- * lib/racc/grammar.rb: Grammar.new does not acccept a Compiler.
256
+ * lib/racc/grammar.rb: Grammar.new does not accept a Compiler.
257
257
 
258
258
  * lib/racc/grammar.rb: refactoring.
259
259
 
@@ -285,7 +285,7 @@ Mon Jul 3 04:34:32 2006 Minero Aoki <aamine@loveruby.net>
285
285
 
286
286
  * lib/racc/state.rb: class StateTable -> States.
287
287
 
288
- * lib/racc/state.rb: States.new does not acccept a Compiler.
288
+ * lib/racc/state.rb: States.new does not accept a Compiler.
289
289
 
290
290
  * lib/racc/state.rb: refactoring.
291
291
 
@@ -418,7 +418,7 @@ Tue Jul 26 23:37:46 2005 Minero Aoki <aamine@loveruby.net>
418
418
 
419
419
  Sun Jan 2 11:48:19 2005 Minero Aoki <aamine@loveruby.net>
420
420
 
421
- * lib/racc/grammer.rb (once_writer): bug! needs argument.
421
+ * lib/racc/grammar.rb (once_writer): bug! needs argument.
422
422
 
423
423
  Mon Feb 16 16:14:16 2004 Minero Aoki <aamine@loveruby.net>
424
424
 
data/README.ja.rdoc CHANGED
@@ -1,23 +1,15 @@
1
1
  = Racc
2
2
 
3
- * http://i.loveruby.net/en/projects/racc/
3
+ * https://github.com/ruby/racc
4
4
 
5
5
  == DESCRIPTION:
6
6
 
7
7
  Racc は LALR(1) パーサジェネレータです。
8
8
  yacc の Ruby 版に相当します。
9
9
 
10
- NOTE:
11
- Ruby 1.8.0 からは Racc のランタイムが標準添付されているので、
12
- Racc で生成したパーサを安心して配布できます。また Ruby 1.6 系に
13
- 対応させたい場合は racc -E で生成してください。
14
-
15
-
16
10
  == 必要環境
17
11
 
18
- * Ruby 1.8 以降
19
- (*) C コンパイラと make
20
-
12
+ * Ruby 2.5 以降
21
13
 
22
14
  == インストール
23
15
 
data/README.rdoc CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  == DESCRIPTION:
6
6
 
7
- Racc is a LALR(1) parser generator.
7
+ Racc is an LALR(1) parser generator.
8
8
  It is written in Ruby itself, and generates Ruby program.
9
9
 
10
10
  == Requirement
data/bin/racc CHANGED
@@ -30,7 +30,7 @@ def main
30
30
  profiler = RaccProfiler.new(false)
31
31
 
32
32
  parser = OptionParser.new
33
- parser.banner = "Usage: #{File.basename($0)} [options] <input>"
33
+ parser.banner = "Usage: #{File.basename($0)} [options] [input]"
34
34
  parser.on('-o', '--output-file=PATH',
35
35
  'output file name [<input>.tab.rb]') {|name|
36
36
  output = name
@@ -92,54 +92,52 @@ def main
92
92
  #}
93
93
  parser.on('--version', 'Prints version and quit.') {
94
94
  puts "racc version #{Racc::Version}"
95
- exit 0
95
+ exit
96
96
  }
97
97
  parser.on('--runtime-version', 'Prints runtime version and quit.') {
98
- printf "racc runtime version %s; %s\n",
98
+ printf "racc runtime version %s; %s core version %s\n",
99
99
  Racc::Parser::Racc_Runtime_Version,
100
+ Racc::Parser.racc_runtime_type,
100
101
  if Racc::Parser.racc_runtime_type == 'ruby'
101
- sprintf('ruby core version %s',
102
- Racc::Parser::Racc_Runtime_Core_Version_R)
102
+ Racc::Parser::Racc_Runtime_Core_Version_R
103
103
  else
104
- sprintf('c core version %s',
105
- Racc::Parser::Racc_Runtime_Core_Version_C)
104
+ Racc::Parser::Racc_Runtime_Core_Version_C
106
105
  end
107
- exit 0
106
+ exit
108
107
  }
109
108
  parser.on('--copyright', 'Prints copyright and quit.') {
110
109
  puts Racc::Copyright
111
- exit 0
110
+ exit
112
111
  }
113
112
  parser.on('--help', 'Prints this message and quit.') {
114
113
  puts parser.help
115
- exit 1
114
+ exit
116
115
  }
117
116
  begin
118
117
  parser.parse!
119
118
  rescue OptionParser::ParseError => err
120
- $stderr.puts err.message
121
- $stderr.puts parser.help
122
- exit 1
123
- end
124
- if ARGV.empty?
125
- $stderr.puts 'no input'
126
- exit 1
119
+ abort [err.message, parser.help].join("\n")
127
120
  end
128
121
  if ARGV.size > 1
129
- $stderr.puts 'too many input'
130
- exit 1
122
+ abort 'too many input'
123
+ end
124
+
125
+ input = ARGV[0] || "stdin"
126
+
127
+ if input == "stdin" && !output then
128
+ abort 'You must specify a path to read or use -o <path> for output.'
131
129
  end
132
- input = ARGV[0]
133
130
 
134
131
  begin
135
132
  $stderr.puts 'Parsing grammar file...' if verbose
136
133
  result = profiler.section('parse') {
137
134
  parser = Racc::GrammarFileParser.new(debug_flags)
138
- parser.parse(File.read(input), File.basename(input))
135
+ content = input == "stdin" ? ARGF.read : File.read(input)
136
+ parser.parse(content, File.basename(input))
139
137
  }
140
138
  if check_only
141
139
  $stderr.puts 'syntax ok'
142
- exit 0
140
+ exit
143
141
  end
144
142
 
145
143
  $stderr.puts 'Generating LALR states...' if verbose
@@ -195,11 +193,13 @@ def main
195
193
  end
196
194
 
197
195
  profiler.report
196
+ if states.should_error_on_expect_mismatch?
197
+ raise Racc::CompileError, "#{states.grammar.n_expected_srconflicts} shift/reduce conflicts are expected but #{states.n_srconflicts} shift/reduce conflicts exist"
198
+ end
198
199
  rescue Racc::Error, Errno::ENOENT, Errno::EPERM => err
199
200
  raise if $DEBUG or debug_flags.any?
200
201
  lineno = err.message.slice(/\A\d+:/).to_s
201
- $stderr.puts "#{File.basename $0}: #{input}:#{lineno} #{err.message.strip}"
202
- exit 1
202
+ abort "#{File.basename $0}: #{input}:#{lineno} #{err.message.strip}"
203
203
  end
204
204
  end
205
205
 
@@ -276,19 +276,13 @@ class RaccProfiler
276
276
  def initialize(really)
277
277
  @really = really
278
278
  @log = []
279
- unless ::Process.respond_to?(:times)
280
- # Ruby 1.6
281
- @class = ::Time
282
- else
283
- @class = ::Process
284
- end
285
279
  end
286
280
 
287
281
  def section(name)
288
282
  if @really
289
- t1 = @class.times.utime
283
+ t1 = ::Process.times.utime
290
284
  result = yield
291
- t2 = @class.times.utime
285
+ t2 = ::Process.times.utime
292
286
  @log.push [name, t2 - t1]
293
287
  result
294
288
  else
@@ -15,48 +15,47 @@ supported: Ruby style (`# ...`) and C style (`/* ... */`).
15
15
  == Class Block
16
16
 
17
17
  The class block is formed like this:
18
- --
19
- class CLASS_NAME
20
- [precedence table]
21
- [token declarations]
22
- [expected number of S/R conflict]
23
- [options]
24
- [semantic value conversion]
25
- [start rule]
26
- rule
27
- GRAMMARS
28
- --
18
+
19
+ class CLASS_NAME
20
+ [precedence table]
21
+ [token declarations]
22
+ [expected number of S/R conflict]
23
+ [options]
24
+ [semantic value conversion]
25
+ [start rule]
26
+ rule
27
+ GRAMMARS
28
+
29
29
  CLASS_NAME is a name of parser class.
30
30
  This is the name of generating parser class.
31
31
 
32
32
  If CLASS_NAME includes '::', Racc outputs module clause.
33
- For example, writing "class M::C" causes creating the code bellow:
34
- --
35
- module M
36
- class C
37
- :
38
- :
33
+ For example, writing "class M::C" causes creating the code below:
34
+
35
+ module M
36
+ class C
37
+ :
38
+ :
39
+ end
39
40
  end
40
- end
41
- --
42
41
 
43
42
  == Grammar Block
44
43
 
45
44
  The grammar block describes the grammar
46
45
  to be understood by parser. Syntax is:
47
- --
48
- (token): (token) (token) (token).... (action)
49
46
 
50
- (token): (token) (token) (token).... (action)
51
- | (token) (token) (token).... (action)
52
- | (token) (token) (token).... (action)
53
- --
47
+ (token): (token) (token) (token).... (action)
48
+
49
+ (token): (token) (token) (token).... (action)
50
+ | (token) (token) (token).... (action)
51
+ | (token) (token) (token).... (action)
52
+
54
53
  (action) is an action which is executed when its (token)s are found.
55
54
  (action) is a ruby code block, which is surrounded by braces:
56
- --
57
- { print val[0]
58
- puts val[1] }
59
- --
55
+
56
+ { print val[0]
57
+ puts val[1] }
58
+
60
59
  Note that you cannot use '%' string, here document, '%r' regexp in action.
61
60
 
62
61
  Actions can be omitted.
@@ -66,20 +65,20 @@ A return value of action is a value of left side value ($$).
66
65
  It is value of result, or returned value by "return" statement.
67
66
 
68
67
  Here is an example of whole grammar block.
69
- --
70
- rule
71
- goal: definition rules source { result = val }
72
-
73
- definition: /* none */ { result = [] }
74
- | definition startdesig { result[0] = val[1] }
75
- | definition
76
- precrule # this line continue from upper line
77
- {
78
- result[1] = val[1]
79
- }
80
-
81
- startdesig: START TOKEN
82
- --
68
+
69
+ rule
70
+ goal: definition rules source { result = val }
71
+
72
+ definition: /* none */ { result = [] }
73
+ | definition startdesig { result[0] = val[1] }
74
+ | definition
75
+ precrule # this line continue from upper line
76
+ {
77
+ result[1] = val[1]
78
+ }
79
+
80
+ startdesig: START TOKEN
81
+
83
82
  You can use following special local variables in action.
84
83
 
85
84
  * result ($$)
@@ -99,45 +98,43 @@ DO NOT MODIFY this stack unless you know what you are doing.
99
98
 
100
99
  This function is equal to '%prec' in yacc.
101
100
  To designate this block:
102
- --
103
- prechigh
104
- nonassoc '++'
105
- left '*' '/'
106
- left '+' '-'
107
- right '='
108
- preclow
109
- --
101
+
102
+ prechigh
103
+ nonassoc '++'
104
+ left '*' '/'
105
+ left '+' '-'
106
+ right '='
107
+ preclow
108
+
110
109
  `right' is yacc's %right, `left' is yacc's %left.
111
110
 
112
111
  `=' + (symbol) means yacc's %prec:
113
- --
114
- prechigh
115
- nonassoc UMINUS
116
- left '*' '/'
117
- left '+' '-'
118
- preclow
119
-
120
- rule
121
- exp: exp '*' exp
122
- | exp '-' exp
123
- | '-' exp =UMINUS # equals to "%prec UMINUS"
124
- :
125
- :
126
- --
112
+
113
+ prechigh
114
+ nonassoc UMINUS
115
+ left '*' '/'
116
+ left '+' '-'
117
+ preclow
118
+
119
+ rule
120
+ exp: exp '*' exp
121
+ | exp '-' exp
122
+ | '-' exp =UMINUS # equals to "%prec UMINUS"
123
+ :
124
+ :
127
125
 
128
126
  == expect
129
127
 
130
128
  Racc supports Bison's "expect" directive to declare the expected
131
129
  number of shift/reduce conflicts.
132
- --
133
- class MyParser
134
- expect 3
135
- rule
136
- :
137
- :
138
- --
139
- Then warnings are issued only when the effective number of conflicts differs.
140
130
 
131
+ class MyParser
132
+ expect 3
133
+ rule
134
+ :
135
+ :
136
+
137
+ Then warnings are issued only when the effective number of conflicts differs.
141
138
 
142
139
  == Declaring Tokens
143
140
 
@@ -145,17 +142,16 @@ Declaring tokens avoids many bugs.
145
142
 
146
143
  Racc outputs warnings for declared tokens that do not exist, or existing tokens not declared.
147
144
  The syntax is:
148
- --
149
- token TOKEN_NAME AND_IS_THIS
150
- ALSO_THIS_IS AGAIN_AND_AGAIN THIS_IS_LAST
151
- --
145
+
146
+ token TOKEN_NAME AND_IS_THIS
147
+ ALSO_THIS_IS AGAIN_AND_AGAIN THIS_IS_LAST
152
148
 
153
149
  == Options
154
150
 
155
151
  You can write options for racc command in your racc file.
156
- --
157
- options OPTION OPTION ...
158
- --
152
+
153
+ options OPTION OPTION ...
154
+
159
155
  Options are:
160
156
 
161
157
  * omit_action_call
@@ -179,32 +175,29 @@ Token symbols are, as default,
179
175
 
180
176
  You can change this default using a "convert" block.
181
177
  Here is an example:
182
- --
183
- convert
184
- PLUS 'PlusClass' # We use PlusClass for symbol of `PLUS'
185
- MIN 'MinusClass' # We use MinusClass for symbol of `MIN'
186
- end
187
- --
178
+
179
+ convert
180
+ PLUS 'PlusClass' # We use PlusClass for symbol of `PLUS'
181
+ MIN 'MinusClass' # We use MinusClass for symbol of `MIN'
182
+ end
183
+
188
184
  We can use almost all ruby value can be used by token symbol,
189
185
  except 'false' and 'nil'. These are causes unexpected parse error.
190
186
 
191
187
  If you want to use String as token symbol, special care is required.
192
188
  For example:
193
- --
194
- convert
195
- class '"cls"' # in code, "cls"
196
- PLUS '"plus\n"' # in code, "plus\n"
197
- MIN "\"minus#{val}\"" # in code, \"minus#{val}\"
198
- end
199
- --
189
+
190
+ convert
191
+ class '"cls"' # in code, "cls"
192
+ PLUS '"plus\n"' # in code, "plus\n"
193
+ MIN "\"minus#{val}\"" # in code, \"minus#{val}\"
194
+ end
200
195
 
201
196
  == Start Rule
202
197
 
203
198
  '%start' in yacc. This changes the start symbol.
204
- --
205
- start real_target
206
- --
207
199
 
200
+ start real_target
208
201
 
209
202
  == User Code Block
210
203
 
@@ -213,14 +206,13 @@ There are three user code blocks, "header" "inner" and "footer".
213
206
 
214
207
  User code blocks are introduced by four '-' at the beginning of a line,
215
208
  followed by a single-word name:
216
- --
217
- ---- header
218
- ruby statement
219
- ruby statement
220
- ruby statement
221
-
222
- ---- inner
223
- ruby statement
224
- :
225
- :
226
- --
209
+
210
+ ---- header
211
+ ruby statement
212
+ ruby statement
213
+ ruby statement
214
+
215
+ ---- inner
216
+ ruby statement
217
+ :
218
+ :
data/lib/racc/grammar.rb CHANGED
@@ -10,11 +10,11 @@
10
10
  #
11
11
  #++
12
12
 
13
- require 'racc/compat'
14
- require 'racc/iset'
15
- require 'racc/sourcetext'
16
- require 'racc/logfilegenerator'
17
- require 'racc/exception'
13
+ require_relative 'compat'
14
+ require_relative 'iset'
15
+ require_relative 'sourcetext'
16
+ require_relative 'logfilegenerator'
17
+ require_relative 'exception'
18
18
  require 'forwardable'
19
19
 
20
20
  module Racc
@@ -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]
@@ -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
@@ -10,11 +10,11 @@
10
10
  #
11
11
  #++
12
12
 
13
- require 'racc'
14
- require 'racc/compat'
15
- require 'racc/grammar'
16
- require 'racc/parserfilegenerator'
17
- require 'racc/sourcetext'
13
+ require_relative '../racc'
14
+ require_relative 'compat'
15
+ require_relative 'grammar'
16
+ require_relative 'parserfilegenerator'
17
+ require_relative 'sourcetext'
18
18
  require 'stringio'
19
19
 
20
20
  module Racc
@@ -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", @filename, @scanner.lineno + 1)
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", @filename, @scanner.lineno + 1)
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", @filename, @scanner.lineno + 1)
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)
@@ -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
@@ -12,7 +12,7 @@
12
12
  #++
13
13
 
14
14
  module Racc
15
- VERSION = '1.7.3'
15
+ VERSION = '1.8.1'
16
16
  Version = VERSION
17
17
  Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
18
18
  end
@@ -15,7 +15,7 @@ unless $".find {|p| p.end_with?('/racc/info.rb')}
15
15
  $".push "#{__dir__}/racc/info.rb"
16
16
 
17
17
  module Racc
18
- VERSION = '1.7.3'
18
+ VERSION = '1.8.1'
19
19
  Version = VERSION
20
20
  Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
21
21
  end
@@ -23,10 +23,6 @@ end
23
23
  end
24
24
 
25
25
 
26
- unless defined?(NotImplementedError)
27
- NotImplementedError = NotImplementError # :nodoc:
28
- end
29
-
30
26
  module Racc
31
27
  class ParseError < StandardError; end
32
28
  end
@@ -34,7 +30,7 @@ unless defined?(::ParseError)
34
30
  ParseError = Racc::ParseError # :nodoc:
35
31
  end
36
32
 
37
- # Racc is a LALR(1) parser generator.
33
+ # Racc is an LALR(1) parser generator.
38
34
  # It is written in Ruby itself, and generates Ruby programs.
39
35
  #
40
36
  # == Command-line Reference
data/lib/racc/parser.rb CHANGED
@@ -12,10 +12,6 @@
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
@@ -23,7 +19,7 @@ unless defined?(::ParseError)
23
19
  ParseError = Racc::ParseError # :nodoc:
24
20
  end
25
21
 
26
- # Racc is a LALR(1) parser generator.
22
+ # Racc is an LALR(1) parser generator.
27
23
  # It is written in Ruby itself, and generates Ruby programs.
28
24
  #
29
25
  # == Command-line Reference
@@ -10,9 +10,9 @@
10
10
  #
11
11
  #++
12
12
 
13
- require 'racc/compat'
14
- require 'racc/sourcetext'
15
- require 'racc/parser-text'
13
+ require_relative 'compat'
14
+ require_relative 'sourcetext'
15
+ require_relative 'parser-text'
16
16
  require 'rbconfig'
17
17
 
18
18
  module Racc
data/lib/racc/state.rb CHANGED
@@ -10,9 +10,9 @@
10
10
  #
11
11
  #++
12
12
 
13
- require 'racc/iset'
14
- require 'racc/statetransitiontable'
15
- require 'racc/exception'
13
+ require_relative 'iset'
14
+ require_relative 'statetransitiontable'
15
+ require_relative 'exception'
16
16
  require 'forwardable'
17
17
 
18
18
  module Racc
@@ -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
@@ -10,7 +10,7 @@
10
10
  #
11
11
  #++
12
12
 
13
- require 'racc/parser'
13
+ require_relative 'parser'
14
14
 
15
15
  module Racc
16
16
 
data/lib/racc/static.rb CHANGED
@@ -1,5 +1,5 @@
1
- require 'racc'
2
- require 'racc/parser'
3
- require 'racc/grammarfileparser'
4
- require 'racc/parserfilegenerator'
5
- require 'racc/logfilegenerator'
1
+ require_relative '../racc'
2
+ require_relative 'parser'
3
+ require_relative 'grammarfileparser'
4
+ require_relative 'parserfilegenerator'
5
+ require_relative 'logfilegenerator'
data/lib/racc.rb CHANGED
@@ -1,6 +1,6 @@
1
- require 'racc/compat'
2
- require 'racc/debugflags'
3
- require 'racc/grammar'
4
- require 'racc/state'
5
- require 'racc/exception'
6
- require 'racc/info'
1
+ require_relative 'racc/compat'
2
+ require_relative 'racc/debugflags'
3
+ require_relative 'racc/grammar'
4
+ require_relative 'racc/state'
5
+ require_relative 'racc/exception'
6
+ require_relative 'racc/info'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: racc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.3
4
+ version: 1.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Minero Aoki
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-11-04 00:00:00.000000000 Z
12
+ date: 2024-07-30 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: |
15
- Racc is a LALR(1) parser generator.
15
+ Racc is an LALR(1) parser generator.
16
16
  It is written in Ruby itself, and generates Ruby program.
17
17
 
18
18
  NOTE: Ruby 1.8.x comes with Racc runtime module. You
@@ -29,6 +29,7 @@ extra_rdoc_files:
29
29
  - README.ja.rdoc
30
30
  - README.rdoc
31
31
  files:
32
+ - BSDL
32
33
  - COPYING
33
34
  - ChangeLog
34
35
  - README.ja.rdoc
@@ -65,7 +66,8 @@ homepage: https://github.com/ruby/racc
65
66
  licenses:
66
67
  - Ruby
67
68
  - BSD-2-Clause
68
- metadata: {}
69
+ metadata:
70
+ changelog_uri: https://github.com/ruby/racc/releases
69
71
  post_install_message:
70
72
  rdoc_options:
71
73
  - "--main"
@@ -83,8 +85,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
85
  - !ruby/object:Gem::Version
84
86
  version: '0'
85
87
  requirements: []
86
- rubygems_version: 3.4.10
88
+ rubygems_version: 3.5.0.dev
87
89
  signing_key:
88
90
  specification_version: 4
89
- summary: Racc is a LALR(1) parser generator
91
+ summary: Racc is an LALR(1) parser generator
90
92
  test_files: []