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.
- data/.gemtest +0 -0
- data/COPYING +515 -0
- data/ChangeLog +846 -0
- data/DEPENDS +4 -0
- data/Manifest.txt +105 -0
- data/README.ja.rdoc +96 -0
- data/README.rdoc +86 -0
- data/Rakefile +51 -0
- data/TODO +5 -0
- data/bin/racc +308 -0
- data/bin/racc2y +195 -0
- data/bin/y2racc +339 -0
- data/ext/racc/MANIFEST +4 -0
- data/ext/racc/cparse.c +824 -0
- data/ext/racc/depend +1 -0
- data/ext/racc/extconf.rb +5 -0
- data/fastcache/extconf.rb +2 -0
- data/fastcache/fastcache.c +185 -0
- data/lib/racc.rb +6 -0
- data/lib/racc/compat.rb +40 -0
- data/lib/racc/debugflags.rb +59 -0
- data/lib/racc/exception.rb +15 -0
- data/lib/racc/grammar.rb +1115 -0
- data/lib/racc/grammarfileparser.rb +559 -0
- data/lib/racc/info.rb +16 -0
- data/lib/racc/iset.rb +91 -0
- data/lib/racc/logfilegenerator.rb +211 -0
- data/lib/racc/parser-text.rb +479 -0
- data/lib/racc/parser.rb +474 -0
- data/lib/racc/parserfilegenerator.rb +512 -0
- data/lib/racc/pre-setup +13 -0
- data/lib/racc/sourcetext.rb +34 -0
- data/lib/racc/state.rb +971 -0
- data/lib/racc/statetransitiontable.rb +316 -0
- data/lib/racc/static.rb +5 -0
- data/misc/dist.sh +31 -0
- data/rdoc/en/NEWS.en.rdoc +282 -0
- data/rdoc/en/command.en.html +78 -0
- data/rdoc/en/debug.en.rdoc +20 -0
- data/rdoc/en/grammar.en.rdoc +230 -0
- data/rdoc/en/index.en.html +10 -0
- data/rdoc/en/parser.en.rdoc +74 -0
- data/rdoc/en/usage.en.rdoc +83 -0
- data/rdoc/ja/NEWS.ja.rdoc +307 -0
- data/rdoc/ja/command.ja.html +94 -0
- data/rdoc/ja/debug.ja.rdoc +36 -0
- data/rdoc/ja/grammar.ja.rdoc +348 -0
- data/rdoc/ja/index.ja.html +10 -0
- data/rdoc/ja/parser.ja.rdoc +125 -0
- data/rdoc/ja/usage.ja.html +414 -0
- data/sample/array.y +67 -0
- data/sample/array2.y +59 -0
- data/sample/calc-ja.y +66 -0
- data/sample/calc.y +65 -0
- data/sample/conflict.y +15 -0
- data/sample/hash.y +60 -0
- data/sample/lalr.y +17 -0
- data/sample/lists.y +57 -0
- data/sample/syntax.y +46 -0
- data/sample/yyerr.y +46 -0
- data/setup.rb +1587 -0
- data/tasks/doc.rb +12 -0
- data/tasks/email.rb +55 -0
- data/test/assets/chk.y +126 -0
- data/test/assets/conf.y +16 -0
- data/test/assets/digraph.y +29 -0
- data/test/assets/echk.y +118 -0
- data/test/assets/err.y +60 -0
- data/test/assets/expect.y +7 -0
- data/test/assets/firstline.y +4 -0
- data/test/assets/ichk.y +102 -0
- data/test/assets/intp.y +546 -0
- data/test/assets/mailp.y +437 -0
- data/test/assets/newsyn.y +25 -0
- data/test/assets/noend.y +4 -0
- data/test/assets/nonass.y +41 -0
- data/test/assets/normal.y +27 -0
- data/test/assets/norule.y +4 -0
- data/test/assets/nullbug1.y +25 -0
- data/test/assets/nullbug2.y +15 -0
- data/test/assets/opt.y +123 -0
- data/test/assets/percent.y +35 -0
- data/test/assets/recv.y +97 -0
- data/test/assets/rrconf.y +14 -0
- data/test/assets/scan.y +72 -0
- data/test/assets/syntax.y +50 -0
- data/test/assets/unterm.y +5 -0
- data/test/assets/useless.y +12 -0
- data/test/assets/yyerr.y +46 -0
- data/test/bench.y +36 -0
- data/test/helper.rb +91 -0
- data/test/infini.y +8 -0
- data/test/scandata/brace +7 -0
- data/test/scandata/gvar +1 -0
- data/test/scandata/normal +4 -0
- data/test/scandata/percent +18 -0
- data/test/scandata/slash +10 -0
- data/test/src.intp +34 -0
- data/test/start.y +20 -0
- data/test/test_chk_y.rb +51 -0
- data/test/test_grammar_file_parser.rb +15 -0
- data/test/test_racc_command.rb +155 -0
- data/test/test_scan_y.rb +51 -0
- data/test/testscanner.rb +51 -0
- data/web/racc.en.rhtml +42 -0
- data/web/racc.ja.rhtml +51 -0
- metadata +233 -0
data/sample/array.y
ADDED
@@ -0,0 +1,67 @@
|
|
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
ADDED
@@ -0,0 +1,59 @@
|
|
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
ADDED
@@ -0,0 +1,66 @@
|
|
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
ADDED
@@ -0,0 +1,65 @@
|
|
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
ADDED
data/sample/hash.y
ADDED
@@ -0,0 +1,60 @@
|
|
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
ADDED
data/sample/lists.y
ADDED
@@ -0,0 +1,57 @@
|
|
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
ADDED
@@ -0,0 +1,46 @@
|
|
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
|