mix-language 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/mix-compile +3 -14
- data/lib/javascript/base/array.js +1 -1
- data/lib/javascript/base/env.js +2 -1
- data/lib/javascript/base/eval.js +6 -7
- data/lib/javascript/base/false.js +1 -1
- data/lib/javascript/base/function.js +1 -1
- data/lib/javascript/base/null.js +1 -1
- data/lib/javascript/base/number.js +1 -1
- data/lib/javascript/base/object.js +1 -1
- data/lib/javascript/base/string.js +1 -1
- data/lib/javascript/base/true.js +1 -1
- data/lib/javascript/dom/div.js +1 -1
- data/lib/javascript/dom/drag.js +1 -1
- data/lib/javascript/dom/element.js +1 -1
- data/lib/javascript/dom/event.js +1 -1
- data/lib/javascript/dom/mouse.js +1 -1
- data/lib/javascript/dom/table.js +1 -1
- data/lib/javascript/dom/td.js +1 -1
- data/lib/javascript/dom/text.js +1 -1
- data/lib/javascript/dom/tr.js +1 -1
- data/lib/ruby/compiler.rb +38 -501
- data/lib/ruby/mix.grammar +13 -13
- data/lib/ruby/mix.tab.rb +453 -464
- data/lib/ruby/new_tokenizer.rb +290 -0
- data/lib/ruby/parser.rb +71 -0
- data/lib/ruby/precompiler.rb +106 -0
- data/lib/ruby/tokenizer.rb +268 -0
- data/lib/ruby/translator.rb +179 -0
- metadata +7 -2
@@ -0,0 +1,179 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
# Copyright © 2011-2012 Jesse Sielaff
|
4
|
+
#
|
5
|
+
|
6
|
+
class MixTranslator
|
7
|
+
NODE_TYPES = %w:
|
8
|
+
access_brackets access_colon
|
9
|
+
access_hash and app array
|
10
|
+
break call false function if
|
11
|
+
mix mixin newline not null
|
12
|
+
number object op or return
|
13
|
+
self set statement string
|
14
|
+
switch true variable while :
|
15
|
+
.each_with_object({}).with_index {|(t,h),i| h[t.to_sym] = i + 1 }
|
16
|
+
|
17
|
+
OPERATORS = {
|
18
|
+
'+' => :plus, '-' => :minus,
|
19
|
+
'*' => :star, '/' => :slash, '%' => :percent,
|
20
|
+
'>' => :gt, '>>' => :gtgt, '>=' => :gteq,
|
21
|
+
'<' => :lt, '<<' => :ltlt, '<=' => :lteq,
|
22
|
+
'==' => :eq, '!=' => :neq }
|
23
|
+
|
24
|
+
def array (array)
|
25
|
+
"[#{array.join ?,}]"
|
26
|
+
end
|
27
|
+
|
28
|
+
def node (node)
|
29
|
+
return "0" unless node
|
30
|
+
|
31
|
+
t = node[:type]
|
32
|
+
node_array = [NODE_TYPES[t], *send(:"write_#{t}", *node[:values])]
|
33
|
+
array(node_array)
|
34
|
+
end
|
35
|
+
|
36
|
+
def symbol (value)
|
37
|
+
@symbols[value.to_sym]
|
38
|
+
end
|
39
|
+
|
40
|
+
def translate (node)
|
41
|
+
symbol_index = -1
|
42
|
+
@symbols = Hash.new {|h,k| h[k] = (symbol_index += 1) }
|
43
|
+
|
44
|
+
ast_string = node(node)
|
45
|
+
symbol_string = array(@symbols.keys.map {|x| "'#{x}'" })
|
46
|
+
|
47
|
+
return ast_string, symbol_string
|
48
|
+
end
|
49
|
+
|
50
|
+
def write_access_brackets (a, b)
|
51
|
+
object, key = node(a), node(b)
|
52
|
+
end
|
53
|
+
|
54
|
+
def write_access_colon (a, b)
|
55
|
+
object, name = node(a), symbol(b)
|
56
|
+
end
|
57
|
+
|
58
|
+
def write_access_hash (a, b)
|
59
|
+
object, fname = node(a), symbol(b)
|
60
|
+
end
|
61
|
+
|
62
|
+
def write_and (a, b)
|
63
|
+
left, right = node(a), node(b)
|
64
|
+
end
|
65
|
+
|
66
|
+
def write_app
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
|
70
|
+
def write_array (a)
|
71
|
+
items_array = a.map {|x| node(x) }
|
72
|
+
|
73
|
+
items = array(items_array)
|
74
|
+
end
|
75
|
+
|
76
|
+
def write_break (a)
|
77
|
+
value = node(a)
|
78
|
+
end
|
79
|
+
|
80
|
+
def write_call (a, b)
|
81
|
+
arguments_array = b.map {|x| node(x) }
|
82
|
+
|
83
|
+
function, arguments = node(a), array(arguments_array)
|
84
|
+
end
|
85
|
+
|
86
|
+
def write_false
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
|
90
|
+
def write_function (a, b, c)
|
91
|
+
parameters_array = a.map {|x| symbol(x) }
|
92
|
+
embedded_array = b.map {|x| symbol(x) }
|
93
|
+
|
94
|
+
parameters, embedded, body_statement = array(parameters_array), array(embedded_array), node(c)
|
95
|
+
end
|
96
|
+
|
97
|
+
def write_if (a, b, c)
|
98
|
+
condition, then_statement, else_statement = node(a), node(b), node(c)
|
99
|
+
end
|
100
|
+
|
101
|
+
def write_mix (a, b)
|
102
|
+
mixin, object = symbol(a), node(b)
|
103
|
+
end
|
104
|
+
|
105
|
+
def write_mixin (a, b, c)
|
106
|
+
definitions_array = c.map {|x| node(x) }
|
107
|
+
|
108
|
+
name, init_statement, definitions = symbol(a), node(b), array(definitions_array)
|
109
|
+
end
|
110
|
+
|
111
|
+
def write_newline (a, b, c)
|
112
|
+
file, line, statement = symbol(a), b, node(c)
|
113
|
+
end
|
114
|
+
|
115
|
+
def write_not (a)
|
116
|
+
value = node(a)
|
117
|
+
end
|
118
|
+
|
119
|
+
def write_null
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
def write_number (a)
|
124
|
+
number = a
|
125
|
+
end
|
126
|
+
|
127
|
+
def write_object (a, b)
|
128
|
+
entries_array = a.map {|kv| array [symbol(kv[0]), node(kv[1])] }
|
129
|
+
mixins_array = b.map {|x| symbol(x) }
|
130
|
+
|
131
|
+
entries, mixins = array(entries_array), array(mixins_array)
|
132
|
+
end
|
133
|
+
|
134
|
+
def write_op (a, b, c)
|
135
|
+
operator, left, right = symbol(OPERATORS[a]), node(b), node(c)
|
136
|
+
end
|
137
|
+
|
138
|
+
def write_or (a, b)
|
139
|
+
left, right = node(a), node(b)
|
140
|
+
end
|
141
|
+
|
142
|
+
def write_return (a)
|
143
|
+
value = node(a)
|
144
|
+
end
|
145
|
+
|
146
|
+
def write_self
|
147
|
+
nil
|
148
|
+
end
|
149
|
+
|
150
|
+
def write_set (a, b)
|
151
|
+
lhs, value = node(a), node(b)
|
152
|
+
end
|
153
|
+
|
154
|
+
def write_statement (a, b)
|
155
|
+
current_statement, next_statement = node(a), node(b)
|
156
|
+
end
|
157
|
+
|
158
|
+
def write_string (a)
|
159
|
+
value = symbol(a)
|
160
|
+
end
|
161
|
+
|
162
|
+
def write_switch (a, b, c)
|
163
|
+
cases_array = b.map {|x| array(x.map {|y| node(y) }) }
|
164
|
+
|
165
|
+
condition, cases, else_statement = node(a), array(cases_array), node(c)
|
166
|
+
end
|
167
|
+
|
168
|
+
def write_true
|
169
|
+
nil
|
170
|
+
end
|
171
|
+
|
172
|
+
def write_variable (a)
|
173
|
+
value = symbol(a)
|
174
|
+
end
|
175
|
+
|
176
|
+
def write_while (a, b)
|
177
|
+
condition, statement = node(a), node(b)
|
178
|
+
end
|
179
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mix-language
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.0.
|
5
|
+
version: 1.0.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jesse Sielaff
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2012-01-
|
14
|
+
date: 2012-01-05 00:00:00 Z
|
15
15
|
dependencies: []
|
16
16
|
|
17
17
|
description: .
|
@@ -46,6 +46,11 @@ files:
|
|
46
46
|
- ./lib/ruby/compiler.rb
|
47
47
|
- ./lib/ruby/mix.grammar
|
48
48
|
- ./lib/ruby/mix.tab.rb
|
49
|
+
- ./lib/ruby/new_tokenizer.rb
|
50
|
+
- ./lib/ruby/parser.rb
|
51
|
+
- ./lib/ruby/precompiler.rb
|
52
|
+
- ./lib/ruby/tokenizer.rb
|
53
|
+
- ./lib/ruby/translator.rb
|
49
54
|
- bin/mix-compile
|
50
55
|
homepage:
|
51
56
|
licenses: []
|