gd-racc 1.4.11

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.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/COPYING +515 -0
  4. data/ChangeLog +846 -0
  5. data/DEPENDS +4 -0
  6. data/Manifest.txt +100 -0
  7. data/README.ja.rdoc +96 -0
  8. data/README.rdoc +86 -0
  9. data/Rakefile +54 -0
  10. data/TODO +5 -0
  11. data/bin/racc +308 -0
  12. data/bin/racc2y +195 -0
  13. data/bin/y2racc +339 -0
  14. data/ext/racc/MANIFEST +4 -0
  15. data/ext/racc/cparse.c +828 -0
  16. data/ext/racc/depend +1 -0
  17. data/ext/racc/extconf.rb +7 -0
  18. data/fastcache/extconf.rb +2 -0
  19. data/fastcache/fastcache.c +185 -0
  20. data/lib/racc.rb +6 -0
  21. data/lib/racc/compat.rb +32 -0
  22. data/lib/racc/debugflags.rb +59 -0
  23. data/lib/racc/exception.rb +15 -0
  24. data/lib/racc/grammar.rb +1115 -0
  25. data/lib/racc/grammarfileparser.rb +559 -0
  26. data/lib/racc/info.rb +16 -0
  27. data/lib/racc/iset.rb +91 -0
  28. data/lib/racc/logfilegenerator.rb +211 -0
  29. data/lib/racc/parser-text.rb +631 -0
  30. data/lib/racc/parser.rb +626 -0
  31. data/lib/racc/parserfilegenerator.rb +512 -0
  32. data/lib/racc/pre-setup +13 -0
  33. data/lib/racc/sourcetext.rb +34 -0
  34. data/lib/racc/state.rb +971 -0
  35. data/lib/racc/statetransitiontable.rb +316 -0
  36. data/lib/racc/static.rb +5 -0
  37. data/misc/dist.sh +31 -0
  38. data/rdoc/en/NEWS.en.rdoc +282 -0
  39. data/rdoc/en/grammar.en.rdoc +230 -0
  40. data/rdoc/ja/NEWS.ja.rdoc +307 -0
  41. data/rdoc/ja/command.ja.html +94 -0
  42. data/rdoc/ja/debug.ja.rdoc +36 -0
  43. data/rdoc/ja/grammar.ja.rdoc +348 -0
  44. data/rdoc/ja/index.ja.html +10 -0
  45. data/rdoc/ja/parser.ja.rdoc +125 -0
  46. data/rdoc/ja/usage.ja.html +414 -0
  47. data/sample/array.y +67 -0
  48. data/sample/array2.y +59 -0
  49. data/sample/calc-ja.y +66 -0
  50. data/sample/calc.y +65 -0
  51. data/sample/conflict.y +15 -0
  52. data/sample/hash.y +60 -0
  53. data/sample/lalr.y +17 -0
  54. data/sample/lists.y +57 -0
  55. data/sample/syntax.y +46 -0
  56. data/sample/yyerr.y +46 -0
  57. data/setup.rb +1587 -0
  58. data/tasks/doc.rb +12 -0
  59. data/tasks/email.rb +55 -0
  60. data/test/assets/chk.y +126 -0
  61. data/test/assets/conf.y +16 -0
  62. data/test/assets/digraph.y +29 -0
  63. data/test/assets/echk.y +118 -0
  64. data/test/assets/err.y +60 -0
  65. data/test/assets/expect.y +7 -0
  66. data/test/assets/firstline.y +4 -0
  67. data/test/assets/ichk.y +102 -0
  68. data/test/assets/intp.y +546 -0
  69. data/test/assets/mailp.y +437 -0
  70. data/test/assets/newsyn.y +25 -0
  71. data/test/assets/noend.y +4 -0
  72. data/test/assets/nonass.y +41 -0
  73. data/test/assets/normal.y +27 -0
  74. data/test/assets/norule.y +4 -0
  75. data/test/assets/nullbug1.y +25 -0
  76. data/test/assets/nullbug2.y +15 -0
  77. data/test/assets/opt.y +123 -0
  78. data/test/assets/percent.y +35 -0
  79. data/test/assets/recv.y +97 -0
  80. data/test/assets/rrconf.y +14 -0
  81. data/test/assets/scan.y +72 -0
  82. data/test/assets/syntax.y +50 -0
  83. data/test/assets/unterm.y +5 -0
  84. data/test/assets/useless.y +12 -0
  85. data/test/assets/yyerr.y +46 -0
  86. data/test/bench.y +36 -0
  87. data/test/helper.rb +87 -0
  88. data/test/infini.y +8 -0
  89. data/test/scandata/brace +7 -0
  90. data/test/scandata/gvar +1 -0
  91. data/test/scandata/normal +4 -0
  92. data/test/scandata/percent +18 -0
  93. data/test/scandata/slash +10 -0
  94. data/test/src.intp +34 -0
  95. data/test/start.y +20 -0
  96. data/test/test_chk_y.rb +51 -0
  97. data/test/test_grammar_file_parser.rb +15 -0
  98. data/test/test_racc_command.rb +155 -0
  99. data/test/test_scan_y.rb +51 -0
  100. data/test/testscanner.rb +51 -0
  101. data/web/racc.en.rhtml +42 -0
  102. data/web/racc.ja.rhtml +51 -0
  103. metadata +212 -0
data/lib/racc/info.rb ADDED
@@ -0,0 +1,16 @@
1
+ #
2
+ # $Id: 90afb43b1438ad2bb681a529146d1cb5cd7e45ac $
3
+ #
4
+ # Copyright (c) 1999-2006 Minero Aoki
5
+ #
6
+ # This program is free software.
7
+ # You can distribute/modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ # For details of the GNU LGPL, see the file "COPYING".
10
+ #
11
+
12
+ module Racc
13
+ VERSION = '1.4.11'
14
+ Version = VERSION
15
+ Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
16
+ end
data/lib/racc/iset.rb ADDED
@@ -0,0 +1,91 @@
1
+ #
2
+ # $Id: de638608cfd72d3ed9819d87b65a89ee6a57b589 $
3
+ #
4
+ # Copyright (c) 1999-2006 Minero Aoki
5
+ #
6
+ # This program is free software.
7
+ # You can distribute/modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ # For details of the GNU LGPL, see the file "COPYING".
10
+ #
11
+
12
+ module Racc
13
+
14
+ # An "indexed" set. All items must respond to :ident.
15
+ class ISet
16
+
17
+ def initialize(a = [])
18
+ @set = a
19
+ end
20
+
21
+ attr_reader :set
22
+
23
+ def add(i)
24
+ @set[i.ident] = i
25
+ end
26
+
27
+ def [](key)
28
+ @set[key.ident]
29
+ end
30
+
31
+ def []=(key, val)
32
+ @set[key.ident] = val
33
+ end
34
+
35
+ alias include? []
36
+ alias key? []
37
+
38
+ def update(other)
39
+ s = @set
40
+ o = other.set
41
+ o.each_index do |idx|
42
+ if t = o[idx]
43
+ s[idx] = t
44
+ end
45
+ end
46
+ end
47
+
48
+ def update_a(a)
49
+ s = @set
50
+ a.each {|i| s[i.ident] = i }
51
+ end
52
+
53
+ def delete(key)
54
+ i = @set[key.ident]
55
+ @set[key.ident] = nil
56
+ i
57
+ end
58
+
59
+ def each(&block)
60
+ @set.compact.each(&block)
61
+ end
62
+
63
+ def to_a
64
+ @set.compact
65
+ end
66
+
67
+ def to_s
68
+ "[#{@set.compact.join(' ')}]"
69
+ end
70
+
71
+ alias inspect to_s
72
+
73
+ def size
74
+ @set.nitems
75
+ end
76
+
77
+ def empty?
78
+ @set.nitems == 0
79
+ end
80
+
81
+ def clear
82
+ @set.clear
83
+ end
84
+
85
+ def dup
86
+ ISet.new(@set.dup)
87
+ end
88
+
89
+ end # class ISet
90
+
91
+ end # module Racc
@@ -0,0 +1,211 @@
1
+ #
2
+ # $Id: a7e9663605afdda065d305b250a9805e3bd3fa70 $
3
+ #
4
+ # Copyright (c) 1999-2006 Minero Aoki
5
+ #
6
+ # This program is free software.
7
+ # You can distribute/modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ # For details of the GNU LGPL, see the file "COPYING".
10
+ #
11
+
12
+ module Racc
13
+
14
+ class LogFileGenerator
15
+
16
+ def initialize(states, debug_flags = DebugFlags.new)
17
+ @states = states
18
+ @grammar = states.grammar
19
+ @debug_flags = debug_flags
20
+ end
21
+
22
+ def output(out)
23
+ output_conflict out; out.puts
24
+ output_useless out; out.puts
25
+ output_rule out; out.puts
26
+ output_token out; out.puts
27
+ output_state out
28
+ end
29
+
30
+ #
31
+ # Warnings
32
+ #
33
+
34
+ def output_conflict(out)
35
+ @states.each do |state|
36
+ if state.srconf
37
+ out.printf "state %d contains %d shift/reduce conflicts\n",
38
+ state.stateid, state.srconf.size
39
+ end
40
+ if state.rrconf
41
+ out.printf "state %d contains %d reduce/reduce conflicts\n",
42
+ state.stateid, state.rrconf.size
43
+ end
44
+ end
45
+ end
46
+
47
+ def output_useless(out)
48
+ @grammar.each do |rl|
49
+ if rl.useless?
50
+ out.printf "rule %d (%s) never reduced\n",
51
+ rl.ident, rl.target.to_s
52
+ end
53
+ end
54
+ @grammar.each_nonterminal do |t|
55
+ if t.useless?
56
+ out.printf "useless nonterminal %s\n", t.to_s
57
+ end
58
+ end
59
+ end
60
+
61
+ #
62
+ # States
63
+ #
64
+
65
+ def output_state(out)
66
+ out << "--------- State ---------\n"
67
+
68
+ showall = @debug_flags.la || @debug_flags.state
69
+ @states.each do |state|
70
+ out << "\nstate #{state.ident}\n\n"
71
+
72
+ (showall ? state.closure : state.core).each do |ptr|
73
+ pointer_out(out, ptr) if ptr.rule.ident != 0 or showall
74
+ end
75
+ out << "\n"
76
+
77
+ action_out out, state
78
+ end
79
+ end
80
+
81
+ def pointer_out(out, ptr)
82
+ buf = sprintf("%4d) %s :", ptr.rule.ident, ptr.rule.target.to_s)
83
+ ptr.rule.symbols.each_with_index do |tok, idx|
84
+ buf << ' _' if idx == ptr.index
85
+ buf << ' ' << tok.to_s
86
+ end
87
+ buf << ' _' if ptr.reduce?
88
+ out.puts buf
89
+ end
90
+
91
+ def action_out(f, state)
92
+ sr = state.srconf && state.srconf.dup
93
+ rr = state.rrconf && state.rrconf.dup
94
+ acts = state.action
95
+ keys = acts.keys
96
+ keys.sort! {|a,b| a.ident <=> b.ident }
97
+
98
+ [ Shift, Reduce, Error, Accept ].each do |klass|
99
+ keys.delete_if do |tok|
100
+ act = acts[tok]
101
+ if act.kind_of?(klass)
102
+ outact f, tok, act
103
+ if sr and c = sr.delete(tok)
104
+ outsrconf f, c
105
+ end
106
+ if rr and c = rr.delete(tok)
107
+ outrrconf f, c
108
+ end
109
+
110
+ true
111
+ else
112
+ false
113
+ end
114
+ end
115
+ end
116
+ sr.each {|tok, c| outsrconf f, c } if sr
117
+ rr.each {|tok, c| outrrconf f, c } if rr
118
+
119
+ act = state.defact
120
+ if not act.kind_of?(Error) or @debug_flags.any?
121
+ outact f, '$default', act
122
+ end
123
+
124
+ f.puts
125
+ state.goto_table.each do |t, st|
126
+ if t.nonterminal?
127
+ f.printf " %-12s go to state %d\n", t.to_s, st.ident
128
+ end
129
+ end
130
+ end
131
+
132
+ def outact(f, t, act)
133
+ case act
134
+ when Shift
135
+ f.printf " %-12s shift, and go to state %d\n",
136
+ t.to_s, act.goto_id
137
+ when Reduce
138
+ f.printf " %-12s reduce using rule %d (%s)\n",
139
+ t.to_s, act.ruleid, act.rule.target.to_s
140
+ when Accept
141
+ f.printf " %-12s accept\n", t.to_s
142
+ when Error
143
+ f.printf " %-12s error\n", t.to_s
144
+ else
145
+ raise "racc: fatal: wrong act for outact: act=#{act}(#{act.class})"
146
+ end
147
+ end
148
+
149
+ def outsrconf(f, confs)
150
+ confs.each do |c|
151
+ r = c.reduce
152
+ f.printf " %-12s [reduce using rule %d (%s)]\n",
153
+ c.shift.to_s, r.ident, r.target.to_s
154
+ end
155
+ end
156
+
157
+ def outrrconf(f, confs)
158
+ confs.each do |c|
159
+ r = c.low_prec
160
+ f.printf " %-12s [reduce using rule %d (%s)]\n",
161
+ c.token.to_s, r.ident, r.target.to_s
162
+ end
163
+ end
164
+
165
+ #
166
+ # Rules
167
+ #
168
+
169
+ def output_rule(out)
170
+ out.print "-------- Grammar --------\n\n"
171
+ @grammar.each do |rl|
172
+ if @debug_flags.any? or rl.ident != 0
173
+ out.printf "rule %d %s: %s\n",
174
+ rl.ident, rl.target.to_s, rl.symbols.join(' ')
175
+ end
176
+ end
177
+ end
178
+
179
+ #
180
+ # Tokens
181
+ #
182
+
183
+ def output_token(out)
184
+ out.print "------- Symbols -------\n\n"
185
+
186
+ out.print "**Nonterminals, with rules where they appear\n\n"
187
+ @grammar.each_nonterminal do |t|
188
+ tmp = <<SRC
189
+ %s (%d)
190
+ on right: %s
191
+ on left : %s
192
+ SRC
193
+ out.printf tmp, t.to_s, t.ident,
194
+ symbol_locations(t.locate).join(' '),
195
+ symbol_locations(t.heads).join(' ')
196
+ end
197
+
198
+ out.print "\n**Terminals, with rules where they appear\n\n"
199
+ @grammar.each_terminal do |t|
200
+ out.printf " %s (%d) %s\n",
201
+ t.to_s, t.ident, symbol_locations(t.locate).join(' ')
202
+ end
203
+ end
204
+
205
+ def symbol_locations(locs)
206
+ locs.map {|loc| loc.rule.ident }.reject {|n| n == 0 }.uniq
207
+ end
208
+
209
+ end
210
+
211
+ end # module Racc
@@ -0,0 +1,631 @@
1
+ module Racc
2
+ PARSER_TEXT = <<'__end_of_file__'
3
+ #
4
+ # $Id: 3c520ba1f2996b86abc21eeb54768934a7be9d0c $
5
+ #
6
+ # Copyright (c) 1999-2006 Minero Aoki
7
+ #
8
+ # This program is free software.
9
+ # You can distribute/modify this program under the same terms of ruby.
10
+ #
11
+ # As a special exception, when this code is copied by Racc
12
+ # into a Racc output file, you may use that output file
13
+ # without restriction.
14
+ #
15
+
16
+ require 'racc/info'
17
+
18
+ unless defined?(NotImplementedError)
19
+ NotImplementedError = NotImplementError # :nodoc:
20
+ end
21
+
22
+ module Racc
23
+ class ParseError < StandardError; end
24
+ end
25
+ unless defined?(::ParseError)
26
+ ParseError = Racc::ParseError
27
+ end
28
+
29
+ # Racc is a LALR(1) parser generator.
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.
183
+ module Racc
184
+
185
+ unless defined?(Racc_No_Extentions)
186
+ Racc_No_Extentions = false # :nodoc:
187
+ end
188
+
189
+ class Parser
190
+
191
+ Racc_Runtime_Version = ::Racc::VERSION
192
+ Racc_Runtime_Revision = '$Id: 3c520ba1f2996b86abc21eeb54768934a7be9d0c $'
193
+
194
+ Racc_Runtime_Core_Version_R = ::Racc::VERSION
195
+ Racc_Runtime_Core_Revision_R = '$Id: 3c520ba1f2996b86abc21eeb54768934a7be9d0c $'.split[1]
196
+ begin
197
+ require 'racc/cparse'
198
+ # Racc_Runtime_Core_Version_C = (defined in extention)
199
+ Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
200
+ unless new.respond_to?(:_racc_do_parse_c, true)
201
+ raise LoadError, 'old cparse.so'
202
+ end
203
+ if Racc_No_Extentions
204
+ raise LoadError, 'selecting ruby version of racc runtime core'
205
+ end
206
+
207
+ Racc_Main_Parsing_Routine = :_racc_do_parse_c # :nodoc:
208
+ Racc_YY_Parse_Method = :_racc_yyparse_c # :nodoc:
209
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_C # :nodoc:
210
+ Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_C # :nodoc:
211
+ Racc_Runtime_Type = 'c' # :nodoc:
212
+ rescue LoadError
213
+ Racc_Main_Parsing_Routine = :_racc_do_parse_rb
214
+ Racc_YY_Parse_Method = :_racc_yyparse_rb
215
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R
216
+ Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_R
217
+ Racc_Runtime_Type = 'ruby'
218
+ end
219
+
220
+ def Parser.racc_runtime_type # :nodoc:
221
+ Racc_Runtime_Type
222
+ end
223
+
224
+ def _racc_setup
225
+ @yydebug = false unless self.class::Racc_debug_parser
226
+ @yydebug = false unless defined?(@yydebug)
227
+ if @yydebug
228
+ @racc_debug_out = $stderr unless defined?(@racc_debug_out)
229
+ @racc_debug_out ||= $stderr
230
+ end
231
+ arg = self.class::Racc_arg
232
+ arg[13] = true if arg.size < 14
233
+ arg
234
+ end
235
+
236
+ def _racc_init_sysvars
237
+ @racc_state = [0]
238
+ @racc_tstack = []
239
+ @racc_vstack = []
240
+
241
+ @racc_t = nil
242
+ @racc_val = nil
243
+
244
+ @racc_read_next = true
245
+
246
+ @racc_user_yyerror = false
247
+ @racc_error_status = 0
248
+ end
249
+
250
+ # The entry point of the parser. This method is used with #next_token.
251
+ # If Racc wants to get token (and its value), calls next_token.
252
+ #
253
+ # Example:
254
+ # def parse
255
+ # @q = [[1,1],
256
+ # [2,2],
257
+ # [3,3],
258
+ # [false, '$']]
259
+ # do_parse
260
+ # end
261
+ #
262
+ # def next_token
263
+ # @q.shift
264
+ # end
265
+ def do_parse
266
+ __send__(Racc_Main_Parsing_Routine, _racc_setup(), false)
267
+ end
268
+
269
+ # The method to fetch next token.
270
+ # If you use #do_parse method, you must implement #next_token.
271
+ #
272
+ # The format of return value is [TOKEN_SYMBOL, VALUE].
273
+ # +token-symbol+ is represented by Ruby's symbol by default, e.g. :IDENT
274
+ # for 'IDENT'. ";" (String) for ';'.
275
+ #
276
+ # The final symbol (End of file) must be false.
277
+ def next_token
278
+ raise NotImplementedError, "#{self.class}\#next_token is not defined"
279
+ end
280
+
281
+ def _racc_do_parse_rb(arg, in_debug)
282
+ action_table, action_check, action_default, action_pointer,
283
+ _, _, _, _,
284
+ _, _, token_table, * = arg
285
+
286
+ _racc_init_sysvars
287
+ tok = act = i = nil
288
+
289
+ catch(:racc_end_parse) {
290
+ while true
291
+ if i = action_pointer[@racc_state[-1]]
292
+ if @racc_read_next
293
+ if @racc_t != 0 # not EOF
294
+ tok, @racc_val = next_token()
295
+ unless tok # EOF
296
+ @racc_t = 0
297
+ else
298
+ @racc_t = (token_table[tok] or 1) # error token
299
+ end
300
+ racc_read_token(@racc_t, tok, @racc_val) if @yydebug
301
+ @racc_read_next = false
302
+ end
303
+ end
304
+ i += @racc_t
305
+ unless i >= 0 and
306
+ act = action_table[i] and
307
+ action_check[i] == @racc_state[-1]
308
+ act = action_default[@racc_state[-1]]
309
+ end
310
+ else
311
+ act = action_default[@racc_state[-1]]
312
+ end
313
+ while act = _racc_evalact(act, arg)
314
+ ;
315
+ end
316
+ end
317
+ }
318
+ end
319
+
320
+ # Another entry point for the parser.
321
+ # If you use this method, you must implement RECEIVER#METHOD_ID method.
322
+ #
323
+ # RECEIVER#METHOD_ID is a method to get next token.
324
+ # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
325
+ def yyparse(recv, mid)
326
+ __send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), true)
327
+ end
328
+
329
+ def _racc_yyparse_rb(recv, mid, arg, c_debug)
330
+ action_table, action_check, action_default, action_pointer,
331
+ _, _, _, _,
332
+ _, _, token_table, * = arg
333
+
334
+ _racc_init_sysvars
335
+
336
+ catch(:racc_end_parse) {
337
+ until i = action_pointer[@racc_state[-1]]
338
+ while act = _racc_evalact(action_default[@racc_state[-1]], arg)
339
+ ;
340
+ end
341
+ end
342
+ recv.__send__(mid) do |tok, val|
343
+ unless tok
344
+ @racc_t = 0
345
+ else
346
+ @racc_t = (token_table[tok] or 1) # error token
347
+ end
348
+ @racc_val = val
349
+ @racc_read_next = false
350
+
351
+ i += @racc_t
352
+ unless i >= 0 and
353
+ act = action_table[i] and
354
+ action_check[i] == @racc_state[-1]
355
+ act = action_default[@racc_state[-1]]
356
+ end
357
+ while act = _racc_evalact(act, arg)
358
+ ;
359
+ end
360
+
361
+ while !(i = action_pointer[@racc_state[-1]]) ||
362
+ ! @racc_read_next ||
363
+ @racc_t == 0 # $
364
+ unless i and i += @racc_t and
365
+ i >= 0 and
366
+ act = action_table[i] and
367
+ action_check[i] == @racc_state[-1]
368
+ act = action_default[@racc_state[-1]]
369
+ end
370
+ while act = _racc_evalact(act, arg)
371
+ ;
372
+ end
373
+ end
374
+ end
375
+ }
376
+ end
377
+
378
+ ###
379
+ ### common
380
+ ###
381
+
382
+ def _racc_evalact(act, arg)
383
+ action_table, action_check, _, action_pointer,
384
+ _, _, _, _,
385
+ _, _, _, shift_n,
386
+ reduce_n, * = arg
387
+ nerr = 0 # tmp
388
+
389
+ if act > 0 and act < shift_n
390
+ #
391
+ # shift
392
+ #
393
+ if @racc_error_status > 0
394
+ @racc_error_status -= 1 unless @racc_t == 1 # error token
395
+ end
396
+ @racc_vstack.push @racc_val
397
+ @racc_state.push act
398
+ @racc_read_next = true
399
+ if @yydebug
400
+ @racc_tstack.push @racc_t
401
+ racc_shift @racc_t, @racc_tstack, @racc_vstack
402
+ end
403
+
404
+ elsif act < 0 and act > -reduce_n
405
+ #
406
+ # reduce
407
+ #
408
+ code = catch(:racc_jump) {
409
+ @racc_state.push _racc_do_reduce(arg, act)
410
+ false
411
+ }
412
+ if code
413
+ case code
414
+ when 1 # yyerror
415
+ @racc_user_yyerror = true # user_yyerror
416
+ return -reduce_n
417
+ when 2 # yyaccept
418
+ return shift_n
419
+ else
420
+ raise '[Racc Bug] unknown jump code'
421
+ end
422
+ end
423
+
424
+ elsif act == shift_n
425
+ #
426
+ # accept
427
+ #
428
+ racc_accept if @yydebug
429
+ throw :racc_end_parse, @racc_vstack[0]
430
+
431
+ elsif act == -reduce_n
432
+ #
433
+ # error
434
+ #
435
+ case @racc_error_status
436
+ when 0
437
+ unless arg[21] # user_yyerror
438
+ nerr += 1
439
+ on_error @racc_t, @racc_val, @racc_vstack
440
+ end
441
+ when 3
442
+ if @racc_t == 0 # is $
443
+ throw :racc_end_parse, nil
444
+ end
445
+ @racc_read_next = true
446
+ end
447
+ @racc_user_yyerror = false
448
+ @racc_error_status = 3
449
+ while true
450
+ if i = action_pointer[@racc_state[-1]]
451
+ i += 1 # error token
452
+ if i >= 0 and
453
+ (act = action_table[i]) and
454
+ action_check[i] == @racc_state[-1]
455
+ break
456
+ end
457
+ end
458
+ throw :racc_end_parse, nil if @racc_state.size <= 1
459
+ @racc_state.pop
460
+ @racc_vstack.pop
461
+ if @yydebug
462
+ @racc_tstack.pop
463
+ racc_e_pop @racc_state, @racc_tstack, @racc_vstack
464
+ end
465
+ end
466
+ return act
467
+
468
+ else
469
+ raise "[Racc Bug] unknown action #{act.inspect}"
470
+ end
471
+
472
+ racc_next_state(@racc_state[-1], @racc_state) if @yydebug
473
+
474
+ nil
475
+ end
476
+
477
+ def _racc_do_reduce(arg, act)
478
+ _, _, _, _,
479
+ goto_table, goto_check, goto_default, goto_pointer,
480
+ nt_base, reduce_table, _, _,
481
+ _, use_result, * = arg
482
+
483
+ state = @racc_state
484
+ vstack = @racc_vstack
485
+ tstack = @racc_tstack
486
+
487
+ i = act * -3
488
+ len = reduce_table[i]
489
+ reduce_to = reduce_table[i+1]
490
+ method_id = reduce_table[i+2]
491
+ void_array = []
492
+
493
+ tmp_t = tstack[-len, len] if @yydebug
494
+ tmp_v = vstack[-len, len]
495
+ tstack[-len, len] = void_array if @yydebug
496
+ vstack[-len, len] = void_array
497
+ state[-len, len] = void_array
498
+
499
+ # tstack must be updated AFTER method call
500
+ if use_result
501
+ vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
502
+ else
503
+ vstack.push __send__(method_id, tmp_v, vstack)
504
+ end
505
+ tstack.push reduce_to
506
+
507
+ racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
508
+
509
+ k1 = reduce_to - nt_base
510
+ if i = goto_pointer[k1]
511
+ i += state[-1]
512
+ if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
513
+ return curstate
514
+ end
515
+ end
516
+ goto_default[k1]
517
+ end
518
+
519
+ # This method is called when a parse error is found.
520
+ #
521
+ # ERROR_TOKEN_ID is an internal ID of token which caused error.
522
+ # You can get string representation of this ID by calling
523
+ # #token_to_str.
524
+ #
525
+ # ERROR_VALUE is a value of error token.
526
+ #
527
+ # value_stack is a stack of symbol values.
528
+ # DO NOT MODIFY this object.
529
+ #
530
+ # This method raises ParseError by default.
531
+ #
532
+ # If this method returns, parsers enter "error recovering mode".
533
+ def on_error(t, val, vstack)
534
+ raise ParseError, sprintf("\nparse error on value %s (%s)",
535
+ val.inspect, token_to_str(t) || '?')
536
+ end
537
+
538
+ # Enter error recovering mode.
539
+ # This method does not call #on_error.
540
+ def yyerror
541
+ throw :racc_jump, 1
542
+ end
543
+
544
+ # Exit parser.
545
+ # Return value is Symbol_Value_Stack[0].
546
+ def yyaccept
547
+ throw :racc_jump, 2
548
+ end
549
+
550
+ # Leave error recovering mode.
551
+ def yyerrok
552
+ @racc_error_status = 0
553
+ end
554
+
555
+ # For debugging output
556
+ def racc_read_token(t, tok, val)
557
+ @racc_debug_out.print 'read '
558
+ @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
559
+ @racc_debug_out.puts val.inspect
560
+ @racc_debug_out.puts
561
+ end
562
+
563
+ def racc_shift(tok, tstack, vstack)
564
+ @racc_debug_out.puts "shift #{racc_token2str tok}"
565
+ racc_print_stacks tstack, vstack
566
+ @racc_debug_out.puts
567
+ end
568
+
569
+ def racc_reduce(toks, sim, tstack, vstack)
570
+ out = @racc_debug_out
571
+ out.print 'reduce '
572
+ if toks.empty?
573
+ out.print ' <none>'
574
+ else
575
+ toks.each {|t| out.print ' ', racc_token2str(t) }
576
+ end
577
+ out.puts " --> #{racc_token2str(sim)}"
578
+ racc_print_stacks tstack, vstack
579
+ @racc_debug_out.puts
580
+ end
581
+
582
+ def racc_accept
583
+ @racc_debug_out.puts 'accept'
584
+ @racc_debug_out.puts
585
+ end
586
+
587
+ def racc_e_pop(state, tstack, vstack)
588
+ @racc_debug_out.puts 'error recovering mode: pop token'
589
+ racc_print_states state
590
+ racc_print_stacks tstack, vstack
591
+ @racc_debug_out.puts
592
+ end
593
+
594
+ def racc_next_state(curstate, state)
595
+ @racc_debug_out.puts "goto #{curstate}"
596
+ racc_print_states state
597
+ @racc_debug_out.puts
598
+ end
599
+
600
+ def racc_print_stacks(t, v)
601
+ out = @racc_debug_out
602
+ out.print ' ['
603
+ t.each_index do |i|
604
+ out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
605
+ end
606
+ out.puts ' ]'
607
+ end
608
+
609
+ def racc_print_states(s)
610
+ out = @racc_debug_out
611
+ out.print ' ['
612
+ s.each {|st| out.print ' ', st }
613
+ out.puts ' ]'
614
+ end
615
+
616
+ def racc_token2str(tok)
617
+ self.class::Racc_token_to_s_table[tok] or
618
+ raise "[Racc Bug] can't convert token #{tok} to string"
619
+ end
620
+
621
+ # Convert internal ID of token symbol to the string.
622
+ def token_to_str(t)
623
+ self.class::Racc_token_to_s_table[t]
624
+ end
625
+
626
+ end
627
+
628
+ end
629
+
630
+ __end_of_file__
631
+ end