Why does Javac reject text blocks ending with four or more " ?
Deepak Vohra
dvohra16 at gmail.com
Thu Jul 30 15:33:20 UTC 2020
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