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.
- data/lib/minilang_refi.rb +290 -0
- 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
|
+
|