https://drafts.csswg.org/selectors/#grammar
<pseudo-element-selector> = ':' <pseudo-class-selector>
[...]
The four Level 2 pseudo-elements (::before, ::after, ::first-line, and ::first-letter) may, for legacy reasons, be represented using the <pseudo-class-selector> grammar, with only a single ":" character at their start.
I think it should be:
<pseudo-element-selector> = ':'{1,2} <pseudo-class-selector>
Or:
<pseudo-element-selector> = '::' <pseudo-class-selector>
[...]
The four Level 2 pseudo-elements (::before, ::after, ::first-line, and ::first-letter) may, for legacy reasons, be represented using the <pseudo-class-selector> grammar, with only a single ":" character at their start.