| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871 |
- %{
- #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 <intValue> TOKEN_INTEGER
- %token <floatValue> TOKEN_FLOAT
- %token <intValue> TOKEN_BOOLEAN
- %token <strValue> TOKEN_STRING
- %token <strValue> TOKEN_IDENTIFIER
- %token <intValue> TOKEN_FILLMODEVALUE
- %token <intValue> TOKEN_CULLMODEVALUE
- %token <intValue> TOKEN_COMPFUNCVALUE
- %token <intValue> TOKEN_OPVALUE
- %token <intValue> TOKEN_COLORMASK
- %token <intValue> TOKEN_ADDRMODEVALUE
- %token <intValue> TOKEN_FILTERVALUE
- %token <intValue> TOKEN_BLENDOPVALUE
- %token <intValue> TOKEN_BUFFERUSAGE
- %token <intValue> TOKEN_FLOATTYPE
- %token <intValue> TOKEN_FLOAT2TYPE
- %token <intValue> TOKEN_FLOAT3TYPE
- %token <intValue> TOKEN_FLOAT4TYPE
- %token <intValue> TOKEN_COLORTYPE
- %token <intValue> TOKEN_MAT2x2TYPE
- %token <intValue> TOKEN_MAT2x3TYPE
- %token <intValue> TOKEN_MAT2x4TYPE
- %token <intValue> TOKEN_MAT3x2TYPE
- %token <intValue> TOKEN_MAT3x3TYPE
- %token <intValue> TOKEN_MAT3x4TYPE
- %token <intValue> TOKEN_MAT4x2TYPE
- %token <intValue> TOKEN_MAT4x3TYPE
- %token <intValue> TOKEN_MAT4x4TYPE
- %token <intValue> TOKEN_SAMPLER1D
- %token <intValue> TOKEN_SAMPLER2D
- %token <intValue> TOKEN_SAMPLER3D
- %token <intValue> TOKEN_SAMPLERCUBE
- %token <intValue> TOKEN_SAMPLER2DMS
- %token <intValue> TOKEN_TEXTURE1D
- %token <intValue> TOKEN_TEXTURE2D
- %token <intValue> TOKEN_TEXTURE3D
- %token <intValue> TOKEN_TEXTURECUBE
- %token <intValue> TOKEN_TEXTURE2DMS
- %token <intValue> TOKEN_BYTEBUFFER
- %token <intValue> TOKEN_STRUCTBUFFER
- %token <intValue> TOKEN_RWTYPEDBUFFER
- %token <intValue> TOKEN_RWBYTEBUFFER
- %token <intValue> TOKEN_RWSTRUCTBUFFER
- %token <intValue> TOKEN_RWAPPENDBUFFER
- %token <intValue> 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 <nodePtr> shader;
- %type <nodeOption> shader_statement;
- %type <nodeOption> shader_option;
- %type <nodePtr> technique;
- %type <nodePtr> technique_header;
- %type <nodeOption> technique_statement;
- %type <nodeOption> technique_option;
- %type <nodePtr> pass;
- %type <nodePtr> pass_header;
- %type <nodeOption> pass_statement;
- %type <nodeOption> pass_option;
- %type <nodePtr> code;
- %type <nodePtr> code_header;
- %type <nodePtr> stencil_op_front_header;
- %type <nodePtr> stencil_op_back_header;
- %type <nodeOption> stencil_op_option;
- %type <nodePtr> target;
- %type <nodePtr> target_header;
- %type <nodeOption> target_statement;
- %type <nodeOption> target_option;
- %type <nodePtr> blend_color_header;
- %type <nodePtr> blend_alpha_header;
- %type <nodeOption> blenddef_option;
- %type <nodeOption> sampler_state_option;
- %type <nodePtr> addr_mode;
- %type <nodePtr> addr_mode_header;
- %type <nodeOption> addr_mode_option;
- %type <nodePtr> parameters
- %type <nodePtr> parameters_header
- %type <nodeOption> parameter
- %type <nodePtr> block_header
- %type <nodeOption> block
- %type <nodePtr> blocks_header
- %type <nodePtr> blocks
- %type <nodeOption> qualifier
- %type <matrixValue> float2;
- %type <matrixValue> float3;
- %type <matrixValue> float4;
- %type <matrixValue> mat6;
- %type <matrixValue> mat8;
- %type <matrixValue> mat9;
- %type <matrixValue> mat12;
- %type <matrixValue> mat16;
- %type <nodePtr> param_header_float
- %type <nodePtr> param_header_float2
- %type <nodePtr> param_header_float3
- %type <nodePtr> param_header_float4
- %type <nodePtr> param_header_color
- %type <nodePtr> param_header_mat2x2
- %type <nodePtr> param_header_mat2x3
- %type <nodePtr> param_header_mat2x4
- %type <nodePtr> param_header_mat3x2
- %type <nodePtr> param_header_mat3x3
- %type <nodePtr> param_header_mat3x4
- %type <nodePtr> param_header_mat4x2
- %type <nodePtr> param_header_mat4x3
- %type <nodePtr> param_header_mat4x4
- %type <nodePtr> param_header_sampler
- %type <nodePtr> param_header_generic
- %type <nodePtr> param_header_qualified_sampler
- %type <nodeOption> param_body_float
- %type <nodeOption> param_body_float2
- %type <nodeOption> param_body_float3
- %type <nodeOption> param_body_float4
- %type <nodeOption> param_body_mat6
- %type <nodeOption> param_body_mat8
- %type <nodeOption> param_body_mat9
- %type <nodeOption> param_body_mat12
- %type <nodeOption> param_body_mat16
- %type <nodeOption> 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);
- }
|