diff --git a/tool/src/org/antlr/v4/automata/LexerATNFactory.java b/tool/src/org/antlr/v4/automata/LexerATNFactory.java index b596df5537b..ec0d18b031a 100644 --- a/tool/src/org/antlr/v4/automata/LexerATNFactory.java +++ b/tool/src/org/antlr/v4/automata/LexerATNFactory.java @@ -353,10 +353,12 @@ public Handle stringLiteral(TerminalAST stringLiteralAST) { int n = chars.length(); ATNState prev = left; right = null; - for (int i = 0; i < n; i++) { + for (int i = 0; i < n; ) { right = newState(stringLiteralAST); - prev.addTransition(new AtomTransition(right, chars.charAt(i))); + int codePoint = chars.codePointAt(i); + prev.addTransition(new AtomTransition(right, codePoint)); prev = right; + i += Character.charCount(codePoint); } stringLiteralAST.atnState = left; return new Handle(left, right); diff --git a/tool/src/org/antlr/v4/misc/CharSupport.java b/tool/src/org/antlr/v4/misc/CharSupport.java index 18a508362c0..d9fb2d4eac3 100644 --- a/tool/src/org/antlr/v4/misc/CharSupport.java +++ b/tool/src/org/antlr/v4/misc/CharSupport.java @@ -115,7 +115,7 @@ public static String getStringFromGrammarStringLiteral(String literal) { if ( c==-1 ) { return null; // invalid escape sequence. } - else buf.append((char)c); + else buf.appendCodePoint(c); i = end; } return buf.toString();