rubex 0.1 → 0.1.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 +5 -5
- data/.gitignore +3 -2
- data/.travis.yml +9 -1
- data/CONTRIBUTING.md +2 -2
- data/README.md +4 -1
- data/Rakefile +2 -2
- data/bin/rubex +4 -5
- data/lib/rubex.rb +4 -4
- data/lib/rubex/ast.rb +4 -1
- data/lib/rubex/ast/expression.rb +22 -1191
- data/lib/rubex/ast/expression/actual_arg_list.rb +40 -0
- data/lib/rubex/ast/expression/analysed_element_ref.rb +26 -0
- data/lib/rubex/ast/expression/analysed_element_ref/c_var_element_ref.rb +30 -0
- data/lib/rubex/ast/expression/analysed_element_ref/ruby_object_element_ref.rb +42 -0
- data/lib/rubex/ast/expression/arg_declaration.rb +43 -0
- data/lib/rubex/ast/expression/binary.rb +57 -0
- data/lib/rubex/ast/expression/binary/binary_boolean.rb +23 -0
- data/lib/rubex/ast/expression/binary/binary_boolean_special_op.rb +20 -0
- data/lib/rubex/ast/expression/binary/empty_classes.rb +62 -0
- data/lib/rubex/ast/expression/block_given.rb +15 -0
- data/lib/rubex/ast/expression/coerce_object.rb +15 -0
- data/lib/rubex/ast/expression/command_call.rb +74 -0
- data/lib/rubex/ast/expression/command_call/struct_or_union_member_call.rb +38 -0
- data/lib/rubex/ast/expression/element_ref.rb +64 -0
- data/lib/rubex/ast/expression/empty.rb +13 -0
- data/lib/rubex/ast/expression/from_ruby_object.rb +20 -0
- data/lib/rubex/ast/expression/func_ptr_arg_declaration.rb +21 -0
- data/lib/rubex/ast/expression/func_ptr_internal_arg_declaration.rb +13 -0
- data/lib/rubex/ast/expression/literal.rb +30 -0
- data/lib/rubex/ast/expression/literal/array_lit.rb +51 -0
- data/lib/rubex/ast/expression/literal/c_null.rb +15 -0
- data/lib/rubex/ast/expression/literal/char.rb +36 -0
- data/lib/rubex/ast/expression/literal/double.rb +14 -0
- data/lib/rubex/ast/expression/literal/false.rb +33 -0
- data/lib/rubex/ast/expression/literal/hash_lit.rb +45 -0
- data/lib/rubex/ast/expression/literal/int.rb +14 -0
- data/lib/rubex/ast/expression/literal/nil.rb +14 -0
- data/lib/rubex/ast/expression/literal/ruby_symbol.rb +22 -0
- data/lib/rubex/ast/expression/literal/string_lit.rb +45 -0
- data/lib/rubex/ast/expression/literal/true.rb +29 -0
- data/lib/rubex/ast/expression/method_call.rb +52 -0
- data/lib/rubex/ast/expression/method_call/c_function_call.rb +40 -0
- data/lib/rubex/ast/expression/method_call/ruby_method_call.rb +83 -0
- data/lib/rubex/ast/expression/name.rb +127 -0
- data/lib/rubex/ast/expression/ruby_constant.rb +25 -0
- data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_array_element_ref.rb +20 -0
- data/lib/rubex/ast/expression/ruby_object_element_ref/ruby_hash_element_ref.rb +22 -0
- data/lib/rubex/ast/expression/self.rb +15 -0
- data/lib/rubex/ast/expression/size_of.rb +22 -0
- data/lib/rubex/ast/expression/struct_or_union_member_call/element_ref_member_call.rb +23 -0
- data/lib/rubex/ast/expression/to_ruby_object.rb +21 -0
- data/lib/rubex/ast/expression/typecast.rb +20 -0
- data/lib/rubex/ast/expression/typecast_to.rb +10 -0
- data/lib/rubex/ast/expression/unary.rb +37 -0
- data/lib/rubex/ast/expression/unary_base.rb +24 -0
- data/lib/rubex/ast/expression/unary_base/ampersand.rb +16 -0
- data/lib/rubex/ast/expression/unary_base/unary_bit_not.rb +18 -0
- data/lib/rubex/ast/expression/unary_base/unary_not.rb +18 -0
- data/lib/rubex/ast/expression/unary_base/unary_sub.rb +18 -0
- data/lib/rubex/ast/node.rb +111 -111
- data/lib/rubex/ast/statement.rb +9 -1160
- data/lib/rubex/ast/statement/alias.rb +43 -0
- data/lib/rubex/ast/statement/argument_list.rb +59 -0
- data/lib/rubex/ast/statement/assign.rb +35 -0
- data/lib/rubex/ast/statement/begin_block.rb +14 -0
- data/lib/rubex/ast/statement/begin_block/begin.rb +202 -0
- data/lib/rubex/ast/statement/begin_block/else.rb +21 -0
- data/lib/rubex/ast/statement/begin_block/ensure.rb +21 -0
- data/lib/rubex/ast/statement/begin_block/rescue.rb +34 -0
- data/lib/rubex/ast/statement/break.rb +18 -0
- data/lib/rubex/ast/statement/c_array_decl.rb +49 -0
- data/lib/rubex/ast/statement/c_base_type.rb +26 -0
- data/lib/rubex/ast/statement/c_function_decl.rb +30 -0
- data/lib/rubex/ast/statement/c_ptr_decl.rb +52 -0
- data/lib/rubex/ast/statement/c_ptr_decl/c_ptr_func_decl.rb +25 -0
- data/lib/rubex/ast/statement/c_struct_or_union_def.rb +49 -0
- data/lib/rubex/ast/statement/expression.rb +26 -0
- data/lib/rubex/ast/statement/for.rb +73 -0
- data/lib/rubex/ast/statement/forward_decl.rb +31 -0
- data/lib/rubex/ast/statement/if_block.rb +64 -0
- data/lib/rubex/ast/statement/if_block/else.rb +30 -0
- data/lib/rubex/ast/statement/if_block/elsif.rb +22 -0
- data/lib/rubex/ast/statement/if_block/helper.rb +38 -0
- data/lib/rubex/ast/statement/print.rb +49 -0
- data/lib/rubex/ast/statement/raise.rb +66 -0
- data/lib/rubex/ast/statement/return.rb +45 -0
- data/lib/rubex/ast/statement/var_decl.rb +49 -0
- data/lib/rubex/ast/statement/while.rb +34 -0
- data/lib/rubex/ast/statement/yield.rb +41 -0
- data/lib/rubex/ast/top_statement.rb +1 -815
- data/lib/rubex/ast/top_statement/c_bindings.rb +145 -0
- data/lib/rubex/ast/top_statement/klass.rb +125 -0
- data/lib/rubex/ast/top_statement/klass/attached_klass.rb +417 -0
- data/lib/rubex/ast/top_statement/method_def.rb +110 -0
- data/lib/rubex/ast/top_statement/method_def/c_function_def.rb +26 -0
- data/lib/rubex/ast/top_statement/method_def/ruby_method_def.rb +33 -0
- data/lib/rubex/cli.rb +26 -0
- data/lib/rubex/code_writer.rb +1 -1
- data/lib/rubex/compiler.rb +49 -28
- data/lib/rubex/compiler_config.rb +4 -2
- data/lib/rubex/constants.rb +71 -71
- data/lib/rubex/data_type.rb +9 -675
- data/lib/rubex/data_type/c_array.rb +33 -0
- data/lib/rubex/data_type/c_function.rb +23 -0
- data/lib/rubex/data_type/c_ptr.rb +71 -0
- data/lib/rubex/data_type/c_str.rb +23 -0
- data/lib/rubex/data_type/c_struct_or_union.rb +23 -0
- data/lib/rubex/data_type/char.rb +30 -0
- data/lib/rubex/data_type/f_32.rb +38 -0
- data/lib/rubex/data_type/f_64.rb +38 -0
- data/lib/rubex/data_type/int.rb +32 -0
- data/lib/rubex/data_type/int/c_boolean.rb +13 -0
- data/lib/rubex/data_type/int_16.rb +32 -0
- data/lib/rubex/data_type/int_32.rb +32 -0
- data/lib/rubex/data_type/int_64.rb +36 -0
- data/lib/rubex/data_type/int_8.rb +33 -0
- data/lib/rubex/data_type/l_int.rb +38 -0
- data/lib/rubex/data_type/l_l_int.rb +26 -0
- data/lib/rubex/data_type/ruby_method.rb +22 -0
- data/lib/rubex/data_type/ruby_object.rb +19 -0
- data/lib/rubex/data_type/ruby_object/boolean.rb +11 -0
- data/lib/rubex/data_type/ruby_object/boolean/false_type.rb +5 -0
- data/lib/rubex/data_type/ruby_object/boolean/true_type.rb +5 -0
- data/lib/rubex/data_type/ruby_object/nil_type.rb +9 -0
- data/lib/rubex/data_type/ruby_object/ruby_array.rb +10 -0
- data/lib/rubex/data_type/ruby_object/ruby_constant.rb +18 -0
- data/lib/rubex/data_type/ruby_object/ruby_constant/ruby_class.rb +18 -0
- data/lib/rubex/data_type/ruby_object/ruby_hash.rb +9 -0
- data/lib/rubex/data_type/ruby_object/ruby_string.rb +10 -0
- data/lib/rubex/data_type/ruby_object/ruby_symbol.rb +10 -0
- data/lib/rubex/data_type/type_def.rb +34 -0
- data/lib/rubex/data_type/u_char.rb +27 -0
- data/lib/rubex/data_type/u_int.rb +32 -0
- data/lib/rubex/data_type/u_int_16.rb +22 -0
- data/lib/rubex/data_type/u_int_32.rb +22 -0
- data/lib/rubex/data_type/u_int_64.rb +26 -0
- data/lib/rubex/data_type/u_int_8.rb +22 -0
- data/lib/rubex/data_type/u_l_int.rb +36 -0
- data/lib/rubex/data_type/u_l_int/size_t.rb +10 -0
- data/lib/rubex/data_type/u_l_l_int.rb +26 -0
- data/lib/rubex/data_type/void.rb +15 -0
- data/lib/rubex/data_type_helpers/float_helpers.rb +8 -0
- data/lib/rubex/data_type_helpers/helpers.rb +48 -0
- data/lib/rubex/data_type_helpers/int_helpers.rb +10 -0
- data/lib/rubex/data_type_helpers/u_int_helpers.rb +11 -0
- data/lib/rubex/helpers.rb +35 -118
- data/lib/rubex/helpers/node_type_methods.rb +9 -0
- data/lib/rubex/helpers/writers.rb +79 -0
- data/lib/rubex/parser.racc +83 -34
- data/lib/rubex/parser.racc.rb +233 -184
- data/lib/rubex/version.rb +2 -2
- data/rubex.gemspec +2 -0
- data/spec/basic_ruby_method_spec.rb +1 -1
- data/spec/binding_ptr_args_spec.rb +2 -2
- data/spec/bitwise_operators_spec.rb +1 -1
- data/spec/blocks_spec.rb +2 -2
- data/spec/c_bindings_spec.rb +1 -1
- data/spec/c_constants_spec.rb +1 -1
- data/spec/c_function_ptrs_spec.rb +1 -1
- data/spec/c_functions_spec.rb +2 -2
- data/spec/c_struct_interface_spec.rb +1 -1
- data/spec/call_by_reference_spec.rb +2 -2
- data/spec/class_methods_spec.rb +2 -2
- data/spec/class_spec.rb +4 -4
- data/spec/cli_spec.rb +43 -0
- data/spec/comments_spec.rb +2 -2
- data/spec/default_args_spec.rb +21 -23
- data/spec/error_handling_spec.rb +1 -1
- data/spec/examples_spec.rb +4 -4
- data/spec/expressions_spec.rb +1 -1
- data/spec/fixtures/cli/cli.rubex +3 -0
- data/spec/fixtures/examples/array_to_hash.rubex +1 -1
- data/spec/fixtures/examples/rcsv.rubex +10 -6
- data/spec/fixtures/loops/loops.rubex +1 -1
- data/spec/fixtures/ruby_strings/string_blank_bm.rb +7 -5
- data/spec/fixtures/struct/struct.rubex +7 -2
- data/spec/fixtures/temp_allocation/temp_allocation.rubex +8 -0
- data/spec/if_else_spec.rb +3 -7
- data/spec/implicit_lib_include_spec.rb +1 -1
- data/spec/init_ruby_objects_with_literal_syntax_spec.rb +1 -1
- data/spec/loops_spec.rb +1 -1
- data/spec/recursion_spec.rb +18 -21
- data/spec/ruby_constant_method_calls_spec.rb +4 -4
- data/spec/ruby_operators_spec.rb +1 -1
- data/spec/ruby_raise_spec.rb +1 -1
- data/spec/ruby_strings_spec.rb +3 -3
- data/spec/ruby_symbols_spec.rb +1 -1
- data/spec/ruby_types_spec.rb +2 -2
- data/spec/spec_helper.rb +42 -10
- data/spec/statement_expression_spec.rb +3 -3
- data/spec/static_array_spec.rb +3 -3
- data/spec/string_literals_spec.rb +2 -2
- data/spec/struct_spec.rb +4 -4
- data/spec/temp_allocation_spec.rb +35 -0
- data/spec/typecasting_spec.rb +2 -2
- data/spec/var_declarions_spec.rb +2 -2
- metadata +168 -3
@@ -0,0 +1,38 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class StructOrUnionMemberCall < CommandCall
|
5
|
+
def analyse_types(local_scope)
|
6
|
+
scope = @expr.type.base_type.scope
|
7
|
+
|
8
|
+
if @command.is_a? String
|
9
|
+
@command = Expression::Name.new @command
|
10
|
+
@command.analyse_types scope
|
11
|
+
elsif @command.is_a? Rubex::AST::Expression::ElementRef
|
12
|
+
@command = Expression::ElementRefMemberCall.new @expr, @command, @arg_list
|
13
|
+
@command.analyse_types local_scope, scope
|
14
|
+
end
|
15
|
+
@has_temp = @command.has_temp
|
16
|
+
@type = @command.type
|
17
|
+
@subexprs = [@expr, @command]
|
18
|
+
end
|
19
|
+
|
20
|
+
def generate_evaluation_code code, local_scope
|
21
|
+
@expr.generate_evaluation_code code, local_scope
|
22
|
+
@command.generate_evaluation_code code, local_scope
|
23
|
+
@c_code =
|
24
|
+
if @command.has_temp
|
25
|
+
@command.c_code(local_scope)
|
26
|
+
else
|
27
|
+
op = @expr.type.cptr? ? '->' : '.'
|
28
|
+
"#{@expr.c_code(local_scope)}#{op}#{@command.c_code(local_scope)}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def c_code(_local_scope)
|
33
|
+
@c_code
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
class ElementRef < Base
|
5
|
+
# Readers needed for accessing elements due to delegator classes.
|
6
|
+
attr_reader :entry, :pos, :name, :subexprs
|
7
|
+
extend Forwardable
|
8
|
+
def_delegators :@element_ref, :generate_disposal_code, :generate_evaluation_code,
|
9
|
+
:analyse_statement, :generate_element_ref_code,
|
10
|
+
:generate_assignment_code, :has_temp, :c_code,
|
11
|
+
:allocate_temps, :release_temps, :to_ruby_object,
|
12
|
+
:from_ruby_object
|
13
|
+
|
14
|
+
def initialize(name, pos)
|
15
|
+
@name = name
|
16
|
+
@pos = pos
|
17
|
+
@subexprs = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def analyse_types(local_scope, struct_scope = nil)
|
21
|
+
@entry = struct_scope.nil? ? local_scope.find(@name) : struct_scope[@name]
|
22
|
+
@type = @entry.type.object? ? @entry.type : @entry.type.type
|
23
|
+
@element_ref = proper_analysed_type
|
24
|
+
@element_ref.analyse_types local_scope
|
25
|
+
super(local_scope)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def proper_analysed_type
|
31
|
+
if ruby_object_c_array?
|
32
|
+
CVarElementRef.new(self)
|
33
|
+
else
|
34
|
+
if ruby_array?
|
35
|
+
RubyArrayElementRef.new(self)
|
36
|
+
elsif ruby_hash?
|
37
|
+
RubyHashElementRef.new(self)
|
38
|
+
elsif generic_ruby_object?
|
39
|
+
RubyObjectElementRef.new(self)
|
40
|
+
else
|
41
|
+
CVarElementRef.new(self)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def ruby_array?
|
47
|
+
@type.ruby_array?
|
48
|
+
end
|
49
|
+
|
50
|
+
def ruby_hash?
|
51
|
+
@type.ruby_hash?
|
52
|
+
end
|
53
|
+
|
54
|
+
def generic_ruby_object?
|
55
|
+
@type.object?
|
56
|
+
end
|
57
|
+
|
58
|
+
def ruby_object_c_array?
|
59
|
+
@entry.type.cptr? && @entry.type.type.object?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
# Internal node that denotes empty expression for a statement for example
|
5
|
+
# the `return` for a C function with return type `void`.
|
6
|
+
class Empty < Base
|
7
|
+
def analyse_types(_local_scope)
|
8
|
+
@type = DataType::Void.new
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
# internal node for converting from ruby object.
|
5
|
+
class FromRubyObject < CoerceObject
|
6
|
+
# expr - Expression to convert
|
7
|
+
# from_node - LHS expression. Of type Rubex::AST::Expression
|
8
|
+
def initialize(expr, from_node)
|
9
|
+
@expr = expr
|
10
|
+
@type = @expr.type
|
11
|
+
@from_node = from_node
|
12
|
+
end
|
13
|
+
|
14
|
+
def c_code(local_scope)
|
15
|
+
@from_node.type.from_ruby_object(@expr.c_code(local_scope)).to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Function argument is a function pointer.
|
2
|
+
module Rubex
|
3
|
+
module AST
|
4
|
+
module Expression
|
5
|
+
class FuncPtrArgDeclaration < ArgDeclaration
|
6
|
+
def analyse_types(local_scope, extern: false)
|
7
|
+
var, dtype, ident, ptr_level, value = fetch_data
|
8
|
+
cfunc_return_type = Helpers.determine_dtype(dtype, ident[:return_ptr_level])
|
9
|
+
arg_list = ident[:arg_list].analyse_statement(local_scope)
|
10
|
+
ptr_level = '*' if ptr_level.empty?
|
11
|
+
name = ident[:name]
|
12
|
+
c_name = Rubex::ARG_PREFIX + ident[:name]
|
13
|
+
@type = Helpers.determine_dtype(
|
14
|
+
DataType::CFunction.new(name, c_name, arg_list, cfunc_return_type, nil), ptr_level
|
15
|
+
)
|
16
|
+
add_arg_to_symbol_table name, c_name, value, extern, local_scope
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
# Function argument is the argument of a function pointer.
|
5
|
+
class FuncPtrInternalArgDeclaration < ArgDeclaration
|
6
|
+
def analyse_types(_local_scope, extern: false)
|
7
|
+
var, dtype, ident, ptr_level, value = fetch_data
|
8
|
+
@type = Helpers.determine_dtype(dtype, ptr_level)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
module Literal
|
5
|
+
class Base < Rubex::AST::Expression::Base
|
6
|
+
def initialize(name)
|
7
|
+
@name = name
|
8
|
+
end
|
9
|
+
|
10
|
+
def c_code(local_scope)
|
11
|
+
code = super
|
12
|
+
code << @name
|
13
|
+
end
|
14
|
+
|
15
|
+
def c_name
|
16
|
+
@name
|
17
|
+
end
|
18
|
+
|
19
|
+
def literal?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def ==(other)
|
24
|
+
self.class == other.class && @name == other.name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
module Literal
|
5
|
+
class ArrayLit < Base
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
attr_accessor :c_array
|
9
|
+
|
10
|
+
def each(&block)
|
11
|
+
@array_list.each(&block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(array_list)
|
15
|
+
@array_list = array_list
|
16
|
+
@subexprs = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def analyse_types(local_scope)
|
20
|
+
@has_temp = true
|
21
|
+
@type = DataType::RubyObject.new
|
22
|
+
@array_list.map! do |e|
|
23
|
+
e.analyse_types local_scope
|
24
|
+
e = e.to_ruby_object
|
25
|
+
@subexprs << e
|
26
|
+
e
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def generate_evaluation_code(code, local_scope)
|
31
|
+
code << "#{@c_code} = rb_ary_new2(#{@array_list.size});"
|
32
|
+
code.nl
|
33
|
+
@array_list.each do |e|
|
34
|
+
code << "rb_ary_push(#{@c_code}, #{e.c_code(local_scope)});"
|
35
|
+
code.nl
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def generate_disposal_code(code)
|
40
|
+
code << "#{@c_code} = 0;"
|
41
|
+
code.nl
|
42
|
+
end
|
43
|
+
|
44
|
+
def c_code(_local_scope)
|
45
|
+
@c_code
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
module Literal
|
5
|
+
class CNull < Base
|
6
|
+
def initialize(name)
|
7
|
+
# Rubex treats NULL's dtype as void*
|
8
|
+
super
|
9
|
+
@type = Rubex::DataType::CPtr.new(Rubex::DataType::Void.new)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
module Literal
|
5
|
+
class Char < Base
|
6
|
+
def analyse_for_target_type(target_type, local_scope)
|
7
|
+
if target_type.char?
|
8
|
+
@type = Rubex::DataType::Char.new
|
9
|
+
elsif target_type.object?
|
10
|
+
@type = Rubex::DataType::RubyString.new
|
11
|
+
analyse_types local_scope
|
12
|
+
else
|
13
|
+
raise Rubex::TypeError, "Cannot assign #{target_type} to string."
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def analyse_types(_local_scope)
|
18
|
+
@type ||= Rubex::DataType::RubyString.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_evaluation_code(_code, _local_scope)
|
22
|
+
@c_code = if @type.char?
|
23
|
+
@name
|
24
|
+
else
|
25
|
+
"rb_str_new2(\"#{@name[1]}\")"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def c_code(_local_scope)
|
30
|
+
@c_code
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
module Literal
|
5
|
+
class False < Base
|
6
|
+
def initialize(name)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
def analyse_for_target_type(target_type, _local_scope)
|
11
|
+
@type = if target_type.object?
|
12
|
+
Rubex::DataType::FalseType.new
|
13
|
+
else
|
14
|
+
Rubex::DataType::CBoolean.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def analyse_types(_local_scope)
|
19
|
+
@type = Rubex::DataType::FalseType.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def c_code(_local_scope)
|
23
|
+
if @type.object?
|
24
|
+
@name
|
25
|
+
else
|
26
|
+
'0'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
module Literal
|
5
|
+
class HashLit < Base
|
6
|
+
def initialize(key_val_pairs)
|
7
|
+
@key_val_pairs = key_val_pairs
|
8
|
+
end
|
9
|
+
|
10
|
+
def analyse_types(local_scope)
|
11
|
+
@has_temp = true
|
12
|
+
@type = Rubex::DataType::RubyObject.new
|
13
|
+
@key_val_pairs.map! do |k, v|
|
14
|
+
k.analyse_for_target_type(@type, local_scope)
|
15
|
+
v.analyse_for_target_type(@type, local_scope)
|
16
|
+
[k.to_ruby_object, v.to_ruby_object]
|
17
|
+
end
|
18
|
+
@subexprs = @key_val_pairs.to_a.flatten
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_evaluation_code(code, local_scope)
|
22
|
+
code << "#{@c_code} = rb_hash_new();"
|
23
|
+
code.nl
|
24
|
+
@key_val_pairs.each do |k, v|
|
25
|
+
k.generate_evaluation_code(code, local_scope)
|
26
|
+
v.generate_evaluation_code(code, local_scope)
|
27
|
+
|
28
|
+
code << "rb_hash_aset(#{@c_code}, #{k.c_code(local_scope)}, "
|
29
|
+
code << "#{v.c_code(local_scope)});"
|
30
|
+
code.nl
|
31
|
+
|
32
|
+
k.generate_disposal_code code
|
33
|
+
v.generate_disposal_code code
|
34
|
+
code.nl
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def c_code(_local_scope)
|
39
|
+
@c_code
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Rubex
|
2
|
+
module AST
|
3
|
+
module Expression
|
4
|
+
module Literal
|
5
|
+
class RubySymbol < Base
|
6
|
+
def initialize(name)
|
7
|
+
super(name[1..-1])
|
8
|
+
@type = Rubex::DataType::RubySymbol.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def generate_evaluation_code(_code, _local_scope)
|
12
|
+
@c_code = "ID2SYM(rb_intern(\"#{@name}\"))"
|
13
|
+
end
|
14
|
+
|
15
|
+
def c_code(_local_scope)
|
16
|
+
@c_code
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|