@@ -115,7 +115,11 @@ export class Scanner {
115
115
}
116
116
117
117
isCurrentCharEOL ( ) {
118
- return this . char ( ) === "\n" || this . slice ( 0 , 2 ) === "\r\n" ;
118
+ return this . char ( ) === "\n" || this . startsWith ( "\r\n" ) ;
119
+ }
120
+
121
+ startsWith ( searchString : string ) {
122
+ return this . #source. startsWith ( searchString , this . #position) ;
119
123
}
120
124
}
121
125
@@ -304,7 +308,7 @@ function surround<T>(
304
308
function character ( str : string ) {
305
309
return ( scanner : Scanner ) : ParseResult < void > => {
306
310
scanner . nextUntilChar ( { inline : true } ) ;
307
- if ( scanner . slice ( 0 , str . length ) !== str ) return failure ( ) ;
311
+ if ( ! scanner . startsWith ( str ) ) return failure ( ) ;
308
312
scanner . next ( str . length ) ;
309
313
scanner . nextUntilChar ( { inline : true } ) ;
310
314
return success ( undefined ) ;
@@ -429,23 +433,23 @@ export function multilineBasicString(
429
433
scanner : Scanner ,
430
434
) : ParseResult < string > {
431
435
scanner . nextUntilChar ( { inline : true } ) ;
432
- if ( scanner . slice ( 0 , 3 ) !== '"""' ) return failure ( ) ;
436
+ if ( ! scanner . startsWith ( '"""' ) ) return failure ( ) ;
433
437
scanner . next ( 3 ) ;
434
438
if ( scanner . char ( ) === "\n" ) {
435
439
// The first newline (LF) is trimmed
436
440
scanner . next ( ) ;
437
- } else if ( scanner . slice ( 0 , 2 ) === "\r\n" ) {
441
+ } else if ( scanner . startsWith ( "\r\n" ) ) {
438
442
// The first newline (CRLF) is trimmed
439
443
scanner . next ( 2 ) ;
440
444
}
441
445
const acc : string [ ] = [ ] ;
442
- while ( scanner . slice ( 0 , 3 ) !== '"""' && ! scanner . eof ( ) ) {
446
+ while ( ! scanner . startsWith ( '"""' ) && ! scanner . eof ( ) ) {
443
447
// line ending backslash
444
- if ( scanner . slice ( 0 , 2 ) === "\\\n" ) {
448
+ if ( scanner . startsWith ( "\\\n" ) ) {
445
449
scanner . next ( ) ;
446
450
scanner . nextUntilChar ( { comment : false } ) ;
447
451
continue ;
448
- } else if ( scanner . slice ( 0 , 3 ) === "\\\r\n" ) {
452
+ } else if ( scanner . startsWith ( "\\\r\n" ) ) {
449
453
scanner . next ( ) ;
450
454
scanner . nextUntilChar ( { comment : false } ) ;
451
455
continue ;
@@ -477,17 +481,17 @@ export function multilineLiteralString(
477
481
scanner : Scanner ,
478
482
) : ParseResult < string > {
479
483
scanner . nextUntilChar ( { inline : true } ) ;
480
- if ( scanner . slice ( 0 , 3 ) !== "'''" ) return failure ( ) ;
484
+ if ( ! scanner . startsWith ( "'''" ) ) return failure ( ) ;
481
485
scanner . next ( 3 ) ;
482
486
if ( scanner . char ( ) === "\n" ) {
483
487
// The first newline (LF) is trimmed
484
488
scanner . next ( ) ;
485
- } else if ( scanner . slice ( 0 , 2 ) === "\r\n" ) {
489
+ } else if ( scanner . startsWith ( "\r\n" ) ) {
486
490
// The first newline (CRLF) is trimmed
487
491
scanner . next ( 2 ) ;
488
492
}
489
493
const acc : string [ ] = [ ] ;
490
- while ( scanner . slice ( 0 , 3 ) !== "'''" && ! scanner . eof ( ) ) {
494
+ while ( ! scanner . startsWith ( "'''" ) && ! scanner . eof ( ) ) {
491
495
acc . push ( scanner . char ( ) ) ;
492
496
scanner . next ( ) ;
493
497
}
@@ -517,9 +521,7 @@ const symbolPairs: [string, unknown][] = [
517
521
] ;
518
522
export function symbols ( scanner : Scanner ) : ParseResult < unknown > {
519
523
scanner . nextUntilChar ( { inline : true } ) ;
520
- const found = symbolPairs . find ( ( [ str ] ) =>
521
- scanner . slice ( 0 , str . length ) === str
522
- ) ;
524
+ const found = symbolPairs . find ( ( [ str ] ) => scanner . startsWith ( str ) ) ;
523
525
if ( ! found ) return failure ( ) ;
524
526
const [ str , value ] = found ;
525
527
scanner . next ( str . length ) ;
0 commit comments