Why does Javac reject text blocks ending with four or more " ?

Alex Buckley alex.buckley at oracle.com
Thu Jul 30 19:27:02 UTC 2020


Since there is evidently interest in consecutive " characters in text 
blocks, I have updated 
http://openjdk.java.net/jeps/378#3--Escape-sequences with more 
discussion and examples.

Alex

On 7/30/2020 8:33 AM, Deepak Vohra wrote:
> Jim,
> 
> What I was implying was that four consecutive """" whether at the end of a
> text block or within a text block are not interpreted as such as these
> could be 3+1 quotes, and 3 """ are reserved for text blocks.
> 
> regards,
> Deepak
> 
> On Thu, Jul 30, 2020 at 8:17 AM Jim Laskey <james.laskey at oracle.com> wrote:
> 
>> Deepak,
>>
>> It's not clear what you are commenting on.
>>
>> As in your description;
>>
>>          >> cat Empty.java
>>          public class Empty {
>>              public static void main(String... args) {
>>                  String s = """
>>
>>                          ""
>>
>>                          """;
>>                  System.out.println(s);
>>              }
>>          }
>>          >> java Empty.java
>>
>>          ""
>>
>> As shown in your example;
>>
>>          >> cat Empty.java
>>          public class Empty {
>>              public static void main(String... args) {
>>                  String s = """
>>
>>                          """"
>>
>>                          """;
>>                  System.out.println(s);
>>              }
>>          }
>>          >> java Empty.java
>>          Empty.java:5: error: unclosed string literal
>>                          """"
>>                             ^
>>          Empty.java:7: error: illegal text block open delimiter sequence,
>> missing line terminator
>>                          """;
>>                             ^
>>          2 errors
>>          error: compilation failed
>>
>> If you want to include three or more quotes in a text block then escape
>> (at least) every third quote;
>>
>>          >> cat Empty.java
>>          public class Empty {
>>              public static void main(String... args) {
>>                  String s = """
>>
>>                          \"""\"
>>
>>                          """;
>>                  System.out.println(s);
>>              }
>>          }
>>          >> java Empty.java
>>
>>          """"
>>
>>
>> Cheers.
>>
>> -- Jim
>>
>>
>>
>>
>>
>>
>> On Jul 30, 2020, at 11:04 AM, Deepak Vohra <dvohra16 at gmail.com> wrote:
>>
>> Sequences of three characters are reserved for the opening and closing
>> delimiter and should not occur by user code or incidentally in a text
>> block. As an example, an empty string literal within a text block, while
>> apparently permissible, adds three consecutive double quotes as follows:
>>
>> String s ="""
>>
>>                  """"
>>
>>                  """;
>>
>> On Thu, Jul 30, 2020 at 1:13 AM Alex Buckley <alex.buckley at oracle.com>
>> wrote:
>>
>> " and "" can be used anywhere in a text block except immediately prior
>> to the closing delimiter. If a text block needs to end with " or "",
>> then the " and "" may be escaped:
>>
>> String s1 = """
>>    ...
>>    \"""";
>> String s2 = """
>>    ...
>>    \"\"""";
>>
>> Writing just """" or """"" runs afoul of the longstanding JLS 3.2 rule
>> about lexical translation choosing the longest possible token. That is,
>> during the process of translating characters into the TextBlock token of
>> the lexical grammar, the discovery of """ is translated as the closing
>> delimiter of TextBlock, even if a further " follows immediately.
>>
>> Alex
>>
>> On 7/29/2020 10:05 PM, Jayaprakash Artanareeswaran wrote:
>>
>> Hello,
>>
>> The following code is rejected by Javac in JDK 15, although JEP 378
>>
>> doesn't say anything about it.
>>
>>
>>      static final String TEXT_BLOCK = """
>>                1
>>              """"; // Notice the four quotes here?
>>
>> In fact, the JEP says this:
>>
>> "The use of the escape sequences \" and \n is permitted in a text block,
>>
>> but not necessary or recommended. However, representing the sequence """ in
>> a text block requires the escaping of at least one " character, to avoid
>> mimicking the closing delimiter."
>>
>>
>> So, I would imagine it's perfectly okay for up to two consequent quotes
>>
>> to be used anywhere in a text block.
>>
>>
>> If this is indeed backed by the spec, can the experts please point me to
>>
>> the relevant section?
>>
>> Hopefully, I am asking this in the right mailing list.
>>
>> Thanks,
>> Jay
>>
>>
>>
>>


More information about the amber-dev mailing list