Class: Expressir::Express::Builders::LiteralBuilder

Inherits:
Object
  • Object
show all
Includes:
Helpers
Defined in:
lib/expressir/express/builders/literal_builder.rb

Overview

Builds literal nodes (integer, real, binary, logical, string).

Instance Method Summary collapse

Methods included from Helpers

#apply_qualifier, #extract_id_ref, #extract_interval_op, #extract_nested_text, #extract_operator, #extract_rel_op, #extract_text, #extract_unary_op, #first_value

Instance Method Details

#build_binary(ast_data) ⇒ Object

Binary literal



23
24
25
26
# File 'lib/expressir/express/builders/literal_builder.rb', line 23

def build_binary(ast_data)
  val = extract_text(ast_data[:binary] || ast_data[:str])
  Expressir::Model::Literals::Binary.new(value: val)
end

#build_encoded_string(ast_data) ⇒ Object



70
71
72
73
74
# File 'lib/expressir/express/builders/literal_builder.rb', line 70

def build_encoded_string(ast_data)
  val = extract_text(ast_data[:str])
  val = val[1..-2] if val && val.length >= 2
  Expressir::Model::Literals::String.new(value: val, encoded: true)
end

#build_integer(ast_data) ⇒ Object

Integer literal



11
12
13
14
# File 'lib/expressir/express/builders/literal_builder.rb', line 11

def build_integer(ast_data)
  val = extract_text(ast_data[:integer] || ast_data[:str])
  Expressir::Model::Literals::Integer.new(value: val)
end

#build_logical(ast_data) ⇒ Object

Logical literal



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/expressir/express/builders/literal_builder.rb', line 29

def build_logical(ast_data)
  value = if ast_data[:t_true]
            Expressir::Model::Literals::Logical::TRUE
          elsif ast_data[:t_false]
            Expressir::Model::Literals::Logical::FALSE
          elsif ast_data[:t_unknown]
            Expressir::Model::Literals::Logical::UNKNOWN
          else
            val = extract_text(ast_data[:logical] || ast_data[:str]).to_s.strip.upcase
            case val
            when "TRUE" then Expressir::Model::Literals::Logical::TRUE
            when "FALSE" then Expressir::Model::Literals::Logical::FALSE
            else Expressir::Model::Literals::Logical::UNKNOWN
            end
          end
  Expressir::Model::Literals::Logical.new(value: value)
end

#build_real(ast_data) ⇒ Object

Real literal



17
18
19
20
# File 'lib/expressir/express/builders/literal_builder.rb', line 17

def build_real(ast_data)
  val = extract_text(ast_data[:real] || ast_data[:str])
  Expressir::Model::Literals::Real.new(value: val)
end

#build_simple_string(ast_data) ⇒ Object



64
65
66
67
68
# File 'lib/expressir/express/builders/literal_builder.rb', line 64

def build_simple_string(ast_data)
  val = extract_text(ast_data[:str])
  val = val[1..-2] if val && val.length >= 2
  Expressir::Model::Literals::String.new(value: val)
end

#build_string(ast_data) ⇒ Object

String literal



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/expressir/express/builders/literal_builder.rb', line 48

def build_string(ast_data)
  if ast_data[:string_literal] && ast_data.keys.length == 1
    ast_data = ast_data[:string_literal]
  end

  if ast_data[:simple_string_literal].is_a?(Hash)
    build_simple_string(ast_data[:simple_string_literal])
  elsif ast_data[:encoded_string_literal].is_a?(Hash)
    build_encoded_string(ast_data[:encoded_string_literal])
  else
    val = extract_text(ast_data[:str])
    val = val[1..-2] if val && val.length >= 2
    Expressir::Model::Literals::String.new(value: val)
  end
end

#call(ast_data) ⇒ Object

Generic literal dispatcher



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/expressir/express/builders/literal_builder.rb', line 77

def call(ast_data)
  if ast_data[:binary_literal]
    Builder.build({ binary_literal: ast_data[:binary_literal] })
  elsif ast_data[:integer_literal]
    Builder.build({ integer_literal: ast_data[:integer_literal] })
  elsif ast_data[:logical_literal]
    Builder.build({ logical_literal: ast_data[:logical_literal] })
  elsif ast_data[:real_literal]
    Builder.build({ real_literal: ast_data[:real_literal] })
  elsif ast_data[:string_literal]
    Builder.build({ string_literal: ast_data[:string_literal] })
  end
end