minilang_refi 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/minilang_refi.rb +290 -0
  2. metadata +108 -0
@@ -0,0 +1,290 @@
1
+ # encoding: UTF-8
2
+
3
+ ## === std stuff
4
+ #if(__FILE__ == $0)
5
+ #local_dir = File.expand_path(File.dirname(__FILE__) )
6
+ #global_libs_dir = "C:/files/dev/libs/ruby"
7
+ #$: << local_dir # my local requires
8
+ #$: << global_libs_dir # my global requires
9
+ #require 'general_libs/helper.rb' # timing, styling, monkey-patches (String,Hash,Array)
10
+ #end
11
+ ## ===
12
+
13
+ #require 'minival_refi'
14
+
15
+ require 'polyglot'
16
+ require 'treetop'
17
+ #require 'pp'
18
+ require 'string_extensions_refi'
19
+
20
+
21
+ p = File.join(File.dirname(__FILE__),'/minilang_refi/minilang_grammar.treetop')
22
+ Treetop.load(p)
23
+
24
+ class MinilangGrammarParser
25
+ def get_errors
26
+ [failure_reason,failure_line,failure_column]
27
+ end
28
+ end
29
+
30
+ # g1: new_values = each({in:[1,2,3],as:i,do:concat(["(",i,")"])});
31
+ # g2: insert(concat(["<tr>", each({in:cur_cols,as:cur_col,do:concat(["<td>",var_map[cur_col],"</td>"])}) , "</tr>"]));
32
+ # c3: tdx_cols = regex_select( {from: col_labels, where: tdx_cols_regex} ) ;
33
+
34
+ module Refi
35
+
36
+ class MinilangEnv
37
+ @@rf_cache = {}
38
+ @@funs = {
39
+ "prepare" => proc{|env,args|
40
+ env.prepare(args[:n],args[:stmt])
41
+ },
42
+ "run" => proc{|env,args|
43
+ next env.prepare_run(args[:n])
44
+ },
45
+ "set" => proc{|env,args|
46
+ deref = args[:deref] || []
47
+ env.set(args[:n],args[:v],deref)
48
+ },
49
+ "get" => proc{|env,args|
50
+ next env.get(args[:n])
51
+ },
52
+ "get_m" => proc{|env,args|
53
+ next env.get_m(args[:n])
54
+ },
55
+ "get_l" => proc{|env,args|
56
+ next env.get_l(args[:n])
57
+ },
58
+ "get_e" => proc{|env,args|
59
+ next env.get_e(args[:n])
60
+ },
61
+ "insert" => proc{|env,args|
62
+ env.text << args[:v].to_s
63
+ },
64
+ "read_file" => proc{|env,args|
65
+ pn = args[:pn]
66
+ rf = @@rf_cache[pn]
67
+ unless rf
68
+ rf = env.read_file args[:pn].to_s
69
+ @@rf_cache[pn] = rf
70
+ end
71
+ next rf
72
+ #next env.read_file args[:pn].to_s
73
+ },
74
+ "print" => proc{|env,args|
75
+ puts args[:v].to_s
76
+ },
77
+ "pp" => proc{|env,args|
78
+ pp env
79
+ },
80
+ "concat" => proc{|env,args|
81
+ ary = args[:ary]
82
+ concat_str = ary.inject(''){|memo,i|
83
+ memo << i
84
+ }
85
+ next concat_str
86
+ },
87
+ "get_export_type" => proc{|env,args|
88
+ next env.get_export_type
89
+ },
90
+ "get_keys" => proc{|env,args|
91
+ m = args[:map]
92
+ res = m.keys
93
+ next res
94
+ },
95
+ "regex_select" => proc{|env,args|
96
+ from = args[:from]
97
+ where = args[:where]
98
+ res = []
99
+ from.each{|e|
100
+ if e.match(where)
101
+ res << e
102
+ end
103
+ }
104
+ next res
105
+ },
106
+ "group" => proc{|env,args|
107
+ ary = args[:ary].dup
108
+ ary_size = ary.size
109
+ amount = args[:amount]
110
+ fill = args[:fill]
111
+ res = []
112
+ while !ary.empty?
113
+ res.push ary.shift(amount)
114
+ end
115
+ if fill
116
+ fills = ary_size % amount
117
+ fills.times{
118
+ res[-1].push(fill)
119
+ }
120
+ end
121
+ next res
122
+ },
123
+ "loop" => proc{|env,args|
124
+ l_var_name = args[:l_var]
125
+ ary = args[:ary].dup
126
+ env.create_loop(l_var_name,ary)
127
+ next nil
128
+ },
129
+ }
130
+ attr_accessor :text
131
+ def initialize(creator,p)
132
+ @creator = creator
133
+ @export_type = p[:export_type] || $Log.tlog({id: 'err1030'})
134
+ #dperr( 'E777', 'export type not passed to minilang env init')
135
+ @text = ''
136
+ @vars = {} # local
137
+ @vars_m = {} # var_map
138
+ @vars_l = {} # loop
139
+ @vars_e = {} # each
140
+ @iter_vars = {}
141
+ @prep_stmts = {}
142
+ end
143
+ def consume_text
144
+ t = @text
145
+ @text = ''
146
+ return t
147
+ end
148
+ def set_var_map var_map
149
+ @vars_m = var_map
150
+ end
151
+ def pretty_print(pp)
152
+ puts "<vars>"
153
+ pp @vars
154
+ puts "</vars>"
155
+ puts "<text>"
156
+ pp @text
157
+ puts "</text>"
158
+ end
159
+ def call_fun(fun_name,fun_args)
160
+ res = @@funs[fun_name].call(self,fun_args)
161
+ return res
162
+ end
163
+ def get name
164
+ return @vars[name]
165
+ end
166
+ def get_m name
167
+ unless name
168
+ return @vars_m
169
+ else
170
+ return @vars_m[name]
171
+ end
172
+ end
173
+ def get_e name
174
+ return @vars_e[name]
175
+ end
176
+ def get_l name
177
+ return @vars_l[name]
178
+ end
179
+ def read_file pn
180
+ return @creator.read_file pn
181
+ end
182
+ def create_loop(l_var_name,ary)
183
+ @creator.create_loop(l_var_name,ary)
184
+ end
185
+ def set_e(var_name,var_value,deref)
186
+ if deref == []
187
+ @vars_e[var_name] = var_value
188
+ return
189
+ else
190
+ v_e = deref.pop
191
+ v = @vars_e[var_name]
192
+ deref.each{|d|
193
+ v = v[d]
194
+ }
195
+ v[v_e] = var_value
196
+ return
197
+ end
198
+ end
199
+ def set_l(var_name,var_value) #,deref)
200
+ #if deref == []
201
+ @vars_l[var_name] = var_value
202
+ return
203
+ #else
204
+ # v_e = deref.pop
205
+ # v = @vars_l[var_name]
206
+ # deref.each{|d|
207
+ # v = v[d]
208
+ # }
209
+ # v[v_e] = var_value
210
+ # return
211
+ #end
212
+ end
213
+ def set(var_name,var_value,deref)
214
+ if deref == []
215
+ @vars[var_name] = var_value
216
+ else
217
+ v_e = deref.pop
218
+ v = @vars[var_name]
219
+ deref.each{|d|
220
+ v = v[d]
221
+ }
222
+ v[v_e] = var_value
223
+ end
224
+ return nil
225
+ end
226
+ def set_iter_var(var_ref,val)
227
+ @iter_vars[var_ref] = val
228
+ end
229
+ def parse_str str
230
+ parse_res = MinilangScript.new(str)
231
+ if(parse_res.valid)
232
+ return parse_res
233
+ else
234
+ dparn 1223, "invalid string (was not executed)"
235
+ parse_res.report_errors
236
+ return nil
237
+ end
238
+ end
239
+ def prepare(name,str)
240
+ @prep_stmts[name] = parse_str(str)
241
+ end
242
+ def prepare_run(name)
243
+ @prep_stmts[name].run(self)
244
+ end
245
+ def run_str str
246
+ parse_res = parse_str(str)
247
+ return parse_res.run(self)
248
+ end
249
+ end
250
+ class MinilangScript
251
+ def initialize(str)
252
+ @parser = MinilangGrammarParser.new
253
+ @parse_result = @parser.parse(str)
254
+ @val = nil
255
+ end
256
+ def valid
257
+ return true if @parse_result
258
+ return false
259
+ end
260
+ def assert_valid
261
+ unless valid
262
+ report_errors
263
+ dperr 1010,"#{self.class} assert_valid failed"
264
+ end
265
+ end
266
+ def report_errors
267
+ pp @parser.get_errors
268
+ # TODO logger
269
+ end
270
+ def compute_val
271
+ @val = @parse_result.content
272
+ end
273
+ def get_val
274
+ return @val || compute_val
275
+ end
276
+ def run env
277
+ return @parse_result.run(env)
278
+ end
279
+ end
280
+
281
+ #test_class = MinilangScript
282
+ ## === std testing
283
+ #if(__FILE__ == $0)
284
+ #puts "#{__FILE__} was called as single app"
285
+ #puts 'execute the test method'
286
+ #test_class.test()
287
+ #end
288
+ ## ===
289
+
290
+ end # module Refi
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minilang_refi
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Robert Fey
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-07-26 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: polyglot
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - "="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ - 3
31
+ - 1
32
+ version: 0.3.1
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: treetop
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 1
45
+ - 4
46
+ - 9
47
+ version: 1.4.9
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: string_extensions_refi
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - "="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
60
+ - 1
61
+ - 0
62
+ version: 0.1.0
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ description: minilang is used in a couple of my projects and I can't recommend anyone to use it as of now
66
+ email: feyrob@gmail.com
67
+ executables: []
68
+
69
+ extensions: []
70
+
71
+ extra_rdoc_files: []
72
+
73
+ files:
74
+ - lib/minilang_refi.rb
75
+ has_rdoc: true
76
+ homepage: http://rubygems.org/gems/minilang_refi
77
+ licenses: []
78
+
79
+ post_install_message:
80
+ rdoc_options: []
81
+
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ requirements: []
101
+
102
+ rubyforge_project: nowarning
103
+ rubygems_version: 1.3.7
104
+ signing_key:
105
+ specification_version: 3
106
+ summary: minilang is a very bad programming language (my first) which tries to prevent users from writing code that does not return
107
+ test_files: []
108
+