summaryrefslogtreecommitdiff
path: root/chapter25/src/main/java
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-08-10 14:40:04 -0700
committerCliff Click <cliffc@acm.org>2026-08-10 14:40:04 -0700
commit34c2efae1f2dac2449a52fd2913b4737111e692c (patch)
tree7d84c3ac4043cb03d6c3e1229bfb4e2cc2d4a8d4 /chapter25/src/main/java
parent8f5b226cf472bc249b935320b8f3b7ac71d09579 (diff)
downloadSimple-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')
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/Parser.java26
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 "'"