racc 1.4.16 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/README.ja.rdoc +0 -1
  3. data/README.rdoc +8 -11
  4. data/bin/racc +37 -23
  5. data/{rdoc → doc}/en/NEWS.en.rdoc +0 -0
  6. data/{rdoc → doc}/en/grammar.en.rdoc +27 -31
  7. data/doc/en/grammar2.en.rdoc +219 -0
  8. data/{rdoc → doc}/ja/NEWS.ja.rdoc +0 -0
  9. data/{rdoc → doc}/ja/command.ja.html +1 -1
  10. data/{rdoc → doc}/ja/debug.ja.rdoc +0 -0
  11. data/{rdoc → doc}/ja/grammar.ja.rdoc +0 -0
  12. data/{rdoc → doc}/ja/index.ja.html +0 -0
  13. data/{rdoc → doc}/ja/parser.ja.rdoc +0 -0
  14. data/{rdoc → doc}/ja/usage.ja.html +0 -0
  15. data/ext/racc/cparse/cparse.c +19 -17
  16. data/ext/racc/cparse/extconf.rb +2 -1
  17. data/lib/racc/compat.rb +5 -4
  18. data/lib/racc/debugflags.rb +5 -4
  19. data/lib/racc/exception.rb +4 -1
  20. data/lib/racc/grammar.rb +22 -17
  21. data/lib/racc/grammarfileparser.rb +7 -6
  22. data/lib/racc/info.rb +5 -2
  23. data/lib/racc/iset.rb +5 -4
  24. data/lib/racc/logfilegenerator.rb +5 -4
  25. data/lib/racc/parser-text.rb +10 -16
  26. data/lib/racc/parser.rb +10 -16
  27. data/lib/racc/parserfilegenerator.rb +5 -47
  28. data/lib/racc/sourcetext.rb +5 -4
  29. data/lib/racc/state.rb +4 -1
  30. data/lib/racc/statetransitiontable.rb +9 -14
  31. metadata +22 -140
  32. data/DEPENDS +0 -4
  33. data/Manifest.txt +0 -146
  34. data/Rakefile +0 -58
  35. data/bin/racc2y +0 -195
  36. data/bin/y2racc +0 -339
  37. data/ext/racc/com/headius/racc/Cparse.java +0 -849
  38. data/fastcache/extconf.rb +0 -2
  39. data/fastcache/fastcache.c +0 -185
  40. data/lib/racc/pre-setup +0 -13
  41. data/misc/dist.sh +0 -31
  42. data/sample/array.y +0 -67
  43. data/sample/array2.y +0 -59
  44. data/sample/calc-ja.y +0 -66
  45. data/sample/calc.y +0 -65
  46. data/sample/conflict.y +0 -15
  47. data/sample/hash.y +0 -60
  48. data/sample/lalr.y +0 -17
  49. data/sample/lists.y +0 -57
  50. data/sample/syntax.y +0 -46
  51. data/sample/yyerr.y +0 -46
  52. data/setup.rb +0 -1587
  53. data/tasks/doc.rb +0 -12
  54. data/tasks/email.rb +0 -55
  55. data/test/assets/cadenza.y +0 -170
  56. data/test/assets/cast.y +0 -926
  57. data/test/assets/chk.y +0 -126
  58. data/test/assets/conf.y +0 -16
  59. data/test/assets/csspool.y +0 -729
  60. data/test/assets/digraph.y +0 -29
  61. data/test/assets/echk.y +0 -118
  62. data/test/assets/edtf.y +0 -583
  63. data/test/assets/err.y +0 -60
  64. data/test/assets/error_recovery.y +0 -35
  65. data/test/assets/expect.y +0 -7
  66. data/test/assets/firstline.y +0 -4
  67. data/test/assets/huia.y +0 -318
  68. data/test/assets/ichk.y +0 -102
  69. data/test/assets/intp.y +0 -546
  70. data/test/assets/journey.y +0 -47
  71. data/test/assets/liquor.y +0 -313
  72. data/test/assets/machete.y +0 -423
  73. data/test/assets/macruby.y +0 -2197
  74. data/test/assets/mailp.y +0 -437
  75. data/test/assets/mediacloth.y +0 -599
  76. data/test/assets/mof.y +0 -649
  77. data/test/assets/namae.y +0 -302
  78. data/test/assets/nasl.y +0 -626
  79. data/test/assets/newsyn.y +0 -25
  80. data/test/assets/noend.y +0 -4
  81. data/test/assets/nokogiri-css.y +0 -255
  82. data/test/assets/nonass.y +0 -41
  83. data/test/assets/normal.y +0 -27
  84. data/test/assets/norule.y +0 -4
  85. data/test/assets/nullbug1.y +0 -25
  86. data/test/assets/nullbug2.y +0 -15
  87. data/test/assets/opal.y +0 -1807
  88. data/test/assets/opt.y +0 -123
  89. data/test/assets/percent.y +0 -35
  90. data/test/assets/php_serialization.y +0 -98
  91. data/test/assets/recv.y +0 -97
  92. data/test/assets/riml.y +0 -665
  93. data/test/assets/rrconf.y +0 -14
  94. data/test/assets/ruby18.y +0 -1943
  95. data/test/assets/ruby19.y +0 -2174
  96. data/test/assets/ruby20.y +0 -2350
  97. data/test/assets/ruby21.y +0 -2359
  98. data/test/assets/ruby22.y +0 -2381
  99. data/test/assets/scan.y +0 -72
  100. data/test/assets/syntax.y +0 -50
  101. data/test/assets/tp_plus.y +0 -622
  102. data/test/assets/twowaysql.y +0 -278
  103. data/test/assets/unterm.y +0 -5
  104. data/test/assets/useless.y +0 -12
  105. data/test/assets/yyerr.y +0 -46
  106. data/test/bench.y +0 -36
  107. data/test/helper.rb +0 -115
  108. data/test/infini.y +0 -8
  109. data/test/regress/cadenza +0 -796
  110. data/test/regress/cast +0 -3425
  111. data/test/regress/csspool +0 -2318
  112. data/test/regress/edtf +0 -1794
  113. data/test/regress/huia +0 -1392
  114. data/test/regress/journey +0 -222
  115. data/test/regress/liquor +0 -885
  116. data/test/regress/machete +0 -833
  117. data/test/regress/mediacloth +0 -1463
  118. data/test/regress/mof +0 -1368
  119. data/test/regress/namae +0 -634
  120. data/test/regress/nasl +0 -2058
  121. data/test/regress/nokogiri-css +0 -836
  122. data/test/regress/opal +0 -6429
  123. data/test/regress/php_serialization +0 -336
  124. data/test/regress/riml +0 -3297
  125. data/test/regress/ruby18 +0 -6351
  126. data/test/regress/ruby22 +0 -7456
  127. data/test/regress/tp_plus +0 -1933
  128. data/test/regress/twowaysql +0 -556
  129. data/test/scandata/brace +0 -7
  130. data/test/scandata/gvar +0 -1
  131. data/test/scandata/normal +0 -4
  132. data/test/scandata/percent +0 -18
  133. data/test/scandata/slash +0 -10
  134. data/test/src.intp +0 -34
  135. data/test/start.y +0 -20
  136. data/test/test_chk_y.rb +0 -52
  137. data/test/test_grammar_file_parser.rb +0 -15
  138. data/test/test_racc_command.rb +0 -322
  139. data/test/test_scan_y.rb +0 -52
  140. data/test/testscanner.rb +0 -51
  141. data/web/racc.en.rhtml +0 -42
  142. data/web/racc.ja.rhtml +0 -51
data/bin/y2racc DELETED
@@ -1,339 +0,0 @@
1
- #!/usr/local/bin/ruby
2
- #
3
- # $Id$
4
- #
5
- # Copyright (c) 1999-2006 Minero Aoki
6
- #
7
- # This program is free software.
8
- # You can distribute/modify this program under the terms of
9
- # the GNU LGPL, Lesser General Public Lisence version 2.1.
10
- # For details of the GNU LGPL, see the file "COPYING".
11
- #
12
-
13
- require 'racc/info'
14
- require 'strscan'
15
- require 'forwardable'
16
- require 'optparse'
17
-
18
- def main
19
- @with_action = true
20
- @with_header = false
21
- @with_usercode = false
22
- cname = 'MyParser'
23
- input = nil
24
- output = nil
25
- parser = OptionParser.new
26
- parser.banner = "Usage: #{File.basename($0)} [-Ahu] [-c <classname>] [-o <filename>] <input>"
27
- parser.on('-o', '--output=FILENAME', 'output file name [<input>.racc]') {|name|
28
- output = name
29
- }
30
- parser.on('-c', '--classname=NAME', "Name of the parser class. [#{cname}]") {|name|
31
- cname = name
32
- }
33
- parser.on('-A', '--without-action', 'Does not include actions.') {
34
- @with_action = false
35
- }
36
- parser.on('-h', '--with-header', 'Includes header (%{...%}).') {
37
- @with_header = true
38
- }
39
- parser.on('-u', '--with-user-code', 'Includes user code.') {
40
- @with_usercode = true
41
- }
42
- parser.on('--version', 'Prints version and quit.') {
43
- puts "y2racc version #{Racc::Version}"
44
- exit 0
45
- }
46
- parser.on('--copyright', 'Prints copyright and quit.') {
47
- puts Racc::Copyright
48
- exit 0
49
- }
50
- parser.on('--help', 'Prints this message and quit.') {
51
- puts parser.help
52
- exit 1
53
- }
54
- begin
55
- parser.parse!
56
- rescue OptionParser::ParseError => err
57
- $stderr.puts err.message
58
- $stderr.puts parser.help
59
- exit 1
60
- end
61
- if ARGV.empty?
62
- $stderr.puts 'no input'
63
- exit 1
64
- end
65
- if ARGV.size > 1
66
- $stderr.puts 'too many input'
67
- exit 1
68
- end
69
- input = ARGV[0]
70
-
71
- begin
72
- result = YaccFileParser.parse_file(input)
73
- File.open(output || "#{input}.racc", 'w') {|f|
74
- convert cname, result, f
75
- }
76
- rescue SystemCallError => err
77
- $stderr.puts err.message
78
- exit 1
79
- end
80
- end
81
-
82
- def convert(classname, result, f)
83
- init_indent = 'token'.size
84
- f.puts %<# Converted from "#{result.filename}" by y2racc version #{Racc::Version}>
85
- f.puts
86
- f.puts "class #{classname}"
87
- unless result.terminals.empty?
88
- f.puts
89
- f.print 'token'
90
- columns = init_indent
91
- result.terminals.each do |t|
92
- if columns > 60
93
- f.puts
94
- f.print ' ' * init_indent
95
- columns = init_indent
96
- end
97
- columns += f.write(" #{t}")
98
- end
99
- f.puts
100
- end
101
- unless result.precedence_table.empty?
102
- f.puts
103
- f.puts 'preclow'
104
- result.precedence_table.each do |assoc, toks|
105
- f.printf " %-8s %s\n", assoc, toks.join(' ') unless toks.empty?
106
- end
107
- f.puts 'prechigh'
108
- end
109
- if result.start
110
- f.puts
111
- f.puts "start #{@start}"
112
- end
113
-
114
- f.puts
115
- f.puts 'rule'
116
- texts = @with_action ? result.grammar : result.grammar_without_actions
117
- texts.each do |text|
118
- f.print text
119
- end
120
-
121
- if @with_header and result.header
122
- f.puts
123
- f.puts '---- header'
124
- f.puts result.header
125
- end
126
- if @with_usercode and result.usercode
127
- f.puts
128
- f.puts '---- footer'
129
- f.puts result.usercode
130
- end
131
- end
132
-
133
- class ParseError < StandardError; end
134
-
135
- class StringScanner_withlineno
136
- def initialize(src)
137
- @s = StringScanner.new(src)
138
- @lineno = 1
139
- end
140
-
141
- extend Forwardable
142
- def_delegator "@s", :eos?
143
- def_delegator "@s", :rest
144
-
145
- attr_reader :lineno
146
-
147
- def scan(re)
148
- advance_lineno(@s.scan(re))
149
- end
150
-
151
- def scan_until(re)
152
- advance_lineno(@s.scan_until(re))
153
- end
154
-
155
- def skip(re)
156
- str = advance_lineno(@s.scan(re))
157
- str ? str.size : nil
158
- end
159
-
160
- def getch
161
- advance_lineno(@s.getch)
162
- end
163
-
164
- private
165
-
166
- def advance_lineno(str)
167
- @lineno += str.count("\n") if str
168
- str
169
- end
170
- end
171
-
172
- class YaccFileParser
173
-
174
- Result = Struct.new(:terminals, :precedence_table, :start,
175
- :header, :grammar, :usercode, :filename)
176
- class Result # reopen
177
- def initialize
178
- super
179
- self.terminals = []
180
- self.precedence_table = []
181
- self.start = nil
182
- self.grammar = []
183
- self.header = nil
184
- self.usercode = nil
185
- self.filename = nil
186
- end
187
-
188
- def grammar_without_actions
189
- grammar().map {|text| text[0,1] == '{' ? '{}' : text }
190
- end
191
- end
192
-
193
- def YaccFileParser.parse_file(filename)
194
- new().parse(File.read(filename), filename)
195
- end
196
-
197
- def parse(src, filename = '-')
198
- @result = Result.new
199
- @filename = filename
200
- @result.filename = filename
201
- s = StringScanner_withlineno.new(src)
202
- parse_header s
203
- parse_grammar s
204
- @result
205
- end
206
-
207
- private
208
-
209
- COMMENT = %r</\*[^*]*\*+(?:[^/*][^*]*\*+)*/>
210
- CHAR = /'((?:[^'\\]+|\\.)*)'/
211
- STRING = /"((?:[^"\\]+|\\.)*)"/
212
-
213
- def parse_header(s)
214
- skip_until_percent s
215
- until s.eos?
216
- case
217
- when t = s.scan(/left/)
218
- @result.precedence_table.push ['left', scan_symbols(s)]
219
- when t = s.scan(/right/)
220
- @result.precedence_table.push ['right', scan_symbols(s)]
221
- when t = s.scan(/nonassoc/)
222
- @result.precedence_table.push ['nonassoc', scan_symbols(s)]
223
- when t = s.scan(/token/)
224
- list = scan_symbols(s)
225
- list.shift if /\A<(.*)>\z/ =~ list[0]
226
- @result.terminals.concat list
227
- when t = s.scan(/start/)
228
- @result.start = scan_symbols(s)[0]
229
- when s.skip(%r<(?:
230
- type | union | expect | thong | binary |
231
- semantic_parser | pure_parser | no_lines |
232
- raw | token_table
233
- )\b>x)
234
- skip_until_percent s
235
- when s.skip(/\{/) # header (%{...%})
236
- str = s.scan_until(/\%\}/)
237
- str.chop!
238
- str.chop!
239
- @result.header = str
240
- skip_until_percent s
241
- when s.skip(/\%/) # grammar (%%...)
242
- return
243
- else
244
- raise ParseError, "#{@filename}:#{s.lineno}: scan error"
245
- end
246
- end
247
- end
248
-
249
- def skip_until_percent(s)
250
- until s.eos?
251
- s.skip /[^\%\/]+/
252
- next if s.skip(COMMENT)
253
- return if s.getch == '%'
254
- end
255
- end
256
-
257
- def scan_symbols(s)
258
- list = []
259
- until s.eos?
260
- s.skip /\s+/
261
- if s.skip(COMMENT)
262
- ;
263
- elsif t = s.scan(CHAR)
264
- list.push t
265
- elsif t = s.scan(STRING)
266
- list.push t
267
- elsif s.skip(/\%/)
268
- break
269
- elsif t = s.scan(/\S+/)
270
- list.push t
271
- else
272
- raise ParseError, "#{@filename}:#{@lineno}: scan error"
273
- end
274
- end
275
- list
276
- end
277
-
278
- def parse_grammar(s)
279
- buf = []
280
- until s.eos?
281
- if t = s.scan(/[^%'"{\/]+/)
282
- buf.push t
283
- break if s.eos?
284
- end
285
- if s.skip(/\{/)
286
- buf.push scan_action(s)
287
- elsif t = s.scan(/'(?:[^'\\]+|\\.)*'/) then buf.push t
288
- elsif t = s.scan(/"(?:[^"\\]+|\\.)*"/) then buf.push t
289
- elsif t = s.scan(COMMENT) then buf.push t
290
- elsif s.skip(/%prec\b/) then buf.push '='
291
- elsif s.skip(/%%/)
292
- @result.usercode = s.rest
293
- break
294
- else
295
- buf.push s.getch
296
- end
297
- end
298
- @result.grammar = buf
299
- end
300
-
301
- def scan_action(s)
302
- buf = '{'
303
- nest = 1
304
- until s.eos?
305
- if t = s.scan(%r<[^/{}'"]+>)
306
- buf << t
307
- break if s.eos?
308
- elsif t = s.scan(COMMENT)
309
- buf << t
310
- elsif t = s.scan(CHAR)
311
- buf << t
312
- elsif t = s.scan(STRING)
313
- buf << t
314
- else
315
- c = s.getch
316
- buf << c
317
- case c
318
- when '{'
319
- nest += 1
320
- when '}'
321
- nest -= 1
322
- return buf if nest == 0
323
- end
324
- end
325
- end
326
- $stderr.puts "warning: unterminated action in #{@filename}"
327
- buf
328
- end
329
-
330
- end
331
-
332
- unless Object.method_defined?(:funcall)
333
- class Object
334
- alias funcall __send__
335
- end
336
- end
337
-
338
-
339
- main