racc 1.4.16 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.ja.rdoc +0 -1
- data/README.rdoc +8 -11
- data/bin/racc +37 -23
- data/{rdoc → doc}/en/NEWS.en.rdoc +0 -0
- data/{rdoc → doc}/en/grammar.en.rdoc +27 -31
- data/doc/en/grammar2.en.rdoc +219 -0
- data/{rdoc → doc}/ja/NEWS.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/command.ja.html +1 -1
- data/{rdoc → doc}/ja/debug.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/grammar.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/index.ja.html +0 -0
- data/{rdoc → doc}/ja/parser.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/usage.ja.html +0 -0
- data/ext/racc/cparse/cparse.c +19 -17
- data/ext/racc/cparse/extconf.rb +2 -1
- data/lib/racc/compat.rb +5 -4
- data/lib/racc/debugflags.rb +5 -4
- data/lib/racc/exception.rb +4 -1
- data/lib/racc/grammar.rb +22 -17
- data/lib/racc/grammarfileparser.rb +7 -6
- data/lib/racc/info.rb +5 -2
- data/lib/racc/iset.rb +5 -4
- data/lib/racc/logfilegenerator.rb +5 -4
- data/lib/racc/parser-text.rb +10 -16
- data/lib/racc/parser.rb +10 -16
- data/lib/racc/parserfilegenerator.rb +5 -47
- data/lib/racc/sourcetext.rb +5 -4
- data/lib/racc/state.rb +4 -1
- data/lib/racc/statetransitiontable.rb +9 -14
- metadata +22 -140
- data/DEPENDS +0 -4
- data/Manifest.txt +0 -146
- data/Rakefile +0 -58
- data/bin/racc2y +0 -195
- data/bin/y2racc +0 -339
- data/ext/racc/com/headius/racc/Cparse.java +0 -849
- data/fastcache/extconf.rb +0 -2
- data/fastcache/fastcache.c +0 -185
- data/lib/racc/pre-setup +0 -13
- data/misc/dist.sh +0 -31
- data/sample/array.y +0 -67
- data/sample/array2.y +0 -59
- data/sample/calc-ja.y +0 -66
- data/sample/calc.y +0 -65
- data/sample/conflict.y +0 -15
- data/sample/hash.y +0 -60
- data/sample/lalr.y +0 -17
- data/sample/lists.y +0 -57
- data/sample/syntax.y +0 -46
- data/sample/yyerr.y +0 -46
- data/setup.rb +0 -1587
- data/tasks/doc.rb +0 -12
- data/tasks/email.rb +0 -55
- data/test/assets/cadenza.y +0 -170
- data/test/assets/cast.y +0 -926
- data/test/assets/chk.y +0 -126
- data/test/assets/conf.y +0 -16
- data/test/assets/csspool.y +0 -729
- data/test/assets/digraph.y +0 -29
- data/test/assets/echk.y +0 -118
- data/test/assets/edtf.y +0 -583
- data/test/assets/err.y +0 -60
- data/test/assets/error_recovery.y +0 -35
- data/test/assets/expect.y +0 -7
- data/test/assets/firstline.y +0 -4
- data/test/assets/huia.y +0 -318
- data/test/assets/ichk.y +0 -102
- data/test/assets/intp.y +0 -546
- data/test/assets/journey.y +0 -47
- data/test/assets/liquor.y +0 -313
- data/test/assets/machete.y +0 -423
- data/test/assets/macruby.y +0 -2197
- data/test/assets/mailp.y +0 -437
- data/test/assets/mediacloth.y +0 -599
- data/test/assets/mof.y +0 -649
- data/test/assets/namae.y +0 -302
- data/test/assets/nasl.y +0 -626
- data/test/assets/newsyn.y +0 -25
- data/test/assets/noend.y +0 -4
- data/test/assets/nokogiri-css.y +0 -255
- data/test/assets/nonass.y +0 -41
- data/test/assets/normal.y +0 -27
- data/test/assets/norule.y +0 -4
- data/test/assets/nullbug1.y +0 -25
- data/test/assets/nullbug2.y +0 -15
- data/test/assets/opal.y +0 -1807
- data/test/assets/opt.y +0 -123
- data/test/assets/percent.y +0 -35
- data/test/assets/php_serialization.y +0 -98
- data/test/assets/recv.y +0 -97
- data/test/assets/riml.y +0 -665
- data/test/assets/rrconf.y +0 -14
- data/test/assets/ruby18.y +0 -1943
- data/test/assets/ruby19.y +0 -2174
- data/test/assets/ruby20.y +0 -2350
- data/test/assets/ruby21.y +0 -2359
- data/test/assets/ruby22.y +0 -2381
- data/test/assets/scan.y +0 -72
- data/test/assets/syntax.y +0 -50
- data/test/assets/tp_plus.y +0 -622
- data/test/assets/twowaysql.y +0 -278
- data/test/assets/unterm.y +0 -5
- data/test/assets/useless.y +0 -12
- data/test/assets/yyerr.y +0 -46
- data/test/bench.y +0 -36
- data/test/helper.rb +0 -115
- data/test/infini.y +0 -8
- data/test/regress/cadenza +0 -796
- data/test/regress/cast +0 -3425
- data/test/regress/csspool +0 -2318
- data/test/regress/edtf +0 -1794
- data/test/regress/huia +0 -1392
- data/test/regress/journey +0 -222
- data/test/regress/liquor +0 -885
- data/test/regress/machete +0 -833
- data/test/regress/mediacloth +0 -1463
- data/test/regress/mof +0 -1368
- data/test/regress/namae +0 -634
- data/test/regress/nasl +0 -2058
- data/test/regress/nokogiri-css +0 -836
- data/test/regress/opal +0 -6429
- data/test/regress/php_serialization +0 -336
- data/test/regress/riml +0 -3297
- data/test/regress/ruby18 +0 -6351
- data/test/regress/ruby22 +0 -7456
- data/test/regress/tp_plus +0 -1933
- data/test/regress/twowaysql +0 -556
- data/test/scandata/brace +0 -7
- data/test/scandata/gvar +0 -1
- data/test/scandata/normal +0 -4
- data/test/scandata/percent +0 -18
- data/test/scandata/slash +0 -10
- data/test/src.intp +0 -34
- data/test/start.y +0 -20
- data/test/test_chk_y.rb +0 -52
- data/test/test_grammar_file_parser.rb +0 -15
- data/test/test_racc_command.rb +0 -322
- data/test/test_scan_y.rb +0 -52
- data/test/testscanner.rb +0 -51
- data/web/racc.en.rhtml +0 -42
- data/web/racc.ja.rhtml +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1dc09f1fcbc04e87d099180c64c1566e34c7b1f59c734c60a3760b149bd1a99
|
4
|
+
data.tar.gz: b74af200ad861ddad78ff850a15d7f1554c032c6e24e46841b40a212ee620a0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18d137641877399ad7ca6f475405fee151af9975df5f04c894c62ed2cba11835b880da0399a69303f663f772ae2283fdd09ce4dce924463c1df8c739a3e30f29
|
7
|
+
data.tar.gz: 5bec7de05bc72b35614140184f4619419b488f878206ed44d5e59405cf55045e90bd1b2eacef0501bd8195f9db035802e2f3e8d569812948cd944097a6f800f6
|
data/README.ja.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
= Racc
|
2
2
|
|
3
3
|
* http://i.loveruby.net/en/projects/racc/
|
4
|
-
* http://racc.rubyforge.org/
|
5
4
|
|
6
5
|
== DESCRIPTION:
|
7
6
|
|
@@ -16,8 +15,6 @@
|
|
16
15
|
== Requirement
|
17
16
|
|
18
17
|
* Ruby 1.8.x or later.
|
19
|
-
(*) make and C compiler.
|
20
|
-
|
21
18
|
|
22
19
|
== Installation
|
23
20
|
|
@@ -36,9 +33,9 @@
|
|
36
33
|
|
37
34
|
You can install Racc into your favorite directory by giving
|
38
35
|
options to setup.rb. e.g.
|
39
|
-
|
36
|
+
|
40
37
|
$ ruby setup.rb config --prefix=/usr
|
41
|
-
|
38
|
+
|
42
39
|
For details, try "ruby setup.rb --help".
|
43
40
|
|
44
41
|
|
@@ -61,9 +58,9 @@
|
|
61
58
|
|
62
59
|
$ ruby calc
|
63
60
|
|
64
|
-
... Does it
|
65
|
-
For details of Racc, see HTML documents placed under '
|
66
|
-
and sample
|
61
|
+
... Does it work?
|
62
|
+
For details of Racc, see HTML documents placed under 'rdoc/en/'
|
63
|
+
and sample grammar files under 'sample/'.
|
67
64
|
|
68
65
|
|
69
66
|
== License
|
@@ -76,9 +73,9 @@
|
|
76
73
|
|
77
74
|
== Bug Reports
|
78
75
|
|
79
|
-
Any kind of bug
|
80
|
-
If you find a bug of Racc, please email me. Your
|
81
|
-
debug output
|
76
|
+
Any kind of bug report is welcome.
|
77
|
+
If you find a bug of Racc, please email me. Your grammar file,
|
78
|
+
debug output generated by "racc -g", are helpful.
|
82
79
|
|
83
80
|
|
84
81
|
Minero Aoki
|
data/bin/racc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
#
|
3
|
+
#
|
4
4
|
#
|
5
5
|
# Copyright (c) 1999-2006 Minero Aoki
|
6
6
|
#
|
@@ -51,7 +51,7 @@ def main
|
|
51
51
|
logfilename = path
|
52
52
|
}
|
53
53
|
parser.on('-e', '--executable [RUBYPATH]', 'Makes executable parser.') {|path|
|
54
|
-
|
54
|
+
make_executable = true
|
55
55
|
rubypath = (path == 'ruby' ? nil : path)
|
56
56
|
}
|
57
57
|
parser.on('-E', '--embedded', "Embeds Racc runtime in output.") {
|
@@ -71,10 +71,6 @@ def main
|
|
71
71
|
'Uses CLASSNAME instead of Racc::Parser.') {|name|
|
72
72
|
superclass = name
|
73
73
|
}
|
74
|
-
parser.on('--runtime=FEATURE',
|
75
|
-
"Uses FEATURE instead of 'racc/parser'") {|feat|
|
76
|
-
runtime = feature
|
77
|
-
}
|
78
74
|
parser.on('-C', '--check-only', 'Checks syntax and quit immediately.') {|fl|
|
79
75
|
check_only = fl
|
80
76
|
}
|
@@ -88,24 +84,21 @@ def main
|
|
88
84
|
debug_flags = Racc::DebugFlags.parse_option_string(flags)
|
89
85
|
}
|
90
86
|
#parser.on('--no-extensions', 'Run Racc without any Ruby extension.') {
|
91
|
-
# Racc.const_set :
|
87
|
+
# Racc.const_set :Racc_No_Extensions, true
|
92
88
|
#}
|
93
89
|
parser.on('--version', 'Prints version and quit.') {
|
94
90
|
puts "racc version #{Racc::Version}"
|
95
91
|
exit 0
|
96
92
|
}
|
97
93
|
parser.on('--runtime-version', 'Prints runtime version and quit.') {
|
98
|
-
printf "racc runtime version %s
|
94
|
+
printf "racc runtime version %s; %s\n",
|
99
95
|
Racc::Parser::Racc_Runtime_Version,
|
100
|
-
Racc::Parser::Racc_Runtime_Revision,
|
101
96
|
if Racc::Parser.racc_runtime_type == 'ruby'
|
102
|
-
sprintf('ruby core version %s
|
103
|
-
Racc::Parser::Racc_Runtime_Core_Version_R
|
104
|
-
Racc::Parser::Racc_Runtime_Core_Revision_R)
|
97
|
+
sprintf('ruby core version %s',
|
98
|
+
Racc::Parser::Racc_Runtime_Core_Version_R)
|
105
99
|
else
|
106
|
-
sprintf('c core version %s
|
107
|
-
Racc::Parser::Racc_Runtime_Core_Version_C
|
108
|
-
Racc::Parser::Racc_Runtime_Core_Revision_C)
|
100
|
+
sprintf('c core version %s',
|
101
|
+
Racc::Parser::Racc_Runtime_Core_Version_C)
|
109
102
|
end
|
110
103
|
exit 0
|
111
104
|
}
|
@@ -187,8 +180,12 @@ def main
|
|
187
180
|
log_useless states.grammar
|
188
181
|
log_conflict states
|
189
182
|
else
|
190
|
-
report_useless states.grammar
|
191
|
-
report_conflict states
|
183
|
+
has_useless = report_useless states.grammar
|
184
|
+
has_conflicts = report_conflict states
|
185
|
+
if has_useless || has_conflicts
|
186
|
+
preamble = make_logfile ? 'C' : 'Turn on logging with "-v" and c'
|
187
|
+
$stderr.puts %Q{#{preamble}heck ".output" file for details}
|
188
|
+
end
|
192
189
|
end
|
193
190
|
|
194
191
|
profiler.report
|
@@ -204,13 +201,29 @@ def make_filename(path, suffix)
|
|
204
201
|
path.sub(/(?:\..*?)?\z/, suffix)
|
205
202
|
end
|
206
203
|
|
204
|
+
LIST_LIMIT = 10
|
205
|
+
def report_list(enum, label)
|
206
|
+
c = enum.count
|
207
|
+
if c > 0
|
208
|
+
$stderr.puts "#{c} #{label}:"
|
209
|
+
enum.first(LIST_LIMIT).each do |item|
|
210
|
+
$stderr.puts " #{yield item}"
|
211
|
+
end
|
212
|
+
$stderr.puts " ..." if c > LIST_LIMIT
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
# @return [Boolean] if anything was reported
|
207
217
|
def report_conflict(states)
|
208
218
|
if states.should_report_srconflict?
|
219
|
+
reported = true
|
209
220
|
$stderr.puts "#{states.n_srconflicts} shift/reduce conflicts"
|
210
221
|
end
|
211
222
|
if states.rrconflict_exist?
|
223
|
+
reported = true
|
212
224
|
$stderr.puts "#{states.n_rrconflicts} reduce/reduce conflicts"
|
213
225
|
end
|
226
|
+
reported
|
214
227
|
end
|
215
228
|
|
216
229
|
def log_conflict(states)
|
@@ -225,16 +238,17 @@ def log_conflict(states)
|
|
225
238
|
}
|
226
239
|
end
|
227
240
|
|
241
|
+
# @return [Boolean] if anything was reported
|
228
242
|
def report_useless(grammar)
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
$stderr.puts "#{grammar.n_useless_rules} useless rules"
|
234
|
-
end
|
243
|
+
reported = report_list(grammar.each_useless_nonterminal, 'useless nonterminals', &:to_s)
|
244
|
+
|
245
|
+
reported ||= report_list(grammar.each_useless_rule, 'useless rules') { |r| "##{r.ident} (#{r.target})" }
|
246
|
+
|
235
247
|
if grammar.start.useless?
|
236
248
|
$stderr.puts 'fatal: start symbol does not derive any sentence'
|
249
|
+
reported = true
|
237
250
|
end
|
251
|
+
reported
|
238
252
|
end
|
239
253
|
|
240
254
|
def log_useless(grammar)
|
File without changes
|
@@ -4,25 +4,24 @@
|
|
4
4
|
|
5
5
|
== Class Block and User Code Block
|
6
6
|
|
7
|
-
There
|
8
|
-
|
9
|
-
places after 'class' block.
|
7
|
+
There are two top-level blocks: the 'class' block, and the 'user code'
|
8
|
+
block. The 'user code' block MUST be after the 'class' block.
|
10
9
|
|
11
10
|
== Comment
|
12
11
|
|
13
|
-
|
14
|
-
Ruby style (
|
12
|
+
Comments can be added about everywhere. Two comment styles are
|
13
|
+
supported: Ruby style (`# ...`) and C style (`/* ... */`).
|
15
14
|
|
16
15
|
== Class Block
|
17
16
|
|
18
17
|
The class block is formed like this:
|
19
18
|
--
|
20
19
|
class CLASS_NAME
|
21
|
-
[
|
22
|
-
[token
|
20
|
+
[precedence table]
|
21
|
+
[token declarations]
|
23
22
|
[expected number of S/R conflict]
|
24
23
|
[options]
|
25
|
-
[semantic value
|
24
|
+
[semantic value conversion]
|
26
25
|
[start rule]
|
27
26
|
rule
|
28
27
|
GRAMMARS
|
@@ -43,7 +42,7 @@ end
|
|
43
42
|
|
44
43
|
== Grammar Block
|
45
44
|
|
46
|
-
The grammar block
|
45
|
+
The grammar block describes the grammar
|
47
46
|
to be understood by parser. Syntax is:
|
48
47
|
--
|
49
48
|
(token): (token) (token) (token).... (action)
|
@@ -69,7 +68,7 @@ It is value of result, or returned value by "return" statement.
|
|
69
68
|
Here is an example of whole grammar block.
|
70
69
|
--
|
71
70
|
rule
|
72
|
-
goal: definition
|
71
|
+
goal: definition rules source { result = val }
|
73
72
|
|
74
73
|
definition: /* none */ { result = [] }
|
75
74
|
| definition startdesig { result[0] = val[1] }
|
@@ -96,7 +95,7 @@ An array of value of right-hand side (rhs).
|
|
96
95
|
A stack of values.
|
97
96
|
DO NOT MODIFY this stack unless you know what you are doing.
|
98
97
|
|
99
|
-
== Operator
|
98
|
+
== Operator Precedence
|
100
99
|
|
101
100
|
This function is equal to '%prec' in yacc.
|
102
101
|
To designate this block:
|
@@ -128,25 +127,24 @@ rule
|
|
128
127
|
|
129
128
|
== expect
|
130
129
|
|
131
|
-
Racc
|
130
|
+
Racc supports Bison's "expect" directive to declare the expected
|
131
|
+
number of shift/reduce conflicts.
|
132
132
|
--
|
133
|
-
# Example
|
134
|
-
|
135
133
|
class MyParser
|
136
134
|
rule
|
137
135
|
expect 3
|
138
136
|
:
|
139
137
|
:
|
140
138
|
--
|
141
|
-
|
142
|
-
|
143
|
-
racc does not print confliction warning message.
|
139
|
+
Then warnings are issued only when the effective number of conflicts differs.
|
140
|
+
|
144
141
|
|
145
142
|
== Declaring Tokens
|
146
143
|
|
147
|
-
|
148
|
-
|
149
|
-
Racc
|
144
|
+
Declaring tokens avoids many bugs.
|
145
|
+
|
146
|
+
Racc outputs warnings for declared tokens that do not exist, or existing tokens not declared.
|
147
|
+
The syntax is:
|
150
148
|
--
|
151
149
|
token TOKEN_NAME AND_IS_THIS
|
152
150
|
ALSO_THIS_IS AGAIN_AND_AGAIN THIS_IS_LAST
|
@@ -174,12 +172,12 @@ You can use 'no_' prefix to invert its meanings.
|
|
174
172
|
|
175
173
|
Token symbols are, as default,
|
176
174
|
|
177
|
-
* naked token
|
175
|
+
* naked token strings in racc file (TOK, XFILE, this_is_token, ...)
|
178
176
|
--> symbol (:TOK, :XFILE, :this_is_token, ...)
|
179
|
-
* quoted
|
177
|
+
* quoted strings (':', '.', '(', ...)
|
180
178
|
--> same string (':', '.', '(', ...)
|
181
179
|
|
182
|
-
You can change this default
|
180
|
+
You can change this default using a "convert" block.
|
183
181
|
Here is an example:
|
184
182
|
--
|
185
183
|
convert
|
@@ -202,18 +200,19 @@ end
|
|
202
200
|
|
203
201
|
== Start Rule
|
204
202
|
|
205
|
-
'%start' in yacc. This changes start
|
203
|
+
'%start' in yacc. This changes the start symbol.
|
206
204
|
--
|
207
205
|
start real_target
|
208
206
|
--
|
209
|
-
|
207
|
+
|
210
208
|
|
211
209
|
== User Code Block
|
212
210
|
|
213
|
-
"User Code Block" is a Ruby source code
|
214
|
-
There are three user code
|
211
|
+
A "User Code Block" is a piece of Ruby source code copied in the output.
|
212
|
+
There are three user code blocks, "header" "inner" and "footer".
|
215
213
|
|
216
|
-
|
214
|
+
User code blocks are introduced by four '-' at the beginning of a line,
|
215
|
+
followed by a single-word name:
|
217
216
|
--
|
218
217
|
---- header
|
219
218
|
ruby statement
|
@@ -225,6 +224,3 @@ Format of user code is like this:
|
|
225
224
|
:
|
226
225
|
:
|
227
226
|
--
|
228
|
-
If four '-' exist on line head,
|
229
|
-
racc treat it as beginning of user code block.
|
230
|
-
A name of user code must be one word.
|
@@ -0,0 +1,219 @@
|
|
1
|
+
= Racc Grammar File Reference
|
2
|
+
|
3
|
+
== Global Structure
|
4
|
+
|
5
|
+
== Class Block and User Code Block
|
6
|
+
|
7
|
+
There are two blocks on the toplevel. One is the 'class' block, the other is the 'user code'
|
8
|
+
block. The 'user code' block MUST be placed after the 'class' block.
|
9
|
+
|
10
|
+
== Comments
|
11
|
+
|
12
|
+
You can insert comments about all places. Two styles of comments can be used, Ruby style '#.....' and C style '/\*......*\/'.
|
13
|
+
|
14
|
+
== Class Block
|
15
|
+
|
16
|
+
The class block is formed like this:
|
17
|
+
|
18
|
+
class CLASS_NAME
|
19
|
+
[precedence table]
|
20
|
+
[token declarations]
|
21
|
+
[expected number of S/R conflicts]
|
22
|
+
[options]
|
23
|
+
[semantic value conversion]
|
24
|
+
[start rule]
|
25
|
+
rule
|
26
|
+
GRAMMARS
|
27
|
+
|
28
|
+
CLASS_NAME is a name of the parser class. This is the name of the generating parser
|
29
|
+
class.
|
30
|
+
|
31
|
+
If CLASS_NAME includes '::', Racc outputs the module clause. For example, writing
|
32
|
+
"class M::C" causes the code below to be created:
|
33
|
+
|
34
|
+
module M
|
35
|
+
class C
|
36
|
+
:
|
37
|
+
:
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
== Grammar Block
|
42
|
+
|
43
|
+
The grammar block describes grammar which is able to be understood by the parser.
|
44
|
+
Syntax is:
|
45
|
+
|
46
|
+
(token): (token) (token) (token).... (action)
|
47
|
+
|
48
|
+
(token): (token) (token) (token).... (action)
|
49
|
+
| (token) (token) (token).... (action)
|
50
|
+
| (token) (token) (token).... (action)
|
51
|
+
|
52
|
+
(action) is an action which is executed when its (token)s are found.
|
53
|
+
(action) is a ruby code block, which is surrounded by braces:
|
54
|
+
|
55
|
+
{ print val[0]
|
56
|
+
puts val[1] }
|
57
|
+
|
58
|
+
Note that you cannot use '%' string, here document, '%r' regexp in action.
|
59
|
+
|
60
|
+
Actions can be omitted. When it is omitted, '' (empty string) is used.
|
61
|
+
|
62
|
+
A return value of action is a value of the left side value ($$). It is the value of the
|
63
|
+
result, or the returned value by `return` statement.
|
64
|
+
|
65
|
+
Here is an example of the whole grammar block.
|
66
|
+
|
67
|
+
rule
|
68
|
+
goal: definition rules source { result = val }
|
69
|
+
|
70
|
+
definition: /* none */ { result = [] }
|
71
|
+
| definition startdesig { result[0] = val[1] }
|
72
|
+
| definition
|
73
|
+
precrule # this line continues from upper line
|
74
|
+
{
|
75
|
+
result[1] = val[1]
|
76
|
+
}
|
77
|
+
|
78
|
+
startdesig: START TOKEN
|
79
|
+
|
80
|
+
You can use the following special local variables in action:
|
81
|
+
|
82
|
+
* result ($$)
|
83
|
+
|
84
|
+
The value of the left-hand side (lhs). A default value is val[0].
|
85
|
+
|
86
|
+
* val ($1,$2,$3...)
|
87
|
+
|
88
|
+
An array of value of the right-hand side (rhs).
|
89
|
+
|
90
|
+
* _values (...$-2,$-1,$0)
|
91
|
+
|
92
|
+
A stack of values. DO NOT MODIFY this stack unless you know what you are doing.
|
93
|
+
|
94
|
+
== Operator Precedence
|
95
|
+
|
96
|
+
This function is equal to '%prec' in yacc.
|
97
|
+
To designate this block:
|
98
|
+
|
99
|
+
prechigh
|
100
|
+
nonassoc '++'
|
101
|
+
left '*' '/'
|
102
|
+
left '+' '-'
|
103
|
+
right '='
|
104
|
+
preclow
|
105
|
+
|
106
|
+
`right` is yacc's %right, `left` is yacc's %left.
|
107
|
+
|
108
|
+
`=` + (symbol) means yacc's %prec:
|
109
|
+
|
110
|
+
prechigh
|
111
|
+
nonassoc UMINUS
|
112
|
+
left '*' '/'
|
113
|
+
left '+' '-'
|
114
|
+
preclow
|
115
|
+
|
116
|
+
rule
|
117
|
+
exp: exp '*' exp
|
118
|
+
| exp '-' exp
|
119
|
+
| '-' exp =UMINUS # equals to "%prec UMINUS"
|
120
|
+
:
|
121
|
+
:
|
122
|
+
|
123
|
+
== expect
|
124
|
+
|
125
|
+
Racc has bison's "expect" directive.
|
126
|
+
|
127
|
+
# Example
|
128
|
+
|
129
|
+
class MyParser
|
130
|
+
rule
|
131
|
+
expect 3
|
132
|
+
:
|
133
|
+
:
|
134
|
+
|
135
|
+
This directive declares "expected" number of shift/reduce conflicts. If
|
136
|
+
"expected" number is equal to real number of conflicts, Racc does not print
|
137
|
+
conflict warning message.
|
138
|
+
|
139
|
+
== Declaring Tokens
|
140
|
+
|
141
|
+
By declaring tokens, you can avoid many meaningless bugs. If declared token
|
142
|
+
does not exist or existing token does not decleared, Racc output warnings.
|
143
|
+
Declaration syntax is:
|
144
|
+
|
145
|
+
token TOKEN_NAME AND_IS_THIS
|
146
|
+
ALSO_THIS_IS AGAIN_AND_AGAIN THIS_IS_LAST
|
147
|
+
|
148
|
+
== Options
|
149
|
+
|
150
|
+
You can write options for Racc command in your Racc file.
|
151
|
+
|
152
|
+
options OPTION OPTION ...
|
153
|
+
|
154
|
+
Options are:
|
155
|
+
|
156
|
+
* omit_action_call
|
157
|
+
|
158
|
+
omits empty action call or not.
|
159
|
+
|
160
|
+
* result_var
|
161
|
+
|
162
|
+
uses local variable "result" or not.
|
163
|
+
|
164
|
+
You can use 'no_' prefix to invert their meanings.
|
165
|
+
|
166
|
+
== Converting Token Symbol
|
167
|
+
|
168
|
+
Token symbols are, as default,
|
169
|
+
|
170
|
+
* naked token string in Racc file (TOK, XFILE, this_is_token, ...)
|
171
|
+
--> symbol (:TOK, :XFILE, :this_is_token, ...)
|
172
|
+
* quoted string (':', '.', '(', ...)
|
173
|
+
--> same string (':', '.', '(', ...)
|
174
|
+
|
175
|
+
You can change this default by "convert" block.
|
176
|
+
Here is an example:
|
177
|
+
|
178
|
+
convert
|
179
|
+
PLUS 'PlusClass' # We use PlusClass for symbol of `PLUS'
|
180
|
+
MIN 'MinusClass' # We use MinusClass for symbol of `MIN'
|
181
|
+
end
|
182
|
+
|
183
|
+
We can use almost all ruby value can be used by token symbol,
|
184
|
+
except 'false' and 'nil'. These cause unexpected parse error.
|
185
|
+
|
186
|
+
If you want to use String as token symbol, special care is required.
|
187
|
+
For example:
|
188
|
+
|
189
|
+
convert
|
190
|
+
class '"cls"' # in code, "cls"
|
191
|
+
PLUS '"plus\n"' # in code, "plus\n"
|
192
|
+
MIN "\"minus#{val}\"" # in code, \"minus#{val}\"
|
193
|
+
end
|
194
|
+
|
195
|
+
== Start Rule
|
196
|
+
|
197
|
+
'%start' in yacc. This changes start rule.
|
198
|
+
|
199
|
+
start real_target
|
200
|
+
|
201
|
+
== User Code Block
|
202
|
+
|
203
|
+
"User Code Block" is a Ruby source code which is copied to output. There are
|
204
|
+
three user code blocks, "header" "inner" and "footer".
|
205
|
+
|
206
|
+
Format of user code is like this:
|
207
|
+
|
208
|
+
---- header
|
209
|
+
ruby statement
|
210
|
+
ruby statement
|
211
|
+
ruby statement
|
212
|
+
|
213
|
+
---- inner
|
214
|
+
ruby statement
|
215
|
+
:
|
216
|
+
:
|
217
|
+
|
218
|
+
If four '-' exist on the line head, Racc treats it as the beginning of the
|
219
|
+
user code block. The name of the user code block must be one word.
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<h1>Raccコマンドリファレンス</h1>
|
2
2
|
<p>
|
3
3
|
racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
|
4
|
-
[-e<var>rubypath</var>] [--
|
4
|
+
[-e<var>rubypath</var>] [--executable=<var>rubypath</var>]
|
5
5
|
[-v] [--verbose]
|
6
6
|
[-O<var>filename</var>] [--log-file=<var>filename</var>]
|
7
7
|
[-g] [--debug]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/ext/racc/cparse/cparse.c
CHANGED
@@ -605,7 +605,7 @@ parse_main(struct cparse_params *v, VALUE tok, VALUE val, int resume)
|
|
605
605
|
user_yyerror:
|
606
606
|
if (v->errstatus == 3) {
|
607
607
|
if (v->t == vFINAL_TOKEN) {
|
608
|
-
v->retval =
|
608
|
+
v->retval = Qnil;
|
609
609
|
v->fin = CP_FIN_EOT;
|
610
610
|
return;
|
611
611
|
}
|
@@ -819,14 +819,16 @@ reduce0(RB_BLOCK_CALL_FUNC_ARGLIST(_, data))
|
|
819
819
|
void
|
820
820
|
Init_cparse(void)
|
821
821
|
{
|
822
|
-
#
|
823
|
-
|
822
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
823
|
+
rb_ext_ractor_safe(true);
|
824
|
+
#endif
|
825
|
+
|
824
826
|
VALUE Racc, Parser;
|
825
|
-
ID id_racc =
|
827
|
+
ID id_racc = rb_intern_const("Racc");
|
826
828
|
|
827
829
|
if (rb_const_defined(rb_cObject, id_racc)) {
|
828
830
|
Racc = rb_const_get(rb_cObject, id_racc);
|
829
|
-
Parser = rb_const_get_at(Racc,
|
831
|
+
Parser = rb_const_get_at(Racc, rb_intern_const("Parser"));
|
830
832
|
}
|
831
833
|
else {
|
832
834
|
Racc = rb_define_module("Racc");
|
@@ -846,16 +848,16 @@ Init_cparse(void)
|
|
846
848
|
|
847
849
|
RaccBug = rb_eRuntimeError;
|
848
850
|
|
849
|
-
id_yydebug =
|
850
|
-
id_nexttoken =
|
851
|
-
id_onerror =
|
852
|
-
id_noreduce =
|
853
|
-
id_errstatus =
|
854
|
-
|
855
|
-
id_d_shift =
|
856
|
-
id_d_reduce =
|
857
|
-
id_d_accept =
|
858
|
-
id_d_read_token =
|
859
|
-
id_d_next_state =
|
860
|
-
id_d_e_pop =
|
851
|
+
id_yydebug = rb_intern_const("@yydebug");
|
852
|
+
id_nexttoken = rb_intern_const("next_token");
|
853
|
+
id_onerror = rb_intern_const("on_error");
|
854
|
+
id_noreduce = rb_intern_const("_reduce_none");
|
855
|
+
id_errstatus = rb_intern_const("@racc_error_status");
|
856
|
+
|
857
|
+
id_d_shift = rb_intern_const("racc_shift");
|
858
|
+
id_d_reduce = rb_intern_const("racc_reduce");
|
859
|
+
id_d_accept = rb_intern_const("racc_accept");
|
860
|
+
id_d_read_token = rb_intern_const("racc_read_token");
|
861
|
+
id_d_next_state = rb_intern_const("racc_next_state");
|
862
|
+
id_d_e_pop = rb_intern_const("racc_e_pop");
|
861
863
|
}
|
data/ext/racc/cparse/extconf.rb
CHANGED
data/lib/racc/compat.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
|
+
#--
|
2
|
+
#
|
1
3
|
#
|
2
|
-
# $Id: 14fa1118eb3a23e85265e4f7afe2d5a297d69f9c $
|
3
4
|
#
|
4
5
|
# Copyright (c) 1999-2006 Minero Aoki
|
5
6
|
#
|
6
7
|
# This program is free software.
|
7
|
-
# You can distribute/modify this program under the terms of
|
8
|
-
# the
|
9
|
-
# For details of the GNU LGPL, see the file "COPYING".
|
8
|
+
# You can distribute/modify this program under the same terms of ruby.
|
9
|
+
# see the file "COPYING".
|
10
10
|
#
|
11
|
+
#++
|
11
12
|
|
12
13
|
unless Object.method_defined?(:__send)
|
13
14
|
class Object
|