racc 1.4.9-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.
Files changed (107) hide show
  1. data/.gemtest +0 -0
  2. data/COPYING +515 -0
  3. data/ChangeLog +846 -0
  4. data/DEPENDS +4 -0
  5. data/Manifest.txt +105 -0
  6. data/README.ja.rdoc +96 -0
  7. data/README.rdoc +86 -0
  8. data/Rakefile +51 -0
  9. data/TODO +5 -0
  10. data/bin/racc +308 -0
  11. data/bin/racc2y +195 -0
  12. data/bin/y2racc +339 -0
  13. data/ext/racc/MANIFEST +4 -0
  14. data/ext/racc/cparse.c +824 -0
  15. data/ext/racc/depend +1 -0
  16. data/ext/racc/extconf.rb +5 -0
  17. data/fastcache/extconf.rb +2 -0
  18. data/fastcache/fastcache.c +185 -0
  19. data/lib/racc.rb +6 -0
  20. data/lib/racc/compat.rb +40 -0
  21. data/lib/racc/debugflags.rb +59 -0
  22. data/lib/racc/exception.rb +15 -0
  23. data/lib/racc/grammar.rb +1115 -0
  24. data/lib/racc/grammarfileparser.rb +559 -0
  25. data/lib/racc/info.rb +16 -0
  26. data/lib/racc/iset.rb +91 -0
  27. data/lib/racc/logfilegenerator.rb +211 -0
  28. data/lib/racc/parser-text.rb +479 -0
  29. data/lib/racc/parser.rb +474 -0
  30. data/lib/racc/parserfilegenerator.rb +512 -0
  31. data/lib/racc/pre-setup +13 -0
  32. data/lib/racc/sourcetext.rb +34 -0
  33. data/lib/racc/state.rb +971 -0
  34. data/lib/racc/statetransitiontable.rb +316 -0
  35. data/lib/racc/static.rb +5 -0
  36. data/misc/dist.sh +31 -0
  37. data/rdoc/en/NEWS.en.rdoc +282 -0
  38. data/rdoc/en/command.en.html +78 -0
  39. data/rdoc/en/debug.en.rdoc +20 -0
  40. data/rdoc/en/grammar.en.rdoc +230 -0
  41. data/rdoc/en/index.en.html +10 -0
  42. data/rdoc/en/parser.en.rdoc +74 -0
  43. data/rdoc/en/usage.en.rdoc +83 -0
  44. data/rdoc/ja/NEWS.ja.rdoc +307 -0
  45. data/rdoc/ja/command.ja.html +94 -0
  46. data/rdoc/ja/debug.ja.rdoc +36 -0
  47. data/rdoc/ja/grammar.ja.rdoc +348 -0
  48. data/rdoc/ja/index.ja.html +10 -0
  49. data/rdoc/ja/parser.ja.rdoc +125 -0
  50. data/rdoc/ja/usage.ja.html +414 -0
  51. data/sample/array.y +67 -0
  52. data/sample/array2.y +59 -0
  53. data/sample/calc-ja.y +66 -0
  54. data/sample/calc.y +65 -0
  55. data/sample/conflict.y +15 -0
  56. data/sample/hash.y +60 -0
  57. data/sample/lalr.y +17 -0
  58. data/sample/lists.y +57 -0
  59. data/sample/syntax.y +46 -0
  60. data/sample/yyerr.y +46 -0
  61. data/setup.rb +1587 -0
  62. data/tasks/doc.rb +12 -0
  63. data/tasks/email.rb +55 -0
  64. data/test/assets/chk.y +126 -0
  65. data/test/assets/conf.y +16 -0
  66. data/test/assets/digraph.y +29 -0
  67. data/test/assets/echk.y +118 -0
  68. data/test/assets/err.y +60 -0
  69. data/test/assets/expect.y +7 -0
  70. data/test/assets/firstline.y +4 -0
  71. data/test/assets/ichk.y +102 -0
  72. data/test/assets/intp.y +546 -0
  73. data/test/assets/mailp.y +437 -0
  74. data/test/assets/newsyn.y +25 -0
  75. data/test/assets/noend.y +4 -0
  76. data/test/assets/nonass.y +41 -0
  77. data/test/assets/normal.y +27 -0
  78. data/test/assets/norule.y +4 -0
  79. data/test/assets/nullbug1.y +25 -0
  80. data/test/assets/nullbug2.y +15 -0
  81. data/test/assets/opt.y +123 -0
  82. data/test/assets/percent.y +35 -0
  83. data/test/assets/recv.y +97 -0
  84. data/test/assets/rrconf.y +14 -0
  85. data/test/assets/scan.y +72 -0
  86. data/test/assets/syntax.y +50 -0
  87. data/test/assets/unterm.y +5 -0
  88. data/test/assets/useless.y +12 -0
  89. data/test/assets/yyerr.y +46 -0
  90. data/test/bench.y +36 -0
  91. data/test/helper.rb +91 -0
  92. data/test/infini.y +8 -0
  93. data/test/scandata/brace +7 -0
  94. data/test/scandata/gvar +1 -0
  95. data/test/scandata/normal +4 -0
  96. data/test/scandata/percent +18 -0
  97. data/test/scandata/slash +10 -0
  98. data/test/src.intp +34 -0
  99. data/test/start.y +20 -0
  100. data/test/test_chk_y.rb +51 -0
  101. data/test/test_grammar_file_parser.rb +15 -0
  102. data/test/test_racc_command.rb +155 -0
  103. data/test/test_scan_y.rb +51 -0
  104. data/test/testscanner.rb +51 -0
  105. data/web/racc.en.rhtml +42 -0
  106. data/web/racc.ja.rhtml +51 -0
  107. metadata +233 -0
data/lib/racc/info.rb ADDED
@@ -0,0 +1,16 @@
1
+ #
2
+ # $Id: 70655d6dde5488a467b21dcae9ef4fcf92b33fec $
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.9'
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,479 @@
1
+ module Racc
2
+ PARSER_TEXT = <<'__end_of_file__'
3
+ #
4
+ # $Id: 891566e6b68142589f193e8e7bd3372e1e258373 $
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
+ module Racc
32
+
33
+ unless defined?(Racc_No_Extentions)
34
+ Racc_No_Extentions = false # :nodoc:
35
+ end
36
+
37
+ class Parser
38
+
39
+ Racc_Runtime_Version = ::Racc::VERSION
40
+ Racc_Runtime_Revision = '$Id: 891566e6b68142589f193e8e7bd3372e1e258373 $'
41
+
42
+ Racc_Runtime_Core_Version_R = ::Racc::VERSION
43
+ Racc_Runtime_Core_Revision_R = '$Id: 891566e6b68142589f193e8e7bd3372e1e258373 $'.split[1]
44
+ begin
45
+ require 'racc/cparse'
46
+ # Racc_Runtime_Core_Version_C = (defined in extention)
47
+ Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
48
+ unless new.respond_to?(:_racc_do_parse_c, true)
49
+ raise LoadError, 'old cparse.so'
50
+ end
51
+ if Racc_No_Extentions
52
+ raise LoadError, 'selecting ruby version of racc runtime core'
53
+ end
54
+
55
+ Racc_Main_Parsing_Routine = :_racc_do_parse_c # :nodoc:
56
+ Racc_YY_Parse_Method = :_racc_yyparse_c # :nodoc:
57
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_C # :nodoc:
58
+ Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_C # :nodoc:
59
+ Racc_Runtime_Type = 'c' # :nodoc:
60
+ rescue LoadError
61
+ Racc_Main_Parsing_Routine = :_racc_do_parse_rb
62
+ Racc_YY_Parse_Method = :_racc_yyparse_rb
63
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R
64
+ Racc_Runtime_Core_Revision = Racc_Runtime_Core_Revision_R
65
+ Racc_Runtime_Type = 'ruby'
66
+ end
67
+
68
+ def Parser.racc_runtime_type # :nodoc:
69
+ Racc_Runtime_Type
70
+ end
71
+
72
+ def _racc_setup
73
+ @yydebug = false unless self.class::Racc_debug_parser
74
+ @yydebug = false unless defined?(@yydebug)
75
+ if @yydebug
76
+ @racc_debug_out = $stderr unless defined?(@racc_debug_out)
77
+ @racc_debug_out ||= $stderr
78
+ end
79
+ arg = self.class::Racc_arg
80
+ arg[13] = true if arg.size < 14
81
+ arg
82
+ end
83
+
84
+ def _racc_init_sysvars
85
+ @racc_state = [0]
86
+ @racc_tstack = []
87
+ @racc_vstack = []
88
+
89
+ @racc_t = nil
90
+ @racc_val = nil
91
+
92
+ @racc_read_next = true
93
+
94
+ @racc_user_yyerror = false
95
+ @racc_error_status = 0
96
+ end
97
+
98
+ # The entry point of the parser. This method is used with #next_token.
99
+ # If Racc wants to get token (and its value), calls next_token.
100
+ #
101
+ # Example:
102
+ # def parse
103
+ # @q = [[1,1],
104
+ # [2,2],
105
+ # [3,3],
106
+ # [false, '$']]
107
+ # do_parse
108
+ # end
109
+ #
110
+ # def next_token
111
+ # @q.shift
112
+ # end
113
+ def do_parse
114
+ __send__(Racc_Main_Parsing_Routine, _racc_setup(), false)
115
+ end
116
+
117
+ # The method to fetch next token.
118
+ # If you use #do_parse method, you must implement #next_token.
119
+ #
120
+ # The format of return value is [TOKEN_SYMBOL, VALUE].
121
+ # +token-symbol+ is represented by Ruby's symbol by default, e.g. :IDENT
122
+ # for 'IDENT'. ";" (String) for ';'.
123
+ #
124
+ # The final symbol (End of file) must be false.
125
+ def next_token
126
+ raise NotImplementedError, "#{self.class}\#next_token is not defined"
127
+ end
128
+
129
+ def _racc_do_parse_rb(arg, in_debug)
130
+ action_table, action_check, action_default, action_pointer,
131
+ _, _, _, _,
132
+ _, _, token_table, * = arg
133
+
134
+ _racc_init_sysvars
135
+ tok = act = i = nil
136
+
137
+ catch(:racc_end_parse) {
138
+ while true
139
+ if i = action_pointer[@racc_state[-1]]
140
+ if @racc_read_next
141
+ if @racc_t != 0 # not EOF
142
+ tok, @racc_val = next_token()
143
+ unless tok # EOF
144
+ @racc_t = 0
145
+ else
146
+ @racc_t = (token_table[tok] or 1) # error token
147
+ end
148
+ racc_read_token(@racc_t, tok, @racc_val) if @yydebug
149
+ @racc_read_next = false
150
+ end
151
+ end
152
+ i += @racc_t
153
+ unless i >= 0 and
154
+ act = action_table[i] and
155
+ action_check[i] == @racc_state[-1]
156
+ act = action_default[@racc_state[-1]]
157
+ end
158
+ else
159
+ act = action_default[@racc_state[-1]]
160
+ end
161
+ while act = _racc_evalact(act, arg)
162
+ ;
163
+ end
164
+ end
165
+ }
166
+ end
167
+
168
+ # Another entry point for the parser.
169
+ # If you use this method, you must implement RECEIVER#METHOD_ID method.
170
+ #
171
+ # RECEIVER#METHOD_ID is a method to get next token.
172
+ # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
173
+ def yyparse(recv, mid)
174
+ __send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), true)
175
+ end
176
+
177
+ def _racc_yyparse_rb(recv, mid, arg, c_debug)
178
+ action_table, action_check, action_default, action_pointer,
179
+ _, _, _, _,
180
+ _, _, token_table, * = arg
181
+
182
+ _racc_init_sysvars
183
+
184
+ catch(:racc_end_parse) {
185
+ until i = action_pointer[@racc_state[-1]]
186
+ while act = _racc_evalact(action_default[@racc_state[-1]], arg)
187
+ ;
188
+ end
189
+ end
190
+ recv.__send__(mid) do |tok, val|
191
+ unless tok
192
+ @racc_t = 0
193
+ else
194
+ @racc_t = (token_table[tok] or 1) # error token
195
+ end
196
+ @racc_val = val
197
+ @racc_read_next = false
198
+
199
+ i += @racc_t
200
+ unless i >= 0 and
201
+ act = action_table[i] and
202
+ action_check[i] == @racc_state[-1]
203
+ act = action_default[@racc_state[-1]]
204
+ end
205
+ while act = _racc_evalact(act, arg)
206
+ ;
207
+ end
208
+
209
+ while !(i = action_pointer[@racc_state[-1]]) ||
210
+ ! @racc_read_next ||
211
+ @racc_t == 0 # $
212
+ unless i and i += @racc_t and
213
+ i >= 0 and
214
+ act = action_table[i] and
215
+ action_check[i] == @racc_state[-1]
216
+ act = action_default[@racc_state[-1]]
217
+ end
218
+ while act = _racc_evalact(act, arg)
219
+ ;
220
+ end
221
+ end
222
+ end
223
+ }
224
+ end
225
+
226
+ ###
227
+ ### common
228
+ ###
229
+
230
+ def _racc_evalact(act, arg)
231
+ action_table, action_check, _, action_pointer,
232
+ _, _, _, _,
233
+ _, _, _, shift_n,
234
+ reduce_n, * = arg
235
+ nerr = 0 # tmp
236
+
237
+ if act > 0 and act < shift_n
238
+ #
239
+ # shift
240
+ #
241
+ if @racc_error_status > 0
242
+ @racc_error_status -= 1 unless @racc_t == 1 # error token
243
+ end
244
+ @racc_vstack.push @racc_val
245
+ @racc_state.push act
246
+ @racc_read_next = true
247
+ if @yydebug
248
+ @racc_tstack.push @racc_t
249
+ racc_shift @racc_t, @racc_tstack, @racc_vstack
250
+ end
251
+
252
+ elsif act < 0 and act > -reduce_n
253
+ #
254
+ # reduce
255
+ #
256
+ code = catch(:racc_jump) {
257
+ @racc_state.push _racc_do_reduce(arg, act)
258
+ false
259
+ }
260
+ if code
261
+ case code
262
+ when 1 # yyerror
263
+ @racc_user_yyerror = true # user_yyerror
264
+ return -reduce_n
265
+ when 2 # yyaccept
266
+ return shift_n
267
+ else
268
+ raise '[Racc Bug] unknown jump code'
269
+ end
270
+ end
271
+
272
+ elsif act == shift_n
273
+ #
274
+ # accept
275
+ #
276
+ racc_accept if @yydebug
277
+ throw :racc_end_parse, @racc_vstack[0]
278
+
279
+ elsif act == -reduce_n
280
+ #
281
+ # error
282
+ #
283
+ case @racc_error_status
284
+ when 0
285
+ unless arg[21] # user_yyerror
286
+ nerr += 1
287
+ on_error @racc_t, @racc_val, @racc_vstack
288
+ end
289
+ when 3
290
+ if @racc_t == 0 # is $
291
+ throw :racc_end_parse, nil
292
+ end
293
+ @racc_read_next = true
294
+ end
295
+ @racc_user_yyerror = false
296
+ @racc_error_status = 3
297
+ while true
298
+ if i = action_pointer[@racc_state[-1]]
299
+ i += 1 # error token
300
+ if i >= 0 and
301
+ (act = action_table[i]) and
302
+ action_check[i] == @racc_state[-1]
303
+ break
304
+ end
305
+ end
306
+ throw :racc_end_parse, nil if @racc_state.size <= 1
307
+ @racc_state.pop
308
+ @racc_vstack.pop
309
+ if @yydebug
310
+ @racc_tstack.pop
311
+ racc_e_pop @racc_state, @racc_tstack, @racc_vstack
312
+ end
313
+ end
314
+ return act
315
+
316
+ else
317
+ raise "[Racc Bug] unknown action #{act.inspect}"
318
+ end
319
+
320
+ racc_next_state(@racc_state[-1], @racc_state) if @yydebug
321
+
322
+ nil
323
+ end
324
+
325
+ def _racc_do_reduce(arg, act)
326
+ _, _, _, _,
327
+ goto_table, goto_check, goto_default, goto_pointer,
328
+ nt_base, reduce_table, _, _,
329
+ _, use_result, * = arg
330
+
331
+ state = @racc_state
332
+ vstack = @racc_vstack
333
+ tstack = @racc_tstack
334
+
335
+ i = act * -3
336
+ len = reduce_table[i]
337
+ reduce_to = reduce_table[i+1]
338
+ method_id = reduce_table[i+2]
339
+ void_array = []
340
+
341
+ tmp_t = tstack[-len, len] if @yydebug
342
+ tmp_v = vstack[-len, len]
343
+ tstack[-len, len] = void_array if @yydebug
344
+ vstack[-len, len] = void_array
345
+ state[-len, len] = void_array
346
+
347
+ # tstack must be updated AFTER method call
348
+ if use_result
349
+ vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
350
+ else
351
+ vstack.push __send__(method_id, tmp_v, vstack)
352
+ end
353
+ tstack.push reduce_to
354
+
355
+ racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
356
+
357
+ k1 = reduce_to - nt_base
358
+ if i = goto_pointer[k1]
359
+ i += state[-1]
360
+ if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
361
+ return curstate
362
+ end
363
+ end
364
+ goto_default[k1]
365
+ end
366
+
367
+ # This method is called when a parse error is found.
368
+ #
369
+ # ERROR_TOKEN_ID is an internal ID of token which caused error.
370
+ # You can get string representation of this ID by calling
371
+ # #token_to_str.
372
+ #
373
+ # ERROR_VALUE is a value of error token.
374
+ #
375
+ # value_stack is a stack of symbol values.
376
+ # DO NOT MODIFY this object.
377
+ #
378
+ # This method raises ParseError by default.
379
+ #
380
+ # If this method returns, parsers enter "error recovering mode".
381
+ def on_error(t, val, vstack)
382
+ raise ParseError, sprintf("\nparse error on value %s (%s)",
383
+ val.inspect, token_to_str(t) || '?')
384
+ end
385
+
386
+ # Enter error recovering mode.
387
+ # This method does not call #on_error.
388
+ def yyerror
389
+ throw :racc_jump, 1
390
+ end
391
+
392
+ # Exit parser.
393
+ # Return value is Symbol_Value_Stack[0].
394
+ def yyaccept
395
+ throw :racc_jump, 2
396
+ end
397
+
398
+ # Leave error recovering mode.
399
+ def yyerrok
400
+ @racc_error_status = 0
401
+ end
402
+
403
+ # For debugging output
404
+ def racc_read_token(t, tok, val)
405
+ @racc_debug_out.print 'read '
406
+ @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
407
+ @racc_debug_out.puts val.inspect
408
+ @racc_debug_out.puts
409
+ end
410
+
411
+ def racc_shift(tok, tstack, vstack)
412
+ @racc_debug_out.puts "shift #{racc_token2str tok}"
413
+ racc_print_stacks tstack, vstack
414
+ @racc_debug_out.puts
415
+ end
416
+
417
+ def racc_reduce(toks, sim, tstack, vstack)
418
+ out = @racc_debug_out
419
+ out.print 'reduce '
420
+ if toks.empty?
421
+ out.print ' <none>'
422
+ else
423
+ toks.each {|t| out.print ' ', racc_token2str(t) }
424
+ end
425
+ out.puts " --> #{racc_token2str(sim)}"
426
+ racc_print_stacks tstack, vstack
427
+ @racc_debug_out.puts
428
+ end
429
+
430
+ def racc_accept
431
+ @racc_debug_out.puts 'accept'
432
+ @racc_debug_out.puts
433
+ end
434
+
435
+ def racc_e_pop(state, tstack, vstack)
436
+ @racc_debug_out.puts 'error recovering mode: pop token'
437
+ racc_print_states state
438
+ racc_print_stacks tstack, vstack
439
+ @racc_debug_out.puts
440
+ end
441
+
442
+ def racc_next_state(curstate, state)
443
+ @racc_debug_out.puts "goto #{curstate}"
444
+ racc_print_states state
445
+ @racc_debug_out.puts
446
+ end
447
+
448
+ def racc_print_stacks(t, v)
449
+ out = @racc_debug_out
450
+ out.print ' ['
451
+ t.each_index do |i|
452
+ out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
453
+ end
454
+ out.puts ' ]'
455
+ end
456
+
457
+ def racc_print_states(s)
458
+ out = @racc_debug_out
459
+ out.print ' ['
460
+ s.each {|st| out.print ' ', st }
461
+ out.puts ' ]'
462
+ end
463
+
464
+ def racc_token2str(tok)
465
+ self.class::Racc_token_to_s_table[tok] or
466
+ raise "[Racc Bug] can't convert token #{tok} to string"
467
+ end
468
+
469
+ # Convert internal ID of token symbol to the string.
470
+ def token_to_str(t)
471
+ self.class::Racc_token_to_s_table[t]
472
+ end
473
+
474
+ end
475
+
476
+ end
477
+
478
+ __end_of_file__
479
+ end