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.
@@ -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.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-02 00:00:00 Z
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: []