Each node in the AST has the same type struct glsl_node
. The glsl_node
struct stores a variable number of children in an array past the end of the structure. It also contains a code
field that identifies what type of node it is and how to interpret it's child nodes. The node types are documented in the list below.
In each entry below the value on the left side of the ":" is a node type and the values on the right define the type of child nodes the type has. Nodes surrounded by brackets are optional and a "|" separated list denotes that the child can be any one of the types in the list. If a node is followed by ...
then it matches an arbitrary number of nodes (including zero) of that type. Entries in all lower case simply assign a label to an "|" list and do not define a node type.
Some of the node descriptions below contain a comment indicating the equivalent GLSL code they represent in terms of identifier's 'a', 'b', 'c', which refer to the node's children. Comments in other nodes may list some arbitary examples of GLSL fragments the node type could represent.
TRANSLATION_UNIT : DECLARATION | FUNCTION_DEFINITON
FUNCTION_DEFINITION : FUNCTION_DECLARATION STATEMENT_LIST
FUNCTION_DECLARATION : FUNCTION_HEADER FUNCTION_PARAMETER_LIST
FUNCTION_HEADER : FULLY_SPECIFIED_TYPE IDENTIFIER
FUNCTION_PARAMETER_LIST : PARAMETER_DECLARATION ...
PARAMETER_DECLARATION : TYPE_QUALIFIER_LIST PARAMETER_DECLARATOR
FULLY_SPECIFIED_TYPE : TYPE_QUALIFIER_LIST TYPE_SPECIFIER
TYPE_SPECIFIER : type_specifier_nonarray ARRAY_SPECIFIER_LIST
type_specifier_nonarray : type_token | STRUCT_SPECIFIER | IDENTIFIER
STRUCT_SPECIFIER : IDENTIFIER STRUCT_DECLARATION_LIST
STRUCT_DECLARATION_LIST : STRUCT_DECLARATION ...
STRUCT_DECLARATION : TYPE_QUALIFIER_LIST TYPE_SPECIFIER STRUCT_DECLARATOR_LIST
STRUCT_DECLARATOR_LIST : STRUCT_DECLARATOR ...
STRUCT_DECLARATOR : IDENTIFIER ARRAY_SPECIFIER_LIST
type_token : VOID | FLOAT | DOUBLE | INT | UINT | BOOL
| VEC2 | VEC3 | VEC4
| DVEC2 | DVEC3 | DVEC4
| BVEC2 | BVEC3 | BVEC4
| IVEC2 | IVEC3 | IVEC4
| UVEC2 | UVEC3 | UVEC4
| MAT2 | MAT3 | MAT4
| MAT2X2 | MAT2X3 | MAT2X4
| MAT3X2 | MAT3X3 | MAT3X4
| MAT4X2 | MAT4X3 | MAT4X4
| DMAT2 | DMAT3 | DMAT4
| DMAT2X2 | DMAT2X3 | DMAT2X4
| DMAT3X2 | DMAT3X3 | DMAT3X4
| DMAT4X2 | DMAT4X3 | DMAT4X4
| ATOMIC_UINT
| SAMPLER1D | SAMPLER2D | SAMPLER3D
| SAMPLERCUBE
| SAMPLER1DSHADOW | SAMPLER2DSHADOW | SAMPLERCUBESHADOW
| SAMPLER1DARRAY | SAMPLER2DARRAY
| SAMPLER1DARRAYSHADOW | SAMPLER2DARRAYSHADOW
| SAMPLERCUBEARRAY | SAMPLERCUBEARRAYSHADOW
| ISAMPLER1D | ISAMPLER2D | ISAMPLER3D
| ISAMPLERCUBE
| ISAMPLER1DARRAY | ISAMPLER2DARRAY | ISAMPLERCUBEARRAY
| USAMPLER1D | USAMPLER2D | USAMPLER3D
| USAMPLERCUBE | USAMPLER1DARRAY
| USAMPLER2DARRAY | USAMPLERCUBEARRAY | SAMPLER2DRECT
| SAMPLER2DRECTSHADOW | ISAMPLER2DRECT | USAMPLER2DRECT
| SAMPLERBUFFER | ISAMPLERBUFFER | USAMPLERBUFFER
| SAMPLER2DMS | ISAMPLER2DMS | USAMPLER2DMS
| SAMPLER2DMSARRAY | ISAMPLER2DMSARRAY | USAMPLER2DMSARRAY
| IMAGE1D | IIMAGE1D | UIMAGE1D
| IMAGE2D | IIMAGE2D | UIMAGE2D
| IMAGE3D | IIMAGE3D | UIMAGE3D
| IMAGE2DRECT | IIMAGE2DRECT | UIMAGE2DRECT
| IMAGECUBE | IIMAGECUBE | UIMAGECUBE
| IMAGEBUFFER | IIMAGEBUFFER | UIMAGEBUFFER
| IMAGE1DARRAY | IIMAGE1DARRAY | UIMAGE1DARRAY
| IMAGE2DARRAY | IIMAGE2DARRAY | UIMAGE2DARRAY
| IMAGECUBEARRAY | IIMAGECUBEARRAY | UIMAGECUBEARRAY
| IMAGE2DMS | IIMAGE2DMS | UIMAGE2DMS
| IMAGE2DMSARRAY | IIMAGE2DMSARRAY | UIMAGE2DMSARRAY
PARAMETER_DECLARATOR : TYPE_SPECIFIER IDENTIFIER ARRAY_SPECIFIER_LIST
type_qualifier : LAYOUT_QUALIFIER_ID_LIST | HIGHP | MEDIUMP
| LOWP | SMOOTH | FLAT| NOPERSPECTIVE
| INVARIANT | PRECISE | storage_qualifier
TYPE_QUALIFIER_LIST : type_qualifier ...
storage_qualifier : CONST | INOUT | IN | OUT | CENTROID
| PATCH | SAMPLE | UNIFORM | BUFFER | SHARED
| COHERENT | VOLATILE | RESTRICT | READONLY | WRITEONLY
| SUBROUTINE | SUBROUTINE_TYPE
SUBROUTINE_TYPE : TYPE_NAME_LIST | IDENTIFIER
TYPE_NAME_LIST : IDENTIFIER ...
LAYOUT_QUALIFIER_ID_LIST: (LAYOUT_QUALIFIER_ID | SHARED ) ...
LAYOUT_QUALIFIER_ID : (TODO)
STATEMENT_LIST : statement ...
statement : DECLARATION | EXPRESSION_STATEMENT | SELECTION_STATEMENT
| RETURN | RETURN_VALUE | BREAK | FOR_STATEMENT | WHILE_STATEMENT
| DO_STATEMENT
DECLARATION : INIT_DECLARATOR_LIST | BLOCK_DECLARATION | FUNCTION_DECLARATION
INIT_DECLARATOR_LIST : (SINGLE_DECLARATION | SINGLE_INIT_DECLARATION) INIT_DECLARATOR ...
INIT_DECLARATOR : IDENTIFIER ARRAY_SPECIFIER_LIST INITIALIZER // example: int r = 0
INITIALIZER : expression | INITIALIZER_LIST
INITIALIZER_LIST : INITIALIZER... // { a, b, c, ...}
EXPRESSION_STATEMENT : [expression] // "a;" or ";"
expression : binary_operator | unary_expression
| assignment_expression | TERNARY_EXPRESSION
unary_expression : prefix_expression | postfix_expression
binary_operator : PLUS | DASH | STAR | SLASH
| PERCENT | AMPERSAND | EQ_OP | NE_OP
| LEFT_ANGLE | RIGHT_ANGLE | LE_OP | GE_OP
| LEFT_OP | RIGHT_OP | CARET | VERTICAL_BAR
| AND_OP | OR_OP | XOR_OP
PLUS : expression expression // a + b
DASH : expression expression // a - b
STAR : expression expression // a * b
SLASH : expression expression // a / b
PERCENT : expression expression // a % b
AMPERSAND : expression expression // a & b
EQ_OP : expression expression // a == b
NE_OP : expression expression // a != b
LEFT_ANGLE : expression expression // a < b
RIGHT_ANGLE : expression expression // a > b
LE_OP : expression expression // a <= b
GE_OP : expression expression // a >= b
LEFT_OP : expression expression // a << b
RIGHT_OP : expression expression // a >> b
CARET : expression expression // a ^ b
VERTICAL_BAR : expression expression // a | b
AND_OP : expression expression // a && b
OR_OP : expression expression // a || b
XOR_OP : expression expression // a ^^ b
assignment_expression : EQUAL | MUL_ASSIGN | DIV_ASSIGN | MOD_ASSIGN
| ADD_ASSIGN | SUB_ASSIGN | LEFT_ASSIGN
| RIGHT_ASSIGN | AND_ASSIGN | XOR_ASSIGN
| OR_ASSIGN
EQUAL : unary_expression expression // a = b
MUL_ASSIGN : unary_expression expression // a *= b
DIV_ASSIGN : unary_expression expression // a /= b
MOD_ASSIGN : unary_expression expression // a %= b
ADD_ASSIGN : unary_expression expression // a += b
SUB_ASSIGN : unary_expression expression // a -= b
LEFT_ASSIGN : unary_expression expression // a <<= b
RIGHT_ASSIGN : unary_expression expression // a >>= b
AND_ASSIGN : unary_expression expression // a &= b
XOR_ASSIGN : unary_expression expression // a ^= b
OR_ASSIGN : unary_expression expression // a |= b
TERNARY_EXPRESSION : expression expression expression // a ? b : c
prefix_expression : PRE_INC_OP | PRE_DEC_OP | UNARY_PLUS
| UNARY_DASH | TILDE | BANG
PRE_INC_OP : expression // ++a
PRE_DEC_OP : expression // --a
UNARY_PLUS : expression // +a
UNARY_DASH : expression // -a
TILDE : expression // ~a
BANG : expression // !a
POSTFIX_EXPRESSION : expression
postfix_expression : POST_INC_OP | POST_DEC_OP | FUNCTION_CALL | ARRAY_REF_OP | DOT
| IDENTIFIER | INTCONSTANT | UINTCONSTANT | FLOATCONSTANT | TRUE
| FALSE | PAREN_EXPRESSION
PAREN_EXPRESSION : expression // (a)
POST_INC_OP : expression // a++
POST_DEC_OP : expression // a--
DOT : expression IDENTIFIER // a.b
SINGLE_DECLARATION : FULLY_SPECIFIED_TYPE IDENTIFIER ARRAY_SPECIFIER_LIST //examples: "float x[10]", "vec3 y"
SINGLE_INIT_DECLARATION : FULLY_SPECIFIED_TYPE IDENTIFIER ARRAY_SPECIFIER_LIST INITIALIZER //examples: "float x[10] = {...}", "float y = 1.0"
BLOCK_DECLARATION : TYPE_QUALIFIER_LIST IDENTIFIER STRUCT_DECLARATION_LIST IDENTIFIER ARRAY_SPECIFIER_LIST // a b { c } d e;
FUNCTION_CALL : (TYPE_SPECIFIER | POSTFIX_EXPRESSION) FUNCITON_CALL_PARAMETER_LIST //examples: "vec3(0,1,2)", "myfunc(0,1,2)"
FUNCITON_CALL_PARAMETER_LIST : expression ...
ARRAY_REF_OP : postfix_expression expression // a[b]
BREAK : (empty) // break;
SELECTION_STATEMENT : expression statement // if (a) b
SELECTION_STATEMENT_ELSE: expression statement statement // if (a) b else c
WHILE_STATEMENT : condition statement // while(a) b
DO_STATEMENT : statement expression // do { a } while(b);
FOR_STATEMENT : for_init_statement FOR_REST_STATEMENT statement // for (a; b) c
for_init_statement : EXPRESSION_STATEMENT | DECLARATION // examples: "int r = 0", "r = 0"
FOR_REST_STATEMENT : CONDITION_OPT [expression] // examples: "r > 0; r++", ";r++", "r>0;", ";"
CONDITION_OPT : [condition]
condition : EXPRESSION_CONDITION | ASSIGNMENT_CONDITION
EXPRESSION_CONDITION : expression
ASSIGNMENT_CONDITION : FULLY_SPECIFIED_TYPE IDENTIFIER INITIALIZER
RETURN : (none) // return;
RETURN_VALUE : expression
SECTION_STATEMENT : IDENTIFIER DECLARATION_STATEMENT_LIST
DECLARATION_STATEMENT_LIST : DECLARATION_STATEMENT ...