Class: RubyNext::Language::PacoParsers::StringLiterals

Inherits:
Base
  • Object
show all
Defined in:
lib/ruby-next/language/paco_parsers/string_literals.rb

Constant Summary collapse

PAIRS =
{"[" => "]", "{" => "}", "(" => ")"}.freeze

Instance Method Summary collapse

Methods inherited from Base

#parse

Instance Method Details

#all_stringsObject



15
16
17
18
19
20
21
22
23
24
25
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 15

def all_strings
  alt(
    single_quoted,
    double_quoted,
    external_cmd_exec,
    quoted,
    quoted_expanded
  )
  # heredoc,
  # heredoc_expanded
end

#defaultObject



9
10
11
12
13
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 9

def default
  all_strings.fmap do |result|
    reduce_tokens(result.flatten)
  end
end

#double_quotedObject



59
60
61
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 59

def double_quoted
  escapable_string(string('"'), interpolate: true)
end

#escapable_string(left, right = nil, interpolate: false) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 63

def escapable_string(left, right = nil, interpolate: false)
  right ||= left
  seq(
    left,
    many(
      alt(
        *[
          seq(string("\\"), right).fmap { [:literal, _1] },
          interpolate ? seq(
            string('#{'),
            lazy { alt(balanced("{", "}", alt(all_strings, any_char)), many(none_of("}"))) },
            string("}")
          ) : nil,
          not_followed_by(right).bind { any_char }.fmap { [:literal, _1] }
        ].compact
      )
    ),
    right
  )
end

#external_cmd_execObject



55
56
57
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 55

def external_cmd_exec
  escapable_string(string("`"), interpolate: true)
end

#literal_startObject



27
28
29
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 27

def literal_start
  alt(string("{"), string("("), string("["))
end

#quotedObject



31
32
33
34
35
36
37
38
39
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 31

def quoted
  seq(
    alt(string("%q"), string("%s"), string("%r"), string("%i"), string("%w")),
    literal_start.bind do |char|
      end_symbol = string(PAIRS.fetch(char))
      escapable_string(succeed(char), end_symbol)
    end
  )
end

#quoted_expandedObject



45
46
47
48
49
50
51
52
53
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 45

def quoted_expanded
  seq(
    alt(string("%Q"), string("%"), string("%W"), string("%I")),
    literal_start.bind do |char|
      end_symbol = string(PAIRS.fetch(char))
      escapable_string(succeed(char), end_symbol, interpolate: true)
    end
  )
end

#single_quotedObject



41
42
43
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 41

def single_quoted
  escapable_string(string("'"))
end