Revision control
++ variable_identifier ::= IDENTIFIER ;
++ primary_expression ::= NUMBER ;
++ primary_expression ::= TRUE ;
++ primary_expression ::= FALSE ;
++ primary_expression ::= variable_identifier ;
++ primary_expression ::= LEFT_PAREN expression RIGHT_PAREN ;
++ postfix_expression ::= primary_expression ;
++ postfix_expression ::= postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET ;
++ postfix_expression ::= function_call ;
++ postfix_expression ::= postfix_expression DOT IDENTIFIER ;
++ postfix_expression ::= postfix_expression INC_OP ;
++ postfix_expression ::= postfix_expression DEC_OP ;
++ integer_expression ::= expression ;
++ function_call ::= function_call_or_method ;
++ function_call_or_method ::= function_call_generic ;
++ function_call_or_method ::= postfix_expression DOT function_call_generic ;
++ function_call_generic ::= function_call_header_with_parameters RIGHT_PAREN ;
++ function_call_generic ::= function_call_header_no_parameters RIGHT_PAREN ;
++ function_call_header_no_parameters ::= function_call_header VOID ;
++ function_call_header_no_parameters ::= function_call_header ;
++ function_call_header_with_parameters ::= function_call_header assignment_expression ;
++ function_call_header_with_parameters ::= function_call_header_with_parameters COMMA assignment_expression ;
++ function_call_header ::= function_identifier LEFT_PAREN ;
++ function_identifier ::= type_specifier ;
++ function_identifier ::= IDENTIFIER ;
++ unary_expression ::= postfix_expression ;
++ unary_expression ::= INC_OP unary_expression ;
++ unary_expression ::= DEC_OP unary_expression ;
++ unary_expression ::= unary_operator unary_expression ;
++ unary_operator ::= PLUS ;
++ unary_operator ::= DASH ;
++ unary_operator ::= BANG ;
++ unary_operator ::= TILDE ;
++ multiplicative_expression ::= unary_expression ;
++ multiplicative_expression ::= multiplicative_expression STAR unary_expression ;
++ multiplicative_expression ::= multiplicative_expression SLASH unary_expression ;
++ multiplicative_expression ::= multiplicative_expression PERCENT unary_expression ;
++ additive_expression ::= multiplicative_expression ;
++ additive_expression ::= additive_expression PLUS multiplicative_expression ;
++ additive_expression ::= additive_expression DASH multiplicative_expression ;
++ shift_expression ::= additive_expression ;
++ shift_expression ::= shift_expression LEFT_OP additive_expression ;
++ shift_expression ::= shift_expression RIGHT_OP additive_expression ;
++ relational_expression ::= shift_expression ;
++ relational_expression ::= relational_expression LEFT_ANGLE shift_expression ;
++ relational_expression ::= relational_expression RIGHT_ANGLE shift_expression ;
++ relational_expression ::= relational_expression LE_OP shift_expression ;
++ relational_expression ::= relational_expression GE_OP shift_expression ;
++ equality_expression ::= relational_expression ;
++ equality_expression ::= equality_expression EQ_OP relational_expression ;
++ equality_expression ::= equality_expression NE_OP relational_expression ;
++ and_expression ::= equality_expression ;
++ and_expression ::= and_expression AMPERSAND equality_expression ;
++ exclusive_or_expression ::= and_expression ;
++ exclusive_or_expression ::= exclusive_or_expression CARET and_expression ;
++ inclusive_or_expression ::= exclusive_or_expression ;
++ inclusive_or_expression ::= inclusive_or_expression VERTICAL_BAR exclusive_or_expression ;
++ logical_and_expression ::= inclusive_or_expression ;
++ logical_and_expression ::= logical_and_expression AND_OP inclusive_or_expression ;
++ logical_xor_expression ::= logical_and_expression ;
++ logical_xor_expression ::= logical_xor_expression XOR_OP logical_and_expression ;
++ logical_or_expression ::= logical_xor_expression ;
++ logical_or_expression ::= logical_or_expression OR_OP logical_xor_expression ;
++ conditional_expression ::= logical_or_expression ;
++ conditional_expression ::= logical_or_expression QUESTION expression COLON assignment_expression ;
++ assignment_expression ::= conditional_expression ;
++ assignment_expression ::= unary_expression assignment_operator assignment_expression ;
++ assignment_operator ::= EQUAL ;
++ assignment_operator ::= MUL_ASSIGN ;
++ assignment_operator ::= DIV_ASSIGN ;
++ assignment_operator ::= MOD_ASSIGN ;
++ assignment_operator ::= ADD_ASSIGN ;
++ assignment_operator ::= SUB_ASSIGN ;
++ assignment_operator ::= LEFT_ASSIGN ;
++ assignment_operator ::= RIGHT_ASSIGN ;
++ assignment_operator ::= AND_ASSIGN ;
++ assignment_operator ::= XOR_ASSIGN ;
++ assignment_operator ::= OR_ASSIGN ;
++ expression ::= assignment_expression ;
++ expression ::= expression COMMA assignment_expression ;
++ constant_expression ::= conditional_expression ;
++ declaration ::= function_prototype SEMICOLON ;
++ declaration ::= init_declarator_list SEMICOLON ;
++ declaration ::= PRECISION precision_qualifier type_specifier_no_prec SEMICOLON ;
++ declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE SEMICOLON ;
++ declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER SEMICOLON ;
++ declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER LEFT_BRACKET RIGHT_BRACKET SEMICOLON ;
++ declaration ::= type_qualifier IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET SEMICOLON ;
++ declaration ::= type_qualifier SEMICOLON ;
++ function_prototype ::= function_declarator RIGHT_PAREN ;
++ function_declarator ::= function_header ;
++ function_declarator ::= function_header_with_parameters ;
++ function_header_with_parameters ::= function_header parameter_declaration ;
++ function_header_with_parameters ::= function_header_with_parameters COMMA parameter_declaration ;
++ function_header ::= fully_specified_type IDENTIFIER LEFT_PAREN ;
++ parameter_declarator ::= type_specifier IDENTIFIER ;
++ parameter_declarator ::= type_specifier IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
++ parameter_declaration ::= parameter_type_qualifier parameter_qualifier parameter_declarator ;
++ parameter_declaration ::= parameter_qualifier parameter_declarator ;
++ parameter_declaration ::= parameter_type_qualifier parameter_qualifier parameter_type_specifier ;
++ parameter_declaration ::= parameter_qualifier parameter_type_specifier ;
++ parameter_qualifier ::= empty ;
++ parameter_qualifier ::= IN ;
++ parameter_qualifier ::= OUT ;
++ parameter_qualifier ::= INOUT ;
++ parameter_type_specifier ::= type_specifier ;
++ init_declarator_list ::= single_declaration ;
++ init_declarator_list ::= init_declarator_list COMMA IDENTIFIER ;
++ init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET ;
++ init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
++ init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET RIGHT_BRACKET EQUAL initializer ;
++ init_declarator_list ::= init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET EQUAL initializer ;
++ init_declarator_list ::= init_declarator_list COMMA IDENTIFIER EQUAL initializer ;
++ single_declaration ::= fully_specified_type ;
++ single_declaration ::= fully_specified_type IDENTIFIER ;
++ single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET RIGHT_BRACKET ;
++ single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
++ single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET RIGHT_BRACKET EQUAL initializer ;
++ single_declaration ::= fully_specified_type IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET EQUAL initializer ;
++ single_declaration ::= fully_specified_type IDENTIFIER EQUAL initializer ;
++ single_declaration ::= INVARIANT IDENTIFIER ;
++ fully_specified_type ::= type_specifier ;
++ fully_specified_type ::= type_qualifier type_specifier ;
++ invariant_qualifier ::= INVARIANT ;
++ interpolation_qualifier ::= SMOOTH ;
++ interpolation_qualifier ::= FLAT ;
++ interpolation_qualifier ::= NOPERSPECTIVE ;
++ layout_qualifier ::= LAYOUT LEFT_PAREN layout_qualifier_id_list RIGHT_PAREN ;
++ layout_qualifier_id_list ::= layout_qualifier_id ;
++ layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ;
++ layout_qualifier_id ::= IDENTIFIER ;
++ layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ;
++ parameter_type_qualifier ::= CONST ;
++ type_qualifier ::= storage_qualifier ;
++ type_qualifier ::= layout_qualifier ;
++ type_qualifier ::= layout_qualifier storage_qualifier ;
++ type_qualifier ::= interpolation_qualifier storage_qualifier ;
++ type_qualifier ::= interpolation_qualifier ;
++ type_qualifier ::= invariant_qualifier storage_qualifier ;
++ type_qualifier ::= invariant_qualifier interpolation_qualifier storage_qualifier ;
++ type_qualifier ::= INVARIANT ;
++ storage_qualifier ::= CONST ;
++ storage_qualifier ::= ATTRIBUTE ;
++ storage_qualifier ::= VARYING ;
++ storage_qualifier ::= CENTROID VARYING ;
++ storage_qualifier ::= IN ;
++ storage_qualifier ::= OUT ;
++ storage_qualifier ::= CENTROID IN ;
++ storage_qualifier ::= CENTROID OUT ;
++ storage_qualifier ::= PATCH IN ;
++ storage_qualifier ::= PATCH OUT ;
++ storage_qualifier ::= SAMPLE IN ;
++ storage_qualifier ::= SAMPLE OUT ;
++ storage_qualifier ::= UNIFORM ;
++ type_specifier ::= type_specifier_no_prec ;
++ type_specifier ::= precision_qualifier type_specifier_no_prec ;
++ type_specifier_no_prec ::= type_specifier_nonarray ;
++ type_specifier_no_prec ::= type_specifier_nonarray LEFT_BRACKET RIGHT_BRACKET ;
++ type_specifier_no_prec ::= type_specifier_nonarray LEFT_BRACKET constant_expression RIGHT_BRACKET ;
++ type_specifier_nonarray ::= VOID ;
++ type_specifier_nonarray ::= FLOAT ;
++ type_specifier_nonarray ::= DOUBLE ;
++ type_specifier_nonarray ::= INT ;
++ type_specifier_nonarray ::= UINT ;
++ type_specifier_nonarray ::= BOOL ;
++ type_specifier_nonarray ::= VEC2 ;
++ type_specifier_nonarray ::= VEC3 ;
++ type_specifier_nonarray ::= VEC4 ;
++ type_specifier_nonarray ::= DVEC2 ;
++ type_specifier_nonarray ::= DVEC3 ;
++ type_specifier_nonarray ::= DVEC4 ;
++ type_specifier_nonarray ::= BVEC2 ;
++ type_specifier_nonarray ::= BVEC3 ;
++ type_specifier_nonarray ::= BVEC4 ;
++ type_specifier_nonarray ::= IVEC2 ;
++ type_specifier_nonarray ::= IVEC3 ;
++ type_specifier_nonarray ::= IVEC4 ;
++ type_specifier_nonarray ::= UVEC2 ;
++ type_specifier_nonarray ::= UVEC3 ;
++ type_specifier_nonarray ::= UVEC4 ;
++ type_specifier_nonarray ::= MAT2 ;
++ type_specifier_nonarray ::= MAT3 ;
++ type_specifier_nonarray ::= MAT4 ;
++ type_specifier_nonarray ::= MAT2X2 ;
++ type_specifier_nonarray ::= MAT2X3 ;
++ type_specifier_nonarray ::= MAT2X4 ;
++ type_specifier_nonarray ::= MAT3X2 ;
++ type_specifier_nonarray ::= MAT3X3 ;
++ type_specifier_nonarray ::= MAT3X4 ;
++ type_specifier_nonarray ::= MAT4X2 ;
++ type_specifier_nonarray ::= MAT4X3 ;
++ type_specifier_nonarray ::= MAT4X4 ;
++ type_specifier_nonarray ::= DMAT2 ;
++ type_specifier_nonarray ::= DMAT3 ;
++ type_specifier_nonarray ::= DMAT4 ;
++ type_specifier_nonarray ::= DMAT2X2 ;
++ type_specifier_nonarray ::= DMAT2X3 ;
++ type_specifier_nonarray ::= DMAT2X4 ;
++ type_specifier_nonarray ::= DMAT3X2 ;
++ type_specifier_nonarray ::= DMAT3X3 ;
++ type_specifier_nonarray ::= DMAT3X4 ;
++ type_specifier_nonarray ::= DMAT4X2 ;
++ type_specifier_nonarray ::= DMAT4X3 ;
++ type_specifier_nonarray ::= DMAT4X4 ;
++ type_specifier_nonarray ::= SAMPLER1D ;
++ type_specifier_nonarray ::= SAMPLER2D ;
++ type_specifier_nonarray ::= SAMPLER3D ;
++ type_specifier_nonarray ::= SAMPLERCUBE ;
++ type_specifier_nonarray ::= SAMPLER1DSHADOW ;
++ type_specifier_nonarray ::= SAMPLER2DSHADOW ;
++ type_specifier_nonarray ::= SAMPLERCUBESHADOW ;
++ type_specifier_nonarray ::= SAMPLER1DARRAY ;
++ type_specifier_nonarray ::= SAMPLER2DARRAY ;
++ type_specifier_nonarray ::= SAMPLER1DARRAYSHADOW ;
++ type_specifier_nonarray ::= SAMPLER2DARRAYSHADOW ;
++ type_specifier_nonarray ::= SAMPLERCUBEARRAY ;
++ type_specifier_nonarray ::= SAMPLERCUBEARRAYSHADOW ;
++ type_specifier_nonarray ::= ISAMPLER1D ;
++ type_specifier_nonarray ::= ISAMPLER2D ;
++ type_specifier_nonarray ::= ISAMPLER3D ;
++ type_specifier_nonarray ::= ISAMPLERCUBE ;
++ type_specifier_nonarray ::= ISAMPLER1DARRAY ;
++ type_specifier_nonarray ::= ISAMPLER2DARRAY ;
++ type_specifier_nonarray ::= ISAMPLERCUBEARRAY ;
++ type_specifier_nonarray ::= USAMPLER1D ;
++ type_specifier_nonarray ::= USAMPLER2D ;
++ type_specifier_nonarray ::= USAMPLER3D ;
++ type_specifier_nonarray ::= USAMPLERCUBE ;
++ type_specifier_nonarray ::= USAMPLER1DARRAY ;
++ type_specifier_nonarray ::= USAMPLER2DARRAY ;
++ type_specifier_nonarray ::= USAMPLERCUBEARRAY ;
++ type_specifier_nonarray ::= SAMPLER2DRECT ;
++ type_specifier_nonarray ::= SAMPLER2DRECTSHADOW ;
++ type_specifier_nonarray ::= ISAMPLER2DRECT ;
++ type_specifier_nonarray ::= USAMPLER2DRECT ;
++ type_specifier_nonarray ::= SAMPLERBUFFER ;
++ type_specifier_nonarray ::= ISAMPLERBUFFER ;
++ type_specifier_nonarray ::= USAMPLERBUFFER ;
++ type_specifier_nonarray ::= SAMPLER2DMS ;
++ type_specifier_nonarray ::= ISAMPLER2DMS ;
++ type_specifier_nonarray ::= USAMPLER2DMS ;
++ type_specifier_nonarray ::= SAMPLER2DMSARRAY ;
++ type_specifier_nonarray ::= ISAMPLER2DMSARRAY ;
++ type_specifier_nonarray ::= USAMPLER2DMSARRAY ;
++ type_specifier_nonarray ::= struct_specifier ;
++ type_specifier_nonarray ::= TYPE_NAME ;
++ precision_qualifier ::= HIGHP ;
++ precision_qualifier ::= MEDIUMP ;
++ precision_qualifier ::= LOWP ;
++ struct_specifier ::= STRUCT IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE ;
++ struct_specifier ::= STRUCT LEFT_BRACE struct_declaration_list RIGHT_BRACE ;
++ struct_declaration_list ::= struct_declaration ;
++ struct_declaration_list ::= struct_declaration_list struct_declaration ;
++ struct_declaration ::= type_specifier struct_declarator_list SEMICOLON ;
++ struct_declaration ::= type_qualifier type_specifier struct_declarator_list SEMICOLON ;
++ struct_declarator_list ::= struct_declarator ;
++ struct_declarator_list ::= struct_declarator_list COMMA struct_declarator ;
++ struct_declarator ::= IDENTIFIER ;
++ struct_declarator ::= IDENTIFIER LEFT_BRACKET RIGHT_BRACKET ;
++ struct_declarator ::= IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET ;
++ initializer ::= assignment_expression ;
++ declaration_statement ::= declaration ;
++ statement ::= compound_statement ;
++ statement ::= simple_statement ;
++ simple_statement ::= declaration_statement ;
++ simple_statement ::= expression_statement ;
++ simple_statement ::= selection_statement ;
++ simple_statement ::= switch_statement ;
++ simple_statement ::= case_label ;
++ simple_statement ::= iteration_statement ;
++ simple_statement ::= jump_statement ;
++ compound_statement ::= LEFT_BRACE RIGHT_BRACE ;
++ compound_statement ::= LEFT_BRACE statement_list RIGHT_BRACE ;
++ statement_no_new_scope ::= compound_statement_no_new_scope ;
++ statement_no_new_scope ::= simple_statement ;
++ compound_statement_no_new_scope ::= LEFT_BRACE RIGHT_BRACE ;
++ compound_statement_no_new_scope ::= LEFT_BRACE statement_list RIGHT_BRACE ;
++ statement_list ::= statement ;
++ statement_list ::= statement_list statement ;
++ expression_statement ::= SEMICOLON ;
++ expression_statement ::= expression SEMICOLON ;
++ selection_statement ::= IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement ;
++ selection_rest_statement ::= statement ELSE statement ;
++ selection_rest_statement ::= statement ;
++ condition ::= expression ;
++ condition ::= fully_specified_type IDENTIFIER EQUAL initializer ;
++ switch_statement ::= SWITCH LEFT_PAREN expression RIGHT_PAREN LEFT_BRACE switch_statement_list RIGHT_BRACE ;
++ switch_statement_list ::= empty ;
++ switch_statement_list ::= statement_list ;
++ case_label ::= CASE expression COLON ;
++ case_label ::= DEFAULT COLON ;
++ iteration_statement ::= WHILE LEFT_PAREN condition RIGHT_PAREN statement_no_new_scope ;
++ iteration_statement ::= DO statement WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON ;
++ iteration_statement ::= FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope ;
++ for_init_statement ::= expression_statement ;
++ for_init_statement ::= declaration_statement ;
++ conditionopt ::= empty ;
++ conditionopt ::= condition ;
++ for_rest_statement ::= conditionopt SEMICOLON ;
++ for_rest_statement ::= conditionopt SEMICOLON expression ;
++ jump_statement ::= CONTINUE SEMICOLON ;
++ jump_statement ::= BREAK SEMICOLON ;
++ jump_statement ::= RETURN SEMICOLON ;
++ jump_statement ::= RETURN expression SEMICOLON ;
++ jump_statement ::= DISCARD SEMICOLON ;
++ translation_unit ::= external_declaration ;
++ translation_unit ::= translation_unit external_declaration ;
++ external_declaration ::= function_definition ;
++ external_declaration ::= declaration ;
++ external_declaration ::= SEMICOLON ;
++ function_definition ::= function_prototype compound_statement_no_new_scope ;
++ empty ::= ;