Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grammar railroad diagram #695

Open
mingodad opened this issue Oct 8, 2024 · 0 comments
Open

Grammar railroad diagram #695

mingodad opened this issue Oct 8, 2024 · 0 comments

Comments

@mingodad
Copy link

mingodad commented Oct 8, 2024

Transforming a bit the grammar at https://github.com/ELENA-LANG/elena-lang/blob/develop/dat/sg/syntax60.txt to an EBNF accepted by (IPV4) https://rr.red-dove.com/ui or (IPV6) https://www.bottlecaps.de/rr/ui (repository here https://github.com/GuntherRademacher/rr) we can have a nice navigable railroad diagram (see instructions bellow at the top).

Ideally the sg application could output it as an option.

I think that it's a valuable option to document/debug/develop the grammar.

The ÈBNF shown bellow was hand transformed by removing the __define lines, replace {} by (), {}* by ()*, {}+ by ()+, {}? by ()?, ^ANY by `/*^ANY*/ and removing the ';' rule/production separator.

//
// EBNF to be viewd at
//	(IPV6) https://www.bottlecaps.de/rr/ui
//	(IPV4) https://rr.red-dove.com/ui
//
// Copy and paste this at one url shown above in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//

START ::=
        ( DECLARATION | META_DECLARATION )+ eof
	| eof

META_DECLARATION ::=
	"#new" DICTIONARY DECLARATION_END
	| "#share" SHARED_DICTIONARY DECLARATION_END
	| "#let" META_STATEMENT DECLARATION_END
	| "#load" LOAD_STATEMENT DECLARATION_END
	| "#clear" CLEAR_STATEMENT DECLARATION_END
	| "#include" INCLUDE_STATEMENT DECLARATION_END

DECLARATION ::=
	( identifier | reference )+ IR_DECLARATION
	| "::" "(" TUPLE_TYPE ")" identifier SUB_IR_DECLARATION

IR_DECLARATION ::=
	( TEMPLATE_BRACKETS (
		DYNAMIC_DIMENSION /*^TEMPLATE_TYPE*/ /*^ARRAY_TYPE*/ ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )* identifier
		| identifier
		| eps)
	| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ identifier
	) ( POSTFIXES NESTED_SCOPE | SCOPE )
	| "::" (
		COMPLEX_NAME ( "::" COMPLEX_NAME )* TEMPLATE_BRACKETS? METHOD_SCOPE
		| "(" TUPLE_TYPE ")" identifier SCOPE
	)
	| ( "," SUB_DECLARATION )+ ( POSTFIXES NESTED_SCOPE | SCOPE )
	| "?" /*^NULLABLE_TYPE*/ identifier ( POSTFIXES NESTED_SCOPE | SCOPE )
	| POSTFIXES NESTED_SCOPE
	| SCOPE

SUB_IR_DECLARATION ::=
	POSTFIXES NESTED_SCOPE
	| SCOPE

SUB_DECLARATION ::=
	( identifier | reference )+ ( TEMPLATE_BRACKETS identifier? | ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ identifier | eps )

SCOPE ::=
	"{" ( DECLARATION | META_DECLARATION )* END_OF_BLOCK
	| "=" GET_EXPRESSION DECLARATION_END
	| ":=" INIT_EXPRESSION DECLARATION_END
	| "+=" ACCUM_EXPRESSION DECLARATION_END
	| "[" DIMENSION "]" DECLARATION_END
	| METHOD_SCOPE
	| DECLARATION_END

NESTED_SCOPE ::=
	"{" ( DECLARATION | META_DECLARATION )* END_OF_BLOCK
	| "=" GET_EXPRESSION DECLARATION_END
	| DECLARATION_END

METHOD_SCOPE ::=
	"(" ( PARAMETER ( "," PARAMETER )* )? ")" POSTFIXES? METHOD_BODY

METHOD_BODY ::=
	"{" BLOCK
	| "=" RET_EXPRESSION DECLARATION_END
	| "=>" REDIRECT DECLARATION_END
	| "<=" RESEND ( DECLARATION_END | "{" BLOCK )
	| NO_BODY

NO_BODY ::=
	";"

BLOCK ::=
	STATEMENT NEXT_STATEMENT
	| "^" RET_EXPRESSION LAST_STATEMENT
	| END_OF_BLOCK

STATEMENT ::=
	ROOT_EXPRESSION
	| "#include" INCLUDE_STATEMENT
	| "#let" META_STATEMENT
	| "#new" DICTIONARY
	| "#share" SHARED_DICTIONARY
	| "{" BLOCK

NEXT_STATEMENT ::=
	DECLARATION_END (
		STATEMENT NEXT_STATEMENT
		| "^" RET_EXPRESSION LAST_STATEMENT
		| END_OF_BLOCK
	)
	| END_OF_BLOCK

LAST_STATEMENT ::=
	DECLARATION_END END_OF_BLOCK
	| END_OF_BLOCK

META_STATEMENT ::=
	EXPRESSION

RET_EXPRESSION ::=
	EXPRESSION

ACCUM_EXPRESSION ::=
	EXPRESSION

GET_EXPRESSION ::=
	EXPRESSION

REDIRECT ::=
	EXPRESSION

INIT_EXPRESSION ::=
	EXPRESSION

NESTED_EXPRESSION ::=
	( DECLARATION | META_DECLARATION )+ END_OF_BLOCK
	| END_OF_BLOCK

T_EXPRESSION ::=
	"{" BLOCK

T_EXPRESSION_F ::=
	identifier ( NT_EXPRESSION T_EXPRESSION_F | LT_EXPRESSION )
	| eps

NT_EXPRESSION ::=
	"{" BLOCK
	| "::" "{" NESTED_EXPRESSION /*^NESTED*/
	| BRACKET SUB_EXPRESSION

LT_EXPRESSION ::=
	NESTED_ROOT_EXPRESSION /*^ BLOCK*/

ROOT_EXPRESSION ::=
	identifier+ (
		reference (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_F
			| L2_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| L8_OOP
			| L9_OOP
			| eps /*^OBJECT*/
		)
		| "," /*^OBJECT*/ SUB_VARIABLE ( "," SUB_VARIABLE )* ASSIGN EXPRESSION /*^TUPLE_ASSIGNING*/
		| SBRACKET /*^OBJECT*/ INDEXER_R L0_F
		| ASSIGN /*^OBJECT*/ ASSIGN_R
		| L1a_OOP
		| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ (
			BRACKET FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| "{" /*^OBJECT*/ COLLECTION "}" /*^ COLLECTION_EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| identifier /*^OBJECT*/ ASSIGN ASSIGN_R
		)
                | BRACKET /*^OBJECT*/ (
			MESSAGE_PARAMETER (
				( ";" EXPRESSION )+ ")" (
					T_EXPRESSION T_EXPRESSION_F /*^ TEMPLATE_BLOCK*/
					| LT_EXPRESSION /*^ TEMPLATE_BLOCK*/ )
				| ( "," MESSAGE_PARAMETER )+ ")" ( RI_F | eps /*^MESSAGE_OPERATION*/ )
				| ")" (
					RI_F
					| T_EXPRESSION T_EXPRESSION_F /*^ TEMPLATE_BLOCK*/
					| LT_EXPRESSION /*^ TEMPLATE_BLOCK*/
					| eps /*^MESSAGE_OPERATION*/
				)
			)
			| ")" ( RI_F | eps /*^MESSAGE_OPERATION*/ )
		)
		| DOT /*^OBJECT*/ MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OOP L7_OP* L8_OP? L9_OP?
		| L7_OOP L7_OP* L8_OP? L9_OP?
		| IF /*^OBJECT*/ IF_OR_NULLABLE_R
		| ELSE /*^OBJECT*/ ELSE_R
		| L9_OOP
		| LESS /*^OBJECT*/ TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ (
			"{" NESTED_EXPRESSION /*^NESTED*/   L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| O_R
			| eps
		)
		| "=>" /*^OBJECT*/ ( SWITCH_OPTION+ SWITCH_LAST_OPTION? ) /*^SWITCH_OPERATION*/
		| INC /*^OBJECT*/ /*^INC_OPERATION*/
		| DEC /*^OBJECT*/ /*^DEC_OPERATION*/
		| T_EXPRESSION T_EXPRESSION_F /*^ TEMPLATE_BLOCK*/
		| eps /*^OBJECT*/
	)
	| ( reference | global ) ( O_R | eps /*^OBJECT*/ )
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/ L_F
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| "$rep" EXPRESSION /*^LOOP_OPERATION*/
	| "$ext" EXPRESSION /*^EXTERN_OPERATION*/
	| "$break" /*^BREAK_OPERATION*/
	| "$continue" /*^CONTINUE_OPERATION*/
	| "$yield" EXPRESSION /*^YIELD_OPERATION*/
	| "$await" EXPRESSION /*^ASYNC_OPERATION*/
	| BRACKET SUB_EXPRESSION (
		"=>" ( SWITCH_OPTION+ SWITCH_LAST_OPTION? ) /*^SWITCH_OPERATION*/
		| L2_OP+ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L3_OP+ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OP L7_OP* L8_OP? L9_OP?
		| L7_OP+ L8_OP? L9_OP?
		| L8_OP
		| L9_OP
		| ASSIGN EXPRESSION /*^TUPLE_ASSIGNING*/
		| eps
	)

NESTED_ROOT_EXPRESSION ::=
	identifier+ (
		reference (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_F
			| L2_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| L8_OOP
			| L9_OOP
			| eps /*^OBJECT*/
		)
		| "," /*^OBJECT*/ SUB_VARIABLE ( "," SUB_VARIABLE )* ASSIGN EXPRESSION /*^TUPLE_ASSIGNING*/
		| SBRACKET /*^OBJECT*/ INDEXER_R L0_F
		| ASSIGN /*^OBJECT*/ ASSIGN_R
		| L1a_OOP
		| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ (
			BRACKET FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| "{" /*^OBJECT*/ COLLECTION "}" /*^ COLLECTION_EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| identifier /*^OBJECT*/ ASSIGN ASSIGN_R
		)
		| BRACKET /*^OBJECT*/ MESSAGE_PARAMETERS? ")" (
			BRACKET /*^MESSAGE_OPERATION*/ FUNCTION_R L2_F
        		| DOT /*^MESSAGE_OPERATION*/ MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
			| STAR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^MUL_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| DIV /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^DIV_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| BAND /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^BAND_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| BOR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^BOR_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| BXOR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^BXOR_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| SHL /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^SHL_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| SHR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^SHR_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| MINUS /*^MESSAGE_OPERATION*/ L5_EXPRESSION /*^SUB_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| PLUS /*^MESSAGE_OPERATION*/ L5_EXPRESSION /*^ADD_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| EQUAL /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^EQUAL_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| NOTEQUAL /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^NOTEQUAL_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| GREATER /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^GREATER_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| NOTLESS /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^NOTLESS_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| NOTGREATER /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^NOTGREATER_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| AND /*^MESSAGE_OPERATION*/ L7_EXPRESSION /*^AND_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| OR /*^MESSAGE_OPERATION*/ L7_EXPRESSION /*^OR_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| XOR /*^MESSAGE_OPERATION*/ L7_EXPRESSION /*^OR_OPERATION*/ L7_OP* L8_OP? L9_OP?
			| IF /*^MESSAGE_OPERATION*/ IF_R
			| ELSE /*^MESSAGE_OPERATION*/ ELSE_R
			| TRY /*^MESSAGE_OPERATION*/ TRY_R
			| FNL /*^MESSAGE_OPERATION*/ FNL_R
			| ALT /*^MESSAGE_OPERATION*/ ALT_R
			| ISNIL /*^MESSAGE_OPERATION*/ EXPRESSION /*^ISNIL_OPERATION*/
			| T_EXPRESSION T_EXPRESSION_F /*^ TEMPLATE_BLOCK*/
			| eps /*^MESSAGE_OPERATION*/
		)
		| DOT /*^OBJECT*/ MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OOP L7_OP* L8_OP? L9_OP?
		| L7_OOP L7_OP* L8_OP? L9_OP?
		| IF /*^OBJECT*/ IF_R
		| ELSE /*^OBJECT*/ ELSE_R
		| L9_OOP
		| LESS /*^OBJECT*/ TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ (
			"{" NESTED_EXPRESSION /*^NESTED*/   L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| identifier /*^OBJECT*/ ( ASSIGN ASSIGN_R )?
			| BRACKET /*^OBJECT*/ FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| L8_OOP
			| L9_OOP
			| eps
		)
		| "=>" /*^OBJECT*/ ( SWITCH_OPTION+ SWITCH_LAST_OPTION? ) /*^SWITCH_OPERATION*/
		| INC /*^OBJECT*/ /*^INC_OPERATION*/
		| DEC /*^OBJECT*/ /*^DEC_OPERATION*/
		| T_EXPRESSION T_EXPRESSION_F /*^ TEMPLATE_BLOCK*/
		| eps /*^OBJECT*/
	)
	| ( reference | global ) /*^OBJECT*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/ L_F
	| "$rep" EXPRESSION /*^LOOP_OPERATION*/
	| "$ext" EXPRESSION /*^EXTERN_OPERATION*/
	| "$break" /*^BREAK_OPERATION*/
	| "$continue" /*^CONTINUE_OPERATION*/
	| "$yield" EXPRESSION /*^YIELD_OPERATION*/
	| "$await" EXPRESSION /*^ASYNC_OPERATION*/

EXPRESSION ::=
	identifier (
		identifier+ (
			| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ (
				BRACKET /*^OBJECT*/ FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| "{" /*^OBJECT*/ COLLECTION "}" /*^ COLLECTION_EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			)
			| ":" /*^OBJECT*/ /*^EXPRESSION*/ identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/
			| "::=" /*^OBJECT*/ SINGLE_EXPRESSION /*^KEY_VALUE_EXPRESSION*/
			| SBRACKET /*^OBJECT*/ INDEXER_R L0_F
			| ASSIGN /*^OBJECT*/ ASSIGN_R
			| L1a_OOP
			| BRACKET /*^OBJECT*/ FUNCTION_R L2_F
			| DOT /*^OBJECT*/ MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| IF /*^OBJECT*/ IF_R
			| ELSE /*^OBJECT*/ ELSE_R
			| L9_OOP
			| LESS /*^OBJECT*/ TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ (
				"{" NESTED_EXPRESSION /*^NESTED*/ OL_F
				| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ /*^OBJECT*/ BRACKET FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| SBRACKET /*^OBJECT*/ INDEXER_R OL_F
				| BRACKET /*^OBJECT*/ FUNCTION_R OL_F
				| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| L6_OOP L7_OP* L8_OP? L9_OP?
				| L7_OOP L7_OP* L8_OP? L9_OP?
				| L8_OOP
				| L9_OOP
			)
			| "{" NESTED_EXPRESSION /*^NESTED*/ L_F
			| eps /*^OBJECT*/
		)
		| reference (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_F
			| L2_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| L8_OOP
			| L9_OOP
			| eps /*^OBJECT*/
		)
		| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ (
			BRACKET FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| "{" /*^OBJECT*/ COLLECTION "}" /*^ COLLECTION_EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| identifier /*^OBJECT*/ ( ASSIGN ASSIGN_R )?
		)
		| ":" /*^OBJECT*/ /*^EXPRESSION*/ identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/
		| "::=" /*^OBJECT*/ SINGLE_EXPRESSION /*^KEY_VALUE_EXPRESSION*/
		| SBRACKET /*^OBJECT*/ INDEXER_R L0_F
		| L1a_OOP
		| ASSIGN /*^OBJECT*/ ASSIGN_R
		| BRACKET /*^OBJECT*/ FUNCTION_R L2_F
		| DOT /*^OBJECT*/ MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OOP L7_OP* L8_OP? L9_OP?
		| LESS /*^OBJECT*/ L6_EXPRESSION /*^LESS_OPERATION*/ L7_OP* L8_OP? L9_OP?
		| L7_OOP L7_OP* L8_OP? L9_OP?
		| IF /*^OBJECT*/ IF_OR_NULLABLE_R
		| ELSE /*^OBJECT*/ ELSE_R
		| L9_OOP
		| "{" NESTED_EXPRESSION /*^NESTED*/ L_F
		| INC /*^OBJECT*/ /*^INC_OPERATION*/
		| DEC /*^OBJECT*/ /*^DEC_OPERATION*/
		| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/ L_F
		| eps /*^OBJECT*/
	)
	| "::" (
		identifier+ LESS /*^OBJECT*/ TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ (
			"{" NESTED_EXPRESSION /*^NESTED*/ OL_F
			| SBRACKET /*^OBJECT*/ INDEXER_R OL_F
			| BRACKET /*^OBJECT*/ FUNCTION_R OL_F
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| L8_OOP
			| L9_OOP
		)
		| "{" NESTED_EXPRESSION /*^NESTED*/ L_F
	)
	| ( reference | global ) /*^OBJECT*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/ L_F
	| interpolate ( INTERPOL_EXPRESSION interpolate )+ /*^INTERPOLATE_EXPR*/
	| "!" EXPRESSION /*^NOT_OPERATION*/
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| "~" SINGLE_EXPRESSION /*^BNOT_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| "-" SINGLE_EXPRESSION /*^NEGATE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| "$name" SINGLE_EXPRESSION /*^NAME_OPERATION*/
	| "$value" SINGLE_EXPRESSION /*^EXPRVAL_OPERATION*/
	| "$reference" SINGLE_EXPRESSION /*^REFER_OPERATION*/
	| "$len" SINGLE_EXPRESSION /*^LEN_OPERATION*/
	| "$size" SINGLE_EXPRESSION /*^SIZE_OPERATION*/
	| "$await" EXPRESSION /*^ASYNC_OPERATION*/
	| "{" BLOCK /*^CLOSURE*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| BRACKET SUB_EXPRESSION (
		L2_OP+ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L3_OP+ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OP L7_OP* L8_OP? L9_OP?
		| L7_OP+ L8_OP? L9_OP?
		| L8_OP
		| L9_OP
		| ASSIGN /*^TUPLE_BLOCK*/ EXPRESSION /*^TUPLE_ASSIGNING*/
		| eps
	)
	| "$lazy" EXPRESSION /*^LAZY_OPERATION*/

INTERPOL_EXPRESSION ::=
	identifier (
		identifier+ (
			( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ (
				BRACKET /*^OBJECT*/ FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| "{" /*^OBJECT*/ COLLECTION "}" /*^ COLLECTION_EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			)
			| SBRACKET /*^OBJECT*/ INDEXER_R
			| BRACKET /*^OBJECT*/ FUNCTION_R
			| DOT /*^OBJECT*/ MESSAGE /*^PROPERTY_OPERATION*/
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| IF /*^OBJECT*/ IF_R
			| ELSE /*^OBJECT*/ ELSE_R
			| L9_OOP
			| LESS /*^OBJECT*/ TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ (
				"{" NESTED_EXPRESSION /*^NESTED*/ OL_F
				| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ /*^OBJECT*/ BRACKET FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| SBRACKET /*^OBJECT*/ INDEXER_R OL_F
				| BRACKET /*^OBJECT*/ FUNCTION_R OL_F
				| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
				| L6_OOP L7_OP* L8_OP? L9_OP?
				| L7_OOP L7_OP* L8_OP? L9_OP?
				| L8_OOP
				| L9_OOP
			)
			| eps /*^OBJECT*/
		)
		| reference (
			SBRACKET /*^OBJECT*/ INDEXER_R
			| L2_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OOP L7_OP* L8_OP? L9_OP?
			| L7_OOP L7_OP* L8_OP? L9_OP?
			| L8_OOP
			| L9_OOP
			| eps /*^OBJECT*/
		)
		| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ (
			BRACKET FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
			| "{" /*^OBJECT*/ COLLECTION "}" /*^ COLLECTION_EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		)
		| SBRACKET /*^OBJECT*/ INDEXER_R
		| BRACKET /*^OBJECT*/ FUNCTION_R
		| DOT /*^OBJECT*/ MESSAGE /*^PROPERTY_OPERATION*/
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F
		| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OOP L7_OP* L8_OP? L9_OP?
		| LESS /*^OBJECT*/ L6_EXPRESSION /*^LESS_OPERATION*/ L7_OP* L8_OP? L9_OP?
		| L7_OOP L7_OP* L8_OP? L9_OP?
		| ELSE /*^OBJECT*/ ELSE_R
		| L9_OOP
		| ( integer | hexinteger | long | real ) /*^OBJECT*/ L_F
		| eps /*^OBJECT*/
	)
	| ( reference | global ) /*^OBJECT*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| ( integer | hexinteger | long | real ) /*^OBJECT*/ L_F
	| BRACKET SUB_EXPRESSION (
		L2_OP+ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L3_OP+ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OP L7_OP* L8_OP? L9_OP?
		| L7_OP+ L8_OP? L9_OP?
		| L8_OP
		| L9_OP
		| eps
	)

SUB_EXPRESSION ::=
	identifier (
		identifier+ (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ (
				identifier ")" "{" /*^ PARAMETER_BLOCK*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
				| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP*
				| "{" /*^OBJECT*/ COLLECTION "}" /*^ COLLECTION_EXPRESSION*/ L3_OP* ) ")"
			| ":" /*^OBJECT*/ /*^EXPRESSION*/ identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/ /*^EXPRESSION*/ ")"
			| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L3_OOP L3_OP* (
				":" identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/ /*^EXPRESSION*/
				| L4_OP+ L5_OP*  L6_OP? L7_OP* L8_OP? L9_OP?
				| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
				| L6_OP L7_OP* L8_OP? L9_OP?
				| L7_OP+ L8_OP? L9_OP?
				| L8_OP L9_OP?
				| L9_OP
				| eps ) TUPLE_R? ")"
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L6_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L7_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L8_OOP TUPLE_R? ")"
			| L9_OOP TUPLE_R? ")"
			| LESS /*^OBJECT*/ TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ (
				"{" NESTED_EXPRESSION /*^NESTED*/ OL_F TUPLE_R? ")"
				| identifier (
					"=>" /*^ OBJECT*/ /*^ EXPRESSION*/ /*^ PARAMETER_BLOCK*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
					| "," /*^ OBJECT*/ /*^ EXPRESSION*/ EXPRESSION ( "," EXPRESSION )* (
						"=>" /*^ PARAMETER_BLOCK*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
						| ")" (
							"{" /*^ PARAMETER_BLOCK*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
							| eps /*^TUPLE_COLLECTION*/ )
						)
					| ")" (
						"{" /*^ PARAMETER*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
						| eps /*^OBJECT*/ )
				)
				| BRACKET /*^OBJECT*/ FUNCTION_R OL_F TUPLE_R? ")"
				| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
				| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
				| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
				| L6_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
				| L7_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
				| L8_OOP TUPLE_R? ")"
				| L9_OOP TUPLE_R? ")"
			)
			| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
			| "=>" /*^ PARAMETER*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
			| "," /*^ OBJECT*/ /*^ EXPRESSION*/ EXPRESSION ( "," EXPRESSION )* (
				"=>" /*^ PARAMETER_BLOCK*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
				| ")" (
					"{" /*^ PARAMETER_BLOCK*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
					| eps /*^TUPLE_COLLECTION*/
				)
			)
			| ")" (
				"{" /*^ PARAMETER*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
				| eps /*^OBJECT*/ )
		)
		| reference (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_F TUPLE_R? ")"
			| L2_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L6_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L7_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
			| L8_OOP TUPLE_R? ")"
			| L9_OOP TUPLE_R? ")"
			| TUPLE_OR ")"
			| ")" /*^OBJECT*/
		)
		| ":" /*^OBJECT*/ /*^EXPRESSION*/ identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/ /*^EXPRESSION*/ ")"
		| SBRACKET /*^OBJECT*/ INDEXER_R L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| L3_OOP L3_OP* (
			":" identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/ /*^EXPRESSION*/
			| L4_OP+ L5_OP*  L6_OP? L7_OP* L8_OP? L9_OP?
			| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
			| L6_OP L7_OP* L8_OP? L9_OP?
			| L7_OP+ L8_OP? L9_OP?
			| L8_OP L9_OP?
			| L9_OP
			| eps ) TUPLE_R? ")"
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F TUPLE_R? ")"
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F TUPLE_R? ")"
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F TUPLE_R? ")"
		| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| L6_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| LESS /*^OBJECT*/ L6_EXPRESSION /*^LESS_OPERATION*/ L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| L7_OOP L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| L8_OOP ")"
		| L9_OOP ")"
		| ( DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )+ identifier (
			"=>" /*^ PARAMETER_BLOCK*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
			| ")" "{" /*^ PARAMETER_BLOCK*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
		)
		| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R? ")"
		| "=>" /*^ PARAMETER*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
		| "," /*^ OBJECT*/ /*^ EXPRESSION*/ EXPRESSION ( "," EXPRESSION )* (
			"=>" /*^ PARAMETER_BLOCK*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
			| ")" (
				"{" /*^ PARAMETER_BLOCK*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
				| eps /*^TUPLE_COLLECTION*/
			)
		)
		| ")" (
			"{" /*^ PARAMETER*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
			| eps /*^OBJECT*/
		)
	)
	| ( reference | global ) /*^OBJECT*/ SUB_L_F ")"
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/ SUB_L_F ")"
	| "!" EXPRESSION /*^NOT_OPERATION*/ ")"
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ SUB_L_F ")"
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ SUB_L_F ")"
	| "~" SINGLE_EXPRESSION /*^BNOT_OPERATION*/ SUB_L_F ")"
	| "-" SINGLE_EXPRESSION /*^NEGATE_OPERATION*/ SUB_L_F ")"
	| "$name" SINGLE_EXPRESSION /*^NAME_OPERATION*/ ")"
	| "$reference" SINGLE_EXPRESSION /*^REFER_OPERATION*/ ")"
	| "$len" SINGLE_EXPRESSION /*^LEN_OPERATION*/ ")"
	| "$size" SINGLE_EXPRESSION /*^SIZE_OPERATION*/ ")"
	| "{" BLOCK /*^CLOSURE*/ SUB_L_F ")"
	| BRACKET SUB_EXPRESSION SUB_L_F ")"

SUB_SINGLE_EXPRESSION ::=
	identifier (
		identifier+ (
			SBRACKET /*^OBJECT*/ INDEXER_R L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
			| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
			| L3_OOP L3_OP* L4_OP* L5_OP*  L6_OP? L7_OP* L8_OP? L9_OP? ")"
			| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
			| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
			| L6_OOP L7_OP* L8_OP? L9_OP? ")"
			| L7_OOP L7_OP* L8_OP? L9_OP? ")"
			| L8_OOP ")"
			| L9_OOP ")"
			| LESS /*^OBJECT*/ TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ (
				"{" NESTED_EXPRESSION /*^NESTED*/ OL_F ")"
				| BRACKET /*^OBJECT*/ FUNCTION_R OL_F ")"
				| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
				| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
				| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
				| L6_OOP L7_OP* L8_OP? L9_OP? ")"
				| L7_OOP L7_OP* L8_OP? L9_OP? ")"
				| L8_OOP ")"
				| L9_OOP ")"
			)
			| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
			| ")" /*^OBJECT*/
		)
		| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
		| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F ")"
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F ")"
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ OL_F ")"
 		| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
		| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
		| L6_OOP L7_OP* L8_OP? L9_OP? ")"
		| LESS /*^OBJECT*/ L6_EXPRESSION /*^LESS_OPERATION*/ L7_OP* L8_OP? L9_OP? ")"
		| L7_OOP L7_OP* L8_OP? L9_OP? ")"
		| L8_OOP ")"
		| L9_OOP ")"
		| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
		| ")" /*^OBJECT*/
	)
	| reference /*^OBJECT*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
	| "!" EXPRESSION /*^NOT_OPERATION*/ ")"
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
	| "~" SINGLE_EXPRESSION /*^BNOT_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
	| "-" SINGLE_EXPRESSION /*^NEGATE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"
	| "$name" SINGLE_EXPRESSION /*^NAME_OPERATION*/ ")"
	| "$reference" SINGLE_EXPRESSION /*^REFER_OPERATION*/ ")"
	| "$len" SINGLE_EXPRESSION /*^LEN_OPERATION*/ ")"
	| "$size" SINGLE_EXPRESSION /*^SIZE_OPERATION*/ ")"
	| BRACKET SUB_EXPRESSION L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? ")"

L4_EXPRESSION ::=
	identifier (
		identifier+ (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP*
			| L2_OOP L2_OP* L3_OP*
			| L3_OOP L3_OP*
			| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP*
			| eps /*^OBJECT*/
		)
		| "::=" /*^OBJECT*/ SINGLE_EXPRESSION /*^KEY_VALUE_EXPRESSION*/
		| SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP*
		| L2_OOP L2_OP* L3_OP*
		| L3_OOP L3_OP*
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP*
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP*
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP*
		| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP*
		| eps /*^OBJECT*/
	)
	| ( reference | global ) /*^OBJECT*/ L2_OP* L3_OP*
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/	L3_OP*
	| "$name" SINGLE_EXPRESSION /*^NAME_OPERATION*/
	| "$reference" SINGLE_EXPRESSION /*^REFER_OPERATION*/
	| "$len" SINGLE_EXPRESSION /*^LEN_OPERATION*/
	| "$size" SINGLE_EXPRESSION /*^SIZE_OPERATION*/
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ L2_OP* L3_OP*
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ L2_OP* L3_OP*
	| "~" SINGLE_EXPRESSION /*^BNOT_OPERATION*/ L2_OP* L3_OP*
	| "-" SINGLE_EXPRESSION /*^NEGATE_OPERATION*/ L2_OP* L3_OP*
	| "{" BLOCK /*^CLOSURE*/ L2_OP* L3_OP*
	| BRACKET SUB_EXPRESSION L2_OP* L3_OP*

L5_EXPRESSION ::=
	identifier (
		identifier+ (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP* L4_OP*
			| L2_OOP L2_OP* L3_OP* L4_OP*
			| L3_OOP L3_OP* L4_OP*
			| L4_OOP L4_OP*
			| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP*
			| eps /*^OBJECT*/
		)
		| "::=" /*^OBJECT*/ SINGLE_EXPRESSION /*^KEY_VALUE_EXPRESSION*/
		| SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP* L4_OP*
		| L2_OOP L2_OP* L3_OP* L4_OP*
		| L3_OOP L3_OP* L4_OP*
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP*
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP*
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP*
		| L4_OOP L4_OP*
		| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP*
		| eps /*^OBJECT*/
	)
	| reference /*^OBJECT*/ L2_OP* L3_OP* L4_OP*
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/	L3_OP* L4_OP*
	| "$name" SINGLE_EXPRESSION /*^NAME_OPERATION*/
	| "$reference" SINGLE_EXPRESSION /*^REFER_OPERATION*/
	| "$len" SINGLE_EXPRESSION /*^LEN_OPERATION*/
	| "$size" SINGLE_EXPRESSION /*^SIZE_OPERATION*/
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ L2_OP* L3_OP* L4_OP*
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ L2_OP* L3_OP* L4_OP*
	| "~" SINGLE_EXPRESSION /*^BNOT_OPERATION*/ L2_OP* L3_OP* L4_OP*
	| "-" SINGLE_EXPRESSION /*^NEGATE_OPERATION*/ L2_OP* L3_OP* L4_OP*
	| "{" BLOCK /*^CLOSURE*/ L2_OP* L3_OP* L4_OP*
	| BRACKET SUB_EXPRESSION L2_OP* L3_OP* L4_OP*

L6_EXPRESSION ::=
	identifier (
		identifier+ (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP* L4_OP* L5_OP*
			| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP*
			| L3_OOP L3_OP* L4_OP* L5_OP*
			| L4_OOp L4_OP* L5_OP*
			| L5_OOp L5_OP*
			| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP*
			| eps /*^OBJECT*/
		)
		| "::=" /*^OBJECT*/ SINGLE_EXPRESSION /*^KEY_VALUE_EXPRESSION*/
		| SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP* L4_OP* L5_OP*
		| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP*
		| L3_OOP L3_OP* L4_OP* L5_OP*
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP* L5_OP*
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP* L5_OP*
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP* L5_OP*
		| L4_OOP L4_OP* L5_OP*
		| L5_OOP L5_OP*
		| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP*
		| eps /*^OBJECT*/
	)
	| ( reference | global ) /*^OBJECT*/ L2_OP* L3_OP* L4_OP* L5_OP*
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/	L3_OP* L4_OP* L5_OP*
	| "$name" SINGLE_EXPRESSION /*^NAME_OPERATION*/
	| "$reference" SINGLE_EXPRESSION /*^REFER_OPERATION*/
	| "$len" SINGLE_EXPRESSION /*^LEN_OPERATION*/
	| "$size" SINGLE_EXPRESSION /*^SIZE_OPERATION*/
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP*
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP*
	| "~" SINGLE_EXPRESSION /*^BNOT_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP*
	| "-" SINGLE_EXPRESSION /*^NEGATE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP*
	| "{" BLOCK /*^CLOSURE*/ L2_OP* L3_OP* L4_OP* L5_OP*
	| BRACKET SUB_EXPRESSION L2_OP* L3_OP* L4_OP* L5_OP*

L7_EXPRESSION ::=
	identifier (
		identifier+ (
			SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
			| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
			| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP?
			| L4_OOP L4_OP* L5_OP* L6_OP?
			| L5_OOP L5_OP* L6_OP?
			| L6_OOP
			| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
			| eps /*^OBJECT*/
		)
		| "::=" /*^OBJECT*/ SINGLE_EXPRESSION /*^KEY_VALUE_EXPRESSION*/
		| SBRACKET /*^OBJECT*/ INDEXER_R L0_OP* L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
		| L2_OOP L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
		| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP?
		| IF_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^IF_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP?
		| ELSE_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ELSE_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP?
		| ALT_DOT /*^OBJECT*/ MESSAGE? CALL_R /*^ALT_OPERATION*/ /*^OPERATION_TEMPLATE*/ /*^EXPRESSION*/ L3_OP* L4_OP* L5_OP* L6_OP?
		| L4_OOP L4_OP* L5_OP* L6_OP?
		| L5_OOP L5_OP* L6_OP?
		| L6_OOP
		| LESS /*^OBJECT*/ L6_EXPRESSION /*^LESS_OPERATION*/
		| "{" NESTED_EXPRESSION /*^NESTED*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
		| eps /*^OBJECT*/
	)
	| reference /*^OBJECT*/ L3_OP* L6_OP?
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/	L3_OP* L4_OP* L5_OP* L6_OP?
	| "$name" SINGLE_EXPRESSION /*^NAME_OPERATION*/
	| "$reference" SINGLE_EXPRESSION /*^REFER_OPERATION*/
	| "$len" SINGLE_EXPRESSION /*^LEN_OPERATION*/
	| "$size" SINGLE_EXPRESSION /*^SIZE_OPERATION*/
	| "*" SINGLE_EXPRESSION /*^VALUE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
	| "&" SINGLE_EXPRESSION /*^CLOSURE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
	| "~" SINGLE_EXPRESSION /*^BNOT_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
	| "-" SINGLE_EXPRESSION /*^NEGATE_OPERATION*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
	| "{" BLOCK /*^CLOSURE*/ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?
	| BRACKET SUB_EXPRESSION L2_OP* L3_OP* L4_OP* L5_OP* L6_OP?

L8_EXPRESSION ::=
	"{" BLOCK /*^ CLOSURE*/

SINGLE_EXPRESSION ::=
	( identifier | reference | global )+ /*^OBJECT*/
	| ( string | integer | hexinteger | long | real | constant | character | wide ) /*^OBJECT*/
	| "(" SUB_SINGLE_EXPRESSION

L3_SINGLE_EXPRESSION ::=
	BRACKET identifier+ (
		"=>" /*^ PARAMETER*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
		| LESS TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">" /*^TEMPLATE_TYPE*/ identifier (
			"=>" /*^ PARAMETER*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
			| ")" "{" /*^ PARAMETER*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
		)
		| "," /*^ OBJECT*/ /*^ EXPRESSION*/ EXPRESSION ( "," EXPRESSION )* (
				"=>" /*^ PARAMETER_BLOCK*/ RET_EXPRESSION /*^CLOSURE*/ ")" /*^EXPRESSION*/
				| ")" "{" /*^ PARAMETER_BLOCK*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
			)
			| ")" "{" /*^ PARAMETER*/ BLOCK /*^CLOSURE*/ /*^EXPRESSION*/
	)

O_R ::=
	identifier /*^OBJECT*/ ( ASSIGN ASSIGN_R )?
	| BRACKET /*^OBJECT*/ FUNCTION_R L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L3_OOP L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L4_OOP L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L5_OOP L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L6_OOP L7_OP* L8_OP? L9_OP?
	| L7_OOP L7_OP* L8_OP? L9_OP?
	| L8_OOP
	| L9_OOP

RI_F ::=
	DOT /*^MESSAGE_OPERATION*/ MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
	| STAR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^MUL_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| DIV /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^DIV_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| BAND /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^BAND_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| BOR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^BOR_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| BXOR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^BXOR_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| SHL /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^SHL_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| SHR /*^MESSAGE_OPERATION*/ L4_EXPRESSION /*^SHR_OPERATION*/ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| MINUS /*^MESSAGE_OPERATION*/ L5_EXPRESSION /*^SUB_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| PLUS /*^MESSAGE_OPERATION*/ L5_EXPRESSION /*^ADD_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| EQUAL /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^EQUAL_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| NOTEQUAL /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^NOTEQUAL_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| GREATER /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^GREATER_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| NOTLESS /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^NOTLESS_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| NOTGREATER /*^MESSAGE_OPERATION*/ L6_EXPRESSION /*^NOTGREATER_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| AND /*^MESSAGE_OPERATION*/ L7_EXPRESSION /*^AND_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| OR /*^MESSAGE_OPERATION*/ L7_EXPRESSION /*^OR_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| XOR /*^MESSAGE_OPERATION*/ L7_EXPRESSION /*^OR_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| IF /*^MESSAGE_OPERATION*/ IF_R
	| ELSE /*^MESSAGE_OPERATION*/ ELSE_R
	| TRY /*^MESSAGE_OPERATION*/ TRY_R
	| FNL /*^MESSAGE_OPERATION*/ FNL_R
	| ALT /*^MESSAGE_OPERATION*/ ALT_R
	| ISNIL /*^MESSAGE_OPERATION*/ EXPRESSION /*^ISNIL_OPERATION*/

L_F ::=
	L0_OP+ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| ":" /*^EXPRESSION*/ identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/
	| L2_OP+ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L3_OP+ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
	| L6_OP L7_OP* L8_OP? L9_OP?
	| L7_OP+ L8_OP? L9_OP?
	| L8_OP
	| L9_OP
	| eps

SUB_L_F ::=
	L0_OP+ L2_OP* L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R?
	| L2_OP+ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R?
	| L3_OP+ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R?
	| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R?
	| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP? TUPLE_R?
	| L6_OP L7_OP* L8_OP? L9_OP? TUPLE_R?
	| L7_OP+ L8_OP? L9_OP? TUPLE_R?
	| L8_OP TUPLE_R?
	| L9_OP TUPLE_R?
	| TUPLE_OR
	| eps

OL_F ::=
	L3_OP+ L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
	| L6_OP L7_OP* L8_OP? L9_OP?
	| L7_OP+ L8_OP? L9_OP?
	| L8_OP
	| L9_OP
	| eps

L0_F ::=
	L0_OP L0_F
	| L1a_OP
	| L1_OP
	| L2_OP L2_F
        | DOT MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
	| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
	| L6_OP L7_OP* L8_OP? L9_OP?
	| L7_OP+ L8_OP? L9_OP?
	| L8_OP
	| L9_OP
	| eps

L2_F ::=
	L2_OP L2_F
        | DOT MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
	| ":" /*^EXPRESSION*/ identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/
	| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
	| L6_OP L7_OP* L8_OP? L9_OP?
	| L7_OP+ L8_OP? L9_OP?
	| L8_OP
	| L9_OP
	| eps

L3_F ::=
	DOT /*^PROPERTY_OPERATION*/ MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
	| ASSIGN EXPRESSION /*^PROPERTY_OPERATION*/
	| BRACKET MESSAGE_R (
		DOT MESSAGE ( L3_F | eps /*^PROPERTY_OPERATION*/ )
		| ":" /*^EXPRESSION*/ identifier TEMPLATE_ARG /*^ TEMPLATE_EXPR_BLOCK*/
		| L4_OP+ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
		| L5_OP+ L6_OP? L7_OP* L8_OP? L9_OP?
		| L6_OP L7_OP* L8_OP? L9_OP?
		| L7_OP+  L8_OP? L9_OP?
		| L8_OP
		| L9_OP
		| eps
	)
	| "::" L3_SINGLE_EXPRESSION /*^ MESSAGE_OPERATION*/ L3_OP* L4_OP* L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| STAR /*^PROPERTY_OPERATION*/ L4_EXPRESSION /*^MUL_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| DIV /*^PROPERTY_OPERATION*/ L4_EXPRESSION /*^DIV_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| BAND /*^PROPERTY_OPERATION*/ L4_EXPRESSION /*^BAND_OPERATION*/
	| BOR /*^PROPERTY_OPERATION*/ L4_EXPRESSION /*^BOR_OPERATION*/
	| BXOR /*^PROPERTY_OPERATION*/ L4_EXPRESSION /*^BXOR_OPERATION*/
	| SHL /*^PROPERTY_OPERATION*/ L4_EXPRESSION /*^SHL_OPERATION*/
	| SHR /*^PROPERTY_OPERATION*/ L4_EXPRESSION /*^SHR_OPERATION*/
	| MINUS /*^PROPERTY_OPERATION*/ L5_EXPRESSION /*^SUB_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
	| PLUS /*^PROPERTY_OPERATION*/ L5_EXPRESSION /*^ADD_OPERATION*/ L5_OP* L6_OP? L7_OP* L8_OP? L9_OP?
        | EQUAL /*^PROPERTY_OPERATION*/ L6_EXPRESSION /*^EQUAL_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| NOTEQUAL /*^PROPERTY_OPERATION*/ L6_EXPRESSION /*^NOTEQUAL_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| GREATER /*^PROPERTY_OPERATION*/ L6_EXPRESSION /*^GREATER_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| NOTLESS /*^PROPERTY_OPERATION*/ L6_EXPRESSION /*^NOTLESS_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| NOTGREATER /*^PROPERTY_OPERATION*/ L6_EXPRESSION /*^NOTGREATER_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| LESS /*^PROPERTY_OPERATION*/ L6_EXPRESSION /*^LESS_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| AND /*^PROPERTY_OPERATION*/ L7_EXPRESSION /*^AND_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| OR /*^PROPERTY_OPERATION*/ L7_EXPRESSION /*^OR_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| XOR /*^PROPERTY_OPERATION*/ L7_EXPRESSION /*^OR_OPERATION*/ L7_OP* L8_OP? L9_OP?
	| IF /*^PROPERTY_OPERATION*/ IF_R
	| ELSE /*^PROPERTY_OPERATION*/ ELSE_R
	| TRY /*^PROPERTY_OPERATION*/ TRY_R
	| ALT /*^PROPERTY_OPERATION*/ ALT_R
	| FNL /*^PROPERTY_OPERATION*/ FNL_R
	| ISNIL /*^PROPERTY_OPERATION*/ EXPRESSION /*^ISNIL_OPERATION*/

L0_OP ::=
	SBRACKET INDEXER_R

L1_OP ::=
	ASSIGN EXPRESSION /*^ASSIGN_OPERATION*/

L1a_OOP ::=
	APPEND /*^OBJECT*/ EXPRESSION /*^ADDITION_ASSIGNMENT*/
	| REDUCE /*^OBJECT*/ EXPRESSION /*^SUB_ASSIGNMENT*/
	| AMUL /*^OBJECT*/ EXPRESSION /*^MUL_ASSIGNMENT*/
	| ADIV /*^OBJECT*/ EXPRESSION /*^DIV_ASSIGNMENT*/

L1a_OP ::=
	APPEND EXPRESSION /*^ADDITION_ASSIGNMENT*/
	| REDUCE EXPRESSION /*^SUB_ASSIGNMENT*/
	| AMUL EXPRESSION /*^MUL_ASSIGNMENT*/
	| ADIV EXPRESSION /*^DIV_ASSIGNMENT*/

L2_OP ::=
	BRACKET	FUNCTION_R

L2_OOP ::=
	BRACKET /*^OBJECT*/ FUNCTION_R

L3_OP ::=
	DOT MESSAGE CALL_R

L3_OOP ::=
	DOT /*^OBJECT*/ MESSAGE CALL_R

L4_OP ::=
	STAR L4_EXPRESSION /*^MUL_OPERATION*/
	| DIV L4_EXPRESSION /*^DIV_OPERATION*/
	| BAND L4_EXPRESSION /*^BAND_OPERATION*/
	| BOR L4_EXPRESSION /*^BOR_OPERATION*/
	| BXOR L4_EXPRESSION /*^BXOR_OPERATION*/
	| SHL L4_EXPRESSION /*^SHL_OPERATION*/
	| SHR L4_EXPRESSION /*^SHR_OPERATION*/

L4_OOP ::=
	STAR /*^OBJECT*/ L4_EXPRESSION /*^MUL_OPERATION*/
	| DIV /*^OBJECT*/ L4_EXPRESSION /*^DIV_OPERATION*/
	| BAND /*^OBJECT*/ L4_EXPRESSION /*^BAND_OPERATION*/
	| BOR /*^OBJECT*/ L4_EXPRESSION /*^BOR_OPERATION*/
	| BXOR /*^OBJECT*/ L4_EXPRESSION /*^BXOR_OPERATION*/
	| SHL /*^OBJECT*/ L4_EXPRESSION /*^SHL_OPERATION*/
	| SHR /*^OBJECT*/ L4_EXPRESSION /*^SHR_OPERATION*/

L5_OP ::=
	MINUS L5_EXPRESSION /*^SUB_OPERATION*/
	| PLUS L5_EXPRESSION /*^ADD_OPERATION*/

L5_OOP ::=
	MINUS /*^OBJECT*/ L5_EXPRESSION /*^SUB_OPERATION*/
	| PLUS /*^OBJECT*/ L5_EXPRESSION /*^ADD_OPERATION*/

L6_OP ::=
	EQUAL L6_EXPRESSION /*^EQUAL_OPERATION*/
	| NOTEQUAL L6_EXPRESSION /*^NOTEQUAL_OPERATION*/
	| GREATER L6_EXPRESSION /*^GREATER_OPERATION*/
	| NOTLESS L6_EXPRESSION /*^NOTLESS_OPERATION*/
	| NOTGREATER L6_EXPRESSION /*^NOTGREATER_OPERATION*/
	| LESS L6_EXPRESSION /*^LESS_OPERATION*/

L6_OOP ::=
	EQUAL /*^OBJECT*/ L6_EXPRESSION /*^EQUAL_OPERATION*/
	| NOTEQUAL /*^OBJECT*/ L6_EXPRESSION /*^NOTEQUAL_OPERATION*/
	| GREATER /*^OBJECT*/ L6_EXPRESSION /*^GREATER_OPERATION*/
	| NOTLESS /*^OBJECT*/ L6_EXPRESSION /*^NOTLESS_OPERATION*/
	| NOTGREATER /*^OBJECT*/ L6_EXPRESSION /*^NOTGREATER_OPERATION*/

L7_OP ::=
	AND L7_EXPRESSION /*^AND_OPERATION*/
	| OR L7_EXPRESSION /*^OR_OPERATION*/
	| XOR L7_EXPRESSION /*^XOR_OPERATION*/

L7_OOP ::=
	AND /*^OBJECT*/ L7_EXPRESSION /*^AND_OPERATION*/
	| OR /*^OBJECT*/ L7_EXPRESSION /*^OR_OPERATION*/
	| XOR /*^OBJECT*/ L7_EXPRESSION /*^OR_OPERATION*/

L8_OP ::=
	IF IF_R
	| ELSE ELSE_R

L8_OOP ::=
	IF /*^OBJECT*/ IF_R
	| ELSE /*^OBJECT*/ ELSE_R

L9_OP ::=
	TRY TRY_R
	| FNL FNL_R
	| ALT ALT_R
	| ISNIL EXPRESSION /*^ISNIL_OPERATION*/

L9_OOP ::=
	TRY /*^OBJECT*/ TRY_R
	| FNL /*^OBJECT*/ FNL_R
	| ALT /*^OBJECT*/ ALT_R
	| ISNIL /*^OBJECT*/ EXPRESSION /*^ISNIL_OPERATION*/

INDEXER_R ::=
	EXPRESSION "]" /*^INDEXER_OPERATION*/

ASSIGN_R ::=
	EXPRESSION /*^ASSIGN_OPERATION*/

FUNCTION_R ::=
	MESSAGE_PARAMETERS ")" /*^MESSAGE_OPERATION*/
	| ")" /*^MESSAGE_OPERATION*/

CALL_R ::=
	BRACKET MESSAGE_R
	| "::" L3_SINGLE_EXPRESSION /*^ MESSAGE_OPERATION*/
	| eps /*^PROPERTY_OPERATION*/

MESSAGE_R ::=
	MESSAGE_PARAMETERS ")" /*^ MESSAGE_OPERATION*/
	| ")" /*^ MESSAGE_OPERATION*/

IF_R ::=
	L8_EXPRESSION ( eps /*^IF_OPERATION*/ | "!" L8_EXPRESSION /*^IF_ELSE_OPERATION*/ )
	| SINGLE_EXPRESSION ":" SINGLE_EXPRESSION /*^IF_ELSE_OPERATION*/

IF_OR_NULLABLE_R ::=
	L8_EXPRESSION ( eps /*^IF_OPERATION*/ | "!" L8_EXPRESSION /*^IF_ELSE_OPERATION*/ )
	| SINGLE_EXPRESSION (
		ASSIGN /*^NULLABLE_TYPE*/ ASSIGN_R
		| ":" SINGLE_EXPRESSION /*^IF_ELSE_OPERATION*/
		| eps /*^NULLABLE_TYPE*/ )

ELSE_R ::=
	L8_EXPRESSION /*^ELSE_OPERATION*/

TRY_R ::=
	CATCH ( FNL FINALLY )? /*^CATCH_OPERATION*/

FNL_R ::=
	FINALLY /*^FINAL_OPERATION*/

ALT_R ::=
	CATCH /*^ALT_OPERATION*/

TUPLE_R ::=
	"," /*^EXPRESSION*/ EXPRESSION ( "," EXPRESSION )* /*^TUPLE_COLLECTION*/

TUPLE_OR ::=
	"," /*^EXPRESSION*/  EXPRESSION ( "," EXPRESSION )* /*^TUPLE_COLLECTION*/

RESEND_R ::=
	"(" MESSAGE_PARAMETERS? ")" /*^ MESSAGE_OPERATION*/
	| eps /*^PROPERTY_OPERATION*/

INCLUDE_STATEMENT ::=
	( identifier | reference )+ /*^ OBJECT*/

COMPLEX_NAME ::=
	identifier

DIMENSION ::=
        integer
        | hexinteger
	| identifier

DICTIONARY ::=
	identifier+

SHARED_DICTIONARY ::=
	identifier+

LOAD_STATEMENT ::=
	( reference | identifier )

CLEAR_STATEMENT ::=
	identifier

PARAMETER ::=
	identifier+ (
		DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ identifier
		| TEMPLATE_BRACKETS identifier
		| "?" /*^NULLABLE_TYPE*/ identifier
		| eps
	)
	| reference identifier

SUB_VARIABLE ::=
	identifier+ (
		DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ identifier
		| TEMPLATE_BRACKETS identifier
		| eps )

TEMPLATE_BRACKETS ::=
	"<" TEMPLATE_ARG ( "," TEMPLATE_ARG )* ">"

TEMPLATE_ARG ::=
	identifier (TEMPLATE_BRACKETS /*^ TEMPLATE_TYPE*/ | DYNAMIC_DIMENSION /*^ARRAY_TYPE*/ )?
	| reference
	| global

POSTFIXES ::=
	":" POSTFIX ( "," POSTFIX )*

POSTFIX ::=
	identifier (
		"(" ( MESSAGE_PARAMETER ( "," MESSAGE_PARAMETER )* )? ")" /*^ INLINE*/
		| TEMPLATE_BRACKETS (
			"(" ( MESSAGE_PARAMETER ( "," MESSAGE_PARAMETER )* )? ")" /*^ENUM_POSTFIX*/
			| eps /*^ TEMPLATE_TYPE*/ )
		| eps )

MESSAGE_PARAMETERS ::=
	MESSAGE_PARAMETER ( "," MESSAGE_PARAMETER )*

MESSAGE_PARAMETER ::=
	EXPRESSION

MESSAGE ::=
	identifier

COLLECTION ::=
	EXPRESSION ( "," EXPRESSION )*

TUPLE_TYPE ::=
	SUB_DECLARATION ( "," SUB_DECLARATION )+

CATCH ::=
	MESSAGE (
		BRACKET MESSAGE_R
		| "::" L3_SINGLE_EXPRESSION /*^ MESSAGE_OPERATION*/
	)

FINALLY ::=
	L7_EXPRESSION

RESEND ::=
	identifier+ RESEND_R


SWITCH_OPTION ::=
	identifier /*^ OBJECT*/ SWITCH_CODE
	| ( integer | character | string ) /*^ OBJECT*/ SWITCH_CODE

SWITCH_LAST_OPTION ::=
	"!" SWITCH_CODE

SWITCH_CODE ::=
	"{" BLOCK

DYNAMIC_DIMENSION ::=
	"[]"

DOT        ::= "."
IF         ::= "?"
ELSE       ::= "!"
BRACKET    ::= "("
SBRACKET   ::= "["
ASSIGN     ::= ":="
EQUAL      ::= "=="
NOTEQUAL   ::= "!="
LESS       ::= "<"
GREATER    ::= ">"
NOTLESS    ::= ">="
NOTGREATER ::= "<="
APPEND     ::= "+="
REDUCE     ::= "-="
AMUL       ::= "*="
ADIV       ::= "/="
TRY        ::= "\\"
ALT        ::= "\"
MINUS      ::= "-"
PLUS       ::= "+"
STAR       ::= "*"
DIV        ::= "/"
FNL        ::= "$fnl"
ISNIL      ::= "??"
BAND       ::= "&"
BOR        ::= "|"
BXOR       ::= "^"
SHL        ::= "$shl"
SHR        ::= "$shr"
AND        ::= "&&"
OR         ::= "||"
XOR        ::= "^^"
IF_DOT     ::= "?."
ELSE_DOT   ::= "!."
ALT_DOT    ::= "\."
INC        ::= "++"
DEC        ::= "--"

DECLARATION_END ::=
	";"

END_OF_BLOCK ::=
	"}"
	| BLOCK_CLOSING_EXPECTED

BLOCK_CLOSING_EXPECTED ::=
	eof
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant