mix-language 1.0.0 → 1.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/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: []
|