This gives 66 shift/reduce conflicts
initializer
: '{' initializer_list '}'
| '{' initializer_list ',' '}'
| '{' preprocessor_list initializer_list '}'
;
preprocessor_list
: preprocessor
| preprocessor_list preprocessor
;
but this works:
initializer
: '{' initializer_list '}'
| '{' initializer_list ',' '}'
| '{' preprocessor initializer_list '}'
| '{' preprocessor preprocessor initializer_list '}
| '{' preprocessor preprocessor preprocessor initializer_list '}'
;
Please find below the definition of initializer list:
initializer_list
: designation initializer
| preprocessor
| preprocessor initializer_list ','
| preprocessor initializer_list ',' preprocessor_list
| initializer_list ',' preprocessor_list designation initializer
| initializer_list ',' designation initializer
| initializer_list ',' initializer
;
designation
: designator_list '='
;
designator_list
: designator
| designator_list designator
;
designator
: '[' constant_expression ']'
| '.' IDENTIFIER
;
Rules for preprocessor:
preprocessor
: hash_define BLACK_SPACE define_expression
| hash_else NEW_LINE
| hash_if BLACK_SPACE unary_expression NEW_LINE
| hash_ifdef BLACK_SPACE unary_expression NEW_LINE
| hash_ifndef BLACK_SPACE unary_expression NEW_LINE
| hash_ident BLACK_SPACE STRING_LITERAL NEW_LINE
| hash_include STRING_LITERAL
{printf("string identified in #include\n");}
NEW_LINE {printf("#include with quotes\n");}
| hash_include '<' filepath '>' NEW_LINE
| hash_line BLACK_SPACE I_CONSTANT NEW_LINE
| hash_line BLACK_SPACE I_CONSTANT {enable_space = 1;}
BLACK_SPACE STRING_LITERAL NEW_LINE
| hash_undef BLACK_SPACE IDENTIFIER NEW_LINE
| hash_LINK BLACK_SPACE STRING_LITERAL NEW_LINE
| hash_endif NEW_LINE
;