stringLiteral function

Parser<Literal> stringLiteral()

Implementation

Parser<Literal> stringLiteral() {
  Parser<String> quotedString(String quote) {
    final backslash = String.fromCharCode(92);
    final bodyCharPattern = '^$quote$backslash';

    final escapeSequence = (char('\\') & any()).map((values) {
      final String character = values[1] as String;
      switch (character) {
        case 'n':
          return '\n';
        case 'r':
          return '\r';
        case 't':
          return '\t';
        case '"':
          return '"';
        case "'":
          return "'";
        case '\\':
          return '\\';
        default:
          // Unknown escape sequences keep the backslash and the character.
          return '\\$character';
      }
    }).labeled("quotedString");

    final bodyCharacter = pattern(bodyCharPattern);

    final content =
        (escapeSequence | bodyCharacter).star().map((values) => values.join());

    return (char(quote) & content & char(quote))
        .map((values) => values[1] as String);
  }

  return (quotedString('"') | quotedString("'"))
      .map((value) => Literal(value, LiteralType.string))
      .labeled('stringLiteral');
}