/** * MojoShader; generate shader programs from bytecode of compiled * Direct3D shaders. * * Please see the file LICENSE.txt in the source's root directory. * * This file written by Ryan C. Gordon. */ // This is a Lemon Parser grammar for HLSL. It is based on an ANSI C YACC // grammar by Jeff Lee: http://www.lysator.liu.se/c/ANSI-C-grammar-y.html // Lemon is here: http://www.hwaci.com/sw/lemon/ ... the source is included // with MojoShader, and built with the library, so you don't have to track // down the dependency. // HLSL syntax is described, informally, here: // http://msdn.microsoft.com/en-us/library/bb509615(VS.85).aspx %name ParseHLSL %start_symbol shader %token_prefix TOKEN_HLSL_ %token_type { IncludeState * } %extra_argument { Context *ctx } %include { #ifndef __MOJOSHADER_HLSL_COMPILER__ #error Do not compile this file directly. #endif } %parse_failure { fprintf(stderr,"Giving up. Parser is hopelessly lost...\n"); } %stack_overflow { fprintf(stderr,"Giving up. Parser stack overflow\n"); } // operator precedence (matches C spec)... %left COMMA. %right ASSIGN ADDASSIGN SUBASSIGN MULASSIGN DIVASSIGN MODASSIGN LSHIFTASSIGN RSHIFTASSIGN ANDASSIGN ORASSIGN XORASSIGN. %right QUESTION. %left OROR. %left ANDAND. %left OR. %left XOR. %left AND. %left EQL NEQ. %left LT LEQ GT GEQ. %left LSHIFT RSHIFT. %left PLUS MINUS. %left STAR SLASH PERCENT. %right TYPECAST EXCLAMATION COMPLEMENT MINUSMINUS PLUSPLUS. %left DOT LBRACKET RBRACKET LPAREN RPAREN. // bump up the precedence of ELSE, to avoid shift/reduce conflict on the // usual "dangling else ambiguity" ... %right ELSE. // The rules... shader ::= compilation_units. compilation_units ::= compilation_unit. compilation_units ::= compilation_units compilation_unit. compilation_unit ::= function_declaration. compilation_unit ::= function_definition. compilation_unit ::= global_variable. compilation_unit ::= typedef_statement. compilation_unit ::= struct_statement. function_declaration ::= function_signature SEMICOLON. function_definition ::= function_signature statement_block. function_signature ::= function_storageclass function_details semantic. function_signature ::= function_storageclass function_details. function_signature ::= function_details semantic. function_signature ::= function_details. function_details ::= datatype identifier LPAREN function_arguments RPAREN. // !!! FIXME: there is a "target" storage class that is the name of the // !!! FIXME: platform that this function is meant for...but I don't know // !!! FIXME: what tokens are valid here. // !!! FIXME: Also, the docs say "one of" inline or target, but I bet you can // !!! FIXME: specify both. //function_storageclass ::= target. function_storageclass ::= INLINE. function_arguments ::= VOID. function_arguments ::= function_argument_list. function_arguments ::= . function_argument_list ::= function_argument. function_argument_list ::= function_argument_list COMMA function_argument. function_argument ::= input_modifier datatype identifier semantic interpolation_mod initializer. function_argument ::= input_modifier datatype identifier semantic interpolation_mod. function_argument ::= input_modifier datatype identifier semantic initializer. function_argument ::= input_modifier datatype identifier semantic. function_argument ::= input_modifier datatype identifier interpolation_mod initializer. function_argument ::= input_modifier datatype identifier interpolation_mod. function_argument ::= input_modifier datatype identifier initializer. function_argument ::= input_modifier datatype identifier. function_argument ::= datatype identifier semantic interpolation_mod initializer. function_argument ::= datatype identifier semantic interpolation_mod. function_argument ::= datatype identifier semantic initializer. function_argument ::= datatype identifier semantic. function_argument ::= datatype identifier interpolation_mod initializer. function_argument ::= datatype identifier interpolation_mod. function_argument ::= datatype identifier initializer. function_argument ::= datatype identifier. input_modifier ::= IN. input_modifier ::= INOUT. input_modifier ::= OUT. input_modifier ::= UNIFORM. semantic ::= COLON semantic_name. semantic_name ::= identifier. // !!! FIXME: list these here // DX10 only? interpolation_mod ::= LINEAR. interpolation_mod ::= CENTROID. interpolation_mod ::= NOINTERPOLATION. interpolation_mod ::= NOPERSPECTIVE. interpolation_mod ::= SAMPLE. global_variable ::= variable_declaration. variable_declaration ::= variable_attribute_list datatype variable_declaration_details_list SEMICOLON. variable_declaration ::= datatype variable_declaration_details_list SEMICOLON. variable_declaration ::= struct_declaration scalar_or_array SEMICOLON. variable_declaration_details_list ::= variable_declaration_details. variable_declaration_details_list ::= variable_declaration_details_list COMMA variable_declaration_details. variable_declaration_details ::= scalar_or_array semantic annotations initializer variable_lowlevel. variable_declaration_details ::= scalar_or_array semantic annotations initializer. variable_declaration_details ::= scalar_or_array semantic annotations variable_lowlevel. variable_declaration_details ::= scalar_or_array semantic annotations. variable_declaration_details ::= scalar_or_array semantic initializer variable_lowlevel. variable_declaration_details ::= scalar_or_array semantic initializer. variable_declaration_details ::= scalar_or_array semantic variable_lowlevel. variable_declaration_details ::= scalar_or_array semantic. variable_declaration_details ::= scalar_or_array annotations initializer variable_lowlevel. variable_declaration_details ::= scalar_or_array annotations initializer. variable_declaration_details ::= scalar_or_array annotations variable_lowlevel. variable_declaration_details ::= scalar_or_array annotations. variable_declaration_details ::= scalar_or_array initializer variable_lowlevel. variable_declaration_details ::= scalar_or_array initializer. variable_declaration_details ::= scalar_or_array variable_lowlevel. variable_declaration_details ::= scalar_or_array. // !!! FIXME: we don't handle full sampler declarations at the moment. struct_declaration ::= STRUCT identifier LBRACE struct_member_list RBRACE. struct_member_list ::= struct_member. struct_member_list ::= struct_member_list struct_member. struct_member ::= interpolation_mod struct_member_details. struct_member ::= struct_member_details. struct_member_details ::= datatype struct_member_item_list SEMICOLON. struct_member_item_list ::= identifier. struct_member_item_list ::= struct_member_item_list COMMA identifier. typedef_statement ::= TYPEDEF CONST datatype scalar_or_array. typedef_statement ::= TYPEDEF datatype scalar_or_array. variable_lowlevel ::= packoffset register. variable_lowlevel ::= packoffset. variable_lowlevel ::= register. scalar_or_array ::= identifier LBRACKET INT_CONSTANT RBRACKET. scalar_or_array ::= identifier. packoffset ::= PACKOFFSET LPAREN identifier identifier RPAREN. packoffset ::= PACKOFFSET LPAREN identifier RPAREN. register ::= COLON REGISTER LPAREN identifier RPAREN. annotations ::= LT annotation_list GT. annotation_list ::= annotation. annotation_list ::= annotation_list annotation. annotation ::= datatype_scalar initializer SEMICOLON. variable_attribute_list ::= variable_attribute. variable_attribute_list ::= variable_attribute_list variable_attribute. variable_attribute ::= EXTERN. variable_attribute ::= NOINTERPOLATION. variable_attribute ::= SHARED. variable_attribute ::= STATIC. variable_attribute ::= UNIFORM. variable_attribute ::= VOLATILE. variable_attribute ::= CONST. variable_attribute ::= ROWMAJOR. variable_attribute ::= COLUMNMAJOR. initializer ::= ASSIGN expression. intrinsic_datatype ::= datatype_vector. intrinsic_datatype ::= datatype_matrix. intrinsic_datatype ::= datatype_scalar. intrinsic_datatype ::= datatype_sampler. datatype ::= intrinsic_datatype. datatype ::= USERTYPE. datatype_sampler ::= SAMPLER. datatype_sampler ::= SAMPLER1D. datatype_sampler ::= SAMPLER2D. datatype_sampler ::= SAMPLER3D. datatype_sampler ::= SAMPLERCUBE. datatype_sampler ::= SAMPLER_STATE. datatype_sampler ::= SAMPLERSTATE. datatype_sampler ::= SAMPLERCOMPARISONSTATE. datatype_scalar ::= BOOL. datatype_scalar ::= INT. datatype_scalar ::= UINT. datatype_scalar ::= HALF. datatype_scalar ::= FLOAT. datatype_scalar ::= DOUBLE. datatype_scalar ::= STRING. // this is for the effects framework, not HLSL. datatype_scalar ::= SNORM FLOAT. datatype_scalar ::= UNORM FLOAT. datatype_scalar ::= BUFFER LT datatype_scalar GT. // !!! FIXME: MSDN suggests that the matrix ones are just typedefs inserted // !!! FIXME: before parsing begins, like: // !!! FIXME: typedef matrix bool4x3; // !!! FIXME: ...maybe we can rip these out of the grammar and just create // !!! FIXME: them at startup? datatype_vector ::= VECTOR LT datatype_scalar COMMA INT_CONSTANT GT. datatype_vector ::= BOOL1. datatype_vector ::= BOOL2. datatype_vector ::= BOOL3. datatype_vector ::= BOOL4. datatype_vector ::= INT1. datatype_vector ::= INT2. datatype_vector ::= INT3. datatype_vector ::= INT4. datatype_vector ::= UINT1. datatype_vector ::= UINT2. datatype_vector ::= UINT3. datatype_vector ::= UINT4. datatype_vector ::= HALF1. datatype_vector ::= HALF2. datatype_vector ::= HALF3. datatype_vector ::= HALF4. datatype_vector ::= FLOAT1. datatype_vector ::= FLOAT2. datatype_vector ::= FLOAT3. datatype_vector ::= FLOAT4. datatype_vector ::= DOUBLE1. datatype_vector ::= DOUBLE2. datatype_vector ::= DOUBLE3. datatype_vector ::= DOUBLE4. datatype_matrix ::= MATRIX LT datatype_scalar COMMA INT_CONSTANT COMMA INT_CONSTANT GT. datatype_matrix ::= BOOL1X1. datatype_matrix ::= BOOL1X2. datatype_matrix ::= BOOL1X3. datatype_matrix ::= BOOL1X4. datatype_matrix ::= BOOL2X1. datatype_matrix ::= BOOL2X2. datatype_matrix ::= BOOL2X3. datatype_matrix ::= BOOL2X4. datatype_matrix ::= BOOL3X1. datatype_matrix ::= BOOL3X2. datatype_matrix ::= BOOL3X3. datatype_matrix ::= BOOL3X4. datatype_matrix ::= BOOL4X1. datatype_matrix ::= BOOL4X2. datatype_matrix ::= BOOL4X3. datatype_matrix ::= BOOL4X4. datatype_matrix ::= INT1X1. datatype_matrix ::= INT1X2. datatype_matrix ::= INT1X3. datatype_matrix ::= INT1X4. datatype_matrix ::= INT2X1. datatype_matrix ::= INT2X2. datatype_matrix ::= INT2X3. datatype_matrix ::= INT2X4. datatype_matrix ::= INT3X1. datatype_matrix ::= INT3X2. datatype_matrix ::= INT3X3. datatype_matrix ::= INT3X4. datatype_matrix ::= INT4X1. datatype_matrix ::= INT4X2. datatype_matrix ::= INT4X3. datatype_matrix ::= INT4X4. datatype_matrix ::= UINT1X1. datatype_matrix ::= UINT1X2. datatype_matrix ::= UINT1X3. datatype_matrix ::= UINT1X4. datatype_matrix ::= UINT2X1. datatype_matrix ::= UINT2X2. datatype_matrix ::= UINT2X3. datatype_matrix ::= UINT2X4. datatype_matrix ::= UINT3X1. datatype_matrix ::= UINT3X2. datatype_matrix ::= UINT3X3. datatype_matrix ::= UINT3X4. datatype_matrix ::= UINT4X1. datatype_matrix ::= UINT4X2. datatype_matrix ::= UINT4X3. datatype_matrix ::= UINT4X4. datatype_matrix ::= HALF1X1. datatype_matrix ::= HALF1X2. datatype_matrix ::= HALF1X3. datatype_matrix ::= HALF1X4. datatype_matrix ::= HALF2X1. datatype_matrix ::= HALF2X2. datatype_matrix ::= HALF2X3. datatype_matrix ::= HALF2X4. datatype_matrix ::= HALF3X1. datatype_matrix ::= HALF3X2. datatype_matrix ::= HALF3X3. datatype_matrix ::= HALF3X4. datatype_matrix ::= HALF4X1. datatype_matrix ::= HALF4X2. datatype_matrix ::= HALF4X3. datatype_matrix ::= HALF4X4. datatype_matrix ::= FLOAT1X1. datatype_matrix ::= FLOAT1X2. datatype_matrix ::= FLOAT1X3. datatype_matrix ::= FLOAT1X4. datatype_matrix ::= FLOAT2X1. datatype_matrix ::= FLOAT2X2. datatype_matrix ::= FLOAT2X3. datatype_matrix ::= FLOAT2X4. datatype_matrix ::= FLOAT3X1. datatype_matrix ::= FLOAT3X2. datatype_matrix ::= FLOAT3X3. datatype_matrix ::= FLOAT3X4. datatype_matrix ::= FLOAT4X1. datatype_matrix ::= FLOAT4X2. datatype_matrix ::= FLOAT4X3. datatype_matrix ::= FLOAT4X4. datatype_matrix ::= DOUBLE1X1. datatype_matrix ::= DOUBLE1X2. datatype_matrix ::= DOUBLE1X3. datatype_matrix ::= DOUBLE1X4. datatype_matrix ::= DOUBLE2X1. datatype_matrix ::= DOUBLE2X2. datatype_matrix ::= DOUBLE2X3. datatype_matrix ::= DOUBLE2X4. datatype_matrix ::= DOUBLE3X1. datatype_matrix ::= DOUBLE3X2. datatype_matrix ::= DOUBLE3X3. datatype_matrix ::= DOUBLE3X4. datatype_matrix ::= DOUBLE4X1. datatype_matrix ::= DOUBLE4X2. datatype_matrix ::= DOUBLE4X3. datatype_matrix ::= DOUBLE4X4. statement_block ::= LBRACE RBRACE. statement_block ::= LBRACE statement_list RBRACE. statement_list ::= statement. statement_list ::= statement_list statement. statement ::= return_statement. statement ::= BREAK SEMICOLON. statement ::= CONTINUE SEMICOLON. statement ::= DISCARD SEMICOLON. statement ::= statement_block. statement ::= for_statement. statement ::= do_statement. statement ::= while_statement. statement ::= if_statement. statement ::= switch_statement. statement ::= variable_declaration. statement ::= typedef_statement. statement ::= expression_statement. statement ::= struct_statement. struct_statement ::= struct_declaration SEMICOLON. expression_statement ::= SEMICOLON. expression_statement ::= expression SEMICOLON. return_statement ::= RETURN SEMICOLON. return_statement ::= RETURN expression SEMICOLON. while_statement ::= loop_attribute while_details. while_statement ::= while_details. while_details ::= WHILE LPAREN expression RPAREN statement. for_statement ::= loop_attribute for_details. for_statement ::= for_details. for_details ::= FOR LPAREN expression SEMICOLON expression SEMICOLON expression RPAREN statement. for_details ::= FOR LPAREN SEMICOLON SEMICOLON RPAREN statement. for_details ::= FOR LPAREN SEMICOLON SEMICOLON expression RPAREN statement. for_details ::= FOR LPAREN SEMICOLON expression SEMICOLON RPAREN statement. for_details ::= FOR LPAREN SEMICOLON expression SEMICOLON expression RPAREN statement. for_details ::= FOR LPAREN expression SEMICOLON SEMICOLON RPAREN statement. for_details ::= FOR LPAREN expression SEMICOLON SEMICOLON expression RPAREN statement. for_details ::= FOR LPAREN expression SEMICOLON expression SEMICOLON RPAREN statement. loop_attribute ::= UNROLL LPAREN INT_CONSTANT RPAREN. loop_attribute ::= UNROLL. loop_attribute ::= LOOP. do_statement ::= DO statement WHILE LPAREN expression RPAREN SEMICOLON. if_statement ::= if_attribute IF LPAREN expression RPAREN statement. if_statement ::= IF LPAREN expression RPAREN statement. if_statement ::= if_attribute IF LPAREN expression RPAREN statement ELSE statement. if_statement ::= IF LPAREN expression RPAREN statement ELSE statement. if_attribute ::= BRANCH. if_attribute ::= FLATTEN. switch_statement ::= switch_attribute switch_details. switch_statement ::= switch_details. switch_details ::= SWITCH LPAREN expression RPAREN LBRACE switch_case_list RBRACE. switch_attribute ::= FLATTEN. switch_attribute ::= BRANCH. switch_attribute ::= FORCECASE. switch_attribute ::= CALL. switch_case_list ::= switch_case. switch_case_list ::= switch_case_list switch_case. // You can do math here, apparently, as long as it produces an int constant. // ...so "case 3+2:" works. switch_case ::= CASE expression COLON statement_list. switch_case ::= CASE expression COLON. switch_case ::= DEFAULT COLON statement_list. switch_case ::= DEFAULT COLON. // I may want to do more with this at some point. identifier ::= IDENTIFIER. // the expression stuff is based on Jeff Lee's ANSI C grammar. primary_expr ::= identifier. primary_expr ::= INT_CONSTANT. primary_expr ::= FLOAT_CONSTANT. primary_expr ::= STRING_LITERAL. primary_expr ::= LPAREN expression RPAREN. postfix_expr ::= primary_expr. postfix_expr ::= postfix_expr LBRACKET expression RBRACKET. postfix_expr ::= postfix_expr LPAREN RPAREN. postfix_expr ::= postfix_expr LPAREN argument_expr_list RPAREN. postfix_expr ::= datatype LPAREN argument_expr_list RPAREN. // HLSL constructor postfix_expr ::= postfix_expr DOT identifier. postfix_expr ::= postfix_expr PLUSPLUS. postfix_expr ::= postfix_expr MINUSMINUS. argument_expr_list ::= assignment_expr. argument_expr_list ::= argument_expr_list COMMA assignment_expr. unary_expr ::= postfix_expr. unary_expr ::= PLUSPLUS unary_expr. unary_expr ::= MINUSMINUS unary_expr. unary_expr ::= unary_operator cast_expr. unary_operator ::= PLUS. unary_operator ::= MINUS. unary_operator ::= COMPLEMENT. unary_operator ::= EXCLAMATION. cast_expr ::= unary_expr. cast_expr ::= LPAREN datatype RPAREN cast_expr. multiplicative_expr ::= cast_expr. multiplicative_expr ::= multiplicative_expr STAR cast_expr. multiplicative_expr ::= multiplicative_expr SLASH cast_expr. multiplicative_expr ::= multiplicative_expr PERCENT cast_expr. additive_expr ::= multiplicative_expr. additive_expr ::= additive_expr PLUS multiplicative_expr. additive_expr ::= additive_expr MINUS multiplicative_expr. shift_expr ::= additive_expr. shift_expr ::= shift_expr LSHIFT additive_expr. shift_expr ::= shift_expr RSHIFT additive_expr. relational_expr ::= shift_expr. relational_expr ::= relational_expr LT shift_expr. relational_expr ::= relational_expr GT shift_expr. relational_expr ::= relational_expr LEQ shift_expr. relational_expr ::= relational_expr GEQ shift_expr. equality_expr ::= relational_expr. equality_expr ::= equality_expr EQL relational_expr. equality_expr ::= equality_expr NEQ relational_expr. and_expr ::= equality_expr. and_expr ::= and_expr AND equality_expr. exclusive_or_expr ::= and_expr. exclusive_or_expr ::= exclusive_or_expr XOR and_expr. inclusive_or_expr ::= exclusive_or_expr. inclusive_or_expr ::= inclusive_or_expr OR exclusive_or_expr. logical_and_expr ::= inclusive_or_expr. logical_and_expr ::= logical_and_expr ANDAND inclusive_or_expr. logical_or_expr ::= logical_and_expr. logical_or_expr ::= logical_or_expr OROR logical_and_expr. conditional_expr ::= logical_or_expr. conditional_expr ::= logical_or_expr QUESTION logical_or_expr COLON conditional_expr. assignment_expr ::= conditional_expr. assignment_expr ::= unary_expr assignment_operator assignment_expr. assignment_operator ::= ASSIGN. assignment_operator ::= MULASSIGN. assignment_operator ::= DIVASSIGN. assignment_operator ::= MODASSIGN. assignment_operator ::= ADDASSIGN. assignment_operator ::= SUBASSIGN. assignment_operator ::= LSHIFTASSIGN. assignment_operator ::= RSHIFTASSIGN. assignment_operator ::= ANDASSIGN. assignment_operator ::= XORASSIGN. assignment_operator ::= ORASSIGN. expression ::= assignment_expr. expression ::= expression COMMA assignment_expr. // end of mojoshader_parser_hlsl.lemon ...