rubex 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.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.travis.yml +14 -0
- data/CONTRIBUTING.md +101 -0
- data/HISTORY.md +3 -0
- data/README.md +112 -297
- data/REFERENCE.md +753 -0
- data/Rakefile +4 -1
- data/TUTORIAL.md +234 -0
- data/bin/rubex +1 -1
- data/docs/_config.yml +1 -0
- data/docs/index.html +1 -0
- data/examples/c_struct_interface/c_struct_interface.rb +6 -0
- data/examples/c_struct_interface/c_struct_interface.rubex +47 -0
- data/examples/linked_list/linked_list.rubex +39 -0
- data/examples/linked_list/rb_linked_list.rb +8 -0
- data/examples/rcsv wrapper/rcsv/README.md +1 -0
- data/examples/rcsv wrapper/rcsv/Rakefile +7 -0
- data/examples/rcsv wrapper/rcsv/ext/rcsv/extconf.rb +3 -0
- data/examples/rcsv wrapper/rcsv/ext/rcsv/rcsv.c +302 -0
- data/examples/rcsv wrapper/rcsv/ext/rcsv/rcsv.rubex +124 -0
- data/examples/rcsv wrapper/rcsv/lib/rcsv.rb +8 -0
- data/examples/rcsv wrapper/rcsv/lib/rcsv.so +0 -0
- data/examples/rcsv wrapper/rcsv/lib/rcsv/version.rb +1 -0
- data/examples/rcsv wrapper/rcsv/rcsv.gemspec +27 -0
- data/examples/rcsv wrapper/rcsv/spec/rcsv.csv +5 -0
- data/examples/rcsv wrapper/rcsv/spec/rcsv_spec.rb +17 -0
- data/examples/rcsv wrapper/rcsv/spec/spec_helper.rb +6 -0
- data/{spec/fixtures/basic_ruby_method/Makefile → examples/rcsv wrapper/rcsv/tmp/x86_64-linux/rcsv/2.3.3/Makefile } +20 -20
- data/examples/rcsv wrapper/rcsv/tmp/x86_64-linux/rcsv/2.3.3/rcsv.o +0 -0
- data/examples/rcsv wrapper/rcsv/tmp/x86_64-linux/rcsv/2.3.3/rcsv.so +0 -0
- data/examples/rcsv wrapper/rcsv/tmp/x86_64-linux/stage/lib/rcsv.so +0 -0
- data/lib/rubex.rb +6 -50
- data/lib/rubex/ast.rb +1 -3
- data/lib/rubex/ast/expression.rb +1257 -8
- data/lib/rubex/ast/node.rb +226 -28
- data/lib/rubex/ast/statement.rb +1162 -35
- data/lib/rubex/ast/top_statement.rb +815 -0
- data/lib/rubex/code_writer.rb +103 -26
- data/lib/rubex/compiler.rb +72 -0
- data/lib/rubex/compiler_config.rb +19 -0
- data/lib/rubex/constants.rb +145 -8
- data/lib/rubex/data_type.rb +667 -4
- data/lib/rubex/error.rb +15 -0
- data/lib/rubex/helpers.rb +154 -0
- data/lib/rubex/lexer.rex +186 -22
- data/lib/rubex/lexer.rex.rb +261 -35
- data/lib/rubex/parser.racc +876 -28
- data/lib/rubex/parser.racc.rb +2845 -90
- data/lib/rubex/rake_task.rb +34 -0
- data/lib/rubex/symbol_table/entry.rb +17 -3
- data/lib/rubex/symbol_table/scope.rb +298 -25
- data/lib/rubex/version.rb +1 -1
- data/rubex.gemspec +11 -3
- data/spec/basic_ruby_method_spec.rb +15 -21
- data/spec/binding_ptr_args_spec.rb +33 -0
- data/spec/bitwise_operators_spec.rb +40 -0
- data/spec/blocks_spec.rb +35 -0
- data/spec/c_bindings_spec.rb +36 -0
- data/spec/c_constants_spec.rb +33 -0
- data/spec/c_function_ptrs_spec.rb +38 -0
- data/spec/c_functions_spec.rb +35 -0
- data/spec/c_struct_interface_spec.rb +38 -0
- data/spec/call_by_reference_spec.rb +33 -0
- data/spec/class_methods_spec.rb +33 -0
- data/spec/class_spec.rb +40 -0
- data/spec/comments_spec.rb +33 -0
- data/spec/default_args_spec.rb +37 -0
- data/spec/error_handling_spec.rb +42 -0
- data/spec/examples_spec.rb +52 -0
- data/spec/expressions_spec.rb +33 -0
- data/spec/fixtures/basic_ruby_method/basic_ruby_method.rubex +2 -0
- data/spec/fixtures/binding_ptr_args/binding_ptr_args.rubex +30 -0
- data/spec/fixtures/bitwise_operators/bitwise_operators.rubex +40 -0
- data/spec/fixtures/blocks/blocks.rubex +11 -0
- data/spec/fixtures/c_bindings/c_bindings.rubex +58 -0
- data/spec/fixtures/c_constants/c_constants.rubex +7 -0
- data/spec/fixtures/c_function_ptrs/c_function_ptrs.rubex +52 -0
- data/spec/fixtures/c_functions/c_functions.rubex +25 -0
- data/spec/fixtures/c_struct_interface/c_struct_interface.rubex +34 -0
- data/spec/fixtures/call_by_reference/call_by_reference.rubex +30 -0
- data/spec/fixtures/class/class.rubex +20 -0
- data/spec/fixtures/class_methods/class_methods.rubex +12 -0
- data/spec/fixtures/comments/comments.rubex +9 -0
- data/spec/fixtures/default_args/default_args.rubex +11 -0
- data/spec/fixtures/error_handling/error_handling.rubex +54 -0
- data/spec/fixtures/examples/array_to_hash.rubex +14 -0
- data/spec/fixtures/examples/rcsv.csv +5 -0
- data/spec/fixtures/examples/rcsv.rubex +329 -0
- data/spec/fixtures/expressions/expressions.rubex +10 -0
- data/spec/fixtures/if_else/if_else.rubex +77 -0
- data/spec/fixtures/implicit_lib_include/implicit_lib_include.rubex +15 -0
- data/spec/fixtures/init_ruby_objects_with_literal_syntax/init_ruby_objects_with_literal_syntax.rubex +17 -0
- data/spec/fixtures/loops/loops.rubex +33 -0
- data/spec/fixtures/recursion/recursion.rubex +9 -0
- data/spec/fixtures/ruby_constant_method_calls/ruby_constant_method_calls.rubex +17 -0
- data/spec/fixtures/ruby_operators/ruby_operators.rubex +29 -0
- data/spec/fixtures/ruby_raise/ruby_raise.rubex +13 -0
- data/spec/fixtures/ruby_strings/ruby_strings.rubex +19 -0
- data/spec/fixtures/ruby_strings/string_blank_bm.rb +37 -0
- data/spec/fixtures/ruby_symbols/ruby_symbols.rubex +12 -0
- data/spec/fixtures/ruby_types/ruby_types.rubex +15 -0
- data/spec/fixtures/statement_expression/statement_expression.rubex +23 -0
- data/spec/fixtures/static_array/static_array.rubex +20 -0
- data/spec/fixtures/string_literals/string_literals.rubex +15 -0
- data/spec/fixtures/struct/struct.rubex +82 -0
- data/spec/fixtures/typecasting/typecasting.rubex +23 -0
- data/spec/fixtures/var_declarations/var_declarations.rubex +39 -0
- data/spec/if_else_spec.rb +39 -0
- data/spec/implicit_lib_include_spec.rb +33 -0
- data/spec/init_ruby_objects_with_literal_syntax_spec.rb +39 -0
- data/spec/loops_spec.rb +34 -0
- data/spec/recursion_spec.rb +35 -0
- data/spec/ruby_constant_method_calls_spec.rb +35 -0
- data/spec/ruby_operators_spec.rb +40 -0
- data/spec/ruby_raise_spec.rb +35 -0
- data/spec/ruby_strings_spec.rb +33 -0
- data/spec/ruby_symbols_spec.rb +37 -0
- data/spec/ruby_types_spec.rb +35 -0
- data/spec/spec_helper.rb +54 -1
- data/spec/statement_expression_spec.rb +34 -0
- data/spec/static_array_spec.rb +33 -0
- data/spec/string_literals_spec.rb +34 -0
- data/spec/struct_spec.rb +36 -0
- data/spec/typecasting_spec.rb +38 -0
- data/spec/var_declarions_spec.rb +35 -0
- metadata +255 -29
- data/lib/rubex/ast/argument_list.rb +0 -20
- data/lib/rubex/ast/c_base_type.rb +0 -11
- data/lib/rubex/ast/ruby_method_def.rb +0 -84
- data/spec/fixtures/basic_ruby_method/basic.rb +0 -3
- data/spec/fixtures/basic_ruby_method/basic_ruby_method.c +0 -16
- data/spec/fixtures/basic_ruby_method/basic_ruby_method.o +0 -0
- data/spec/fixtures/basic_ruby_method/basic_ruby_method.so +0 -0
- data/spec/fixtures/basic_ruby_method/extconf.rb +0 -3
@@ -0,0 +1,77 @@
|
|
1
|
+
def adder_if_else(int a, i64 b, f64 c)
|
2
|
+
i32 d
|
3
|
+
|
4
|
+
if a < 5
|
5
|
+
d = 5
|
6
|
+
elsif b == 44
|
7
|
+
d = 44
|
8
|
+
elsif c >= 211
|
9
|
+
d = 211
|
10
|
+
|
11
|
+
if c == 225
|
12
|
+
d = 221
|
13
|
+
end
|
14
|
+
else
|
15
|
+
d = 666
|
16
|
+
end
|
17
|
+
|
18
|
+
if !(d > 32)
|
19
|
+
d = -69
|
20
|
+
end
|
21
|
+
|
22
|
+
if !d || a == 2
|
23
|
+
d = 4
|
24
|
+
end
|
25
|
+
|
26
|
+
if a
|
27
|
+
print "hello"
|
28
|
+
end
|
29
|
+
|
30
|
+
d = 5643 if d + 4 == 69
|
31
|
+
if c - 43 >= 321 then b = -43 end
|
32
|
+
|
33
|
+
return d
|
34
|
+
end
|
35
|
+
|
36
|
+
class IfElseTest
|
37
|
+
def ruby_obj_in_condition
|
38
|
+
int i = 0
|
39
|
+
a = nil
|
40
|
+
b = false
|
41
|
+
|
42
|
+
if a
|
43
|
+
i += 1
|
44
|
+
else
|
45
|
+
i += 10
|
46
|
+
end
|
47
|
+
|
48
|
+
if b
|
49
|
+
i += 1
|
50
|
+
else
|
51
|
+
i += 10
|
52
|
+
end
|
53
|
+
|
54
|
+
return i
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def multi_if_elsif
|
59
|
+
opts = {}
|
60
|
+
opts[:a] = "hello world"
|
61
|
+
opts[:b] = 3
|
62
|
+
|
63
|
+
if opts[:b] == 3 && opts[:a] == "hello world"
|
64
|
+
return true
|
65
|
+
elsif opts[:a] == 3 && opts[:b] == "hello world"
|
66
|
+
return false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
#def multi_line_if
|
71
|
+
# if true || false ||
|
72
|
+
# false && true
|
73
|
+
# return true
|
74
|
+
# else
|
75
|
+
# return false
|
76
|
+
# end
|
77
|
+
#end
|
data/spec/fixtures/init_ruby_objects_with_literal_syntax/init_ruby_objects_with_literal_syntax.rubex
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
class DataInit
|
2
|
+
def init_this(a, b, c)
|
3
|
+
array = [1,2,3,4,5,6]
|
4
|
+
string = "Hello world! Lets have a picnic!"
|
5
|
+
h = {
|
6
|
+
"hello" => array,
|
7
|
+
"world" => 666,
|
8
|
+
"message" => string
|
9
|
+
}
|
10
|
+
emp = []
|
11
|
+
emp2 = {}
|
12
|
+
|
13
|
+
print h["hello"]
|
14
|
+
|
15
|
+
return h
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
def looper(i32 size)
|
2
|
+
i32 a[size], i = 0, j = size, m
|
3
|
+
|
4
|
+
for i <= m < j do
|
5
|
+
a[m] = 5*m
|
6
|
+
end
|
7
|
+
|
8
|
+
m = 0
|
9
|
+
|
10
|
+
for j > m >= i do
|
11
|
+
print a[m]
|
12
|
+
end
|
13
|
+
|
14
|
+
i32 f = 0
|
15
|
+
while !(a[f] != 45) do
|
16
|
+
print a[f]
|
17
|
+
f = f + 1
|
18
|
+
end
|
19
|
+
|
20
|
+
return a[2]
|
21
|
+
end
|
22
|
+
|
23
|
+
def break_stmt
|
24
|
+
int i[5] = [1,2,3,4,5]
|
25
|
+
int j
|
26
|
+
|
27
|
+
while j < 5 do
|
28
|
+
break if i[j] == 3
|
29
|
+
j += 1
|
30
|
+
end
|
31
|
+
|
32
|
+
return i[j]
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class InitRubyClass
|
2
|
+
def init_classes
|
3
|
+
a = String.new
|
4
|
+
a[0] = "5"
|
5
|
+
|
6
|
+
f = StringIO.new("Hello! This is a test")
|
7
|
+
s = f.read
|
8
|
+
|
9
|
+
array = Array.new(2,3)
|
10
|
+
array.push(s)
|
11
|
+
|
12
|
+
st = String.try_convert("converted.")
|
13
|
+
array.push(st)
|
14
|
+
|
15
|
+
return array
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class StringCaller
|
2
|
+
def call_now(string)
|
3
|
+
string[2] = "h"
|
4
|
+
print string[1]
|
5
|
+
|
6
|
+
return string[0]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class BinaryOperators
|
11
|
+
def double_eq(a, b)
|
12
|
+
int i = 1
|
13
|
+
!(a == b && i == 1)
|
14
|
+
|
15
|
+
if a == b
|
16
|
+
return true
|
17
|
+
else
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def lt(a, b)
|
23
|
+
if a < b
|
24
|
+
return true
|
25
|
+
else
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
lib "<ruby.h>"
|
2
|
+
double RSTRING_LEN(object)
|
3
|
+
end
|
4
|
+
|
5
|
+
def blank?(string)
|
6
|
+
i32 i = 0
|
7
|
+
char *s = string
|
8
|
+
i32 length = <i32>RSTRING_LEN(string)
|
9
|
+
|
10
|
+
while i < length do
|
11
|
+
if s[i] != ' '
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
i += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
return true
|
19
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# This file contains a benchmark between Rubex's blank? and the String#blank?
|
2
|
+
# from the the fast_blank gem.
|
3
|
+
|
4
|
+
require_relative 'ruby_strings.so'
|
5
|
+
require 'fast_blank'
|
6
|
+
require 'benchmark'
|
7
|
+
require 'benchmark/ips'
|
8
|
+
|
9
|
+
str= " "*2500 + "dff"
|
10
|
+
|
11
|
+
Benchmark.ips do |x|
|
12
|
+
x.config(:time => 5, :warmup => 2)
|
13
|
+
|
14
|
+
x.time = 5
|
15
|
+
x.warmup = 2
|
16
|
+
|
17
|
+
x.report("fast_blank") do
|
18
|
+
str.blank?
|
19
|
+
end
|
20
|
+
|
21
|
+
x.report("blank?") do
|
22
|
+
blank? str
|
23
|
+
end
|
24
|
+
|
25
|
+
x.compare!
|
26
|
+
end
|
27
|
+
|
28
|
+
# Warming up --------------------------------------
|
29
|
+
# fast_blank 3.401k i/100ms
|
30
|
+
# blank? 57.041k i/100ms
|
31
|
+
# Calculating -------------------------------------
|
32
|
+
# fast_blank 35.068k (± 0.4%) i/s - 176.852k in 5.043263s
|
33
|
+
# blank? 671.289k (± 1.1%) i/s - 3.365M in 5.014016s
|
34
|
+
#
|
35
|
+
# Comparison:
|
36
|
+
# blank?: 671289.0 i/s
|
37
|
+
# fast_blank: 35067.6 i/s - 19.14x slower
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# This file contains sample Rubex code that contains an expression as a
|
2
|
+
# statement. For example, simply stating `1+2` or `function_name` is an
|
3
|
+
# expression that is actually a statement.
|
4
|
+
|
5
|
+
def test_string_return
|
6
|
+
print "This string."
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_with_args(int a)
|
10
|
+
print "hello", a
|
11
|
+
end
|
12
|
+
|
13
|
+
def expr_stat
|
14
|
+
int a = 3
|
15
|
+
|
16
|
+
test_string_return
|
17
|
+
test_with_args(a)
|
18
|
+
foo
|
19
|
+
4 + 5 * 6 - 333 + (3455)
|
20
|
+
a * 5 + 3
|
21
|
+
|
22
|
+
return "success."
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
def static_array
|
2
|
+
i32 a[10], c[32]
|
3
|
+
i64 b[5] = [1,2,3,4,5], t[4] = [4,6,2,12]
|
4
|
+
i8 size = 54
|
5
|
+
i32 e[size]
|
6
|
+
|
7
|
+
a[2] = 443
|
8
|
+
print a[2]
|
9
|
+
|
10
|
+
if a[2] == 443
|
11
|
+
b[4] = 123
|
12
|
+
end
|
13
|
+
|
14
|
+
e[53] = 4311
|
15
|
+
|
16
|
+
print e[53]
|
17
|
+
print b[4]
|
18
|
+
|
19
|
+
return b[4]
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
def strings
|
2
|
+
char* s = "My name is Ted."
|
3
|
+
obj = "Ted says \"Oh my God thats a big sandwich!\""
|
4
|
+
int a = 4
|
5
|
+
float b = 5.6
|
6
|
+
|
7
|
+
print "The number a is : #{a}\nThe number b is: #{b}.\n Their sum is #{a+b}."
|
8
|
+
print "a - b :", a - b, " a * b : ", a * b, " a + b * a : ", a + b * a
|
9
|
+
|
10
|
+
return obj
|
11
|
+
end
|
12
|
+
|
13
|
+
def string_ret
|
14
|
+
return "This is a returned string."
|
15
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
def structure(a, i32 b, i32 c)
|
2
|
+
fwd struct other_node
|
3
|
+
i32 f[10]
|
4
|
+
|
5
|
+
struct node
|
6
|
+
i32 a, b
|
7
|
+
other_node *hello
|
8
|
+
f32 c[10]
|
9
|
+
end
|
10
|
+
|
11
|
+
struct other_node
|
12
|
+
i64 a, b
|
13
|
+
char *string
|
14
|
+
end
|
15
|
+
|
16
|
+
struct empty_struct
|
17
|
+
end
|
18
|
+
|
19
|
+
node n
|
20
|
+
|
21
|
+
n.a = b
|
22
|
+
n.b = c
|
23
|
+
|
24
|
+
other_node shell
|
25
|
+
|
26
|
+
shell.string = a
|
27
|
+
shell.a = 666
|
28
|
+
shell.b = 555
|
29
|
+
|
30
|
+
i32 i
|
31
|
+
for 0 <= i < 10 do
|
32
|
+
n.c[i] = i*43
|
33
|
+
f[i] = i + 4
|
34
|
+
end
|
35
|
+
|
36
|
+
print n.c[7]
|
37
|
+
|
38
|
+
return shell.a
|
39
|
+
end
|
40
|
+
|
41
|
+
def struct_index
|
42
|
+
struct node
|
43
|
+
int a
|
44
|
+
int ptr[20], ptr1[5]
|
45
|
+
end
|
46
|
+
|
47
|
+
int i = 0
|
48
|
+
node n
|
49
|
+
|
50
|
+
for 0 <= i < 20 do
|
51
|
+
n.ptr[i] = i
|
52
|
+
end
|
53
|
+
n.a = 4
|
54
|
+
n.ptr1[4] = 4
|
55
|
+
|
56
|
+
return n.ptr[n.ptr1[n.a]]
|
57
|
+
end
|
58
|
+
|
59
|
+
def access_struct_obj
|
60
|
+
struct node
|
61
|
+
object array
|
62
|
+
end
|
63
|
+
|
64
|
+
node a
|
65
|
+
|
66
|
+
a.array = []
|
67
|
+
a.array.push(1)
|
68
|
+
|
69
|
+
return a.array[0]
|
70
|
+
end
|
71
|
+
|
72
|
+
def struct_ptr
|
73
|
+
struct node
|
74
|
+
int i, j
|
75
|
+
end
|
76
|
+
|
77
|
+
node *a
|
78
|
+
a.i = 3
|
79
|
+
a.j = 4
|
80
|
+
|
81
|
+
return a.i + a.j
|
82
|
+
end
|