racc 1.4.9-java → 1.4.12-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 +7 -0
- data/Manifest.txt +1 -5
- data/Rakefile +65 -16
- data/ext/racc/com/headius/racc/Cparse.java +806 -0
- data/ext/racc/cparse.c +28 -24
- data/ext/racc/extconf.rb +3 -1
- data/lib/racc/compat.rb +1 -9
- data/lib/racc/cparse-jruby.jar +0 -0
- data/lib/racc/grammarfileparser.rb +2 -2
- data/lib/racc/info.rb +2 -2
- data/lib/racc/parser-text.rb +164 -5
- data/lib/racc/parser.rb +164 -5
- data/lib/racc/parserfilegenerator.rb +2 -2
- data/test/helper.rb +2 -6
- metadata +45 -51
- data/rdoc/en/command.en.html +0 -78
- data/rdoc/en/debug.en.rdoc +0 -20
- data/rdoc/en/index.en.html +0 -10
- data/rdoc/en/parser.en.rdoc +0 -74
- data/rdoc/en/usage.en.rdoc +0 -83
data/ext/racc/cparse.c
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
Important Constants
|
18
18
|
----------------------------------------------------------------------- */
|
19
19
|
|
20
|
-
#define RACC_VERSION "1.4.
|
20
|
+
#define RACC_VERSION "1.4.12"
|
21
21
|
|
22
22
|
#define DEFAULT_TOKEN -1
|
23
23
|
#define ERROR_TOKEN 1
|
@@ -65,6 +65,10 @@ static ID id_d_e_pop;
|
|
65
65
|
# define LONG2NUM(i) INT2NUM(i)
|
66
66
|
#endif
|
67
67
|
|
68
|
+
#ifndef HAVE_RB_ARY_SUBSEQ
|
69
|
+
# define rb_ary_subseq(ary, beg, len) rb_ary_new4(len, RARRAY_PTR(ary) + beg)
|
70
|
+
#endif
|
71
|
+
|
68
72
|
static ID value_to_id _((VALUE v));
|
69
73
|
static inline long num_to_long _((VALUE n));
|
70
74
|
|
@@ -84,7 +88,7 @@ num_to_long(VALUE n)
|
|
84
88
|
}
|
85
89
|
|
86
90
|
#define AREF(s, idx) \
|
87
|
-
((0 <= idx && idx < RARRAY_LEN(s)) ?
|
91
|
+
((0 <= idx && idx < RARRAY_LEN(s)) ? rb_ary_entry(s, idx) : Qnil)
|
88
92
|
|
89
93
|
/* -----------------------------------------------------------------------
|
90
94
|
Parser Stack Interfaces
|
@@ -98,7 +102,7 @@ get_stack_tail(VALUE stack, long len)
|
|
98
102
|
{
|
99
103
|
if (len < 0) return Qnil; /* system error */
|
100
104
|
if (len > RARRAY_LEN(stack)) len = RARRAY_LEN(stack);
|
101
|
-
return
|
105
|
+
return rb_ary_subseq(stack, RARRAY_LEN(stack) - len, len);
|
102
106
|
}
|
103
107
|
|
104
108
|
static void
|
@@ -115,7 +119,7 @@ cut_stack_tail(VALUE stack, long len)
|
|
115
119
|
#define PUSH(s, i) rb_ary_store(s, RARRAY_LEN(s), i)
|
116
120
|
#define POP(s) rb_ary_pop(s)
|
117
121
|
#define LAST_I(s) \
|
118
|
-
((RARRAY_LEN(s) > 0) ?
|
122
|
+
((RARRAY_LEN(s) > 0) ? rb_ary_entry(s, RARRAY_LEN(s) - 1) : Qnil)
|
119
123
|
#define GET_TAIL(s, len) get_stack_tail(s, len)
|
120
124
|
#define CUT_TAIL(s, len) cut_stack_tail(s, len)
|
121
125
|
|
@@ -327,21 +331,21 @@ initialize_params(VALUE vparams, VALUE parser, VALUE arg, VALUE lexer, VALUE lex
|
|
327
331
|
Check_Type(arg, T_ARRAY);
|
328
332
|
if (!(13 <= RARRAY_LEN(arg) && RARRAY_LEN(arg) <= 14))
|
329
333
|
rb_raise(RaccBug, "[Racc Bug] wrong arg.size %ld", RARRAY_LEN(arg));
|
330
|
-
v->action_table = assert_array (
|
331
|
-
v->action_check = assert_array (
|
332
|
-
v->action_default = assert_array (
|
333
|
-
v->action_pointer = assert_array (
|
334
|
-
v->goto_table = assert_array (
|
335
|
-
v->goto_check = assert_array (
|
336
|
-
v->goto_default = assert_array (
|
337
|
-
v->goto_pointer = assert_array (
|
338
|
-
v->nt_base = assert_integer(
|
339
|
-
v->reduce_table = assert_array (
|
340
|
-
v->token_table = assert_hash (
|
341
|
-
v->shift_n = assert_integer(
|
342
|
-
v->reduce_n = assert_integer(
|
334
|
+
v->action_table = assert_array (rb_ary_entry(arg, 0));
|
335
|
+
v->action_check = assert_array (rb_ary_entry(arg, 1));
|
336
|
+
v->action_default = assert_array (rb_ary_entry(arg, 2));
|
337
|
+
v->action_pointer = assert_array (rb_ary_entry(arg, 3));
|
338
|
+
v->goto_table = assert_array (rb_ary_entry(arg, 4));
|
339
|
+
v->goto_check = assert_array (rb_ary_entry(arg, 5));
|
340
|
+
v->goto_default = assert_array (rb_ary_entry(arg, 6));
|
341
|
+
v->goto_pointer = assert_array (rb_ary_entry(arg, 7));
|
342
|
+
v->nt_base = assert_integer(rb_ary_entry(arg, 8));
|
343
|
+
v->reduce_table = assert_array (rb_ary_entry(arg, 9));
|
344
|
+
v->token_table = assert_hash (rb_ary_entry(arg, 10));
|
345
|
+
v->shift_n = assert_integer(rb_ary_entry(arg, 11));
|
346
|
+
v->reduce_n = assert_integer(rb_ary_entry(arg, 12));
|
343
347
|
if (RARRAY_LEN(arg) > 13) {
|
344
|
-
v->use_result_var = RTEST(
|
348
|
+
v->use_result_var = RTEST(rb_ary_entry(arg, 13));
|
345
349
|
}
|
346
350
|
else {
|
347
351
|
v->use_result_var = Qtrue;
|
@@ -557,7 +561,7 @@ parse_main(struct cparse_params *v, VALUE tok, VALUE val, int resume)
|
|
557
561
|
|
558
562
|
accept:
|
559
563
|
if (v->debug) rb_funcall(v->parser, id_d_accept, 0);
|
560
|
-
v->retval =
|
564
|
+
v->retval = rb_ary_entry(v->vstack, 0);
|
561
565
|
v->fin = CP_FIN_ACCEPT;
|
562
566
|
return;
|
563
567
|
|
@@ -686,9 +690,9 @@ reduce0(VALUE val, VALUE data, VALUE self)
|
|
686
690
|
VALUE goto_state;
|
687
691
|
|
688
692
|
Data_Get_Struct(data, struct cparse_params, v);
|
689
|
-
reduce_len =
|
690
|
-
reduce_to =
|
691
|
-
method_id =
|
693
|
+
reduce_len = rb_ary_entry(v->reduce_table, v->ruleno);
|
694
|
+
reduce_to = rb_ary_entry(v->reduce_table, v->ruleno+1);
|
695
|
+
method_id = rb_ary_entry(v->reduce_table, v->ruleno+2);
|
692
696
|
len = NUM2LONG(reduce_len);
|
693
697
|
mid = value_to_id(method_id);
|
694
698
|
|
@@ -703,10 +707,10 @@ reduce0(VALUE val, VALUE data, VALUE self)
|
|
703
707
|
else {
|
704
708
|
if (mid != id_noreduce) {
|
705
709
|
tmp_v = GET_TAIL(v->vstack, len);
|
706
|
-
tmp =
|
710
|
+
tmp = rb_ary_entry(tmp_v, 0);
|
707
711
|
}
|
708
712
|
else {
|
709
|
-
tmp =
|
713
|
+
tmp = rb_ary_entry(v->vstack, RARRAY_LEN(v->vstack) - len);
|
710
714
|
}
|
711
715
|
CUT_TAIL(v->vstack, len);
|
712
716
|
if (v->debug) {
|
data/ext/racc/extconf.rb
CHANGED
data/lib/racc/compat.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# $Id:
|
2
|
+
# $Id: 14fa1118eb3a23e85265e4f7afe2d5a297d69f9c $
|
3
3
|
#
|
4
4
|
# Copyright (c) 1999-2006 Minero Aoki
|
5
5
|
#
|
@@ -21,14 +21,6 @@ unless Object.method_defined?(:__send!)
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
unless String.method_defined?(:to_a)
|
25
|
-
class String
|
26
|
-
def to_a
|
27
|
-
lines.to_a
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
24
|
unless Array.method_defined?(:map!)
|
33
25
|
class Array
|
34
26
|
if Array.method_defined?(:collect!)
|
Binary file
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# $Id:
|
2
|
+
# $Id: 5e1871defa15d288d2252e6a76bb2c4cf2119ed3 $
|
3
3
|
#
|
4
4
|
# Copyright (c) 1999-2006 Minero Aoki
|
5
5
|
#
|
@@ -258,7 +258,7 @@ module Racc
|
|
258
258
|
line = @scanner.lineno
|
259
259
|
_, *blocks = *@scanner.epilogue.split(/^----/)
|
260
260
|
blocks.each do |block|
|
261
|
-
header, *body = block.to_a
|
261
|
+
header, *body = block.lines.to_a
|
262
262
|
label0, pathes = *header.sub(/\A-+/, '').split('=', 2)
|
263
263
|
label = canonical_label(label0)
|
264
264
|
(pathes ? pathes.strip.split(' ') : []).each do |path|
|
data/lib/racc/info.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# $Id:
|
2
|
+
# $Id: 90afb43b1438ad2bb681a529146d1cb5cd7e45ac $
|
3
3
|
#
|
4
4
|
# Copyright (c) 1999-2006 Minero Aoki
|
5
5
|
#
|
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
|
12
12
|
module Racc
|
13
|
-
VERSION = '1.4.
|
13
|
+
VERSION = '1.4.12'
|
14
14
|
Version = VERSION
|
15
15
|
Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
|
16
16
|
end
|
data/lib/racc/parser-text.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Racc
|
2
2
|
PARSER_TEXT = <<'__end_of_file__'
|
3
3
|
#
|
4
|
-
# $Id:
|
4
|
+
# $Id: a7af944d201a32a63d2536cdd589d8e9910848e0 $
|
5
5
|
#
|
6
6
|
# Copyright (c) 1999-2006 Minero Aoki
|
7
7
|
#
|
@@ -28,6 +28,158 @@ end
|
|
28
28
|
|
29
29
|
# Racc is a LALR(1) parser generator.
|
30
30
|
# It is written in Ruby itself, and generates Ruby programs.
|
31
|
+
#
|
32
|
+
# == Command-line Reference
|
33
|
+
#
|
34
|
+
# racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
|
35
|
+
# [-e<var>rubypath</var>] [--embedded=<var>rubypath</var>]
|
36
|
+
# [-v] [--verbose]
|
37
|
+
# [-O<var>filename</var>] [--log-file=<var>filename</var>]
|
38
|
+
# [-g] [--debug]
|
39
|
+
# [-E] [--embedded]
|
40
|
+
# [-l] [--no-line-convert]
|
41
|
+
# [-c] [--line-convert-all]
|
42
|
+
# [-a] [--no-omit-actions]
|
43
|
+
# [-C] [--check-only]
|
44
|
+
# [-S] [--output-status]
|
45
|
+
# [--version] [--copyright] [--help] <var>grammarfile</var>
|
46
|
+
#
|
47
|
+
# [+filename+]
|
48
|
+
# Racc grammar file. Any extention is permitted.
|
49
|
+
# [-o+outfile+, --output-file=+outfile+]
|
50
|
+
# A filename for output. default is <+filename+>.tab.rb
|
51
|
+
# [-O+filename+, --log-file=+filename+]
|
52
|
+
# Place logging output in file +filename+.
|
53
|
+
# Default log file name is <+filename+>.output.
|
54
|
+
# [-e+rubypath+, --executable=+rubypath+]
|
55
|
+
# output executable file(mode 755). where +path+ is the Ruby interpreter.
|
56
|
+
# [-v, --verbose]
|
57
|
+
# verbose mode. create +filename+.output file, like yacc's y.output file.
|
58
|
+
# [-g, --debug]
|
59
|
+
# add debug code to parser class. To display debuggin information,
|
60
|
+
# use this '-g' option and set @yydebug true in parser class.
|
61
|
+
# [-E, --embedded]
|
62
|
+
# Output parser which doesn't need runtime files (racc/parser.rb).
|
63
|
+
# [-C, --check-only]
|
64
|
+
# Check syntax of racc grammer file and quit.
|
65
|
+
# [-S, --output-status]
|
66
|
+
# Print messages time to time while compiling.
|
67
|
+
# [-l, --no-line-convert]
|
68
|
+
# turns off line number converting.
|
69
|
+
# [-c, --line-convert-all]
|
70
|
+
# Convert line number of actions, inner, header and footer.
|
71
|
+
# [-a, --no-omit-actions]
|
72
|
+
# Call all actions, even if an action is empty.
|
73
|
+
# [--version]
|
74
|
+
# print Racc version and quit.
|
75
|
+
# [--copyright]
|
76
|
+
# Print copyright and quit.
|
77
|
+
# [--help]
|
78
|
+
# Print usage and quit.
|
79
|
+
#
|
80
|
+
# == Generating Parser Using Racc
|
81
|
+
#
|
82
|
+
# To compile Racc grammar file, simply type:
|
83
|
+
#
|
84
|
+
# $ racc parse.y
|
85
|
+
#
|
86
|
+
# This creates Ruby script file "parse.tab.y". The -o option can change the output filename.
|
87
|
+
#
|
88
|
+
# == Writing A Racc Grammar File
|
89
|
+
#
|
90
|
+
# If you want your own parser, you have to write a grammar file.
|
91
|
+
# A grammar file contains the name of your parser class, grammar for the parser,
|
92
|
+
# user code, and anything else.
|
93
|
+
# When writing a grammar file, yacc's knowledge is helpful.
|
94
|
+
# If you have not used yacc before, Racc is not too difficult.
|
95
|
+
#
|
96
|
+
# Here's an example Racc grammar file.
|
97
|
+
#
|
98
|
+
# class Calcparser
|
99
|
+
# rule
|
100
|
+
# target: exp { print val[0] }
|
101
|
+
#
|
102
|
+
# exp: exp '+' exp
|
103
|
+
# | exp '*' exp
|
104
|
+
# | '(' exp ')'
|
105
|
+
# | NUMBER
|
106
|
+
# end
|
107
|
+
#
|
108
|
+
# Racc grammar files resemble yacc files.
|
109
|
+
# But (of course), this is Ruby code.
|
110
|
+
# yacc's $$ is the 'result', $0, $1... is
|
111
|
+
# an array called 'val', and $-1, $-2... is an array called '_values'.
|
112
|
+
#
|
113
|
+
# See the {Grammar File Reference}[rdoc-ref:lib/racc/rdoc/grammar.en.rdoc] for
|
114
|
+
# more information on grammar files.
|
115
|
+
#
|
116
|
+
# == Parser
|
117
|
+
#
|
118
|
+
# Then you must prepare the parse entry method. There are two types of
|
119
|
+
# parse methods in Racc, Racc::Parser#do_parse and Racc::Parser#yyparse
|
120
|
+
#
|
121
|
+
# Racc::Parser#do_parse is simple.
|
122
|
+
#
|
123
|
+
# It's yyparse() of yacc, and Racc::Parser#next_token is yylex().
|
124
|
+
# This method must returns an array like [TOKENSYMBOL, ITS_VALUE].
|
125
|
+
# EOF is [false, false].
|
126
|
+
# (TOKENSYMBOL is a Ruby symbol (taken from String#intern) by default.
|
127
|
+
# If you want to change this, see the grammar reference.
|
128
|
+
#
|
129
|
+
# Racc::Parser#yyparse is little complicated, but useful.
|
130
|
+
# It does not use Racc::Parser#next_token, instead it gets tokens from any iterator.
|
131
|
+
#
|
132
|
+
# For example, <code>yyparse(obj, :scan)</code> causes
|
133
|
+
# calling +obj#scan+, and you can return tokens by yielding them from +obj#scan+.
|
134
|
+
#
|
135
|
+
# == Debugging
|
136
|
+
#
|
137
|
+
# When debugging, "-v" or/and the "-g" option is helpful.
|
138
|
+
#
|
139
|
+
# "-v" creates verbose log file (.output).
|
140
|
+
# "-g" creates a "Verbose Parser".
|
141
|
+
# Verbose Parser prints the internal status when parsing.
|
142
|
+
# But it's _not_ automatic.
|
143
|
+
# You must use -g option and set +@yydebug+ to +true+ in order to get output.
|
144
|
+
# -g option only creates the verbose parser.
|
145
|
+
#
|
146
|
+
# === Racc reported syntax error.
|
147
|
+
#
|
148
|
+
# Isn't there too many "end"?
|
149
|
+
# grammar of racc file is changed in v0.10.
|
150
|
+
#
|
151
|
+
# Racc does not use '%' mark, while yacc uses huge number of '%' marks..
|
152
|
+
#
|
153
|
+
# === Racc reported "XXXX conflicts".
|
154
|
+
#
|
155
|
+
# Try "racc -v xxxx.y".
|
156
|
+
# It causes producing racc's internal log file, xxxx.output.
|
157
|
+
#
|
158
|
+
# === Generated parsers does not work correctly
|
159
|
+
#
|
160
|
+
# Try "racc -g xxxx.y".
|
161
|
+
# This command let racc generate "debugging parser".
|
162
|
+
# Then set @yydebug=true in your parser.
|
163
|
+
# It produces a working log of your parser.
|
164
|
+
#
|
165
|
+
# == Re-distributing Racc runtime
|
166
|
+
#
|
167
|
+
# A parser, which is created by Racc, requires the Racc runtime module;
|
168
|
+
# racc/parser.rb.
|
169
|
+
#
|
170
|
+
# Ruby 1.8.x comes with Racc runtime module,
|
171
|
+
# you need NOT distribute Racc runtime files.
|
172
|
+
#
|
173
|
+
# If you want to include the Racc runtime module with your parser.
|
174
|
+
# This can be done by using '-E' option:
|
175
|
+
#
|
176
|
+
# $ racc -E -omyparser.rb myparser.y
|
177
|
+
#
|
178
|
+
# This command creates myparser.rb which `includes' Racc runtime.
|
179
|
+
# Only you must do is to distribute your parser file (myparser.rb).
|
180
|
+
#
|
181
|
+
# Note: parser.rb is LGPL, but your parser is not.
|
182
|
+
# Your own parser is completely yours.
|
31
183
|
module Racc
|
32
184
|
|
33
185
|
unless defined?(Racc_No_Extentions)
|
@@ -37,12 +189,17 @@ module Racc
|
|
37
189
|
class Parser
|
38
190
|
|
39
191
|
Racc_Runtime_Version = ::Racc::VERSION
|
40
|
-
Racc_Runtime_Revision = '$Id:
|
192
|
+
Racc_Runtime_Revision = '$Id: a7af944d201a32a63d2536cdd589d8e9910848e0 $'
|
41
193
|
|
42
194
|
Racc_Runtime_Core_Version_R = ::Racc::VERSION
|
43
|
-
Racc_Runtime_Core_Revision_R = '$Id:
|
195
|
+
Racc_Runtime_Core_Revision_R = '$Id: a7af944d201a32a63d2536cdd589d8e9910848e0 $'.split[1]
|
44
196
|
begin
|
45
|
-
|
197
|
+
if RUBY_ENGINE == 'jruby'
|
198
|
+
require 'racc/cparse-jruby.jar'
|
199
|
+
com.headius.racc.Cparse.new.load(JRuby.runtime, false)
|
200
|
+
else
|
201
|
+
require 'racc/cparse'
|
202
|
+
end
|
46
203
|
# Racc_Runtime_Core_Version_C = (defined in extention)
|
47
204
|
Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
|
48
205
|
unless new.respond_to?(:_racc_do_parse_c, true)
|
@@ -58,6 +215,8 @@ module Racc
|
|
58
215
|
Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_C # :nodoc:
|
59
216
|
Racc_Runtime_Type = 'c' # :nodoc:
|
60
217
|
rescue LoadError
|
218
|
+
puts $!
|
219
|
+
puts $!.backtrace
|
61
220
|
Racc_Main_Parsing_Routine = :_racc_do_parse_rb
|
62
221
|
Racc_YY_Parse_Method = :_racc_yyparse_rb
|
63
222
|
Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R
|
@@ -171,7 +330,7 @@ module Racc
|
|
171
330
|
# RECEIVER#METHOD_ID is a method to get next token.
|
172
331
|
# It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
|
173
332
|
def yyparse(recv, mid)
|
174
|
-
__send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(),
|
333
|
+
__send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), false)
|
175
334
|
end
|
176
335
|
|
177
336
|
def _racc_yyparse_rb(recv, mid, arg, c_debug)
|
data/lib/racc/parser.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# $Id:
|
2
|
+
# $Id: a7af944d201a32a63d2536cdd589d8e9910848e0 $
|
3
3
|
#
|
4
4
|
# Copyright (c) 1999-2006 Minero Aoki
|
5
5
|
#
|
@@ -26,6 +26,158 @@ end
|
|
26
26
|
|
27
27
|
# Racc is a LALR(1) parser generator.
|
28
28
|
# It is written in Ruby itself, and generates Ruby programs.
|
29
|
+
#
|
30
|
+
# == Command-line Reference
|
31
|
+
#
|
32
|
+
# racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
|
33
|
+
# [-e<var>rubypath</var>] [--embedded=<var>rubypath</var>]
|
34
|
+
# [-v] [--verbose]
|
35
|
+
# [-O<var>filename</var>] [--log-file=<var>filename</var>]
|
36
|
+
# [-g] [--debug]
|
37
|
+
# [-E] [--embedded]
|
38
|
+
# [-l] [--no-line-convert]
|
39
|
+
# [-c] [--line-convert-all]
|
40
|
+
# [-a] [--no-omit-actions]
|
41
|
+
# [-C] [--check-only]
|
42
|
+
# [-S] [--output-status]
|
43
|
+
# [--version] [--copyright] [--help] <var>grammarfile</var>
|
44
|
+
#
|
45
|
+
# [+filename+]
|
46
|
+
# Racc grammar file. Any extention is permitted.
|
47
|
+
# [-o+outfile+, --output-file=+outfile+]
|
48
|
+
# A filename for output. default is <+filename+>.tab.rb
|
49
|
+
# [-O+filename+, --log-file=+filename+]
|
50
|
+
# Place logging output in file +filename+.
|
51
|
+
# Default log file name is <+filename+>.output.
|
52
|
+
# [-e+rubypath+, --executable=+rubypath+]
|
53
|
+
# output executable file(mode 755). where +path+ is the Ruby interpreter.
|
54
|
+
# [-v, --verbose]
|
55
|
+
# verbose mode. create +filename+.output file, like yacc's y.output file.
|
56
|
+
# [-g, --debug]
|
57
|
+
# add debug code to parser class. To display debuggin information,
|
58
|
+
# use this '-g' option and set @yydebug true in parser class.
|
59
|
+
# [-E, --embedded]
|
60
|
+
# Output parser which doesn't need runtime files (racc/parser.rb).
|
61
|
+
# [-C, --check-only]
|
62
|
+
# Check syntax of racc grammer file and quit.
|
63
|
+
# [-S, --output-status]
|
64
|
+
# Print messages time to time while compiling.
|
65
|
+
# [-l, --no-line-convert]
|
66
|
+
# turns off line number converting.
|
67
|
+
# [-c, --line-convert-all]
|
68
|
+
# Convert line number of actions, inner, header and footer.
|
69
|
+
# [-a, --no-omit-actions]
|
70
|
+
# Call all actions, even if an action is empty.
|
71
|
+
# [--version]
|
72
|
+
# print Racc version and quit.
|
73
|
+
# [--copyright]
|
74
|
+
# Print copyright and quit.
|
75
|
+
# [--help]
|
76
|
+
# Print usage and quit.
|
77
|
+
#
|
78
|
+
# == Generating Parser Using Racc
|
79
|
+
#
|
80
|
+
# To compile Racc grammar file, simply type:
|
81
|
+
#
|
82
|
+
# $ racc parse.y
|
83
|
+
#
|
84
|
+
# This creates Ruby script file "parse.tab.y". The -o option can change the output filename.
|
85
|
+
#
|
86
|
+
# == Writing A Racc Grammar File
|
87
|
+
#
|
88
|
+
# If you want your own parser, you have to write a grammar file.
|
89
|
+
# A grammar file contains the name of your parser class, grammar for the parser,
|
90
|
+
# user code, and anything else.
|
91
|
+
# When writing a grammar file, yacc's knowledge is helpful.
|
92
|
+
# If you have not used yacc before, Racc is not too difficult.
|
93
|
+
#
|
94
|
+
# Here's an example Racc grammar file.
|
95
|
+
#
|
96
|
+
# class Calcparser
|
97
|
+
# rule
|
98
|
+
# target: exp { print val[0] }
|
99
|
+
#
|
100
|
+
# exp: exp '+' exp
|
101
|
+
# | exp '*' exp
|
102
|
+
# | '(' exp ')'
|
103
|
+
# | NUMBER
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# Racc grammar files resemble yacc files.
|
107
|
+
# But (of course), this is Ruby code.
|
108
|
+
# yacc's $$ is the 'result', $0, $1... is
|
109
|
+
# an array called 'val', and $-1, $-2... is an array called '_values'.
|
110
|
+
#
|
111
|
+
# See the {Grammar File Reference}[rdoc-ref:lib/racc/rdoc/grammar.en.rdoc] for
|
112
|
+
# more information on grammar files.
|
113
|
+
#
|
114
|
+
# == Parser
|
115
|
+
#
|
116
|
+
# Then you must prepare the parse entry method. There are two types of
|
117
|
+
# parse methods in Racc, Racc::Parser#do_parse and Racc::Parser#yyparse
|
118
|
+
#
|
119
|
+
# Racc::Parser#do_parse is simple.
|
120
|
+
#
|
121
|
+
# It's yyparse() of yacc, and Racc::Parser#next_token is yylex().
|
122
|
+
# This method must returns an array like [TOKENSYMBOL, ITS_VALUE].
|
123
|
+
# EOF is [false, false].
|
124
|
+
# (TOKENSYMBOL is a Ruby symbol (taken from String#intern) by default.
|
125
|
+
# If you want to change this, see the grammar reference.
|
126
|
+
#
|
127
|
+
# Racc::Parser#yyparse is little complicated, but useful.
|
128
|
+
# It does not use Racc::Parser#next_token, instead it gets tokens from any iterator.
|
129
|
+
#
|
130
|
+
# For example, <code>yyparse(obj, :scan)</code> causes
|
131
|
+
# calling +obj#scan+, and you can return tokens by yielding them from +obj#scan+.
|
132
|
+
#
|
133
|
+
# == Debugging
|
134
|
+
#
|
135
|
+
# When debugging, "-v" or/and the "-g" option is helpful.
|
136
|
+
#
|
137
|
+
# "-v" creates verbose log file (.output).
|
138
|
+
# "-g" creates a "Verbose Parser".
|
139
|
+
# Verbose Parser prints the internal status when parsing.
|
140
|
+
# But it's _not_ automatic.
|
141
|
+
# You must use -g option and set +@yydebug+ to +true+ in order to get output.
|
142
|
+
# -g option only creates the verbose parser.
|
143
|
+
#
|
144
|
+
# === Racc reported syntax error.
|
145
|
+
#
|
146
|
+
# Isn't there too many "end"?
|
147
|
+
# grammar of racc file is changed in v0.10.
|
148
|
+
#
|
149
|
+
# Racc does not use '%' mark, while yacc uses huge number of '%' marks..
|
150
|
+
#
|
151
|
+
# === Racc reported "XXXX conflicts".
|
152
|
+
#
|
153
|
+
# Try "racc -v xxxx.y".
|
154
|
+
# It causes producing racc's internal log file, xxxx.output.
|
155
|
+
#
|
156
|
+
# === Generated parsers does not work correctly
|
157
|
+
#
|
158
|
+
# Try "racc -g xxxx.y".
|
159
|
+
# This command let racc generate "debugging parser".
|
160
|
+
# Then set @yydebug=true in your parser.
|
161
|
+
# It produces a working log of your parser.
|
162
|
+
#
|
163
|
+
# == Re-distributing Racc runtime
|
164
|
+
#
|
165
|
+
# A parser, which is created by Racc, requires the Racc runtime module;
|
166
|
+
# racc/parser.rb.
|
167
|
+
#
|
168
|
+
# Ruby 1.8.x comes with Racc runtime module,
|
169
|
+
# you need NOT distribute Racc runtime files.
|
170
|
+
#
|
171
|
+
# If you want to include the Racc runtime module with your parser.
|
172
|
+
# This can be done by using '-E' option:
|
173
|
+
#
|
174
|
+
# $ racc -E -omyparser.rb myparser.y
|
175
|
+
#
|
176
|
+
# This command creates myparser.rb which `includes' Racc runtime.
|
177
|
+
# Only you must do is to distribute your parser file (myparser.rb).
|
178
|
+
#
|
179
|
+
# Note: parser.rb is LGPL, but your parser is not.
|
180
|
+
# Your own parser is completely yours.
|
29
181
|
module Racc
|
30
182
|
|
31
183
|
unless defined?(Racc_No_Extentions)
|
@@ -35,12 +187,17 @@ module Racc
|
|
35
187
|
class Parser
|
36
188
|
|
37
189
|
Racc_Runtime_Version = ::Racc::VERSION
|
38
|
-
Racc_Runtime_Revision = '$Id:
|
190
|
+
Racc_Runtime_Revision = '$Id: a7af944d201a32a63d2536cdd589d8e9910848e0 $'
|
39
191
|
|
40
192
|
Racc_Runtime_Core_Version_R = ::Racc::VERSION
|
41
|
-
Racc_Runtime_Core_Revision_R = '$Id:
|
193
|
+
Racc_Runtime_Core_Revision_R = '$Id: a7af944d201a32a63d2536cdd589d8e9910848e0 $'.split[1]
|
42
194
|
begin
|
43
|
-
|
195
|
+
if RUBY_ENGINE == 'jruby'
|
196
|
+
require 'racc/cparse-jruby.jar'
|
197
|
+
com.headius.racc.Cparse.new.load(JRuby.runtime, false)
|
198
|
+
else
|
199
|
+
require 'racc/cparse'
|
200
|
+
end
|
44
201
|
# Racc_Runtime_Core_Version_C = (defined in extention)
|
45
202
|
Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
|
46
203
|
unless new.respond_to?(:_racc_do_parse_c, true)
|
@@ -56,6 +213,8 @@ module Racc
|
|
56
213
|
Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_C # :nodoc:
|
57
214
|
Racc_Runtime_Type = 'c' # :nodoc:
|
58
215
|
rescue LoadError
|
216
|
+
puts $!
|
217
|
+
puts $!.backtrace
|
59
218
|
Racc_Main_Parsing_Routine = :_racc_do_parse_rb
|
60
219
|
Racc_YY_Parse_Method = :_racc_yyparse_rb
|
61
220
|
Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R
|
@@ -169,7 +328,7 @@ module Racc
|
|
169
328
|
# RECEIVER#METHOD_ID is a method to get next token.
|
170
329
|
# It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
|
171
330
|
def yyparse(recv, mid)
|
172
|
-
__send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(),
|
331
|
+
__send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), false)
|
173
332
|
end
|
174
333
|
|
175
334
|
def _racc_yyparse_rb(recv, mid, arg, c_debug)
|