From 465a3db3f2282943ca07103d9b9bd9bd47963278 Mon Sep 17 00:00:00 2001
From: Lukas Stadler <lukas.stadler@oracle.com>
Date: Fri, 24 Aug 2018 14:08:43 +0200
Subject: [PATCH] allow \u and \U with braces in string literals

---
 .../src/com/oracle/truffle/r/parser/ParserGeneration.java | 1 +
 .../src/com/oracle/truffle/r/parser/R.g                   | 2 ++
 .../src/com/oracle/truffle/r/test/ExpectedTestOutput.test | 8 ++++++++
 .../src/com/oracle/truffle/r/test/parser/TestParser.java  | 6 ++++++
 4 files changed, 17 insertions(+)

diff --git a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java
index 23c7fa48bf..a6a6e6655c 100644
--- a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java
+++ b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/ParserGeneration.java
@@ -101,5 +101,6 @@ public class ParserGeneration {
         ":: and ::: do not set argument names",
         "refactored: use file for interactive single-line source",
         "create lookups for field accesses where appropriate",
+        "allow unicode escape literals with {...}",
     };
 }
diff --git a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g
index 61e8a59794..3a1d809d79 100644
--- a/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g
+++ b/com.oracle.truffle.r.parser/src/com/oracle/truffle/r/parser/R.g
@@ -789,6 +789,8 @@ fragment ESCAPE [StringBuilder buf]
       | 'x' a = HEX_DIGIT b = HEX_DIGIT { buf.append(hexChar($a.text, $b.text)); }
       | 'u' a = HEX_DIGIT b = HEX_DIGIT? c = HEX_DIGIT? d = HEX_DIGIT? { buf.append(hexChar($a.text, $b.text, $c.text, $d.text)); }
       | 'U' a = HEX_DIGIT b = HEX_DIGIT? c = HEX_DIGIT? d = HEX_DIGIT? e = HEX_DIGIT? f = HEX_DIGIT? g = HEX_DIGIT? h = HEX_DIGIT? { buf.append(hexChar($a.text, $b.text, $c.text, $d.text, $e.text, $f.text, $g.text, $h.text)); }
+      | 'u' '{' a = HEX_DIGIT b = HEX_DIGIT? c = HEX_DIGIT? d = HEX_DIGIT? '}' { buf.append(hexChar($a.text, $b.text, $c.text, $d.text)); }
+      | 'U' '{' a = HEX_DIGIT b = HEX_DIGIT? c = HEX_DIGIT? d = HEX_DIGIT? '}' { buf.append(hexChar($a.text, $b.text, $c.text, $d.text)); }
       )
     ;
 
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index 4a61db00c5..1729d773c0 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -171254,6 +171254,14 @@ see '?methods' for accessing help and source code
 "","double","bool","raw"
 "1",1231231234.5,TRUE,2a
 
+##com.oracle.truffle.r.test.parser.TestParser.testBraceUnicodeLiterals#
+#"\u{23}\u{9}\u{723}\u{1234}\U{23}\U{9}\U{723}\U{1234}"
+[1] "#\tܣሴ#\tܣሴ"
+
+##com.oracle.truffle.r.test.parser.TestParser.testBraceUnicodeLiterals#
+#'\u{23}\u{9}\u{723}\u{1234}\U{23}\U{9}\U{723}\U{1234}'
+[1] "#\tܣሴ#\tܣሴ"
+
 ##com.oracle.truffle.r.test.parser.TestParser.testDotIdentifiers#
 #{ .. <- 42; cat(..); }
 42
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java
index 524a536573..e02819ca63 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/parser/TestParser.java
@@ -61,6 +61,12 @@ public class TestParser extends TestBase {
         assertEval("0xa.bp1i");
     }
 
+    @Test
+    public void testBraceUnicodeLiterals() {
+        assertEval("\"\\u{23}\\u{9}\\u{723}\\u{1234}\\U{23}\\U{9}\\U{723}\\U{1234}\"");
+        assertEval("'\\u{23}\\u{9}\\u{723}\\u{1234}\\U{23}\\U{9}\\U{723}\\U{1234}'");
+    }
+
     private static final String[] HEX_VALUES = new String[]{"0xFFF", "0xFFFFFFFFFFF"};
 
     @Test
-- 
GitLab