minilang_refi 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/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
+