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 +4 -4
- data/BSDL +22 -0
- data/COPYING +56 -22
- data/ChangeLog +3 -3
- data/README.ja.rdoc +2 -10
- data/README.rdoc +1 -1
- data/bin/racc +26 -32
- data/doc/en/grammar.en.rdoc +99 -107
- data/lib/racc/grammar.rb +82 -5
- data/lib/racc/grammarfileparser.rb +119 -13
- data/lib/racc/info.rb +1 -1
- data/lib/racc/parser-text.rb +2 -6
- data/lib/racc/parser.rb +1 -5
- data/lib/racc/parserfilegenerator.rb +3 -3
- data/lib/racc/state.rb +7 -3
- data/lib/racc/statetransitiontable.rb +1 -1
- data/lib/racc/static.rb +5 -5
- data/lib/racc.rb +6 -6
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69b370f19f8eac7c705b49dd5d6c005a52c07ea1e00198453628d3eb68ac0e74
|
4
|
+
data.tar.gz: abad1bf0e54c19b185f043a9e37517c3fcb0240103e6dfa268ee5a7a5ade62fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
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
|
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/
|
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
|
-
*
|
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
|
19
|
-
(*) C コンパイラと make
|
20
|
-
|
12
|
+
* Ruby 2.5 以降
|
21
13
|
|
22
14
|
== インストール
|
23
15
|
|
data/README.rdoc
CHANGED
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]
|
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
|
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
|
-
|
102
|
-
Racc::Parser::Racc_Runtime_Core_Version_R)
|
102
|
+
Racc::Parser::Racc_Runtime_Core_Version_R
|
103
103
|
else
|
104
|
-
|
105
|
-
Racc::Parser::Racc_Runtime_Core_Version_C)
|
104
|
+
Racc::Parser::Racc_Runtime_Core_Version_C
|
106
105
|
end
|
107
|
-
exit
|
106
|
+
exit
|
108
107
|
}
|
109
108
|
parser.on('--copyright', 'Prints copyright and quit.') {
|
110
109
|
puts Racc::Copyright
|
111
|
-
exit
|
110
|
+
exit
|
112
111
|
}
|
113
112
|
parser.on('--help', 'Prints this message and quit.') {
|
114
113
|
puts parser.help
|
115
|
-
exit
|
114
|
+
exit
|
116
115
|
}
|
117
116
|
begin
|
118
117
|
parser.parse!
|
119
118
|
rescue OptionParser::ParseError => err
|
120
|
-
|
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
|
-
|
130
|
-
|
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
|
-
|
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
|
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
|
-
|
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 =
|
283
|
+
t1 = ::Process.times.utime
|
290
284
|
result = yield
|
291
|
-
t2 =
|
285
|
+
t2 = ::Process.times.utime
|
292
286
|
@log.push [name, t2 - t1]
|
293
287
|
result
|
294
288
|
else
|
data/doc/en/grammar.en.rdoc
CHANGED
@@ -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
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
rule
|
27
|
-
|
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
|
34
|
-
|
35
|
-
module M
|
36
|
-
|
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
|
-
|
52
|
-
|
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
|
-
|
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
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
-
|
116
|
-
|
117
|
-
|
118
|
-
preclow
|
119
|
-
|
120
|
-
rule
|
121
|
-
|
122
|
-
|
123
|
-
|
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
|
-
|
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
|
-
|
185
|
-
|
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
|
-
|
196
|
-
|
197
|
-
|
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
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
---- inner
|
223
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
221
|
-
|
247
|
+
sprec = nil
|
248
|
+
while (sym, idx = enum.next rescue nil)
|
249
|
+
case sym
|
222
250
|
when OrMark
|
223
|
-
|
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 =
|
267
|
+
sprec = sym.symbol
|
229
268
|
else
|
230
|
-
curr.push
|
269
|
+
curr.push sym
|
231
270
|
end
|
232
271
|
end
|
233
|
-
|
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
data/lib/racc/parser-text.rb
CHANGED
@@ -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.
|
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
|
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
|
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
|
data/lib/racc/state.rb
CHANGED
@@ -10,9 +10,9 @@
|
|
10
10
|
#
|
11
11
|
#++
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
data/lib/racc/static.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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.
|
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:
|
12
|
+
date: 2024-07-30 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: |
|
15
|
-
Racc is
|
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.
|
88
|
+
rubygems_version: 3.5.0.dev
|
87
89
|
signing_key:
|
88
90
|
specification_version: 4
|
89
|
-
summary: Racc is
|
91
|
+
summary: Racc is an LALR(1) parser generator
|
90
92
|
test_files: []
|