meta_compile 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/meta_compile +32 -31
- data/bootstrap/meta_for_ruby.txt +5 -6
- metadata +1 -1
data/bin/meta_compile
CHANGED
@@ -7,8 +7,8 @@ compile_program
|
|
7
7
|
end
|
8
8
|
def compile_outarg
|
9
9
|
begin
|
10
|
-
@i.scan /\s*/; s='$'
|
11
|
-
@f = (@i.peek(
|
10
|
+
@i.scan /\s*/; s='$'; l=s.length;
|
11
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
12
12
|
if @f
|
13
13
|
@o.print '@o.print @t'
|
14
14
|
@o.print "\n"
|
@@ -24,16 +24,16 @@ end while false
|
|
24
24
|
end
|
25
25
|
def compile_out
|
26
26
|
begin
|
27
|
-
@i.scan /\s*/; s='<'
|
28
|
-
@f = (@i.peek(
|
27
|
+
@i.scan /\s*/; s='<'; l=s.length;
|
28
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
29
29
|
if @f
|
30
30
|
begin
|
31
31
|
compile_outarg
|
32
32
|
end while @f
|
33
33
|
@f = true
|
34
34
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
35
|
-
@i.scan /\s*/; s='>'
|
36
|
-
@f = (@i.peek(
|
35
|
+
@i.scan /\s*/; s='>'; l=s.length;
|
36
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
37
37
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
38
38
|
@o.print '@o.print "\n"'
|
39
39
|
@o.print "\n"
|
@@ -53,44 +53,45 @@ break if @f
|
|
53
53
|
if @f
|
54
54
|
@o.print '@i.scan /\s*/; s='
|
55
55
|
@o.print @t
|
56
|
+
@o.print '; l=s.length;'
|
56
57
|
@o.print "\n"
|
57
|
-
@o.print '@f = (@i.peek(
|
58
|
+
@o.print '@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil'
|
58
59
|
@o.print "\n"
|
59
60
|
end
|
60
61
|
break if @f
|
61
|
-
@i.scan /\s*/; s='.id'
|
62
|
-
@f = (@i.peek(
|
62
|
+
@i.scan /\s*/; s='.id'; l=s.length;
|
63
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
63
64
|
if @f
|
64
65
|
@o.print '@i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/'
|
65
66
|
@o.print "\n"
|
66
67
|
end
|
67
68
|
break if @f
|
68
|
-
@i.scan /\s*/; s='.string'
|
69
|
-
@f = (@i.peek(
|
69
|
+
@i.scan /\s*/; s='.string'; l=s.length;
|
70
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
70
71
|
if @f
|
71
72
|
@o.print '@i.scan /\s*/; @f = @t = @i.scan /\047[^\047]*\047/'
|
72
73
|
@o.print "\n"
|
73
74
|
end
|
74
75
|
break if @f
|
75
|
-
@i.scan /\s*/; s='('
|
76
|
-
@f = (@i.peek(
|
76
|
+
@i.scan /\s*/; s='('; l=s.length;
|
77
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
77
78
|
if @f
|
78
79
|
compile_exp1
|
79
80
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
80
|
-
@i.scan /\s*/; s=')'
|
81
|
-
@f = (@i.peek(
|
81
|
+
@i.scan /\s*/; s=')'; l=s.length;
|
82
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
82
83
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
83
84
|
end
|
84
85
|
break if @f
|
85
|
-
@i.scan /\s*/; s='.e'
|
86
|
-
@f = (@i.peek(
|
86
|
+
@i.scan /\s*/; s='.e'; l=s.length;
|
87
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
87
88
|
if @f
|
88
89
|
@o.print '@f = true'
|
89
90
|
@o.print "\n"
|
90
91
|
end
|
91
92
|
break if @f
|
92
|
-
@i.scan /\s*/; s='*'
|
93
|
-
@f = (@i.peek(
|
93
|
+
@i.scan /\s*/; s='*'; l=s.length;
|
94
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
94
95
|
if @f
|
95
96
|
@o.print 'begin'
|
96
97
|
@o.print "\n"
|
@@ -148,8 +149,8 @@ compile_exp2
|
|
148
149
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
149
150
|
begin
|
150
151
|
begin
|
151
|
-
@i.scan /\s*/; s='|'
|
152
|
-
@f = (@i.peek(
|
152
|
+
@i.scan /\s*/; s='|'; l=s.length;
|
153
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
153
154
|
if @f
|
154
155
|
@o.print 'break if @f'
|
155
156
|
@o.print "\n"
|
@@ -165,20 +166,20 @@ raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
|
165
166
|
end
|
166
167
|
end while false
|
167
168
|
end
|
168
|
-
def
|
169
|
+
def compile_rule
|
169
170
|
begin
|
170
171
|
@i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/
|
171
172
|
if @f
|
172
173
|
@o.print 'def compile_'
|
173
174
|
@o.print @t
|
174
175
|
@o.print "\n"
|
175
|
-
@i.scan /\s*/; s='='
|
176
|
-
@f = (@i.peek(
|
176
|
+
@i.scan /\s*/; s='='; l=s.length;
|
177
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
177
178
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
178
179
|
compile_exp1
|
179
180
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
180
|
-
@i.scan /\s*/; s=';'
|
181
|
-
@f = (@i.peek(
|
181
|
+
@i.scan /\s*/; s=';'; l=s.length;
|
182
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
182
183
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
183
184
|
@o.print 'end'
|
184
185
|
@o.print "\n"
|
@@ -187,8 +188,8 @@ end while false
|
|
187
188
|
end
|
188
189
|
def compile_program
|
189
190
|
begin
|
190
|
-
@i.scan /\s*/; s='.syntax'
|
191
|
-
@f = (@i.peek(
|
191
|
+
@i.scan /\s*/; s='.syntax'; l=s.length;
|
192
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
192
193
|
if @f
|
193
194
|
@i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/
|
194
195
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
@@ -208,12 +209,12 @@ raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
|
208
209
|
@o.print 'end'
|
209
210
|
@o.print "\n"
|
210
211
|
begin
|
211
|
-
|
212
|
+
compile_rule
|
212
213
|
end while @f
|
213
214
|
@f = true
|
214
215
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
215
|
-
@i.scan /\s*/; s='.end'
|
216
|
-
@f = (@i.peek(
|
216
|
+
@i.scan /\s*/; s='.end'; l=s.length;
|
217
|
+
@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil
|
217
218
|
raise("error at: " + @i.rest.split("\n")[0]) if !@f
|
218
219
|
@o.print 'end'
|
219
220
|
@o.print "\n"
|
data/bootstrap/meta_for_ruby.txt
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
.syntax RMetaII
|
2
2
|
|
3
|
-
outarg = '$'
|
4
|
-
| .string <'@o.print ' $>;
|
3
|
+
outarg = '$' <'@o.print @t'> | .string <'@o.print ' $>;
|
5
4
|
|
6
5
|
out = '<' *outarg '>' <'@o.print "\n"'>;
|
7
6
|
|
8
7
|
exp3 = .id <'compile_' $>
|
9
|
-
| .string <'@i.scan /\s*/; s='
|
10
|
-
<'@f = (@i.peek(
|
8
|
+
| .string <'@i.scan /\s*/; s=' $ '; l=s.length;'>
|
9
|
+
<'@f = (@i.peek(l) == s) ? (@t=s; @i.pos += l) : nil'>
|
11
10
|
| '.id' <'@i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/'>
|
12
11
|
| '.string' <'@i.scan /\s*/; @f = @t = @i.scan /\047[^\047]*\047/'>
|
13
12
|
| '(' exp1 ')'
|
@@ -22,14 +21,14 @@ exp1 = <'begin'> exp2
|
|
22
21
|
*( '|' <'break if @f'> exp2 )
|
23
22
|
<'end while false'>;
|
24
23
|
|
25
|
-
|
24
|
+
rule = .id <'def compile_' $> '=' exp1 ';' <'end'>;
|
26
25
|
|
27
26
|
program = '.syntax' .id
|
28
27
|
<'#!/usr/bin/env ruby'> <'require "strscan"'>
|
29
28
|
<'class ' $> <'def compile(str, out)'>
|
30
29
|
<'@i, @o = StringScanner.new(str), out'>
|
31
30
|
<'compile_program'> <'end'>
|
32
|
-
*
|
31
|
+
*rule '.end' <'end'>
|
33
32
|
<'begin; puts "Use: meta_compile <in> <out>"; exit; end if ARGV.length != 2'>
|
34
33
|
<'File.open(ARGV[1], "w") {|f| RMetaII.new.compile(File.read(ARGV[0]), f)}'>;
|
35
34
|
|