meta_compile 0.0.4 → 0.0.5
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/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
|
|