diff options
| author | Cliff Click <cliffc@acm.org> | 2026-08-10 14:40:04 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-08-10 14:40:04 -0700 |
| commit | 34c2efae1f2dac2449a52fd2913b4737111e692c (patch) | |
| tree | 7d84c3ac4043cb03d6c3e1229bfb4e2cc2d4a8d4 /chapter25/src/main/java/com/seaofnodes | |
| parent | 8f5b226cf472bc249b935320b8f3b7ac71d09579 (diff) | |
| download | Simple-34c2efae1f2dac2449a52fd2913b4737111e692c.tar.gz Simple-34c2efae1f2dac2449a52fd2913b4737111e692c.zip | |
Handle some escaped chars in strings
Add a explicit "emit_main" flag in case you use no_run.
Fix a make parallel bug
Diffstat (limited to 'chapter25/src/main/java/com/seaofnodes')
| -rw-r--r-- | chapter25/src/main/java/com/seaofnodes/simple/Parser.java | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/Parser.java b/chapter25/src/main/java/com/seaofnodes/simple/Parser.java index 98f8698f..4c2dfc84 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/Parser.java @@ -2396,11 +2396,27 @@ public class Parser { private String parseString() { if( !peek('"') ) return null; _lexer.inc(); - int start = pos(); - while( !_lexer.isEOF() && _lexer.nextChar()!= '"' ) ; - if( _lexer.isEOF() ) - throw error("Unclosed string"); - return new String(_lexer._input,start,pos()-start-1); + StringBuilder sb = new StringBuilder(); + while( !_lexer.isEOF() ) { + char c = _lexer.nextChar(); + if( c=='"' ) return sb.toString(); + if( c!='\\' ) { + sb.append(c); + continue; + } + if( _lexer.isEOF() ) + throw error("Unclosed string"); + char esc = _lexer.nextChar(); + sb.append(switch( esc ) { + case 'n' -> '\n'; + case 't' -> '\t'; + case 'r' -> '\r'; + case '\\' -> '\\'; + case '"' -> '"'; + default -> throw error("Unknown string escape \\\\"+esc); + }); + } + throw error("Unclosed string"); } // Already parsed "'" |
