================================================================================
basic strings
================================================================================

foo := "a"
bar := "b
  c
"
baz := "a\"\t"

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (escape_sequence)
          (escape_sequence))))))

================================================================================
escape newlines
================================================================================

foo := "a\
b"

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string
          (escape_sequence))))))

================================================================================
unicode escape
================================================================================

foo := "\u{1F600}"

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string
          (escape_sequence))))))

================================================================================
indented basic strings
================================================================================

foo := """a"""
bar:= """b
  c
"""
baz := """
abc \t
def \"
ghi \n
jkl
"""

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (escape_sequence)
          (escape_sequence)
          (escape_sequence))))))

================================================================================
indented with nested delim
================================================================================

foo := """ a " b """
bar:= """b
  "baz"
"""

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string)))))

================================================================================
raw strings
================================================================================

foo := 'a'
bar := 'b
  c
'
baz := 'a\"\t'

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string)))))

================================================================================
shell-expanded strings
================================================================================

foo := x"a"
bar := x'b'
baz := x"""c"""
qux := x'''d'''

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string)))))

================================================================================
indented raw strings
================================================================================

foo := '''a'''
bar:= '''b
  c
'''
  baz := ''''
  abc \t
  def \"
'''

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string)))))

================================================================================
indented raw with nested delim
================================================================================

foo := ''' a ' '''
bar:= '''b
  'baz'
'''

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string))))
  (assignment
    (identifier)
    (expression
      (value
        (string)))))

================================================================================
format strings
================================================================================

foo := f'hello {{name}}'
bar := f"goodbye {{name}}"
baz := f'no interpolation'
qux := f"escape \t sequence {{var}}"

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string
            (interpolation
              (expression
                (value
                  (identifier)))))))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string
            (interpolation
              (expression
                (value
                  (identifier)))))))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string)))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string
            (escape_sequence)
            (interpolation
              (expression
                (value
                  (identifier))))))))))

================================================================================
indented format strings
================================================================================

foo := f'''
hello {{name}}
'''
bar := f"""
goodbye {{name}}
"""

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string
            (interpolation
              (expression
                (value
                  (identifier)))))))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string
            (interpolation
              (expression
                (value
                  (identifier))))))))))

================================================================================
format strings with function calls
================================================================================

foo := f'arch is {{arch()}}'
bar := f"joined {{join("a", "b")}}"

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string
            (interpolation
              (expression
                (value
                  (function_call
                    (identifier))))))))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string
            (interpolation
              (expression
                (value
                  (function_call
                    (identifier)
                    (sequence
                      (expression
                        (value
                          (string)))
                      (expression
                        (value
                          (string))))))))))))))

================================================================================
format strings with single braces
================================================================================

foo := f'single { brace'
bar := f'single } brace'
baz := f'{start and }end'

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string)))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string)))))
  (assignment
    (identifier)
    (expression
      (value
        (string
          (format_string))))))

================================================================================
backticks
================================================================================

foo := `echo hi`
bar := `echo hi
  echo bye
`

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (external_command
          (command_body)))))
  (assignment
    (identifier)
    (expression
      (value
        (external_command
          (command_body))))))

================================================================================
indented backticks
================================================================================

foo := ```echo hi```
bar := ```
echo bye
```
--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (external_command
          (command_body)))))
  (assignment
    (identifier)
    (expression
      (value
        (external_command
          (command_body))))))

================================================================================
indented backticks with nested delim
================================================================================

foo := ``` a ` ```
bar:= ```b
  `baz`
```

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (expression
      (value
        (external_command
          (command_body)))))
  (assignment
    (identifier)
    (expression
      (value
        (external_command
          (command_body))))))
