This appendix describes the shading language grammar. The shading language grammar is copyrighted by Khronos and is reprinted with permission. The latest OpenGL ES 2.0 specification can be downloaded at www.khronos.org/opengles/2_X/.
The grammar is fed from the output of lexical analysis. The tokens returned from lexical analysis are
ATTRIBUTE CONST BOOL FLOAT INT BREAK CONTINUE DO ELSE FOR IF DISCARD RETURN BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 VEC2 VEC3 VEC4 MAT2 MAT3 MAT4 IN OUT INOUT UNIFORM VARYING SAMPLER2D SAMPLERCUBE STRUCT VOID WHILE IDENTIFIER TYPE_NAME FLOATCONSTANT INTCONSTANT BOOLCONSTANT FIELD_SELECTION LEFT_OP RIGHT_OP INC_OP DEC_OP LE_OP GE_OP EQ_OP NE_OP AND_OP OR_OP XOR_OP MUL_ASSIGN DIV_ASSIGN ADD_ASSIGN MOD_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN XOR_ASSIGN OR_ASSIGN SUB_ASSIGN LEFT_PAREN RIGHT_PAREN LEFT_BRACKET RIGHT_BRACKET LEFT_BRACE RIGHT_BRACE DOT COMMA COLON EQUAL SEMICOLON BANG DASH TILDE PLUS STAR SLASH PERCENT LEFT_ANGLE RIGHT_ANGLE VERTICAL_BAR CARET AMPERSAND QUESTION INVARIANT HIGH_PRECISION MEDIUM_PRECISION LOW_PRECISION PRECISION
The following describes the grammar for the OpenGL ES Shading Language in terms of the above tokens.
variable_identifier: IDENTIFIER primary_expression: variable_identifier INTCONSTANT FLOATCONSTANT BOOLCONSTANT LEFT_PAREN expression RIGHT_PAREN postfix_expression: primary_expression postfix_expression LEFT_BRACKET integer_expression RIGHT_BRACKET function_call postfix_expression DOT FIELD_SELECTION postfix_expression INC_OP postfix_expression DEC_OP integer_expression: expression function_call: function_call_generic function_call_generic: function_call_header_with_parameters RIGHT_PAREN function_call_header_no_parameters RIGHT_PAREN function_call_header_no_parameters: function_call_header VOID function_call_header function_call_header_with_parameters: function_call_header assignment_expression function_call_header_with_parameters COMMA assignment_expression function_call_header: function_identifier LEFT_PAREN function_identifier: constructor_identifier IDENTIFIER // Grammar Note: Constructors look like functions, but lexical // analysis recognized most of them as keywords constructor_identifier: FLOAT INT BOOL VEC2 VEC3 VEC4 BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 MAT2 MAT3 MAT4 TYPE_NAME unary_expression: postfix_expression INC_OP unary_expression DEC_OP unary_expression unary_operator unary_expression // Grammar Note: No traditional style type casts. unary_operator: PLUS DASH BANG TILDE // reserved // Grammar Note: No '*' or '&' unary ops. Pointers are not // supported. multiplicative_expression: unary_expression multiplicative_expression STAR unary_expression multiplicative_expression SLASH unary_expression // reserved multiplicative_expression PERCENT unary_expression additive_expression: multiplicative_expression additive_expression PLUS multiplicative_expression additive_expression DASH multiplicative_expression shift_expression: additive_expression shift_expression LEFT_OP additive_expression // reserved shift_expression RIGHT_OP additive_expression // reserved relational_expression: shift_expression relational_expression LEFT_ANGLE shift_expression relational_expression RIGHT_ANGLE shift_expression relational_expression LE_OP shift_expression relational_expression GE_OP shift_expression equality_expression: relational_expression equality_expression EQ_OP relational_expression equality_expression NE_OP relational_expression and_expression: equality_expression and_expression AMPERSAND equality_expression // reserved exclusive_or_expression: and_expression exclusive_or_expression CARET and_expression // reserved inclusive_or_expression: exclusive_or_expression // reserved inclusive_or_expression VERTICAL_BAR exclusive_or_expression logical_and_expression: inclusive_or_expression logical_and_expression AND_OP inclusive_or_expression logical_xor_expression: logical_and_expression logical_xor_expression XOR_OP logical_and_expression logical_or_expression: logical_xor_expression logical_or_expression OR_OP logical_xor_expression conditional_expression: logical_or_expression logical_or_expression QUESTION expression COLON assignment_expression assignment_expression: conditional_expression unary_expression assignment_operator assignment_expression assignment_operator: EQUAL MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN // reserved ADD_ASSIGN SUB_ASSIGN LEFT_ASSIGN // reserved RIGHT_ASSIGN // reserved AND_ASSIGN // reserved XOR_ASSIGN // reserved OR_ASSIGN // reserved expression: assignment_expression expression COMMA assignment_expression constant_expression: conditional_expression declaration: function_prototype SEMICOLON init_declarator_list SEMICOLON PRECISION precision_qualifier type_specifier_no_prec SEMICOLON function_prototype: function_declarator RIGHT_PAREN function_declarator: function_header function_header_with_parameters function_header_with_parameters: function_header parameter_declaration function_header_with_parameters COMMA parameter_declaration function_header: fully_specified_type IDENTIFIER LEFT_PAREN parameter_declarator: type_specifier IDENTIFIER type_specifier IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET parameter_declaration: type_qualifier parameter_qualifier parameter_declarator parameter_qualifier parameter_declarator type_qualifier parameter_qualifier parameter_type_specifier parameter_qualifier parameter_type_specifier parameter_qualifier: /* empty */ IN OUT INOUT parameter_type_specifier: type_specifier type_specifier LEFT_BRACKET constant_expression RIGHT_BRACKET init_declarator_list: single_declaration init_declarator_list COMMA IDENTIFIER init_declarator_list COMMA IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET init_declarator_list COMMA IDENTIFIER EQUAL initializer single_declaration: fully_specified_type fully_specified_type IDENTIFIER fully_specified_type IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET fully_specified_type IDENTIFIER EQUAL initializer INVARIANT IDENTIFIER // Vertex only. // Grammar Note: No 'enum' or 'typedef'. fully_specified_type: type_specifier type_qualifier type_specifier type_qualifier: CONST ATTRIBUTE // Vertex only. VARYING INVARIANT VARYING UNIFORM type_specifier: type_specifier_no_prec precision_qualifier type_specifier_no_prec type_specifier_no_prec: VOID FLOAT INT BOOL VEC2 VEC3 VEC4 BVEC2 BVEC3 BVEC4 IVEC2 IVEC3 IVEC4 MAT2 MAT3 MAT4 SAMPLER2D SAMPLERCUBE struct_specifier TYPE_NAME precision_qualifier: HIGH_PRECISION MEDIUM_PRECISION LOW_PRECISION struct_specifier: STRUCT IDENTIFIER LEFT_BRACE struct_declaration_list RIGHT_BRACE STRUCT LEFT_BRACE struct_declaration_list RIGHT_BRACE struct_declaration_list: struct_declaration struct_declaration_list struct_declaration struct_declaration: type_specifier struct_declarator_list SEMICOLON struct_declarator_list: struct_declarator struct_declarator_list COMMA struct_declarator struct_declarator: IDENTIFIER IDENTIFIER LEFT_BRACKET constant_expression RIGHT_BRACKET initializer: assignment_expression declaration_statement: declaration statement_no_new_scope: compound_statement_with_scope simple_statement // Grammar Note: No labeled statements; 'goto' is not supported. simple_statement: declaration_statement expression_statement selection_statement iteration_statement jump_statement compound_statement_with_scope: LEFT_BRACE RIGHT_BRACE LEFT_BRACE statement_list RIGHT_BRACE statement_no_new_scope: compound_statement_no_new_scope simple_statement compound_statement_no_new_scope: LEFT_BRACE RIGHT_BRACE LEFT_BRACE statement_list RIGHT_BRACE statement_list: statement_no_new_scope statement_list statement_no_new_scope expression_statement: SEMICOLON expression SEMICOLON selection_statement: IF LEFT_PAREN expression RIGHT_PAREN selection_rest_statement selection_rest_statement: statement_with_scope ELSE statement_with_scope statement_with_scope statement_with_scope compound_statement_no_new_scope simple_statement condition: expression fully_specified_type IDENTIFIER EQUAL initializer iteration_statement: WHILE LEFT_PAREN condition RIGHT_PAREN statement_no_new_scope DO statement_no_new_scope WHILE LEFT_PAREN expression RIGHT_PAREN SEMICOLON FOR LEFT_PAREN for_init_statement for_rest_statement RIGHT_PAREN statement_no_new_scope for_init_statement: expression_statement declaration_statement conditionopt: condition /* empty */ for_rest_statement: conditionopt SEMICOLON conditionopt SEMICOLON expression jump_statement: CONTINUE SEMICOLON BREAK SEMICOLON RETURN SEMICOLON RETURN expression SEMICOLON DISCARD SEMICOLON // Fragment shader only. translation_unit: external_declaration translation_unit external_declaration external_declaration: function_definition declaration function_definition: function_prototype compound_statement_no_new_scope