Identifiers parsed as error when starting with upper case letters #1

Closed
opened 2021-06-06 13:55:27 +02:00 by ColinTimBarndt · 0 comments
ColinTimBarndt commented 2021-06-06 13:55:27 +02:00 (Migrated from github.com)

I ran into this issue when working with labels starting with upper case letters. By the specification, this is valid. The grammar defines identifiers as starting with only lower case letters.

Java program

This program is accepted by the java compiler.

package tests;

@Deprecated(since = "9")
public class Simple {
	private static final String HELLO = "Hello, world!";

	public static void main(String[] args) {
		System.out.println(HELLO);
		Label: for (int i = 0; i < 5; i++) {
			if (i == 2)
				break Label;
		}
	}
}
Lezer Tree for `main`
MethodDeclaration(
	Modifiers(public,static),
	void,
	Definition,
	FormalParameters(
		"(",
		FormalParameter(
			ArrayType(TypeName,Dimension("[","]")),
			Definition
		),
		")"
	),
	Block(
		"{",
		ExpressionStatement(
			MethodInvocation(
				FieldAccess(Identifier,".",Identifier),
				".",
				MethodName(Identifier),
				ArgumentList("(",Identifier,")")
			),
			";"
		),
		ExpressionStatement(Identifier,⚠(":")),
		ForStatement(
			for,
			ForSpec(
				"(",
				LocalVariableDeclaration(
					PrimitiveType,
					VariableDeclarator(Definition,AssignOp,IntegerLiteral),
					";"
				),
				BinaryExpression(Identifier,CompareOp,IntegerLiteral),
				";",
				UpdateExpression(Identifier,UpdateOp),
				")"
			),
			Block(
				"{",
				IfStatement(if,
					ParenthesizedExpression(
						"(",
						BinaryExpression(Identifier,CompareOp,IntegerLiteral),
						")"
					),
					BreakStatement(break,⚠)
				),
				ExpressionStatement(Identifier,";"),
				"}"
			)
		),
		"}"
	)
)
I ran into this issue when working with labels starting with upper case letters. By the [specification], this is valid. The [grammar] defines identifiers as starting with only lower case letters. ### Java program This program is accepted by the java compiler. ```java package tests; @Deprecated(since = "9") public class Simple { private static final String HELLO = "Hello, world!"; public static void main(String[] args) { System.out.println(HELLO); Label: for (int i = 0; i < 5; i++) { if (i == 2) break Label; } } } ``` <details> <summary>Lezer Tree for `main`</summary> ```txt MethodDeclaration( Modifiers(public,static), void, Definition, FormalParameters( "(", FormalParameter( ArrayType(TypeName,Dimension("[","]")), Definition ), ")" ), Block( "{", ExpressionStatement( MethodInvocation( FieldAccess(Identifier,".",Identifier), ".", MethodName(Identifier), ArgumentList("(",Identifier,")") ), ";" ), ExpressionStatement(Identifier,⚠(":")), ForStatement( for, ForSpec( "(", LocalVariableDeclaration( PrimitiveType, VariableDeclarator(Definition,AssignOp,IntegerLiteral), ";" ), BinaryExpression(Identifier,CompareOp,IntegerLiteral), ";", UpdateExpression(Identifier,UpdateOp), ")" ), Block( "{", IfStatement(if, ParenthesizedExpression( "(", BinaryExpression(Identifier,CompareOp,IntegerLiteral), ")" ), BreakStatement(break,⚠) ), ExpressionStatement(Identifier,";"), "}" ) ), "}" ) ) ``` </details> [specification]: https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-Identifier [grammar]: https://github.com/lezer-parser/java/blob/master/src/java.grammar#L687
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lezer/java#1
No description provided.