Browse Source

test: add most of the GLSL grammar.

legacy
Sam Hocevar sam 12 years ago
parent
commit
39493bebaa
2 changed files with 602 additions and 22 deletions
  1. +23
    -6
      test/sandbox/lex/lolfx.l
  2. +579
    -16
      test/sandbox/lex/lolfx.y

+ 23
- 6
test/sandbox/lex/lolfx.l View File

@@ -66,12 +66,6 @@
"field_selection" { return GT_FIELD_SELECTION; }
"left_op" { return GT_LEFT_OP; }
"right_op" { return GT_RIGHT_OP; }
"inc_op" { return GT_INC_OP; }
"dec_op" { return GT_DEC_OP; }
"le_op" { return GT_LE_OP; }
"ge_op" { return GT_GE_OP; }
"eq_op" { return GT_EQ_OP; }
"ne_op" { return GT_NE_OP; }
"and_op" { return GT_AND_OP; }
"or_op" { return GT_OR_OP; }
"xor_op" { return GT_XOR_OP; }
@@ -517,6 +511,29 @@
* Various tokens
*/

"++" { return T_INC; }
"--" { return T_DEC; }
"<=" { return T_LE; }
">=" { return T_GE; }
"==" { return T_EQ; }
"!=" { return T_NE; }
"<<" { return T_LEFT; }
">>" { return T_RIGHT; }
"&&" { return T_AND; }
"||" { return T_OR; }
"^^" { return T_XOR; }

"*=" { return T_MULEQ; }
"/=" { return T_DIVEQ; }
"%=" { return T_MODEQ; }
"+=" { return T_ADDEQ; }
"-=" { return T_SUBEQ; }
"<<=" { return T_LEFTEQ; }
">>=" { return T_RIGHTEQ; }
"&=" { return T_ANDEQ; }
"^=" { return T_XOREQ; }
"|=" { return T_OREQ; }

[0-9]+\.[0-9]+ { yylval.fval = atof(yytext); return FLOAT; }
[0-9]+ { yylval.ival = atoi(yytext); return INT; }
[a-zA-Z][a-zA-Z0-9_]* {


+ 579
- 16
test/sandbox/lex/lolfx.y View File

@@ -72,30 +72,30 @@ void yyerror(const char *s);
* HLSL keywords
*/

%token HT_APPENDSTRUCTUREDBUFFER HT_ASM HT_ASM_FRAGMENT HT_BLENDSTATE HT_BOOL
%token HT_BREAK HT_BUFFER HT_BYTEADDRESSBUFFER HT_CBUFFER HT_CENTROID
%token HT_COLUMN_MAJOR HT_COMPILE HT_COMPILE_FRAGMENT HT_COMPILESHADER HT_CONST
%token HT_CONTINUE HT_COMPUTESHADER HT_CONSUMESTRUCTUREDBUFFER
%token HT_DEPTHSTENCILSTATE HT_DEPTHSTENCILVIEW HT_DISCARD HT_DO HT_DOUBLE
%token HT_DOMAINSHADER HT_DWORD HT_ELSE HT_EXTERN HT_FALSE HT_FLOAT HT_FOR
%token HT_FXGROUP HT_GEOMETRYSHADER HT_GROUPSHARED HT_HALF HT_HULLSHADER HT_IF
%token HT_IN HT_INLINE HT_INOUT HT_INPUTPATCH HT_INT HT_INTERFACE HT_LINE
%token HT_APPENDSTRUCTUREDBUFFER HT_ASM HT_ASM_FRAGMENT HT_BLENDSTATE
%token HT_BUFFER HT_BYTEADDRESSBUFFER HT_CBUFFER
%token HT_COLUMN_MAJOR HT_COMPILE HT_COMPILE_FRAGMENT HT_COMPILESHADER
%token HT_COMPUTESHADER HT_CONSUMESTRUCTUREDBUFFER
%token HT_DEPTHSTENCILSTATE HT_DEPTHSTENCILVIEW
%token HT_DOMAINSHADER HT_DWORD HT_EXTERN HT_FALSE
%token HT_FXGROUP HT_GEOMETRYSHADER HT_GROUPSHARED HT_HALF HT_HULLSHADER
%token HT_INLINE HT_INPUTPATCH HT_INTERFACE HT_LINE
%token HT_LINEADJ HT_LINEAR HT_LINESTREAM HT_MATRIX HT_NAMESPACE
%token HT_NOINTERPOLATION HT_NOPERSPECTIVE HT_NULL HT_OUT HT_OUTPUTPATCH
%token HT_NOINTERPOLATION HT_NULL HT_OUTPUTPATCH
%token HT_PACKOFFSET HT_PASS HT_PIXELFRAGMENT HT_PIXELSHADER HT_POINT
%token HT_POINTSTREAM HT_PRECISE HT_RASTERIZERSTATE HT_RENDERTARGETVIEW
%token HT_RETURN HT_REGISTER HT_ROW_MAJOR HT_RWBUFFER HT_RWBYTEADDRESSBUFFER
%token HT_REGISTER HT_ROW_MAJOR HT_RWBUFFER HT_RWBYTEADDRESSBUFFER
%token HT_RWSTRUCTUREDBUFFER HT_RWTEXTURE1D HT_RWTEXTURE1DARRAY HT_RWTEXTURE2D
%token HT_RWTEXTURE2DARRAY HT_RWTEXTURE3D HT_SAMPLER HT_SAMPLER1D HT_SAMPLER2D
%token HT_SAMPLER3D HT_SAMPLERCUBE HT_SAMPLER_STATE HT_SAMPLERSTATE
%token HT_RWTEXTURE2DARRAY HT_RWTEXTURE3D HT_SAMPLER
%token HT_SAMPLER_STATE HT_SAMPLERSTATE
%token HT_SAMPLERCOMPARISONSTATE HT_SHARED HT_SNORM HT_STATEBLOCK
%token HT_STATEBLOCK_STATE HT_STATIC HT_STRING HT_STRUCT HT_SWITCH
%token HT_STATEBLOCK_STATE HT_STATIC HT_STRING
%token HT_STRUCTUREDBUFFER HT_TBUFFER HT_TECHNIQUE HT_TECHNIQUE10
%token HT_TECHNIQUE11XZ HT_TEXTURE HT_TEXTURE1D HT_TEXTURE1DARRAY HT_TEXTURE2D
%token HT_TEXTURE2DARRAY HT_TEXTURE2DMS HT_TEXTURE2DMSARRAY HT_TEXTURE3D
%token HT_TEXTURECUBE HT_TEXTURECUBEARRAY HT_TRUE HT_TYPEDEF HT_TRIANGLE
%token HT_TRIANGLEADJ HT_TRIANGLESTREAM HT_UNIFORM HT_UNORM HT_UINT HT_VECTOR
%token HT_VERTEXFRAGMENT HT_VERTEXSHADER HT_VOID HT_VOLATILE HT_WHILE
%token HT_TRIANGLEADJ HT_TRIANGLESTREAM HT_UNORM HT_VECTOR
%token HT_VERTEXFRAGMENT HT_VERTEXSHADER HT_VOLATILE

/*
* HLSL types
@@ -144,13 +144,21 @@ void yyerror(const char *s);
* HLSL reserved keywords
*/

%token HT_AUTO HT_CASE HT_CATCH HT_CHAR HT_CLASS HT_CONST_CAST HT_DEFAULT
%token HT_AUTO HT_CATCH HT_CHAR HT_CLASS HT_CONST_CAST
%token HT_DELETE HT_DYNAMIC_CAST HT_ENUM HT_EXPLICIT HT_FRIEND HT_GOTO HT_LONG
%token HT_MUTABLE HT_NEW HT_OPERATOR HT_PRIVATE HT_PROTECTED HT_PUBLIC
%token HT_REINTERPRET_CAST HT_SHORT HT_SIGNED HT_SIZEOF HT_STATIC_CAST
%token HT_TEMPLATE HT_THIS HT_THROW HT_TRY HT_TYPENAME HT_UNION HT_UNSIGNED
%token HT_USING HT_VIRTUAL

/*
* Language keywords
*/

%token T_INC T_DEC T_LE T_GE T_EQ T_NE T_LEFT T_RIGHT T_AND T_OR T_XOR
%token T_MULEQ T_DIVEQ T_MODEQ T_ADDEQ T_SUBEQ T_LEFTEQ T_RIGHTEQ T_ANDEQ
%token T_XOREQ T_OREQ

/*
* Temporary shit
*/
@@ -209,6 +217,561 @@ pass_stmt:
| NAME '[' INT ']' '=' INT ';'
;

/*
* Grammar for GLSL
*/

glsl_variable_identifier:
GLSL_IDENTIFIER
;

glsl_primary_expression:
glsl_variable_identifier
| INTCONSTANT
| UINTCONSTANT
| FLOATCONSTANT
| BOOLCONSTANT
| '(' glsl_expression ')'
;

glsl_postfix_expression:
glsl_primary_expression
| glsl_postfix_expression '[' glsl_integer_expression ']'
| glsl_function_call
| glsl_postfix_expression '.' FIELD_SELECTION
| glsl_postfix_expression T_INC
| glsl_postfix_expression T_DEC
;

glsl_integer_expression:
glsl_expression
;

glsl_function_call:
glsl_function_call_or_method
;

glsl_function_call_or_method:
glsl_function_call_generic
| glsl_postfix_expression '.' glsl_function_call_generic
;

glsl_function_call_generic:
glsl_function_call_header_with_parameters ')'
| glsl_function_call_header_no_parameters ')'
;

glsl_function_call_header_no_parameters:
glsl_function_call_header GHT_VOID
| glsl_function_call_header
;

glsl_function_call_header_with_parameters:
glsl_function_call_header glsl_assignment_expression
| glsl_function_call_header_with_parameters ',' glsl_assignment_expression
;

glsl_function_call_header:
glsl_function_identifier '('
;

glsl_function_identifier:
glsl_type_specifier
| IDENTIFIER
| FIELD_SELECTION
;

glsl_unary_expression:
glsl_postfix_expression
| T_INC glsl_unary_expression
| T_DEC glsl_unary_expression
| glsl_unary_operator glsl_unary_expression
;

glsl_unary_operator:
'+'
| '-'
| '!'
| '~'
;

glsl_multiplicative_expression:
glsl_unary_expression
| glsl_multiplicative_expression '*' glsl_unary_expression
| glsl_multiplicative_expression '/' glsl_unary_expression
| glsl_multiplicative_expression '%' glsl_unary_expression
;

glsl_additive_expression:
glsl_multiplicative_expression
| glsl_additive_expression '+' glsl_multiplicative_expression
| glsl_additive_expression '-' glsl_multiplicative_expression
;

glsl_shift_expression:
glsl_additive_expression
| glsl_shift_expression T_LEFT glsl_additive_expression
| glsl_shift_expression T_RIGHT glsl_additive_expression
;

glsl_relational_expression:
glsl_shift_expression
| glsl_relational_expression '<' glsl_shift_expression
| glsl_relational_expression '>' glsl_shift_expression
| glsl_relational_expression T_LE glsl_shift_expression
| glsl_relational_expression T_GE glsl_shift_expression
;

glsl_equality_expression:
glsl_relational_expression
| glsl_equality_expression T_EQ glsl_relational_expression
| glsl_equality_expression T_NE glsl_relational_expression
;

glsl_and_expression:
glsl_equality_expression
| glsl_and_expression '&' glsl_equality_expression
;

glsl_exclusive_or_expression:
glsl_and_expression
| glsl_exclusive_or_expression '^' glsl_and_expression
;

glsl_inclusive_or_expression:
glsl_exclusive_or_expression
| glsl_inclusive_or_expression '|' glsl_exclusive_or_expression
;

glsl_logical_and_expression:
glsl_inclusive_or_expression
| glsl_logical_and_expression T_AND glsl_inclusive_or_expression
;

glsl_logical_xor_expression:
glsl_logical_and_expression
| glsl_logical_xor_expression T_XOR glsl_logical_and_expression
;

glsl_logical_or_expression:
glsl_logical_xor_expression
| glsl_logical_or_expression T_OR glsl_logical_xor_expression
;

glsl_conditional_expression:
glsl_logical_or_expression
| glsl_logical_or_expression '?' glsl_expression ':' glsl_assignment_expression
;

glsl_assignment_expression:
glsl_conditional_expression
| glsl_unary_expression glsl_assignment_operator glsl_assignment_expression
;

glsl_assignment_operator:
'='
| T_MULEQ
| T_DIVEQ
| T_MODEQ
| T_ADDEQ
| T_SUBEQ
| T_LEFTEQ
| T_RIGHTEQ
| T_ANDEQ
| T_XOREQ
| T_OREQ
;

glsl_expression:
glsl_assignment_expression
| glsl_expression ',' glsl_assignment_expression
;

glsl_constant_expression:
glsl_conditional_expression
;

glsl_declaration:
glsl_function_prototype ';'
| glsl_init_declarator_list ';'
| PRECISION glsl_precision_qualifier glsl_type_specifier_no_prec ';'
| glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' ';'
| glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER ';'
| glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER '[' ']' ';'
| glsl_type_qualifier IDENTIFIER '{' glsl_struct_declaration_list '}' IDENTIFIER '[' glsl_constant_expression ']' ';'
| glsl_type_qualifier ';'
;

glsl_function_prototype:
glsl_function_declarator ')'
;

glsl_function_declarator:
glsl_function_header
| glsl_function_header_with_parameters
;

glsl_function_header_with_parameters:
glsl_function_header glsl_parameter_declaration
| glsl_function_header_with_parameters ',' glsl_parameter_declaration
;

glsl_function_header:
glsl_fully_specified_type IDENTIFIER '('
;

glsl_parameter_declarator:
glsl_type_specifier IDENTIFIER
| glsl_type_specifier IDENTIFIER '[' glsl_constant_expression ']'
;

glsl_parameter_declaration:
glsl_parameter_type_qualifier glsl_parameter_qualifier glsl_parameter_declarator
| glsl_parameter_qualifier glsl_parameter_declarator
| glsl_parameter_type_qualifier glsl_parameter_qualifier glsl_parameter_type_specifier
| glsl_parameter_qualifier glsl_parameter_type_specifier
;

glsl_parameter_qualifier:
/* empty */
| GHT_IN
| GHT_OUT
| GHT_INOUT
;

glsl_parameter_type_specifier:
glsl_type_specifier
;

glsl_init_declarator_list:
glsl_single_declaration
| glsl_init_declarator_list ',' IDENTIFIER
| glsl_init_declarator_list ',' IDENTIFIER '[' ']'
| glsl_init_declarator_list ',' IDENTIFIER '[' glsl_constant_expression ']'
| glsl_init_declarator_list ',' IDENTIFIER '[' ']' '=' glsl_initializer
| glsl_init_declarator_list ',' IDENTIFIER '[' glsl_constant_expression ']' '=' glsl_initializer
| glsl_init_declarator_list ',' IDENTIFIER '=' glsl_initializer
;

glsl_single_declaration:
glsl_fully_specified_type
| glsl_fully_specified_type IDENTIFIER
| glsl_fully_specified_type IDENTIFIER '[' ']'
| glsl_fully_specified_type IDENTIFIER '[' glsl_constant_expression ']'
| glsl_fully_specified_type IDENTIFIER '[' ']' '=' glsl_initializer
| glsl_fully_specified_type IDENTIFIER '[' glsl_constant_expression ']' '=' glsl_initializer
| glsl_fully_specified_type IDENTIFIER '=' glsl_initializer
| INVARIANT IDENTIFIER
;

glsl_fully_specified_type:
glsl_type_specifier
| glsl_type_qualifier glsl_type_specifier
;

glsl_invariant_qualifier:
INVARIANT
;

glsl_interpolation_qualifier:
GT_SMOOTH
| GT_FLAT
| GHT_NOPERSPECTIVE
;

glsl_layout_qualifier:
GT_LAYOUT '(' glsl_layout_qualifier_id_list ')'
;

glsl_layout_qualifier_id_list:
glsl_layout_qualifier_id
| glsl_layout_qualifier_id_list ',' glsl_layout_qualifier_id
;

glsl_layout_qualifier_id:
IDENTIFIER
| IDENTIFIER '=' INTCONSTANT
;

glsl_parameter_type_qualifier:
GHT_CONST
;

glsl_type_qualifier:
glsl_storage_qualifier
| glsl_layout_qualifier
| glsl_layout_qualifier glsl_storage_qualifier
| glsl_interpolation_qualifier glsl_storage_qualifier
| glsl_interpolation_qualifier
| glsl_invariant_qualifier glsl_storage_qualifier
| glsl_invariant_qualifier glsl_interpolation_qualifier glsl_storage_qualifier
| glsl_invariant_qualifier
;

glsl_storage_qualifier:
GHT_CONST
| GHT_IN
| GHT_OUT
| GHT_CENTROID GHT_IN
| GHT_CENTROID GHT_OUT
| GT_PATCH GHT_IN
| GT_PATCH GHT_OUT
| GT_SAMPLE GHT_IN
| GT_SAMPLE GHT_OUT
| GHT_UNIFORM
;

glsl_type_specifier:
glsl_type_specifier_no_prec
| glsl_precision_qualifier glsl_type_specifier_no_prec
;

glsl_type_specifier_no_prec:
glsl_type_specifier_nonarray
| glsl_type_specifier_nonarray '[' ']'
| glsl_type_specifier_nonarray '[' glsl_constant_expression ']'

glsl_type_specifier_nonarray:
GHT_VOID
| GHT_FLOAT
| GHT_DOUBLE
| GHT_INT
| GHT_UINT
| GHT_BOOL
| GT_VEC2
| GT_VEC3
| GT_VEC4
| GT_DVEC2
| GT_DVEC3
| GT_DVEC4
| GT_BVEC2
| GT_BVEC3
| GT_BVEC4
| GT_IVEC2
| GT_IVEC3
| GT_IVEC4
| GT_UVEC2
| GT_UVEC3
| GT_UVEC4
| GT_MAT2
| GT_MAT3
| GT_MAT4
| GT_MAT2X2
| GT_MAT2X3
| GT_MAT2X4
| GT_MAT3X2
| GT_MAT3X3
| GT_MAT3X4
| GT_MAT4X2
| GT_MAT4X3
| GT_MAT4X4
| GT_DMAT2
| GT_DMAT3
| GT_DMAT4
| GT_DMAT2X2
| GT_DMAT2X3
| GT_DMAT2X4
| GT_DMAT3X2
| GT_DMAT3X3
| GT_DMAT3X4
| GT_DMAT4X2
| GT_DMAT4X3
| GT_DMAT4X4
| GHT_SAMPLER1D
| GHT_SAMPLER2D
| GHT_SAMPLER3D
| GHT_SAMPLERCUBE
| GT_SAMPLER1DSHADOW
| GT_SAMPLER2DSHADOW
| GT_SAMPLERCUBESHADOW
| GT_SAMPLER1DARRAY
| GT_SAMPLER2DARRAY
| GT_SAMPLER1DARRAYSHADOW
| GT_SAMPLER2DARRAYSHADOW
| GT_SAMPLERCUBEARRAY
| GT_SAMPLERCUBEARRAYSHADOW
| GT_ISAMPLER1D
| GT_ISAMPLER2D
| GT_ISAMPLER3D
| GT_ISAMPLERCUBE
| GT_ISAMPLER1DARRAY
| GT_ISAMPLER2DARRAY
| GT_ISAMPLERCUBEARRAY
| GT_USAMPLER1D
| GT_USAMPLER2D
| GT_USAMPLER3D
| GT_USAMPLERCUBE
| GT_USAMPLER1DARRAY
| GT_USAMPLER2DARRAY
| GT_USAMPLERCUBEARRAY
| GT_SAMPLER2DRECT
| GT_SAMPLER2DRECTSHADOW
| GT_ISAMPLER2DRECT
| GT_USAMPLER2DRECT
| GT_SAMPLERBUFFER
| GT_ISAMPLERBUFFER
| GT_USAMPLERBUFFER
| GT_SAMPLER2DMS
| GT_ISAMPLER2DMS
| GT_USAMPLER2DMS
| GT_SAMPLER2DMSARRAY
| GT_ISAMPLER2DMSARRAY
| GT_USAMPLER2DMSARRAY
| glsl_struct_specifier
| TYPE_NAME
;

glsl_precision_qualifier:
HIGH_PRECISION
| MEDIUM_PRECISION
| LOW_PRECISION
;

glsl_struct_specifier:
GHT_STRUCT IDENTIFIER '{' glsl_struct_declaration_list '}'
| GHT_STRUCT '{' glsl_struct_declaration_list '}'
;

glsl_struct_declaration_list:
glsl_struct_declaration
| glsl_struct_declaration_list glsl_struct_declaration
;

glsl_struct_declaration:
glsl_type_specifier glsl_struct_declarator_list ';'
| glsl_type_qualifier glsl_type_specifier glsl_struct_declarator_list ';'
;

glsl_struct_declarator_list:
glsl_struct_declarator
| glsl_struct_declarator_list ',' glsl_struct_declarator
;

glsl_struct_declarator:
IDENTIFIER
| IDENTIFIER '[' ']'
| IDENTIFIER '[' glsl_constant_expression ']'
;

glsl_initializer:
glsl_assignment_expression
;

glsl_declaration_statement:
glsl_declaration
;

glsl_statement:
glsl_compound_statement
| glsl_simple_statement
;

glsl_simple_statement:
glsl_declaration_statement
| glsl_expression_statement
| glsl_selection_statement
| glsl_switch_statement
| glsl_case_label
| glsl_iteration_statement
| glsl_jump_statement
;

glsl_compound_statement:
'{' '}'
| '{' glsl_statement_list '}'
;

glsl_statement_no_new_scope:
glsl_compound_statement_no_new_scope
| glsl_simple_statement
;

glsl_compound_statement_no_new_scope:
'{' '}'
| '{' glsl_statement_list '}'
;

glsl_statement_list:
glsl_statement
| glsl_statement_list glsl_statement
;

glsl_expression_statement:
';'
| glsl_expression ';'
;

glsl_selection_statement:
GHT_IF '(' glsl_expression ')' glsl_selection_rest_statement
;

glsl_selection_rest_statement:
glsl_statement GHT_ELSE glsl_statement
| glsl_statement
;

glsl_condition:
glsl_expression
| glsl_fully_specified_type IDENTIFIER '=' glsl_initializer
;

glsl_switch_statement:
GHT_SWITCH '(' glsl_expression ')' '{' glsl_switch_statement_list '}'
;

glsl_switch_statement_list:
/* nothing */
| glsl_statement_list
;

glsl_case_label:
GHT_CASE glsl_expression ':'
| GHT_DEFAULT ':'
;

glsl_iteration_statement:
GHT_WHILE '(' glsl_condition ')' glsl_statement_no_new_scope
| GHT_DO glsl_statement GHT_WHILE '(' glsl_expression ')' ';'
| GHT_FOR '(' glsl_for_init_statement glsl_for_rest_statement ')' glsl_statement_no_new_scope
;

glsl_for_init_statement:
glsl_expression_statement
| glsl_declaration_statement
;

glsl_conditionopt:
glsl_condition
| /* empty */
;

glsl_for_rest_statement:
glsl_conditionopt ';'
| glsl_conditionopt ';' glsl_expression
;

glsl_jump_statement:
GHT_CONTINUE ';'
| GHT_BREAK ';'
| GHT_RETURN ';'
| GHT_RETURN glsl_expression ';'
| GHT_DISCARD ';'
;

glsl_translation_unit:
glsl_external_declaration
glsl_translation_unit glsl_external_declaration
;

glsl_external_declaration:
glsl_function_definition
| glsl_declaration
;

glsl_function_definition:
glsl_function_prototype glsl_compound_statement_no_new_scope
;

/*
* Grammar for shaders
*/


Loading…
Cancel
Save