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