%{ #include "BsParserFX.h" #include "BsLexerFX.h" #define inline void yyerror(YYLTYPE *locp, ParseState* parse_state, yyscan_t scanner, const char *msg); %} %code requires{ #include "BsMMAlloc.h" #include "BsASTFX.h" #ifndef YY_TYPEDEF_YY_SCANNER_T #define YY_TYPEDEF_YY_SCANNER_T typedef void* yyscan_t; #endif #define ADD_PARAMETER(OUTPUT, TYPE, NAME) \ OUTPUT = nodeCreate(parse_state->memContext, NT_Parameter); \ nodePush(parse_state, OUTPUT); \ \ NodeOption paramType; \ paramType.type = OT_ParamType; \ paramType.value.intValue = TYPE; \ \ NodeOption paramName; \ paramName.type = OT_Identifier; \ paramName.value.strValue = NAME; \ \ nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, ¶mType); \ nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, ¶mName); \ } %output "BsParserFX.c" %defines "BsParserFX.h" %define api.pure %locations %lex-param { yyscan_t scanner } %parse-param { ParseState* parse_state } %parse-param { yyscan_t scanner } %glr-parser %union { int intValue; float floatValue; float matrixValue[16]; const char* strValue; ASTFXNode* nodePtr; NodeOption nodeOption; } /* Value types */ %token TOKEN_INTEGER %token TOKEN_FLOAT %token TOKEN_BOOLEAN %token TOKEN_STRING %token TOKEN_IDENTIFIER %token TOKEN_FILLMODEVALUE %token TOKEN_CULLMODEVALUE %token TOKEN_COMPFUNCVALUE %token TOKEN_OPVALUE %token TOKEN_COLORMASK %token TOKEN_ADDRMODEVALUE %token TOKEN_FILTERVALUE %token TOKEN_BLENDOPVALUE %token TOKEN_BUFFERUSAGE %token TOKEN_FLOATTYPE %token TOKEN_FLOAT2TYPE %token TOKEN_FLOAT3TYPE %token TOKEN_FLOAT4TYPE %token TOKEN_COLORTYPE %token TOKEN_MAT2x2TYPE %token TOKEN_MAT2x3TYPE %token TOKEN_MAT2x4TYPE %token TOKEN_MAT3x2TYPE %token TOKEN_MAT3x3TYPE %token TOKEN_MAT3x4TYPE %token TOKEN_MAT4x2TYPE %token TOKEN_MAT4x3TYPE %token TOKEN_MAT4x4TYPE %token TOKEN_SAMPLER1D %token TOKEN_SAMPLER2D %token TOKEN_SAMPLER3D %token TOKEN_SAMPLERCUBE %token TOKEN_SAMPLER2DMS %token TOKEN_TEXTURE1D %token TOKEN_TEXTURE2D %token TOKEN_TEXTURE3D %token TOKEN_TEXTURECUBE %token TOKEN_TEXTURE2DMS %token TOKEN_BYTEBUFFER %token TOKEN_STRUCTBUFFER %token TOKEN_RWTYPEDBUFFER %token TOKEN_RWBYTEBUFFER %token TOKEN_RWSTRUCTBUFFER %token TOKEN_RWAPPENDBUFFER %token TOKEN_RWCONSUMEBUFFER %token TOKEN_PARAMSBLOCK /* Qualifiers */ %token TOKEN_AUTO TOKEN_ALIAS TOKEN_SHARED TOKEN_USAGE /* Shader keywords */ %token TOKEN_SEPARABLE TOKEN_QUEUE TOKEN_PRIORITY TOKEN_TRANSPARENT %token TOKEN_PARAMETERS TOKEN_BLOCKS TOKEN_TECHNIQUE /* Technique keywords */ %token TOKEN_RENDERER TOKEN_LANGUAGE TOKEN_INCLUDE TOKEN_PASS /* Pass keywords */ %token TOKEN_VERTEX TOKEN_FRAGMENT TOKEN_GEOMETRY TOKEN_HULL TOKEN_DOMAIN TOKEN_COMPUTE TOKEN_COMMON %token TOKEN_STENCILREF %token TOKEN_FILLMODE TOKEN_CULLMODE TOKEN_DEPTHBIAS TOKEN_SDEPTHBIAS %token TOKEN_DEPTHCLIP TOKEN_SCISSOR TOKEN_MULTISAMPLE TOKEN_AALINE %token TOKEN_DEPTHREAD TOKEN_DEPTHWRITE TOKEN_COMPAREFUNC TOKEN_STENCIL %token TOKEN_STENCILREADMASK TOKEN_STENCILWRITEMASK TOKEN_STENCILOPFRONT TOKEN_STENCILOPBACK %token TOKEN_FAIL TOKEN_ZFAIL %token TOKEN_ALPHATOCOVERAGE TOKEN_INDEPENDANTBLEND TOKEN_TARGET TOKEN_INDEX %token TOKEN_BLEND TOKEN_COLOR TOKEN_ALPHA TOKEN_WRITEMASK %token TOKEN_SOURCE TOKEN_DEST TOKEN_OP /* Sampler state keywords */ %token TOKEN_ADDRMODE TOKEN_MINFILTER TOKEN_MAGFILTER TOKEN_MIPFILTER %token TOKEN_MAXANISO TOKEN_MIPBIAS TOKEN_MIPMIN TOKEN_MIPMAX %token TOKEN_BORDERCOLOR TOKEN_U TOKEN_V TOKEN_W %type shader; %type shader_statement; %type shader_option; %type technique; %type technique_header; %type technique_statement; %type technique_option; %type pass; %type pass_header; %type pass_statement; %type pass_option; %type code; %type code_header; %type stencil_op_front_header; %type stencil_op_back_header; %type stencil_op_option; %type target; %type target_header; %type target_statement; %type target_option; %type blend_color_header; %type blend_alpha_header; %type blenddef_option; %type sampler_state_option; %type addr_mode; %type addr_mode_header; %type addr_mode_option; %type parameters %type parameters_header %type parameter %type block_header %type block %type blocks_header %type blocks %type qualifier %type float2; %type float3; %type float4; %type mat6; %type mat8; %type mat9; %type mat12; %type mat16; %type param_header_float %type param_header_float2 %type param_header_float3 %type param_header_float4 %type param_header_color %type param_header_mat2x2 %type param_header_mat2x3 %type param_header_mat2x4 %type param_header_mat3x2 %type param_header_mat3x3 %type param_header_mat3x4 %type param_header_mat4x2 %type param_header_mat4x3 %type param_header_mat4x4 %type param_header_sampler %type param_header_generic %type param_header_qualified_sampler %type param_body_float %type param_body_float2 %type param_body_float3 %type param_body_float4 %type param_body_mat6 %type param_body_mat8 %type param_body_mat9 %type param_body_mat12 %type param_body_mat16 %type param_body_sampler %% /* Shader */ shader : /* empty */ { } | shader_statement shader { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; shader_statement : shader_option | technique { $$.type = OT_Technique; $$.value.nodePtr = $1; } | parameters { $$.type = OT_Parameters; $$.value.nodePtr = $1; } | blocks { $$.type = OT_Blocks; $$.value.nodePtr = $1; } ; shader_option : TOKEN_SEPARABLE '=' TOKEN_BOOLEAN ';' { $$.type = OT_Separable; $$.value.intValue = $3; } | TOKEN_QUEUE '=' TOKEN_INTEGER ';' { $$.type = OT_Queue; $$.value.intValue = $3; } | TOKEN_PRIORITY '=' TOKEN_INTEGER ';' { $$.type = OT_Priority; $$.value.intValue = $3; } | TOKEN_INCLUDE '=' TOKEN_STRING ';' { $$.type = OT_Include; $$.value.strValue = $3; } | TOKEN_TRANSPARENT '=' TOKEN_BOOLEAN ';' { $$.type = OT_Transparent; $$.value.intValue = $3; } ; /* Technique */ technique : technique_header '{' technique_body '}' ';' { nodePop(parse_state); $$ = $1; } ; technique_header : TOKEN_TECHNIQUE '=' { $$ = nodeCreate(parse_state->memContext, NT_Technique); nodePush(parse_state, $$); } ; technique_body : /* empty */ | technique_statement technique_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; technique_statement : technique_option | pass { $$.type = OT_Pass; $$.value.nodePtr = $1; } | pass_option | code { $$.type = OT_Code; $$.value.nodePtr = $1; } ; technique_option : TOKEN_RENDERER '=' TOKEN_STRING ';' { $$.type = OT_Renderer; $$.value.strValue = $3; } | TOKEN_LANGUAGE '=' TOKEN_STRING ';' { $$.type = OT_Language; $$.value.strValue = $3; } ; /* Pass */ pass : pass_header '{' pass_body '}' ';' { nodePop(parse_state); $$ = $1; } ; pass_header : TOKEN_PASS '=' { $$ = nodeCreate(parse_state->memContext, NT_Pass); nodePush(parse_state, $$); } ; pass_body : /* empty */ | pass_statement pass_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; pass_statement : pass_option | code { $$.type = OT_Code; $$.value.nodePtr = $1; } ; pass_option : TOKEN_INDEX '=' TOKEN_INTEGER ';' { $$.type = OT_Index; $$.value.intValue = $3; } | TOKEN_FILLMODE '=' TOKEN_FILLMODEVALUE ';' { $$.type = OT_FillMode; $$.value.intValue = $3; } | TOKEN_CULLMODE '=' TOKEN_CULLMODEVALUE ';' { $$.type = OT_CullMode; $$.value.intValue = $3; } | TOKEN_DEPTHBIAS '=' TOKEN_FLOAT ';' { $$.type = OT_DepthBias; $$.value.floatValue = $3; } | TOKEN_SDEPTHBIAS '=' TOKEN_FLOAT ';' { $$.type = OT_SDepthBias; $$.value.floatValue = $3; } | TOKEN_DEPTHCLIP '=' TOKEN_BOOLEAN ';' { $$.type = OT_DepthClip; $$.value.intValue = $3; } | TOKEN_SCISSOR '=' TOKEN_BOOLEAN ';' { $$.type = OT_Scissor; $$.value.intValue = $3; } | TOKEN_MULTISAMPLE '=' TOKEN_BOOLEAN ';' { $$.type = OT_Multisample; $$.value.intValue = $3; } | TOKEN_AALINE '=' TOKEN_BOOLEAN ';' { $$.type = OT_AALine; $$.value.intValue = $3; } | TOKEN_DEPTHREAD '=' TOKEN_BOOLEAN ';' { $$.type = OT_DepthRead; $$.value.intValue = $3; } | TOKEN_DEPTHWRITE '=' TOKEN_BOOLEAN ';' { $$.type = OT_DepthWrite; $$.value.intValue = $3; } | TOKEN_COMPAREFUNC '=' TOKEN_COMPFUNCVALUE ';' { $$.type = OT_CompareFunc; $$.value.intValue = $3; } | TOKEN_STENCIL '=' TOKEN_BOOLEAN ';' { $$.type = OT_Stencil; $$.value.intValue = $3; } | TOKEN_STENCILREADMASK '=' TOKEN_INTEGER ';' { $$.type = OT_StencilReadMask; $$.value.intValue = $3; } | TOKEN_STENCILWRITEMASK '=' TOKEN_INTEGER ';' { $$.type = OT_StencilWriteMask; $$.value.intValue = $3; } | stencil_op_front_header '{' stencil_op_body '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpFront; $$.value.nodePtr = $1; } | stencil_op_back_header '{' stencil_op_body '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpBack; $$.value.nodePtr = $1; } | stencil_op_front_header '{' stencil_op_body_init '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpFront; $$.value.nodePtr = $1; } | stencil_op_back_header '{' stencil_op_body_init '}' ';' { nodePop(parse_state); $$.type = OT_StencilOpBack; $$.value.nodePtr = $1; } | TOKEN_ALPHATOCOVERAGE '=' TOKEN_BOOLEAN ';' { $$.type = OT_AlphaToCoverage; $$.value.intValue = $3; } | TOKEN_INDEPENDANTBLEND '=' TOKEN_BOOLEAN ';' { $$.type = OT_IndependantBlend; $$.value.intValue = $3; } | target { $$.type = OT_Target; $$.value.nodePtr = $1; } | TOKEN_STENCILREF '=' TOKEN_INTEGER ';' { $$.type = OT_StencilRef; $$.value.intValue = $3; } ; /* Code blocks */ code : code_header '{' TOKEN_INDEX '=' TOKEN_INTEGER ';' '}' ';' { NodeOption index; index.type = OT_Index; index.value.intValue = $5; nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &index); nodePop(parse_state); $$ = $1; } ; code_header : TOKEN_VERTEX '=' { $$ = nodeCreate(parse_state->memContext, NT_Code); nodePush(parse_state, $$); } | TOKEN_FRAGMENT '=' { $$ = nodeCreate(parse_state->memContext, NT_Code); nodePush(parse_state, $$); } | TOKEN_GEOMETRY '=' { $$ = nodeCreate(parse_state->memContext, NT_Code); nodePush(parse_state, $$); } | TOKEN_HULL '=' { $$ = nodeCreate(parse_state->memContext, NT_Code); nodePush(parse_state, $$); } | TOKEN_DOMAIN '=' { $$ = nodeCreate(parse_state->memContext, NT_Code); nodePush(parse_state, $$); } | TOKEN_COMPUTE '=' { $$ = nodeCreate(parse_state->memContext, NT_Code); nodePush(parse_state, $$); } | TOKEN_COMMON '=' { $$ = nodeCreate(parse_state->memContext, NT_Code); nodePush(parse_state, $$); } ; /* Stencil op */ stencil_op_front_header : TOKEN_STENCILOPFRONT '=' { $$ = nodeCreate(parse_state->memContext, NT_StencilOp); nodePush(parse_state, $$); } ; stencil_op_back_header : TOKEN_STENCILOPBACK '=' { $$ = nodeCreate(parse_state->memContext, NT_StencilOp); nodePush(parse_state, $$); } ; stencil_op_body_init : TOKEN_OPVALUE ',' TOKEN_OPVALUE ',' TOKEN_OPVALUE ',' TOKEN_COMPFUNCVALUE { NodeOption fail; fail.type = OT_Fail; fail.value.intValue = $1; NodeOption zfail; zfail.type = OT_ZFail; zfail.value.intValue = $3; NodeOption pass; pass.type = OT_PassOp; pass.value.intValue = $5; NodeOption cmp; cmp.type = OT_CompareFunc; cmp.value.intValue = $7; nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &fail); nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &zfail); nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &pass); nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &cmp); } ; stencil_op_body : /* empty */ | stencil_op_option stencil_op_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; stencil_op_option : TOKEN_FAIL '=' TOKEN_OPVALUE ';' { $$.type = OT_Fail; $$.value.intValue = $3; } | TOKEN_ZFAIL '=' TOKEN_OPVALUE ';' { $$.type = OT_ZFail; $$.value.intValue = $3; } | TOKEN_PASS '=' TOKEN_OPVALUE ';' { $$.type = OT_PassOp; $$.value.intValue = $3; } | TOKEN_COMPAREFUNC '=' TOKEN_COMPFUNCVALUE ';' { $$.type = OT_CompareFunc; $$.value.intValue = $3; } ; /* Target */ target : target_header '{' target_body '}' ';' { nodePop(parse_state); $$ = $1; } ; target_header : TOKEN_TARGET '=' { $$ = nodeCreate(parse_state->memContext, NT_Target); nodePush(parse_state, $$); } ; target_body : /* empty */ | target_statement target_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; target_statement : target_option ; target_option : TOKEN_INDEX '=' TOKEN_INTEGER ';' { $$.type = OT_Index; $$.value.intValue = $3; } | TOKEN_BLEND '=' TOKEN_BOOLEAN ';' { $$.type = OT_Blend; $$.value.intValue = $3; } | blend_color_header '{' blenddef_body '}' ';' { nodePop(parse_state); $$.type = OT_Color; $$.value.nodePtr = $1; } | blend_alpha_header '{' blenddef_body '}' ';' { nodePop(parse_state); $$.type = OT_Alpha; $$.value.nodePtr = $1; } | blend_color_header '{' blenddef_body_init '}' ';' { nodePop(parse_state); $$.type = OT_Color; $$.value.nodePtr = $1; } | blend_alpha_header '{' blenddef_body_init '}' ';' { nodePop(parse_state); $$.type = OT_Alpha; $$.value.nodePtr = $1; } | TOKEN_WRITEMASK '=' TOKEN_COLORMASK ';' { $$.type = OT_WriteMask; $$.value.intValue = $3; } ; /* Blend definition */ blend_color_header : TOKEN_COLOR '=' { $$ = nodeCreate(parse_state->memContext, NT_BlendDef); nodePush(parse_state, $$); } ; blend_alpha_header : TOKEN_ALPHA '=' { $$ = nodeCreate(parse_state->memContext, NT_BlendDef); nodePush(parse_state, $$); } ; blenddef_body : /* empty */ | blenddef_option blenddef_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; blenddef_body_init : TOKEN_OPVALUE ',' TOKEN_OPVALUE ',' TOKEN_BLENDOPVALUE { NodeOption src; src.type = OT_Source; src.value.intValue = $1; NodeOption dst; dst.type = OT_Dest; dst.value.intValue = $3; NodeOption op; op.type = OT_Op; op.value.intValue = $5; nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &src); nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &dst); nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &op); } ; blenddef_option : TOKEN_SOURCE '=' TOKEN_OPVALUE ';' { $$.type = OT_Source; $$.value.intValue = $3; } | TOKEN_DEST '=' TOKEN_OPVALUE ';' { $$.type = OT_Dest; $$.value.intValue = $3; } | TOKEN_OP '=' TOKEN_BLENDOPVALUE ';' { $$.type = OT_Op; $$.value.intValue = $3; } ; /* Sampler state */ sampler_state_body : /* empty */ | sampler_state_option sampler_state_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; sampler_state_option : addr_mode { $$.type = OT_AddrMode; $$.value.nodePtr = $1; } | TOKEN_MINFILTER '=' TOKEN_FILTERVALUE ';' { $$.type = OT_MinFilter; $$.value.intValue = $3; } | TOKEN_MAGFILTER '=' TOKEN_FILTERVALUE ';' { $$.type = OT_MagFilter; $$.value.intValue = $3; } | TOKEN_MIPFILTER '=' TOKEN_FILTERVALUE ';' { $$.type = OT_MipFilter; $$.value.intValue = $3; } | TOKEN_MAXANISO '=' TOKEN_INTEGER ';' { $$.type = OT_MaxAniso; $$.value.intValue = $3; } | TOKEN_MIPBIAS '=' TOKEN_FLOAT ';' { $$.type = OT_MipBias; $$.value.floatValue = $3; } | TOKEN_MIPMIN '=' TOKEN_FLOAT ';' { $$.type = OT_MipMin; $$.value.floatValue = $3; } | TOKEN_MIPMAX '=' TOKEN_FLOAT ';' { $$.type = OT_MipMax; $$.value.floatValue = $3; } | TOKEN_BORDERCOLOR '=' float4 ';' { $$.type = OT_BorderColor; memcpy($$.value.matrixValue, $3, sizeof($3)); } | TOKEN_COMPAREFUNC '=' TOKEN_COMPFUNCVALUE ';' { $$.type = OT_CompareFunc; $$.value.intValue = $3; } ; /* Addresing mode */ addr_mode : addr_mode_header '{' addr_mode_body '}' ';' { nodePop(parse_state); $$ = $1; } | addr_mode_header '{' addr_mode_body_init '}' ';' { nodePop(parse_state); $$ = $1; } ; addr_mode_header : TOKEN_ADDRMODE '=' { $$ = nodeCreate(parse_state->memContext, NT_AddrMode); nodePush(parse_state, $$); } ; addr_mode_body_init : TOKEN_ADDRMODEVALUE ',' TOKEN_ADDRMODEVALUE ',' TOKEN_ADDRMODEVALUE { NodeOption u; u.type = OT_U; u.value.intValue = $1; NodeOption v; v.type = OT_V; v.value.intValue = $3; NodeOption w; w.type = OT_W; w.value.intValue = $5; nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &u); nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &v); nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &w); } ; addr_mode_body : /* empty */ | addr_mode_option addr_mode_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; addr_mode_option : TOKEN_U '=' TOKEN_ADDRMODEVALUE ';' { $$.type = OT_U; $$.value.intValue = $3; } | TOKEN_V '=' TOKEN_ADDRMODEVALUE ';' { $$.type = OT_V; $$.value.intValue = $3; } | TOKEN_W '=' TOKEN_ADDRMODEVALUE ';' { $$.type = OT_W; $$.value.intValue = $3; } ; /* Value types */ float2 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; } ; float3 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; } ; float4 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8;} ; mat6 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8; $$[4] = $10; $$[5] = $12; } ; mat8 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8; $$[4] = $10; $$[5] = $12; $$[6] = $14; $$[7] = $16; } ; mat9 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8; $$[4] = $10; $$[5] = $12; $$[6] = $14; $$[7] = $16; $$[8] = $18; } ; mat12 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8; $$[4] = $10; $$[5] = $12; $$[6] = $14; $$[7] = $16; $$[8] = $18; $$[9] = $20; $$[10] = $22; $$[11] = $24; } ; mat16 : '{' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT ',' TOKEN_FLOAT '}' { $$[0] = $2; $$[1] = $4; $$[2] = $6; $$[3] = $8; $$[4] = $10; $$[5] = $12; $$[6] = $14; $$[7] = $16; $$[8] = $18; $$[9] = $20; $$[10] = $22; $$[11] = $24; $$[12] = $26; $$[13] = $28; $$[14] = $30; $$[15] = $32; } ; /* Parameters */ parameters : parameters_header '{' parameters_body '}' ';' { nodePop(parse_state); $$ = $1; } ; parameters_header : TOKEN_PARAMETERS '=' { $$ = nodeCreate(parse_state->memContext, NT_Parameters); nodePush(parse_state, $$); } ; parameters_body : /* empty */ | parameter parameters_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; parameter : param_header_float qualifier_list param_body_float ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_float2 qualifier_list param_body_float2 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_float3 qualifier_list param_body_float3 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_float4 qualifier_list param_body_float4 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_color qualifier_list param_body_float4 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat2x2 qualifier_list param_body_float4 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat2x3 qualifier_list param_body_mat6 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat2x4 qualifier_list param_body_mat8 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat3x2 qualifier_list param_body_mat6 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat3x3 qualifier_list param_body_mat9 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat3x4 qualifier_list param_body_mat12 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat4x2 qualifier_list param_body_mat8 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat4x3 qualifier_list param_body_mat12 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_mat4x4 qualifier_list param_body_mat16 ';' { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$3); nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_generic qualifier_list ';' { nodePop(parse_state); $$.type = OT_Parameter; $$.value.nodePtr = $1; } | param_header_qualified_sampler param_body_sampler ';' { nodePop(parse_state); NodeOption samplerState; samplerState.type = OT_SamplerState; samplerState.value.nodePtr = $1; nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &samplerState); $$.type = OT_Parameter; $$.value.nodePtr = parse_state->topNode; nodePop(parse_state); } ; param_header_float : TOKEN_FLOATTYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_float2 : TOKEN_FLOAT2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_float3 : TOKEN_FLOAT3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_float4 : TOKEN_FLOAT4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_color : TOKEN_COLORTYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat2x2 : TOKEN_MAT2x2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat2x3 : TOKEN_MAT2x3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat2x4 : TOKEN_MAT2x4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat3x2 : TOKEN_MAT3x2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat3x3 : TOKEN_MAT3x3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat3x4 : TOKEN_MAT3x4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat4x2 : TOKEN_MAT4x2TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat4x3 : TOKEN_MAT4x3TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_mat4x4 : TOKEN_MAT4x4TYPE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_sampler : TOKEN_SAMPLER1D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_SAMPLER2D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_SAMPLER3D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_SAMPLERCUBE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_SAMPLER2DMS TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_generic : TOKEN_TEXTURE1D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_TEXTURE2D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_TEXTURE3D TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_TEXTURECUBE TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_TEXTURE2DMS TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_BYTEBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_STRUCTBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_RWTYPEDBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_RWBYTEBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_RWSTRUCTBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_RWAPPENDBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } | TOKEN_RWCONSUMEBUFFER TOKEN_IDENTIFIER { ADD_PARAMETER($$, $1, $2); } ; param_header_qualified_sampler : param_header_sampler qualifier_list { $$ = nodeCreate(parse_state->memContext, NT_SamplerState); nodePush(parse_state, $$); } ; param_body_float : /* empty */ { $$.type = OT_None; } | '=' TOKEN_FLOAT { $$.type = OT_ParamValue; $$.value.floatValue = $2; } ; param_body_float2 : /* empty */ { $$.type = OT_None; } | '=' float2 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_float3 : /* empty */ { $$.type = OT_None; } | '=' float3 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_float4 : /* empty */ { $$.type = OT_None; } | '=' float4 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_mat6 : /* empty */ { $$.type = OT_None; } | '=' mat6 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_mat8 : /* empty */ { $$.type = OT_None; } | '=' mat8 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_mat9 : /* empty */ { $$.type = OT_None; } | '=' mat9 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_mat12 : /* empty */ { $$.type = OT_None; } | '=' mat12 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_mat16 : /* empty */ { $$.type = OT_None; } | '=' mat16 { $$.type = OT_ParamValue; memcpy($$.value.matrixValue, $2, sizeof($2)); } ; param_body_sampler : /* empty */ { $$.type = OT_None; } | '=' '{' sampler_state_body '}' { } ; /* Blocks */ blocks : blocks_header '{' blocks_body '}' ';' { nodePop(parse_state); $$ = $1; } ; blocks_header : TOKEN_BLOCKS '=' { $$ = nodeCreate(parse_state->memContext, NT_Blocks); nodePush(parse_state, $$); } ; blocks_body : /* empty */ | block blocks_body { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; block : block_header qualifier_list ';' { nodePop(parse_state); $$.type = OT_Block; $$.value.nodePtr = $1; } ; block_header : TOKEN_PARAMSBLOCK TOKEN_IDENTIFIER { $$ = nodeCreate(parse_state->memContext, NT_Block); nodePush(parse_state, $$); NodeOption blockName; blockName.type = OT_Identifier; blockName.value.strValue = $2; nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &blockName); } ; /* Qualifiers */ qualifier_list : /* empty */ | qualifier qualifier_list { nodeOptionsAdd(parse_state->memContext, parse_state->topNode->options, &$1); } ; qualifier : ':' TOKEN_ALIAS '(' TOKEN_STRING ')' { $$.type = OT_Alias; $$.value.strValue = $4; } | ':' TOKEN_AUTO '(' TOKEN_STRING ')' { $$.type = OT_Auto; $$.value.strValue = $4; } | ':' TOKEN_SHARED '(' TOKEN_BOOLEAN ')' { $$.type = OT_Shared; $$.value.intValue = $4; } | ':' TOKEN_USAGE '(' TOKEN_BUFFERUSAGE ')' { $$.type = OT_Usage; $$.value.intValue = $4; } ; %% void yyerror(YYLTYPE *locp, ParseState* parse_state, yyscan_t scanner, const char *msg) { parse_state->hasError = 1; parse_state->errorLine = locp->first_line; parse_state->errorColumn = locp->first_column; parse_state->errorMessage = mmalloc_strdup(parse_state->memContext, msg); }