cast 0.0.1 → 0.1.0
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/README +4 -4
- data/doc/index.html +7 -15
- data/ext/cast.h +141 -0
- data/ext/cast_ext.c +10 -0
- data/ext/extconf.rb +2 -0
- data/ext/parser.c +287 -0
- data/ext/yylex.c +8189 -0
- data/ext/yylex.re +330 -0
- data/lib/cast.rb +15 -8
- data/lib/cast/c.tab.rb +3398 -0
- data/lib/{c.y → cast/c.y} +212 -270
- data/lib/{c_nodes.rb → cast/c_nodes.rb} +12 -7
- data/lib/{to_debug.rb → cast/inspect.rb} +12 -12
- data/lib/{node.rb → cast/node.rb} +0 -0
- data/lib/{node_list.rb → cast/node_list.rb} +10 -2
- data/lib/{parse.rb → cast/parse.rb} +0 -0
- data/lib/{to_s.rb → cast/to_s.rb} +12 -3
- data/test/run.rb +204 -2
- data/test/test_c_nodes.rb +5 -9
- data/test/test_node.rb +0 -10
- data/test/test_node_list.rb +20 -3
- data/test/test_parse.rb +623 -626
- data/test/test_parser.rb +80 -33
- metadata +44 -32
- data/install.rb +0 -14
- data/lib/c.tab.rb +0 -3433
- data/test/common.rb +0 -174
data/test/common.rb
DELETED
@@ -1,174 +0,0 @@
|
|
1
|
-
$: << File.expand_path('../lib')
|
2
|
-
require 'cast'
|
3
|
-
require 'test/unit'
|
4
|
-
|
5
|
-
if true
|
6
|
-
class C::Node
|
7
|
-
def pretty_print q
|
8
|
-
q.text self.to_debug
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class Array
|
14
|
-
def same_list? other
|
15
|
-
self.length == other.length or
|
16
|
-
return false
|
17
|
-
self.zip(other).all? do |mine, yours|
|
18
|
-
mine.equal? yours or
|
19
|
-
return false
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
class Integer
|
25
|
-
###
|
26
|
-
### Return a `self'-element array containing the result of the given
|
27
|
-
### block.
|
28
|
-
###
|
29
|
-
def of &blk
|
30
|
-
Array.new(self, &blk)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
module Test::Unit::Assertions
|
35
|
-
###
|
36
|
-
### Assert that the given ast's nodes' parents are correct, and
|
37
|
-
### there aren't non-Nodes where there shouldn't be.
|
38
|
-
###
|
39
|
-
def assert_tree ast
|
40
|
-
meth = 'unknown method'
|
41
|
-
caller.each do |line|
|
42
|
-
if line =~ /in `(test_.*?)'/ #`
|
43
|
-
meth = $1
|
44
|
-
break
|
45
|
-
end
|
46
|
-
end
|
47
|
-
filename = "#{self.class}_#{meth}.out"
|
48
|
-
begin
|
49
|
-
assert_tree1(ast, nil)
|
50
|
-
assert(true)
|
51
|
-
rescue BadTreeError => e
|
52
|
-
require 'pp'
|
53
|
-
open("#{filename}", 'w'){|f| PP.pp(ast, f)}
|
54
|
-
flunk("#{e.message}. Output dumped to `#{filename}'.")
|
55
|
-
end
|
56
|
-
end
|
57
|
-
###
|
58
|
-
def assert_tree1 x, parent
|
59
|
-
if x.is_a? C::Node
|
60
|
-
parent.equal? x.parent or
|
61
|
-
raise BadTreeError, "#{x.class}:0x#{(x.id << 1).to_s(16)} has #{x.parent ? 'wrong' : 'no'} parent"
|
62
|
-
x.fields.each do |field|
|
63
|
-
next if !field.child?
|
64
|
-
val = x.send(field.reader)
|
65
|
-
next if val.nil?
|
66
|
-
val.is_a? C::Node or
|
67
|
-
raise BadTreeError, "#{x.class}:0x#{(x.id << 1).to_s(16)} is a non-Node child"
|
68
|
-
assert_tree1(val, x)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
class BadTreeError < StandardError; end
|
73
|
-
###
|
74
|
-
### Assert that `arg' is a C::NodeList.
|
75
|
-
###
|
76
|
-
def assert_list arg
|
77
|
-
assert_kind_of(C::NodeList, arg)
|
78
|
-
end
|
79
|
-
###
|
80
|
-
### Assert that `arg' is an empty C::NodeList.
|
81
|
-
###
|
82
|
-
def assert_empty_list arg
|
83
|
-
assert_list arg
|
84
|
-
assert(arg.empty?)
|
85
|
-
end
|
86
|
-
###
|
87
|
-
### Assert that the elements of exp are the same as those of out,
|
88
|
-
### and are in the same order.
|
89
|
-
###
|
90
|
-
def assert_same_list exp, out
|
91
|
-
assert_equal(exp.length, out.length, "Checking length")
|
92
|
-
(0...exp.length).each do |i|
|
93
|
-
assert_same(exp[i], out[i], "At index #{i} (of 0...#{exp.length})")
|
94
|
-
end
|
95
|
-
end
|
96
|
-
###
|
97
|
-
### Assert that out is ==, but not the same as exp (i.e., it is a
|
98
|
-
### copy).
|
99
|
-
###
|
100
|
-
def assert_copy exp, out
|
101
|
-
assert_not_same exp, out
|
102
|
-
assert_equal exp, out
|
103
|
-
end
|
104
|
-
###
|
105
|
-
### Assert the invariants of `node'.
|
106
|
-
###
|
107
|
-
def assert_invariants node
|
108
|
-
node.assert_invariants(self)
|
109
|
-
end
|
110
|
-
###
|
111
|
-
### Return a not-too-trivial C program string.
|
112
|
-
###
|
113
|
-
def prog
|
114
|
-
return <<EOS
|
115
|
-
int main(int argc, char **argv) {
|
116
|
-
struct S {
|
117
|
-
int i, j;
|
118
|
-
float f, g;
|
119
|
-
} x;
|
120
|
-
x.i = (int)argv[2][5];
|
121
|
-
return 0;
|
122
|
-
}
|
123
|
-
EOS
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
module CheckAst
|
128
|
-
INDENT = ' '
|
129
|
-
|
130
|
-
ParseError = C::ParseError
|
131
|
-
|
132
|
-
def check_ast test_data
|
133
|
-
inp, exp = test_data.split(/^----+\n/)
|
134
|
-
ast = yield(inp)
|
135
|
-
assert_tree(ast)
|
136
|
-
assert ast.is_a?(C::Node)
|
137
|
-
out = ast.to_debug
|
138
|
-
assert_equal_debug_strs(exp, out)
|
139
|
-
end
|
140
|
-
|
141
|
-
def assert_equal_debug_strs exp, out
|
142
|
-
## remove EOL space
|
143
|
-
out = out.gsub(/ *$/, '')
|
144
|
-
exp = exp.gsub(/ *$/, '')
|
145
|
-
|
146
|
-
## normalize BOL space
|
147
|
-
exp.gsub!(%r'^#{INDENT}*') do |s|
|
148
|
-
levels = s.length / INDENT.length
|
149
|
-
C::Node::TO_DEBUG_TAB*levels
|
150
|
-
end
|
151
|
-
|
152
|
-
## compare
|
153
|
-
meth = 'unknown method'
|
154
|
-
caller.each do |line|
|
155
|
-
if line =~ /in `(test_.*?)'/ #`
|
156
|
-
meth = $1
|
157
|
-
break
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
filename_prefix = "#{self.class}_#{meth}"
|
162
|
-
|
163
|
-
assert_block("Debug strings unequal. Output dumped to #{filename_prefix}.{exp,out}") do
|
164
|
-
if out == exp
|
165
|
-
true
|
166
|
-
else
|
167
|
-
classname = self.class.name.split(/::/)[-1]
|
168
|
-
open("#{filename_prefix}.out", 'w'){|f| f.print(out)}
|
169
|
-
open("#{filename_prefix}.exp", 'w'){|f| f.print(exp)}
|
170
|
-
false
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|