meta_compile 0.0.1

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.
Files changed (2) hide show
  1. data/bin/meta_compile +229 -0
  2. metadata +46 -0
data/bin/meta_compile ADDED
@@ -0,0 +1,229 @@
1
+ #!/usr/bin/env ruby
2
+ require "strscan"
3
+ class RMetaII
4
+ def compile(str, out)
5
+ @i, @o = StringScanner.new(str), out
6
+ compile_program
7
+ end
8
+ def compile_arg
9
+ begin
10
+ @i.scan /\s*/; s='$'
11
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
12
+ if @f
13
+ @o.print '@o.print @t'
14
+ @o.print "\n"
15
+ end
16
+ break if @f
17
+ @i.scan /\s*/; @f = @t = @i.scan /\047[^\047]*\047/
18
+ if @f
19
+ @o.print '@o.print '
20
+ @o.print @t
21
+ @o.print "\n"
22
+ end
23
+ end while false
24
+ end
25
+ def compile_output
26
+ begin
27
+ @i.scan /\s*/; s='<'
28
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
29
+ if @f
30
+ begin
31
+ compile_arg
32
+ end while @f
33
+ @f = true
34
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
35
+ @i.scan /\s*/; s='>'
36
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
37
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
38
+ @o.print '@o.print "\n"'
39
+ @o.print "\n"
40
+ end
41
+ end while false
42
+ end
43
+ def compile_exp3
44
+ begin
45
+ @i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/
46
+ if @f
47
+ @o.print 'compile_'
48
+ @o.print @t
49
+ @o.print "\n"
50
+ end
51
+ break if @f
52
+ @i.scan /\s*/; @f = @t = @i.scan /\047[^\047]*\047/
53
+ if @f
54
+ @o.print '@i.scan /\s*/; s='
55
+ @o.print @t
56
+ @o.print "\n"
57
+ @o.print '@f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil'
58
+ @o.print "\n"
59
+ end
60
+ break if @f
61
+ @i.scan /\s*/; s='.id'
62
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
63
+ if @f
64
+ @o.print '@i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/'
65
+ @o.print "\n"
66
+ end
67
+ break if @f
68
+ @i.scan /\s*/; s='.string'
69
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
70
+ if @f
71
+ @o.print '@i.scan /\s*/; @f = @t = @i.scan /\047[^\047]*\047/'
72
+ @o.print "\n"
73
+ end
74
+ break if @f
75
+ @i.scan /\s*/; s='('
76
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
77
+ if @f
78
+ compile_exp1
79
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
80
+ @i.scan /\s*/; s=')'
81
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
82
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
83
+ end
84
+ break if @f
85
+ @i.scan /\s*/; s='.e'
86
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
87
+ if @f
88
+ @o.print '@f = true'
89
+ @o.print "\n"
90
+ end
91
+ break if @f
92
+ @i.scan /\s*/; s='*'
93
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
94
+ if @f
95
+ @o.print 'begin'
96
+ @o.print "\n"
97
+ compile_exp3
98
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
99
+ @o.print 'end while @f'
100
+ @o.print "\n"
101
+ @o.print '@f = true'
102
+ @o.print "\n"
103
+ end
104
+ end while false
105
+ end
106
+ def compile_exp2
107
+ begin
108
+ begin
109
+ compile_exp3
110
+ if @f
111
+ @o.print 'if @f'
112
+ @o.print "\n"
113
+ end
114
+ break if @f
115
+ compile_output
116
+ if @f
117
+ @o.print 'if true'
118
+ @o.print "\n"
119
+ end
120
+ end while false
121
+ if @f
122
+ begin
123
+ begin
124
+ compile_exp3
125
+ if @f
126
+ @o.print 'raise("error at: " + @i.rest.split("\n")[0]) if !@f'
127
+ @o.print "\n"
128
+ end
129
+ break if @f
130
+ compile_output
131
+ if @f
132
+ end
133
+ end while false
134
+ end while @f
135
+ @f = true
136
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
137
+ @o.print 'end'
138
+ @o.print "\n"
139
+ end
140
+ end while false
141
+ end
142
+ def compile_exp1
143
+ begin
144
+ @o.print 'begin'
145
+ @o.print "\n"
146
+ if true
147
+ compile_exp2
148
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
149
+ begin
150
+ begin
151
+ @i.scan /\s*/; s='|'
152
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
153
+ if @f
154
+ @o.print 'break if @f'
155
+ @o.print "\n"
156
+ compile_exp2
157
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
158
+ end
159
+ end while false
160
+ end while @f
161
+ @f = true
162
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
163
+ @o.print 'end while false'
164
+ @o.print "\n"
165
+ end
166
+ end while false
167
+ end
168
+ def compile_stat
169
+ begin
170
+ @i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/
171
+ if @f
172
+ @o.print 'def compile_'
173
+ @o.print @t
174
+ @o.print "\n"
175
+ @i.scan /\s*/; s='='
176
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
177
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
178
+ compile_exp1
179
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
180
+ @i.scan /\s*/; s=';'
181
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
182
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
183
+ @o.print 'end'
184
+ @o.print "\n"
185
+ end
186
+ end while false
187
+ end
188
+ def compile_program
189
+ begin
190
+ @i.scan /\s*/; s='.syntax'
191
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
192
+ if @f
193
+ @i.scan /\s*/; @f = @t = @i.scan /[A-Za-z]+[A-Za-z0-9_]+/
194
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
195
+ @o.print '#!/usr/bin/env ruby'
196
+ @o.print "\n"
197
+ @o.print 'require "strscan"'
198
+ @o.print "\n"
199
+ @o.print 'class '
200
+ @o.print @t
201
+ @o.print "\n"
202
+ @o.print 'def compile(str, out)'
203
+ @o.print "\n"
204
+ @o.print '@i, @o = StringScanner.new(str), out'
205
+ @o.print "\n"
206
+ @o.print 'compile_program'
207
+ @o.print "\n"
208
+ @o.print 'end'
209
+ @o.print "\n"
210
+ begin
211
+ compile_stat
212
+ end while @f
213
+ @f = true
214
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
215
+ @i.scan /\s*/; s='.end'
216
+ @f = (@i.peek(s.length) == s) ? (@t=s; @i.pos += s.length) : nil
217
+ raise("error at: " + @i.rest.split("\n")[0]) if !@f
218
+ @o.print 'end'
219
+ @o.print "\n"
220
+ @o.print 'begin; puts "Use: meta_compile <in> <out>"; exit; end if ARGV.length != 2'
221
+ @o.print "\n"
222
+ @o.print 'File.open(ARGV[1], "w") {|f| RMetaII.new.compile(File.read(ARGV[0]), f)}'
223
+ @o.print "\n"
224
+ end
225
+ end while false
226
+ end
227
+ end
228
+ begin; puts "Use: meta_compile <in> <out>"; exit; end if ARGV.length != 2
229
+ File.open(ARGV[1], "w") {|f| RMetaII.new.compile(File.read(ARGV[0]), f)}
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta_compile
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Robert Feldt
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-25 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A meta compilation framework à la Meta-II by Val Schorre
15
+ email: robert.feldt@gmail.com
16
+ executables:
17
+ - meta_compile
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - bin/meta_compile
22
+ homepage: http://rubygems.org/gems/meta_compile
23
+ licenses: []
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 1.8.24
43
+ signing_key:
44
+ specification_version: 3
45
+ summary: meta compiler framework
46
+ test_files: []