fwi 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/fwi.gemspec +1 -1
- data/lib/fwi/compiler.rb +10 -4
- data/lib/fwi/{cpp → compilers/cpp}/compiler.rb +1 -3
- data/lib/fwi/{cpp → compilers/cpp}/gen.rb +0 -0
- data/lib/fwi/compilers/js/compiler.rb +24 -0
- data/lib/fwi/compilers/js/gen.rb +174 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eae98e13b6ec9a8846176fa727bbb962397b1c5f
|
4
|
+
data.tar.gz: 7352bb31bed27f0a41cc332f59276bc57bf35b70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 675e87dea63eb8189a13de38e72b00b85c14bbfe84d83463c56f13272671bce276aa4bf558152294d596a96f4f9f8590e9cdc9c9666956de41612f59db1022ea
|
7
|
+
data.tar.gz: a2a3deb6e44f6d372b9ec90bcd2f45aff0fc5dd33f9a9e93f8fb11910432aa56f631020b1f1ff8f608547a3efd1a72f4bf65f847f05b44e4557c5be03dc79645
|
data/Gemfile
CHANGED
data/fwi.gemspec
CHANGED
data/lib/fwi/compiler.rb
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
|
1
|
+
require 'fwi/compilers/cpp/compiler.rb'
|
2
|
+
require 'fwi/compilers/js/compiler.rb'
|
3
|
+
# require_relative 'js/compiler.rb'
|
4
|
+
|
2
5
|
require_relative 'parser.rb'
|
3
6
|
require 'optparse'
|
4
7
|
|
5
8
|
COMPILERS = {
|
6
|
-
"cpp" => CPPCompiler.new
|
9
|
+
"cpp" => CPPCompiler.new,
|
10
|
+
"js" => JSCompiler.new
|
7
11
|
};
|
8
12
|
|
9
13
|
options = {
|
10
|
-
:source_root => "."
|
14
|
+
:source_root => ".", :output => "."
|
11
15
|
}
|
12
16
|
optp = OptionParser.new do |opts|
|
13
17
|
|
@@ -24,10 +28,12 @@ optp = OptionParser.new do |opts|
|
|
24
28
|
options[:language] = lang
|
25
29
|
end
|
26
30
|
|
27
|
-
opts.on("-d", "--source-
|
31
|
+
opts.on("-d", "--source-dir [DIRECTORY]", "Set the source directory to pull files from") do |directory|
|
28
32
|
options[:source_root] = directory
|
29
33
|
end
|
30
34
|
|
35
|
+
opts.on("-o", "--output [DIRECTORY]", "Directory to put Generated Files") { |x| options[:output] = x }
|
36
|
+
|
31
37
|
COMPILERS.each do |n,x|
|
32
38
|
opts.separator ""
|
33
39
|
opts.separator n
|
File without changes
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'gen.rb'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class JSCompiler
|
5
|
+
GEN = FWI::Generator::JS.new
|
6
|
+
|
7
|
+
def populate_options o
|
8
|
+
end
|
9
|
+
|
10
|
+
def after_parse; end
|
11
|
+
def on_selected; end
|
12
|
+
|
13
|
+
def compile file, lex, bitmap, options
|
14
|
+
base = File.basename(file, File.extname(file))
|
15
|
+
|
16
|
+
files = GEN.gen bitmap
|
17
|
+
files.each do |fn, contents|
|
18
|
+
f = File.join(options[:output], fn)
|
19
|
+
FileUtils.mkdir_p File.expand_path("..", f)
|
20
|
+
File.write(f, contents)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module FWI
|
2
|
+
module Generator
|
3
|
+
class JS
|
4
|
+
def append buffer, indent, string
|
5
|
+
string.split(/\n/).each { |y| buffer << ("\t" * indent) + y + "\n" }
|
6
|
+
end
|
7
|
+
|
8
|
+
def _func_util obj, member, mode
|
9
|
+
type = member[:type]
|
10
|
+
internal_type = type.to_s
|
11
|
+
internal_type = "child" if type == :reference && member[:element_type] == :block
|
12
|
+
internal_type = "u8" if type == :reference && member[:element_type] == :enum
|
13
|
+
|
14
|
+
param = member[:array].nil? ? "" : "int index#{mode == :setter ? ', ' : ''}"
|
15
|
+
custom_getter = member[:attribute_map]["getter"]
|
16
|
+
custom_setter = member[:attribute_map]["setter"]
|
17
|
+
custom_length = member[:attribute_map]["length_func"]
|
18
|
+
|
19
|
+
func_name = nil
|
20
|
+
func_sig = nil
|
21
|
+
if mode == :setter
|
22
|
+
func_name = custom_setter.nil? ? "set_#{member[:name]}" : custom_setter
|
23
|
+
func_sig = "function(#{param}value) {"
|
24
|
+
elsif mode == :getter
|
25
|
+
func_name = custom_getter.nil? ? "get_#{member[:name]}" : custom_getter
|
26
|
+
func_sig = "function(#{param}) {"
|
27
|
+
elsif mode == :length
|
28
|
+
func_name = custom_length.nil? ? "#{member[:name]}_length" : custom_length
|
29
|
+
func_sig = "function(#{param}) {"
|
30
|
+
end
|
31
|
+
|
32
|
+
index = member[:index]
|
33
|
+
index = "#{index} + (#{member[:typesize]} * index)" unless member[:array].nil?
|
34
|
+
{ :internal_type => internal_type, :index => index, :func_name => func_name, :func_sig => func_sig }
|
35
|
+
end
|
36
|
+
|
37
|
+
def write_getter obj, member, str, indent
|
38
|
+
return "" if member[:attributes].include? "no-getter"
|
39
|
+
util = _func_util(obj, member, :getter)
|
40
|
+
|
41
|
+
fullfunc = obj + ".prototype." + util[:func_name] + " = " + util[:func_sig]
|
42
|
+
append(str, indent, fullfunc)
|
43
|
+
type = member[:type]
|
44
|
+
if type == :reference && member[:element_type] == :block
|
45
|
+
type = member[:element_name].gsub("::", ".")
|
46
|
+
append(str, indent + 1, "return this.get_child(#{type}, #{util[:index]});")
|
47
|
+
elsif type == :bool
|
48
|
+
if member[:array].nil?
|
49
|
+
append(str, indent + 1, "return this.get_bool(#{util[:index]}, #{member[:bit_index]});")
|
50
|
+
else
|
51
|
+
append(str, indent + 1, "return this.get_bool(#{member[:index]} + index / 8, index % 8, value);")
|
52
|
+
end
|
53
|
+
else
|
54
|
+
append(str, indent + 1, "return this.get_#{util[:internal_type]}(#{util[:index]});")
|
55
|
+
end
|
56
|
+
append(str, indent, "};")
|
57
|
+
end
|
58
|
+
|
59
|
+
def write_setter obj, member, str, indent
|
60
|
+
return "" if member[:attributes].include? "no-setter"
|
61
|
+
util = _func_util(obj, member, :setter)
|
62
|
+
|
63
|
+
fullfunc = obj + ".prototype." + util[:func_name] + " = " + util[:func_sig]
|
64
|
+
append(str, indent, fullfunc)
|
65
|
+
type = member[:type]
|
66
|
+
if type == :bool
|
67
|
+
if member[:array].nil?
|
68
|
+
append(str, indent + 1, "this.set_bool(#{util[:index]}, #{member[:bit_index]}, value);")
|
69
|
+
else
|
70
|
+
append(str, indent + 1, "this.set_bool(#{member[:index]} + index / 8, index % 8, value);")
|
71
|
+
end
|
72
|
+
else
|
73
|
+
append(str, indent + 1, "this.set_#{util[:internal_type]}(#{util[:index]}, value);")
|
74
|
+
end
|
75
|
+
append(str, indent, "};")
|
76
|
+
end
|
77
|
+
|
78
|
+
def write_length obj, member, str, indent
|
79
|
+
return "" if member[:attributes].include? "no-len"
|
80
|
+
util = _func_util(obj, member, :length)
|
81
|
+
|
82
|
+
fullfunc = obj + ".prototype." + util[:func_name] + " = " + util[:func_sig]
|
83
|
+
append(str, indent, fullfunc)
|
84
|
+
append(str, indent + 1, "return #{member[:size]};")
|
85
|
+
append(str, indent, "};")
|
86
|
+
end
|
87
|
+
|
88
|
+
def gen_prototype obj, member, str, indent
|
89
|
+
write_getter obj, member, str, indent
|
90
|
+
if member[:type] == :reference
|
91
|
+
if member[:element_type] == :enum
|
92
|
+
write_setter obj, member, str, indent
|
93
|
+
end
|
94
|
+
else
|
95
|
+
write_setter obj, member, str, indent
|
96
|
+
write_length(obj, member, str, indent)if member[:type] == :string
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def gen_for_ns parent, name, ns, str, indent
|
101
|
+
is_root = name == "<root>"
|
102
|
+
has_parent = parent != "<root>"
|
103
|
+
unless has_parent
|
104
|
+
append str, indent, "var #{name} = {};" unless is_root
|
105
|
+
else
|
106
|
+
append str, indent, "#{parent}.#{name} = {};" unless is_root
|
107
|
+
end
|
108
|
+
|
109
|
+
fqn_ns = name
|
110
|
+
fqn_ns = parent + "." + fqn_ns if has_parent
|
111
|
+
|
112
|
+
unless is_root
|
113
|
+
append(str, indent, "FWI.util.exports().#{fqn_ns} = #{fqn_ns};")
|
114
|
+
end
|
115
|
+
|
116
|
+
ns[:members].each do |el_name, element|
|
117
|
+
fqn = fqn_ns + "." + el_name
|
118
|
+
fqn = el_name if is_root
|
119
|
+
type_decl = is_root ? "var #{fqn}" : "#{fqn}"
|
120
|
+
|
121
|
+
if element[:type] == :namespace
|
122
|
+
gen_for_ns(fqn_ns, el_name, element, str, indent);
|
123
|
+
elsif element[:type] == :block
|
124
|
+
append str, indent, type_decl + " = FWI.block(\"#{fqn}\", #{element[:size]});"
|
125
|
+
element[:members].each do |mem|
|
126
|
+
gen_prototype(fqn, mem, str, indent)
|
127
|
+
end
|
128
|
+
elsif element[:type] == :enum
|
129
|
+
maps = element[:members].map do |e|
|
130
|
+
"#{e[:name]}: #{e[:val]},"
|
131
|
+
end
|
132
|
+
maps.last.sub!(",","")
|
133
|
+
append str, indent, type_decl + " = {"
|
134
|
+
maps.each do |m|
|
135
|
+
append str, indent+1, m
|
136
|
+
end
|
137
|
+
append str, indent, "};"
|
138
|
+
end
|
139
|
+
|
140
|
+
if is_root
|
141
|
+
append(str, indent, "FWI.util.exports().#{fqn} = #{fqn};")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def _get_for_file bitmap, file
|
147
|
+
map = { :members => {}, :type => :namespace }
|
148
|
+
bitmap[:members].each do |name, member|
|
149
|
+
if member[:type] == :namespace
|
150
|
+
ret = _get_for_file member, file
|
151
|
+
map[:members][name] = ret unless ret[:members].empty?
|
152
|
+
else
|
153
|
+
map[:members][name] = member if member[:file] == file
|
154
|
+
end
|
155
|
+
end
|
156
|
+
map
|
157
|
+
end
|
158
|
+
|
159
|
+
def gen bitmap
|
160
|
+
map = {}
|
161
|
+
bitmap[:files].each do |name, file|
|
162
|
+
filename = name.sub ".fwi", ".js"
|
163
|
+
contents = "(function() {\n"
|
164
|
+
|
165
|
+
gen_for_ns("<root>", "<root>", _get_for_file(bitmap, name), contents, 1)
|
166
|
+
|
167
|
+
contents += "})();"
|
168
|
+
map[filename] = contents
|
169
|
+
end
|
170
|
+
map
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fwi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaci Brunning
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -23,8 +23,10 @@ files:
|
|
23
23
|
- bin/fwi
|
24
24
|
- fwi.gemspec
|
25
25
|
- lib/fwi/compiler.rb
|
26
|
-
- lib/fwi/cpp/compiler.rb
|
27
|
-
- lib/fwi/cpp/gen.rb
|
26
|
+
- lib/fwi/compilers/cpp/compiler.rb
|
27
|
+
- lib/fwi/compilers/cpp/gen.rb
|
28
|
+
- lib/fwi/compilers/js/compiler.rb
|
29
|
+
- lib/fwi/compilers/js/gen.rb
|
28
30
|
- lib/fwi/parser.rb
|
29
31
|
homepage: http://github.com/JacisNonsense/Fixed-Width-Interchange
|
30
32
|
licenses: []
|