| 487 | } |
| 488 | |
| 489 | export function literalString(scanner: Scanner): ParseResult<string> { |
| 490 | scanner.skipWhitespaces(); |
| 491 | if (scanner.char() !== "'") return failure(); |
| 492 | scanner.next(); |
| 493 | const acc: string[] = []; |
| 494 | while (scanner.char() !== "'" && !scanner.eof()) { |
| 495 | if (scanner.char() === "\n") { |
| 496 | throw new SyntaxError("Single-line string cannot contain EOL"); |
| 497 | } |
| 498 | acc.push(scanner.char()); |
| 499 | scanner.next(); |
| 500 | } |
| 501 | if (scanner.eof()) { |
| 502 | throw new SyntaxError( |
| 503 | `Single-line string is not closed:\n${acc.join("")}`, |
| 504 | ); |
| 505 | } |
| 506 | scanner.next(); // skip last "'" |
| 507 | return success(acc.join("")); |
| 508 | } |
| 509 | |
| 510 | export function multilineBasicString( |
| 511 | scanner: Scanner, |