Question about null handling in SwitchLabel

Robert Olofsson robo at khelekore.org
Tue Sep 26 19:32:48 UTC 2023


Hi!

I hope this is the right place to ask about switch and null handling.

A bit of background:
So I am trying to build my own parser (parjac2) for the java language
and was trying to implement handling for the updated "switch"
according to the updated grammar. This caused me some problem. So I
tried to test a few things with javac and to me it seems like javac
and the grammar are not fully in synch.

Some parts of the grammar to make it easier to understand:

SwitchRule:
  SwitchLabel -> Expression;

SwitchLabel:
  case CaseConstant {, CaseConstant}
  case null [, default]

CaseConstant:
  ConditionalExpression

We can follow ConditionalExpression to Primary and
Primary can be Literal so it allows "null".

So to me this looks like SwitchLabel say that "null" is allowed
anywhere in a sequence of CaseConstants, but when I try this with
javac I of course get "error: invalid case label combination"

Example program:
------------------------------------------------------
class Foo {
    void foo () {
        String foo = "hello";
        switch (foo) {
        case "A", "B", null -> System.out.println ("Yup");
        default -> System.out.println ("Nope!");
        }
    }
}
------------------------------------------------------

Looking closer at the JLS we do find a bullet point:
* For each case constant associated with the switch block that is a
constant expression, the constant is assignment compatible with T, and
T is one of char, byte, short, int, Character, Byte, Short, Integer,
or String.

So I guess this is the reason null is not allowed as CaseConstant?

Actual question:
Now that we do have the option to have null by itself or with
default as a SwitchLAbel is there really a strong case now for not
allowing us to do 'case "A", "B", null -> ...'?

For me right now I guess I will have to find a creative way to
rewrite the grammar I use for my parser to avoid the problem, not yet
sure how I will do that though. Basically I get a conflict that "case
null" can be two versions of SwitchLabel and the earley parsing
algorithm I use do not like that, this is of course for me to figure
out.

Thank you
/robo


More information about the compiler-dev mailing list