racc 1.4.16 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.ja.rdoc +0 -1
- data/README.rdoc +8 -11
- data/bin/racc +37 -23
- data/{rdoc → doc}/en/NEWS.en.rdoc +0 -0
- data/{rdoc → doc}/en/grammar.en.rdoc +27 -31
- data/doc/en/grammar2.en.rdoc +219 -0
- data/{rdoc → doc}/ja/NEWS.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/command.ja.html +1 -1
- data/{rdoc → doc}/ja/debug.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/grammar.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/index.ja.html +0 -0
- data/{rdoc → doc}/ja/parser.ja.rdoc +0 -0
- data/{rdoc → doc}/ja/usage.ja.html +0 -0
- data/ext/racc/cparse/cparse.c +19 -17
- data/ext/racc/cparse/extconf.rb +2 -1
- data/lib/racc/compat.rb +5 -4
- data/lib/racc/debugflags.rb +5 -4
- data/lib/racc/exception.rb +4 -1
- data/lib/racc/grammar.rb +22 -17
- data/lib/racc/grammarfileparser.rb +7 -6
- data/lib/racc/info.rb +5 -2
- data/lib/racc/iset.rb +5 -4
- data/lib/racc/logfilegenerator.rb +5 -4
- data/lib/racc/parser-text.rb +10 -16
- data/lib/racc/parser.rb +10 -16
- data/lib/racc/parserfilegenerator.rb +5 -47
- data/lib/racc/sourcetext.rb +5 -4
- data/lib/racc/state.rb +4 -1
- data/lib/racc/statetransitiontable.rb +9 -14
- metadata +22 -140
- data/DEPENDS +0 -4
- data/Manifest.txt +0 -146
- data/Rakefile +0 -58
- data/bin/racc2y +0 -195
- data/bin/y2racc +0 -339
- data/ext/racc/com/headius/racc/Cparse.java +0 -849
- data/fastcache/extconf.rb +0 -2
- data/fastcache/fastcache.c +0 -185
- data/lib/racc/pre-setup +0 -13
- data/misc/dist.sh +0 -31
- data/sample/array.y +0 -67
- data/sample/array2.y +0 -59
- data/sample/calc-ja.y +0 -66
- data/sample/calc.y +0 -65
- data/sample/conflict.y +0 -15
- data/sample/hash.y +0 -60
- data/sample/lalr.y +0 -17
- data/sample/lists.y +0 -57
- data/sample/syntax.y +0 -46
- data/sample/yyerr.y +0 -46
- data/setup.rb +0 -1587
- data/tasks/doc.rb +0 -12
- data/tasks/email.rb +0 -55
- data/test/assets/cadenza.y +0 -170
- data/test/assets/cast.y +0 -926
- data/test/assets/chk.y +0 -126
- data/test/assets/conf.y +0 -16
- data/test/assets/csspool.y +0 -729
- data/test/assets/digraph.y +0 -29
- data/test/assets/echk.y +0 -118
- data/test/assets/edtf.y +0 -583
- data/test/assets/err.y +0 -60
- data/test/assets/error_recovery.y +0 -35
- data/test/assets/expect.y +0 -7
- data/test/assets/firstline.y +0 -4
- data/test/assets/huia.y +0 -318
- data/test/assets/ichk.y +0 -102
- data/test/assets/intp.y +0 -546
- data/test/assets/journey.y +0 -47
- data/test/assets/liquor.y +0 -313
- data/test/assets/machete.y +0 -423
- data/test/assets/macruby.y +0 -2197
- data/test/assets/mailp.y +0 -437
- data/test/assets/mediacloth.y +0 -599
- data/test/assets/mof.y +0 -649
- data/test/assets/namae.y +0 -302
- data/test/assets/nasl.y +0 -626
- data/test/assets/newsyn.y +0 -25
- data/test/assets/noend.y +0 -4
- data/test/assets/nokogiri-css.y +0 -255
- data/test/assets/nonass.y +0 -41
- data/test/assets/normal.y +0 -27
- data/test/assets/norule.y +0 -4
- data/test/assets/nullbug1.y +0 -25
- data/test/assets/nullbug2.y +0 -15
- data/test/assets/opal.y +0 -1807
- data/test/assets/opt.y +0 -123
- data/test/assets/percent.y +0 -35
- data/test/assets/php_serialization.y +0 -98
- data/test/assets/recv.y +0 -97
- data/test/assets/riml.y +0 -665
- data/test/assets/rrconf.y +0 -14
- data/test/assets/ruby18.y +0 -1943
- data/test/assets/ruby19.y +0 -2174
- data/test/assets/ruby20.y +0 -2350
- data/test/assets/ruby21.y +0 -2359
- data/test/assets/ruby22.y +0 -2381
- data/test/assets/scan.y +0 -72
- data/test/assets/syntax.y +0 -50
- data/test/assets/tp_plus.y +0 -622
- data/test/assets/twowaysql.y +0 -278
- data/test/assets/unterm.y +0 -5
- data/test/assets/useless.y +0 -12
- data/test/assets/yyerr.y +0 -46
- data/test/bench.y +0 -36
- data/test/helper.rb +0 -115
- data/test/infini.y +0 -8
- data/test/regress/cadenza +0 -796
- data/test/regress/cast +0 -3425
- data/test/regress/csspool +0 -2318
- data/test/regress/edtf +0 -1794
- data/test/regress/huia +0 -1392
- data/test/regress/journey +0 -222
- data/test/regress/liquor +0 -885
- data/test/regress/machete +0 -833
- data/test/regress/mediacloth +0 -1463
- data/test/regress/mof +0 -1368
- data/test/regress/namae +0 -634
- data/test/regress/nasl +0 -2058
- data/test/regress/nokogiri-css +0 -836
- data/test/regress/opal +0 -6429
- data/test/regress/php_serialization +0 -336
- data/test/regress/riml +0 -3297
- data/test/regress/ruby18 +0 -6351
- data/test/regress/ruby22 +0 -7456
- data/test/regress/tp_plus +0 -1933
- data/test/regress/twowaysql +0 -556
- data/test/scandata/brace +0 -7
- data/test/scandata/gvar +0 -1
- data/test/scandata/normal +0 -4
- data/test/scandata/percent +0 -18
- data/test/scandata/slash +0 -10
- data/test/src.intp +0 -34
- data/test/start.y +0 -20
- data/test/test_chk_y.rb +0 -52
- data/test/test_grammar_file_parser.rb +0 -15
- data/test/test_racc_command.rb +0 -322
- data/test/test_scan_y.rb +0 -52
- data/test/testscanner.rb +0 -51
- data/web/racc.en.rhtml +0 -42
- data/web/racc.ja.rhtml +0 -51
data/fastcache/extconf.rb
DELETED
data/fastcache/fastcache.c
DELETED
@@ -1,185 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
$Id$
|
3
|
-
|
4
|
-
Copyright (C) 2005 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 Licese version 2.1.
|
9
|
-
*/
|
10
|
-
|
11
|
-
#include "ruby.h"
|
12
|
-
|
13
|
-
static VALUE LALRcoreCache;
|
14
|
-
|
15
|
-
struct item_holder {
|
16
|
-
unsigned long hashval;
|
17
|
-
VALUE core;
|
18
|
-
VALUE state;
|
19
|
-
struct item_holder *next;
|
20
|
-
};
|
21
|
-
|
22
|
-
struct lalr_state_cache {
|
23
|
-
struct item_holder **bin;
|
24
|
-
long size;
|
25
|
-
long num;
|
26
|
-
};
|
27
|
-
|
28
|
-
static void
|
29
|
-
lalrc_free(struct lalr_state_cache *p)
|
30
|
-
{
|
31
|
-
struct item_holder *tmp;
|
32
|
-
long i;
|
33
|
-
|
34
|
-
for (i = 0; i < p->size; i++) {
|
35
|
-
while (tmp = p->bin[i]) {
|
36
|
-
p->bin[i] = tmp->next;
|
37
|
-
free(tmp);
|
38
|
-
}
|
39
|
-
}
|
40
|
-
free(p->bin);
|
41
|
-
free(p);
|
42
|
-
}
|
43
|
-
|
44
|
-
#define INIT_BIN 256
|
45
|
-
|
46
|
-
static VALUE
|
47
|
-
lalrc_s_new(VALUE self)
|
48
|
-
{
|
49
|
-
struct lalr_state_cache *cache;
|
50
|
-
|
51
|
-
cache = ALLOC_N(struct lalr_state_cache, 1);
|
52
|
-
cache->bin = ALLOC_N(struct item_holder*, INIT_BIN);
|
53
|
-
cache->size = INIT_BIN;
|
54
|
-
cache->num = 0;
|
55
|
-
return Data_Wrap_Struct(LALRcoreCache, 0, lalrc_free, cache);
|
56
|
-
}
|
57
|
-
|
58
|
-
#define GET_LALRC(self, p) Data_Get_Struct(self, struct lalr_state_cache, p)
|
59
|
-
|
60
|
-
static void
|
61
|
-
lalrc_rehash(struct lalr_state_cache *p)
|
62
|
-
{
|
63
|
-
struct item_holder *top = 0, *tmp = 0;
|
64
|
-
long i;
|
65
|
-
|
66
|
-
for (i = p->size / 2; i < p->size; i++) {
|
67
|
-
p->bin[i] = 0;
|
68
|
-
}
|
69
|
-
for (i = 0; i < p->size / 2; i++) {
|
70
|
-
if (!p->bin[i])
|
71
|
-
continue;
|
72
|
-
|
73
|
-
tmp = p->bin[i];
|
74
|
-
while (tmp->next)
|
75
|
-
tmp = tmp->next;
|
76
|
-
tmp->next = top;
|
77
|
-
top = p->bin[i];
|
78
|
-
p->bin[i] = 0;
|
79
|
-
}
|
80
|
-
|
81
|
-
while (top) {
|
82
|
-
tmp = top;
|
83
|
-
top = tmp->next;
|
84
|
-
tmp->next = 0;
|
85
|
-
|
86
|
-
i = tmp->hashval % p->size;
|
87
|
-
if (p->bin[i]) {
|
88
|
-
tmp->next = p->bin[i];
|
89
|
-
p->bin[i] = tmp;
|
90
|
-
}
|
91
|
-
else {
|
92
|
-
p->bin[i] = tmp;
|
93
|
-
}
|
94
|
-
}
|
95
|
-
}
|
96
|
-
|
97
|
-
static int
|
98
|
-
coreeql(VALUE a, VALUE b)
|
99
|
-
{
|
100
|
-
long i;
|
101
|
-
|
102
|
-
/* Check_Type(a, T_ARRAY);
|
103
|
-
Check_Type(b, T_ARRAY); */
|
104
|
-
if (RARRAY(a)->len != RARRAY(b)->len)
|
105
|
-
return 0;
|
106
|
-
for (i = 0; i < RARRAY(a)->len; i++)
|
107
|
-
if (RARRAY(a)->ptr[i] != RARRAY(b)->ptr[i])
|
108
|
-
return 0;
|
109
|
-
|
110
|
-
return 1;
|
111
|
-
}
|
112
|
-
|
113
|
-
static unsigned long
|
114
|
-
hashval(VALUE core)
|
115
|
-
{
|
116
|
-
unsigned long v = 0;
|
117
|
-
long i, j;
|
118
|
-
|
119
|
-
for (i = 0; i < RARRAY(core)->len; i++) {
|
120
|
-
v *= RARRAY(core)->ptr[i];
|
121
|
-
v ^= RARRAY(core)->ptr[i];
|
122
|
-
}
|
123
|
-
return v;
|
124
|
-
}
|
125
|
-
|
126
|
-
static VALUE
|
127
|
-
lalrc_aref(VALUE self, VALUE core)
|
128
|
-
{
|
129
|
-
struct lalr_state_cache *p;
|
130
|
-
unsigned long v;
|
131
|
-
long i;
|
132
|
-
struct item_holder *ad;
|
133
|
-
|
134
|
-
/* Check_Type(core, T_ARRAY); */
|
135
|
-
GET_LALRC(self, p);
|
136
|
-
v = hashval(core);
|
137
|
-
i = v % p->size;
|
138
|
-
ad = p->bin[i];
|
139
|
-
while (ad) {
|
140
|
-
if (ad->hashval == v) {
|
141
|
-
if (coreeql(core, ad->core)) {
|
142
|
-
return ad->state;
|
143
|
-
}
|
144
|
-
else {
|
145
|
-
printf(".");
|
146
|
-
}
|
147
|
-
}
|
148
|
-
ad = ad->next;
|
149
|
-
}
|
150
|
-
return Qnil;
|
151
|
-
}
|
152
|
-
|
153
|
-
static VALUE
|
154
|
-
lalrc_add_direct(VALUE self, VALUE core, VALUE state)
|
155
|
-
{
|
156
|
-
struct lalr_state_cache *p;
|
157
|
-
struct item_holder *ad;
|
158
|
-
long i;
|
159
|
-
|
160
|
-
GET_LALRC(self, p);
|
161
|
-
ad = ALLOC_N(struct item_holder, 1);
|
162
|
-
ad->hashval = hashval(core);
|
163
|
-
ad->core = core;
|
164
|
-
ad->state = state;
|
165
|
-
|
166
|
-
i = ad->hashval % p->size;
|
167
|
-
ad->next = p->bin[i];
|
168
|
-
p->bin[i] = ad;
|
169
|
-
p->num++;
|
170
|
-
if ((p->num / p->size) >= 1) {
|
171
|
-
REALLOC_N(p->bin, struct item_holder*, p->size * 2);
|
172
|
-
p->size *= 2;
|
173
|
-
lalrc_rehash(p);
|
174
|
-
}
|
175
|
-
return Qnil;
|
176
|
-
}
|
177
|
-
|
178
|
-
void
|
179
|
-
Init_corecache(void)
|
180
|
-
{
|
181
|
-
LALRcoreCache = rb_define_class("LALRcoreCache", rb_cObject);
|
182
|
-
rb_define_singleton_method(LALRcoreCache, "new", lalrc_s_new, 0);
|
183
|
-
rb_define_method(LALRcoreCache, "[]", lalrc_aref, 1);
|
184
|
-
rb_define_method(LALRcoreCache, "[]=", lalrc_add_direct, 2);
|
185
|
-
}
|
data/lib/racc/pre-setup
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
def generate_parser_text_rb(target)
|
2
|
-
return if File.exist?(srcfile(target))
|
3
|
-
$stderr.puts "generating #{target}..."
|
4
|
-
File.open(target, 'w') {|f|
|
5
|
-
f.puts "module Racc"
|
6
|
-
f.puts " PARSER_TEXT = <<'__end_of_file__'"
|
7
|
-
f.puts File.read(srcfile('parser.rb'))
|
8
|
-
f.puts "__end_of_file__"
|
9
|
-
f.puts "end"
|
10
|
-
}
|
11
|
-
end
|
12
|
-
|
13
|
-
generate_parser_text_rb 'parser-text.rb'
|
data/misc/dist.sh
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
#!/bin/sh
|
2
|
-
|
3
|
-
rm -rf tmp
|
4
|
-
mkdir tmp
|
5
|
-
cd tmp
|
6
|
-
|
7
|
-
# racc, raccrt
|
8
|
-
cvs -Q export -r`echo V$version | tr . -` -d racc-$version racc
|
9
|
-
cd racc-$version
|
10
|
-
make bootstrap lib/racc/parser-text.rb doc
|
11
|
-
rm -r doc web bits fastcache
|
12
|
-
cd ..
|
13
|
-
mkdir -p raccrt-$version/lib/racc
|
14
|
-
mv racc-$version/lib/racc/parser.rb raccrt-$version/lib/racc
|
15
|
-
mv racc-$version/ext raccrt-$version
|
16
|
-
cp racc-$version/setup.rb raccrt-$version
|
17
|
-
cp racc-$version/README.* raccrt-$version
|
18
|
-
cp racc-$version/COPYING raccrt-$version
|
19
|
-
tar czf $ardir/racc/racc-$version.tar.gz racc-$version
|
20
|
-
tar czf $ardir/raccrt/raccrt-$version.tar.gz raccrt-$version
|
21
|
-
|
22
|
-
# -all
|
23
|
-
mkdir -p racc-$version-all/packages
|
24
|
-
cp racc-$version/setup.rb racc-$version-all
|
25
|
-
cp racc-$version/README.* racc-$version-all
|
26
|
-
mv racc-$version racc-$version-all/packages/racc
|
27
|
-
mv raccrt-$version racc-$version-all/packages/raccrt
|
28
|
-
tar czf $ardir/racc/racc-$version-all.tar.gz racc-$version-all
|
29
|
-
|
30
|
-
cd ..
|
31
|
-
rm -rf tmp
|
data/sample/array.y
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
# $Id$
|
2
|
-
#
|
3
|
-
# convert Array-like string into Ruby's Array.
|
4
|
-
|
5
|
-
class ArrayParser
|
6
|
-
|
7
|
-
rule
|
8
|
-
|
9
|
-
array : '[' contents ']'
|
10
|
-
{
|
11
|
-
result = val[1]
|
12
|
-
}
|
13
|
-
| '[' ']'
|
14
|
-
{
|
15
|
-
result = []
|
16
|
-
}
|
17
|
-
|
18
|
-
contents: ITEM
|
19
|
-
{
|
20
|
-
result = val
|
21
|
-
}
|
22
|
-
| contents ',' ITEM
|
23
|
-
{
|
24
|
-
result.push val[2]
|
25
|
-
}
|
26
|
-
|
27
|
-
---- inner
|
28
|
-
|
29
|
-
def parse(str)
|
30
|
-
str = str.strip
|
31
|
-
@q = []
|
32
|
-
until str.empty?
|
33
|
-
case str
|
34
|
-
when /\A\s+/
|
35
|
-
str = $'
|
36
|
-
when /\A\w+/
|
37
|
-
@q.push [:ITEM, $&]
|
38
|
-
str = $'
|
39
|
-
else
|
40
|
-
c = str[0,1]
|
41
|
-
@q.push [c, c]
|
42
|
-
str = str[1..-1]
|
43
|
-
end
|
44
|
-
end
|
45
|
-
@q.push [false, '$'] # is optional from Racc 1.3.7
|
46
|
-
do_parse
|
47
|
-
end
|
48
|
-
|
49
|
-
def next_token
|
50
|
-
@q.shift
|
51
|
-
end
|
52
|
-
|
53
|
-
---- footer
|
54
|
-
|
55
|
-
if $0 == __FILE__
|
56
|
-
src = <<EOS
|
57
|
-
[
|
58
|
-
a, b, c,
|
59
|
-
d,
|
60
|
-
e ]
|
61
|
-
EOS
|
62
|
-
puts 'parsing:'
|
63
|
-
print src
|
64
|
-
puts
|
65
|
-
puts 'result:'
|
66
|
-
p ArrayParser.new.parse(src)
|
67
|
-
end
|
data/sample/array2.y
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
# $Id$
|
2
|
-
#
|
3
|
-
# Converting Array-like string into Ruby's Array, version 2.
|
4
|
-
# This grammer uses no_result_var.
|
5
|
-
|
6
|
-
class ArrayParser2
|
7
|
-
options no_result_var
|
8
|
-
rule
|
9
|
-
array : '[' contents ']' { val[1] }
|
10
|
-
| '[' ']' { [] }
|
11
|
-
|
12
|
-
contents: ITEM { val }
|
13
|
-
| contents ',' ITEM { val[0].push val[2]; val[0] }
|
14
|
-
end
|
15
|
-
|
16
|
-
---- inner
|
17
|
-
|
18
|
-
def parse(str)
|
19
|
-
@str = str
|
20
|
-
yyparse self, :scan
|
21
|
-
end
|
22
|
-
|
23
|
-
def scan
|
24
|
-
str = @str.strip
|
25
|
-
until str.empty?
|
26
|
-
case str
|
27
|
-
when /\A\s+/
|
28
|
-
str = $'
|
29
|
-
when /\A\w+/
|
30
|
-
yield :ITEM, $&
|
31
|
-
str = $'
|
32
|
-
else
|
33
|
-
c = str[0,1]
|
34
|
-
yield c, c
|
35
|
-
str = str[1..-1]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
yield false, '$' # is optional from Racc 1.3.7
|
39
|
-
end
|
40
|
-
|
41
|
-
def next_token
|
42
|
-
@q.shift
|
43
|
-
end
|
44
|
-
|
45
|
-
---- footer
|
46
|
-
|
47
|
-
if $0 == __FILE__
|
48
|
-
src = <<EOS
|
49
|
-
[
|
50
|
-
a, b, c,
|
51
|
-
d,
|
52
|
-
e ]
|
53
|
-
EOS
|
54
|
-
puts 'parsing:'
|
55
|
-
print src
|
56
|
-
puts
|
57
|
-
puts 'result:'
|
58
|
-
p ArrayParser2.new.parse(src)
|
59
|
-
end
|
data/sample/calc-ja.y
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
# $Id$
|
2
|
-
#
|
3
|
-
# A simple calculator, version 2.
|
4
|
-
# This file contains Japanese characters (encoding=EUC-JP).
|
5
|
-
|
6
|
-
class Calculator2
|
7
|
-
prechigh
|
8
|
-
nonassoc UMINUS
|
9
|
-
left '*' '/'
|
10
|
-
left '+' '-'
|
11
|
-
preclow
|
12
|
-
options no_result_var
|
13
|
-
rule
|
14
|
-
target : exp
|
15
|
-
| /* none */ { 0 }
|
16
|
-
|
17
|
-
exp : exp '+' exp { val[0] + val[2] }
|
18
|
-
| exp '-' exp { val[0] - val[2] }
|
19
|
-
| exp '*' exp { val[0] * val[2] }
|
20
|
-
| exp '/' exp { val[0] / val[2] }
|
21
|
-
| '(' exp ')' { val[1] }
|
22
|
-
| '-' NUMBER =UMINUS { -(val[1]) }
|
23
|
-
| NUMBER
|
24
|
-
end
|
25
|
-
|
26
|
-
---- header
|
27
|
-
# $Id$
|
28
|
-
---- inner
|
29
|
-
|
30
|
-
def evaluate(str)
|
31
|
-
@tokens = []
|
32
|
-
until str.empty?
|
33
|
-
case str
|
34
|
-
when /\A\s+/
|
35
|
-
;
|
36
|
-
when /\A\d+/
|
37
|
-
@tokens.push [:NUMBER, $&.to_i]
|
38
|
-
when /\A.|\n/
|
39
|
-
s = $&
|
40
|
-
@tokens.push [s, s]
|
41
|
-
end
|
42
|
-
str = $'
|
43
|
-
end
|
44
|
-
@tokens.push [false, '$']
|
45
|
-
do_parse
|
46
|
-
end
|
47
|
-
|
48
|
-
def next_token
|
49
|
-
@tokens.shift
|
50
|
-
end
|
51
|
-
|
52
|
-
---- footer
|
53
|
-
|
54
|
-
puts 'Ķ������� 2 �浡'
|
55
|
-
puts 'Q �ǽ�λ���ޤ�'
|
56
|
-
calc = Calculator2.new
|
57
|
-
while true
|
58
|
-
print '>>> '; $stdout.flush
|
59
|
-
str = $stdin.gets.strip
|
60
|
-
break if /q/i =~ str
|
61
|
-
begin
|
62
|
-
p calc.evaluate(str)
|
63
|
-
rescue ParseError
|
64
|
-
puts 'parse error'
|
65
|
-
end
|
66
|
-
end
|
data/sample/calc.y
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
# $Id$
|
2
|
-
#
|
3
|
-
# Very simple calculater.
|
4
|
-
|
5
|
-
class Calcp
|
6
|
-
prechigh
|
7
|
-
nonassoc UMINUS
|
8
|
-
left '*' '/'
|
9
|
-
left '+' '-'
|
10
|
-
preclow
|
11
|
-
rule
|
12
|
-
target: exp
|
13
|
-
| /* none */ { result = 0 }
|
14
|
-
|
15
|
-
exp: exp '+' exp { result += val[2] }
|
16
|
-
| exp '-' exp { result -= val[2] }
|
17
|
-
| exp '*' exp { result *= val[2] }
|
18
|
-
| exp '/' exp { result /= val[2] }
|
19
|
-
| '(' exp ')' { result = val[1] }
|
20
|
-
| '-' NUMBER =UMINUS { result = -val[1] }
|
21
|
-
| NUMBER
|
22
|
-
end
|
23
|
-
|
24
|
-
---- header
|
25
|
-
# $Id$
|
26
|
-
---- inner
|
27
|
-
|
28
|
-
def parse(str)
|
29
|
-
@q = []
|
30
|
-
until str.empty?
|
31
|
-
case str
|
32
|
-
when /\A\s+/
|
33
|
-
when /\A\d+/
|
34
|
-
@q.push [:NUMBER, $&.to_i]
|
35
|
-
when /\A.|\n/o
|
36
|
-
s = $&
|
37
|
-
@q.push [s, s]
|
38
|
-
end
|
39
|
-
str = $'
|
40
|
-
end
|
41
|
-
@q.push [false, '$end']
|
42
|
-
do_parse
|
43
|
-
end
|
44
|
-
|
45
|
-
def next_token
|
46
|
-
@q.shift
|
47
|
-
end
|
48
|
-
|
49
|
-
---- footer
|
50
|
-
|
51
|
-
parser = Calcp.new
|
52
|
-
puts
|
53
|
-
puts 'type "Q" to quit.'
|
54
|
-
puts
|
55
|
-
while true
|
56
|
-
puts
|
57
|
-
print '? '
|
58
|
-
str = gets.chop!
|
59
|
-
break if /q/i =~ str
|
60
|
-
begin
|
61
|
-
puts "= #{parser.parse(str)}"
|
62
|
-
rescue ParseError
|
63
|
-
puts $!
|
64
|
-
end
|
65
|
-
end
|
data/sample/conflict.y
DELETED
data/sample/hash.y
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
# $Id$
|
2
|
-
#
|
3
|
-
# Converting Hash-like string into Ruby's Hash.
|
4
|
-
|
5
|
-
class HashParser
|
6
|
-
options no_result_var
|
7
|
-
rule
|
8
|
-
hash : '{' contents '}' { val[1] }
|
9
|
-
| '{' '}' { Hash.new }
|
10
|
-
|
11
|
-
# Racc can handle string over 2 bytes.
|
12
|
-
contents: IDENT '=>' IDENT { {val[0] => val[2]} }
|
13
|
-
| contents ',' IDENT '=>' IDENT { val[0][val[2]] = val[4]; val[0] }
|
14
|
-
end
|
15
|
-
|
16
|
-
---- inner
|
17
|
-
|
18
|
-
def parse(str)
|
19
|
-
@str = str
|
20
|
-
yyparse self, :scan
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def scan
|
26
|
-
str = @str
|
27
|
-
until str.empty?
|
28
|
-
case str
|
29
|
-
when /\A\s+/
|
30
|
-
str = $'
|
31
|
-
when /\A\w+/
|
32
|
-
yield :IDENT, $&
|
33
|
-
str = $'
|
34
|
-
when /\A=>/
|
35
|
-
yield '=>', '=>'
|
36
|
-
str = $'
|
37
|
-
else
|
38
|
-
c = str[0,1]
|
39
|
-
yield c, c
|
40
|
-
str = str[1..-1]
|
41
|
-
end
|
42
|
-
end
|
43
|
-
yield false, '$' # is optional from Racc 1.3.7
|
44
|
-
end
|
45
|
-
|
46
|
-
---- footer
|
47
|
-
|
48
|
-
if $0 == __FILE__
|
49
|
-
src = <<EOS
|
50
|
-
{
|
51
|
-
name => MyName,
|
52
|
-
id => MyIdent
|
53
|
-
}
|
54
|
-
EOS
|
55
|
-
puts 'Parsing (String):'
|
56
|
-
print src
|
57
|
-
puts
|
58
|
-
puts 'Result (Ruby Object):'
|
59
|
-
p HashParser.new.parse(src)
|
60
|
-
end
|
data/sample/lalr.y
DELETED
data/sample/lists.y
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
# $Id$
|
2
|
-
#
|
3
|
-
# Rules for verious lists.
|
4
|
-
# This file is just an example, you cannot compile this file.
|
5
|
-
|
6
|
-
class ExampleOnly
|
7
|
-
rule
|
8
|
-
|
9
|
-
# a list, which minimum number of items is 0
|
10
|
-
list0 :
|
11
|
-
{
|
12
|
-
result = []
|
13
|
-
}
|
14
|
-
| list0 item
|
15
|
-
{
|
16
|
-
result.push val[1]
|
17
|
-
}
|
18
|
-
|
19
|
-
# a list, which minimum number of items is 1
|
20
|
-
list1 : item
|
21
|
-
{
|
22
|
-
result = val
|
23
|
-
}
|
24
|
-
| list1 item
|
25
|
-
{
|
26
|
-
result.push val[1]
|
27
|
-
}
|
28
|
-
|
29
|
-
# a list, separated by comma
|
30
|
-
clist : item
|
31
|
-
{
|
32
|
-
result = val
|
33
|
-
}
|
34
|
-
| clist ',' item
|
35
|
-
{
|
36
|
-
result.push val[2]
|
37
|
-
}
|
38
|
-
|
39
|
-
# a hash. see also "hash.y".
|
40
|
-
hash : '{' hash_contents '}'
|
41
|
-
{
|
42
|
-
result = val[1]
|
43
|
-
}
|
44
|
-
| '{' '}'
|
45
|
-
{
|
46
|
-
result = {}
|
47
|
-
}
|
48
|
-
|
49
|
-
hash_contents
|
50
|
-
: item "=>" item
|
51
|
-
{
|
52
|
-
result = { val[0] => val[2] }
|
53
|
-
}
|
54
|
-
| hash_contents ',' item "=>" item
|
55
|
-
{
|
56
|
-
result[val[2]] = val[4]
|
57
|
-
}
|
data/sample/syntax.y
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
# $Id$
|
2
|
-
#
|
3
|
-
# Racc syntax checker. This grammer file generates
|
4
|
-
# invalid ruby program, you cannot run this parser.
|
5
|
-
|
6
|
-
class P
|
7
|
-
token A B C
|
8
|
-
|
9
|
-
convert
|
10
|
-
A '5'
|
11
|
-
end
|
12
|
-
|
13
|
-
prechigh
|
14
|
-
left B
|
15
|
-
preclow
|
16
|
-
|
17
|
-
options omit_action_call
|
18
|
-
|
19
|
-
start target
|
20
|
-
rule
|
21
|
-
target: A B C
|
22
|
-
{
|
23
|
-
print 'abc'
|
24
|
-
}
|
25
|
-
| B C A
|
26
|
-
| C B A
|
27
|
-
{
|
28
|
-
print 'cba'
|
29
|
-
}
|
30
|
-
| cont
|
31
|
-
|
32
|
-
cont : A c2 B c2 C
|
33
|
-
|
34
|
-
c2 : C C C C C
|
35
|
-
end
|
36
|
-
|
37
|
-
---- inner
|
38
|
-
|
39
|
-
junk code !!!!
|
40
|
-
|
41
|
-
kjaljlajrlaolanbla /// %%% (*((( token rule
|
42
|
-
akiurtlajluealjflaj @@@@ end end end end __END__
|
43
|
-
laieu2o879urkq96ga(Q#*&%Q#
|
44
|
-
#&lkji END
|
45
|
-
|
46
|
-
q395q?/// liutjqlkr7
|