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



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

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

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



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 59

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



51
52
53
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 51

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

#quotedObject



27
28
29
30
31
32
33
34
35
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 27

def quoted
  seq(
    string("%q"),
    any_char.bind do |char|
      end_symbol = string(PAIRS[char] || char)
      escapable_string(succeed(char), end_symbol)
    end
  )
end

#quoted_expandedObject



41
42
43
44
45
46
47
48
49
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 41

def quoted_expanded
  seq(
    alt(string("%Q"), string("%")),
    any_char.bind do |char|
      end_symbol = string(PAIRS[char] || char)
      escapable_string(succeed(char), end_symbol, interpolate: true)
    end
  )
end

#single_quotedObject



37
38
39
# File 'lib/ruby-next/language/paco_parsers/string_literals.rb', line 37

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