racc 1.7.3.pre.1-java → 1.8.1-java
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.
- 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/doc/en/grammar2.en.rdoc +1 -1
- data/lib/java/racc/cparse-jruby.jar +0 -0
- 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 +9 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f81027e59aab934bcb1b2644e43010745823b7b23ddcb55e0297bfef28e091d
|
4
|
+
data.tar.gz: adb0448c22bb22b05d86b284fdc48c939c2f59e380bda254901b46d7a3373454
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d2d57b61c0e86bc0ad97bd06d72c89344d07f3172b44b0dfb4a222fa3da2b8519e931930be5faec182298fa9ebc49a1417fd82b3a7559bc4c005e58c4ded552e
|
7
|
+
data.tar.gz: 91fa16f2817bc02632241fa1b356e1daae0aa2cad79d8b0b0a2c71d6eab116c0614555232e26ee755e14789ae4a8e9d5ba92388ec9fe8df22ca798d6d856946c
|
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
|
-
rule
|
135
|
-
expect 3
|
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/doc/en/grammar2.en.rdoc
CHANGED
Binary file
|
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: java
|
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
|
@@ -28,6 +28,7 @@ extra_rdoc_files:
|
|
28
28
|
- README.ja.rdoc
|
29
29
|
- README.rdoc
|
30
30
|
files:
|
31
|
+
- BSDL
|
31
32
|
- COPYING
|
32
33
|
- ChangeLog
|
33
34
|
- README.ja.rdoc
|
@@ -63,7 +64,8 @@ homepage: https://github.com/ruby/racc
|
|
63
64
|
licenses:
|
64
65
|
- Ruby
|
65
66
|
- BSD-2-Clause
|
66
|
-
metadata:
|
67
|
+
metadata:
|
68
|
+
changelog_uri: https://github.com/ruby/racc/releases
|
67
69
|
post_install_message:
|
68
70
|
rdoc_options:
|
69
71
|
- "--main"
|
@@ -77,12 +79,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
79
|
version: '2.5'
|
78
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
81
|
requirements:
|
80
|
-
- - "
|
82
|
+
- - ">="
|
81
83
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
84
|
+
version: '0'
|
83
85
|
requirements: []
|
84
86
|
rubygems_version: 3.3.26
|
85
87
|
signing_key:
|
86
88
|
specification_version: 4
|
87
|
-
summary: Racc is
|
89
|
+
summary: Racc is an LALR(1) parser generator
|
88
90
|
test_files: []
|