module SQLiterate

grammar String
  include Identifier

  rule multi_string
    single_string t:( ' '* "\n" ' '* single_string )* <Node::MultiString>
  end

  rule single_string
    std_string_constant / ext_string_constant
  end

  rule std_string_constant
    "'" c:( std_character )* "'" <Node::StringConstant>
  end

  rule std_character
    "''" <Node::Character::Quote>
    /
    [^'] <Node::Character::Text>
  end

  rule ext_string_constant
    [eE] "'" c:( ext_character )* "'" <Node::StringConstant>
  end

  rule ext_character
    "''" <Node::Character::Quote>
    /
    "\\" c:( ext_string_escape ) <Node::Character::ExtEscape>
    /
    [^\\'] <Node::Character::Text>
  end

  rule ext_string_escape
    [bfnrt] <Node::Character::NotImplemented>
    /
    [0-7] 1..3 <Node::Character::NotImplemented>
    /
    'x' [0-9A-F] 1..2 <Node::Character::NotImplemented>
    /
    [uU] ([0-9A-F] 8..8 / [0-9A-F] 4..4) <Node::Character::NotImplemented>
    /
    [^xuU] <Node::Character::Text>
  end
end

end