2.2 Rule Inlining primary_expression
Firstly, we can do SLRR and simplification with primary_no_array_creation_expression:
primary_no_array_creation_expression : (literal | simple_name | parenthesized_expression | member_access | invocation_expression | this_access | base_access | post_increment_expression | post_decrement_expression | object_creation_expression | delegate_creation_expression | anonymous_object_creation_expression | typeof_expression | checked_expression | unchecked_expression | default_value_expression | anonymous_method_expression | sizeof_expression | primary_expression OP_PTR IDENTIFIER ) (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* ;
The rest of the rule inlining is simple. It leads to
primary_expression : array_creation_expression | (literal | simple_name | parenthesized_expression | primary_expression DOT IDENTIFIER type_argument_list? | predefined_type DOT IDENTIFIER type_argument_list? | qualified_alias_member DOT IDENTIFIER type_argument_list? | primary_expression OPEN_PARENS argument_list? CLOSE_PARENS | this_access | base_access | primary_expression OP_INC | primary_expression OP_DEC | object_creation_expression | delegate_creation_expression | anonymous_object_creation_expression | typeof_expression | checked_expression | unchecked_expression | default_value_expression | anonymous_method_expression | sizeof_expression | primary_expression OP_PTR IDENTIFIER ) (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* ;
This point seems to be problematic. primary_expression is actually SLR. But due to the parentheses ANTLR considers them MLR. In-factoring is the only and somewhat ugly solution to allow SLRR:
primary_expression : (array_creation_expression | literal (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | simple_name (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | parenthesized_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | predefined_type DOT IDENTIFIER type_argument_list? (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | qualified_alias_member DOT IDENTIFIER type_argument_list? (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | this_access (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | base_access (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | object_creation_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | delegate_creation_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | anonymous_object_creation_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | typeof_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | checked_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | unchecked_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | default_value_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | anonymous_method_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* | sizeof_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)* ) ( (DOT IDENTIFIER type_argument_list? | OPEN_PARENS argument_list? CLOSE_PARENS | OP_INC | OP_DEC | OP_PTR IDENTIFIER ) (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)*)* ;
The only simplification which preserves the equivalence without checking for validity would be the out-factoring of "(OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)*", but as I use a second pass for my compiler a further simplification can be done.
The first move is to pretend the line "array_creation_expression (OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET)*" and out-factor the inner trailing. Thus the outer trailing can be turn into:
primary_expression : (array_creation_expression | literal | simple_name | parenthesized_expression | predefined_type DOT IDENTIFIER type_argument_list? | qualified_alias_member DOT IDENTIFIER type_argument_list? | this_access | base_access | object_creation_expression | delegate_creation_expression | anonymous_object_creation_expression | typeof_expression | checked_expression | unchecked_expression | default_value_expression | anonymous_method_expression | sizeof_expression ) (DOT IDENTIFIER type_argument_list? | OPEN_PARENS argument_list? CLOSE_PARENS | OP_INC | OP_DEC | OP_PTR IDENTIFIER | OPEN_BRACKET (expression_list | expression) CLOSE_BRACKET )* ;
For now we can leave this rule like this and move on.
Sections
My siblings (including me):