-.syntax program;\r
-\r
-/*\r
- This value must be incremented every time emit code values or structure of the production\r
- array changes. This value is placed at the beginning of the production array. The loader\r
- compares the value with its REVISION value. If they do not match, the loader is not up\r
- to date.\r
-*/\r
-.emtcode REVISION 0x07\r
-\r
-/* program type */\r
-.emtcode FRAGMENT_PROGRAM 0x01\r
-.emtcode VERTEX_PROGRAM 0x02\r
-\r
-/* program section */\r
-.emtcode OPTION 0x01\r
-.emtcode INSTRUCTION 0x02\r
-.emtcode DECLARATION 0x03\r
-.emtcode END 0x04\r
-\r
-/* GL_ARB_fragment_program option flags */\r
-.emtcode ARB_PRECISION_HINT_FASTEST 0x01\r
-.emtcode ARB_PRECISION_HINT_NICEST 0x02\r
-.emtcode ARB_FOG_EXP 0x04\r
-.emtcode ARB_FOG_EXP2 0x08\r
-.emtcode ARB_FOG_LINEAR 0x10\r
-\r
-/* GL_ARB_vertex_program option flags */\r
-.emtcode ARB_POSITION_INVARIANT 0x20\r
-\r
-/* GL_ARB_fragment_program_shadow option flags */\r
-.emtcode ARB_FRAGMENT_PROGRAM_SHADOW 0x40\r
-\r
-/* GL_ARB_fragment_program instruction class */\r
-.emtcode OP_ALU_INST 0x00\r
-.emtcode OP_TEX_INST 0x01\r
-\r
-/* GL_ARB_vertex_program instruction class */\r
-/* OP_ALU_INST */\r
-\r
-/* GL_ARB_fragment_program instruction type */\r
-.emtcode OP_ALU_VECTOR 0x00\r
-.emtcode OP_ALU_SCALAR 0x01\r
-.emtcode OP_ALU_BINSC 0x02\r
-.emtcode OP_ALU_BIN 0x03\r
-.emtcode OP_ALU_TRI 0x04\r
-.emtcode OP_ALU_SWZ 0x05\r
-.emtcode OP_TEX_SAMPLE 0x06\r
-.emtcode OP_TEX_KIL 0x07\r
-\r
-/* GL_ARB_vertex_program instruction type */\r
-.emtcode OP_ALU_ARL 0x08\r
-/* OP_ALU_VECTOR */\r
-/* OP_ALU_SCALAR */\r
-/* OP_ALU_BINSC */\r
-/* OP_ALU_BIN */\r
-/* OP_ALU_TRI */\r
-/* OP_ALU_SWZ */\r
-\r
-/* GL_ARB_fragment_program instruction code */\r
-.emtcode OP_ABS 0x00\r
-.emtcode OP_ABS_SAT 0x1B\r
-.emtcode OP_FLR 0x09\r
-.emtcode OP_FLR_SAT 0x26\r
-.emtcode OP_FRC 0x0A\r
-.emtcode OP_FRC_SAT 0x27\r
-.emtcode OP_LIT 0x0C\r
-.emtcode OP_LIT_SAT 0x2A\r
-.emtcode OP_MOV 0x11\r
-.emtcode OP_MOV_SAT 0x30\r
-.emtcode OP_COS 0x1F\r
-.emtcode OP_COS_SAT 0x20\r
-.emtcode OP_EX2 0x07\r
-.emtcode OP_EX2_SAT 0x25\r
-.emtcode OP_LG2 0x0B\r
-.emtcode OP_LG2_SAT 0x29\r
-.emtcode OP_RCP 0x14\r
-.emtcode OP_RCP_SAT 0x33\r
-.emtcode OP_RSQ 0x15\r
-.emtcode OP_RSQ_SAT 0x34\r
-.emtcode OP_SIN 0x38\r
-.emtcode OP_SIN_SAT 0x39\r
-.emtcode OP_SCS 0x35\r
-.emtcode OP_SCS_SAT 0x36\r
-.emtcode OP_POW 0x13\r
-.emtcode OP_POW_SAT 0x32\r
-.emtcode OP_ADD 0x01\r
-.emtcode OP_ADD_SAT 0x1C\r
-.emtcode OP_DP3 0x03\r
-.emtcode OP_DP3_SAT 0x21\r
-.emtcode OP_DP4 0x04\r
-.emtcode OP_DP4_SAT 0x22\r
-.emtcode OP_DPH 0x05\r
-.emtcode OP_DPH_SAT 0x23\r
-.emtcode OP_DST 0x06\r
-.emtcode OP_DST_SAT 0x24\r
-.emtcode OP_MAX 0x0F\r
-.emtcode OP_MAX_SAT 0x2E\r
-.emtcode OP_MIN 0x10\r
-.emtcode OP_MIN_SAT 0x2F\r
-.emtcode OP_MUL 0x12\r
-.emtcode OP_MUL_SAT 0x31\r
-.emtcode OP_SGE 0x16\r
-.emtcode OP_SGE_SAT 0x37\r
-.emtcode OP_SLT 0x17\r
-.emtcode OP_SLT_SAT 0x3A\r
-.emtcode OP_SUB 0x18\r
-.emtcode OP_SUB_SAT 0x3B\r
-.emtcode OP_XPD 0x1A\r
-.emtcode OP_XPD_SAT 0x43\r
-.emtcode OP_CMP 0x1D\r
-.emtcode OP_CMP_SAT 0x1E\r
-.emtcode OP_LRP 0x2B\r
-.emtcode OP_LRP_SAT 0x2C\r
-.emtcode OP_MAD 0x0E\r
-.emtcode OP_MAD_SAT 0x2D\r
-.emtcode OP_SWZ 0x19\r
-.emtcode OP_SWZ_SAT 0x3C\r
-.emtcode OP_TEX 0x3D\r
-.emtcode OP_TEX_SAT 0x3E\r
-.emtcode OP_TXB 0x3F\r
-.emtcode OP_TXB_SAT 0x40\r
-.emtcode OP_TXP 0x41\r
-.emtcode OP_TXP_SAT 0x42\r
-.emtcode OP_KIL 0x28\r
-\r
-/* GL_ARB_vertex_program instruction code */\r
-.emtcode OP_ARL 0x02\r
-/* OP_ABS */\r
-/* OP_FLR */\r
-/* OP_FRC */\r
-/* OP_LIT */\r
-/* OP_MOV */\r
-/* OP_EX2 */\r
-.emtcode OP_EXP 0x08\r
-/* OP_LG2 */\r
-.emtcode OP_LOG 0x0D\r
-/* OP_RCP */\r
-/* OP_RSQ */\r
-/* OP_POW */\r
-/* OP_ADD */\r
-/* OP_DP3 */\r
-/* OP_DP4 */\r
-/* OP_DPH */\r
-/* OP_DST */\r
-/* OP_MAX */\r
-/* OP_MIN */\r
-/* OP_MUL */\r
-/* OP_SGE */\r
-/* OP_SLT */\r
-/* OP_SUB */\r
-/* OP_XPD */\r
-/* OP_MAD */\r
-/* OP_SWZ */\r
-\r
-/* fragment attribute binding */\r
-.emtcode FRAGMENT_ATTRIB_COLOR 0x01\r
-.emtcode FRAGMENT_ATTRIB_TEXCOORD 0x02\r
-.emtcode FRAGMENT_ATTRIB_FOGCOORD 0x03\r
-.emtcode FRAGMENT_ATTRIB_POSITION 0x04\r
-\r
-/* vertex attribute binding */\r
-.emtcode VERTEX_ATTRIB_POSITION 0x01\r
-.emtcode VERTEX_ATTRIB_WEIGHT 0x02\r
-.emtcode VERTEX_ATTRIB_NORMAL 0x03\r
-.emtcode VERTEX_ATTRIB_COLOR 0x04\r
-.emtcode VERTEX_ATTRIB_FOGCOORD 0x05\r
-.emtcode VERTEX_ATTRIB_TEXCOORD 0x06\r
-.emtcode VERTEX_ATTRIB_MATRIXINDEX 0x07\r
-.emtcode VERTEX_ATTRIB_GENERIC 0x08\r
-\r
-/* fragment result binding */\r
-.emtcode FRAGMENT_RESULT_COLOR 0x01\r
-.emtcode FRAGMENT_RESULT_DEPTH 0x02\r
-\r
-/* vertex result binding */\r
-.emtcode VERTEX_RESULT_POSITION 0x01\r
-.emtcode VERTEX_RESULT_COLOR 0x02\r
-.emtcode VERTEX_RESULT_FOGCOORD 0x03\r
-.emtcode VERTEX_RESULT_POINTSIZE 0x04\r
-.emtcode VERTEX_RESULT_TEXCOORD 0x05\r
-\r
-/* texture target */\r
-.emtcode TEXTARGET_1D 0x01\r
-.emtcode TEXTARGET_2D 0x02\r
-.emtcode TEXTARGET_3D 0x03\r
-.emtcode TEXTARGET_RECT 0x04\r
-.emtcode TEXTARGET_CUBE 0x05\r
-/* GL_ARB_fragment_program_shadow */\r
-.emtcode TEXTARGET_SHADOW1D 0x06\r
-.emtcode TEXTARGET_SHADOW2D 0x07\r
-.emtcode TEXTARGET_SHADOWRECT 0x08\r
-\r
-/* face type */\r
-.emtcode FACE_FRONT 0x00\r
-.emtcode FACE_BACK 0x01\r
-\r
-/* color type */\r
-.emtcode COLOR_PRIMARY 0x00\r
-.emtcode COLOR_SECONDARY 0x01\r
-\r
-/* component */\r
-.emtcode COMPONENT_X 0x00\r
-.emtcode COMPONENT_Y 0x01\r
-.emtcode COMPONENT_Z 0x02\r
-.emtcode COMPONENT_W 0x03\r
-.emtcode COMPONENT_0 0x04\r
-.emtcode COMPONENT_1 0x05\r
-\r
-/* array index type */\r
-.emtcode ARRAY_INDEX_ABSOLUTE 0x00\r
-.emtcode ARRAY_INDEX_RELATIVE 0x01\r
-\r
-/* matrix name */\r
-.emtcode MATRIX_MODELVIEW 0x01\r
-.emtcode MATRIX_PROJECTION 0x02\r
-.emtcode MATRIX_MVP 0x03\r
-.emtcode MATRIX_TEXTURE 0x04\r
-.emtcode MATRIX_PALETTE 0x05\r
-.emtcode MATRIX_PROGRAM 0x06\r
-\r
-/* matrix modifier */\r
-.emtcode MATRIX_MODIFIER_IDENTITY 0x00\r
-.emtcode MATRIX_MODIFIER_INVERSE 0x01\r
-.emtcode MATRIX_MODIFIER_TRANSPOSE 0x02\r
-.emtcode MATRIX_MODIFIER_INVTRANS 0x03\r
-\r
-/* constant type */\r
-.emtcode CONSTANT_SCALAR 0x01\r
-.emtcode CONSTANT_VECTOR 0x02\r
-\r
-/* program param type */\r
-.emtcode PROGRAM_PARAM_ENV 0x01\r
-.emtcode PROGRAM_PARAM_LOCAL 0x02\r
-\r
-/* register type */\r
-.emtcode REGISTER_ATTRIB 0x01\r
-.emtcode REGISTER_PARAM 0x02\r
-.emtcode REGISTER_RESULT 0x03\r
-.emtcode REGISTER_ESTABLISHED_NAME 0x04\r
-\r
-/* param binding */\r
-.emtcode PARAM_NULL 0x00\r
-.emtcode PARAM_ARRAY_ELEMENT 0x01\r
-.emtcode PARAM_STATE_ELEMENT 0x02\r
-.emtcode PARAM_PROGRAM_ELEMENT 0x03\r
-.emtcode PARAM_PROGRAM_ELEMENTS 0x04\r
-.emtcode PARAM_CONSTANT 0x05\r
-\r
-/* param state property */\r
-.emtcode STATE_MATERIAL 0x01\r
-.emtcode STATE_LIGHT 0x02\r
-.emtcode STATE_LIGHT_MODEL 0x03\r
-.emtcode STATE_LIGHT_PROD 0x04\r
-.emtcode STATE_FOG 0x05\r
-.emtcode STATE_MATRIX_ROWS 0x06\r
-/* GL_ARB_fragment_program */\r
-.emtcode STATE_TEX_ENV 0x07\r
-.emtcode STATE_DEPTH 0x08\r
-/* GL_ARB_vertex_program */\r
-.emtcode STATE_TEX_GEN 0x09\r
-.emtcode STATE_CLIP_PLANE 0x0A\r
-.emtcode STATE_POINT 0x0B\r
-\r
-/* state material property */\r
-.emtcode MATERIAL_AMBIENT 0x01\r
-.emtcode MATERIAL_DIFFUSE 0x02\r
-.emtcode MATERIAL_SPECULAR 0x03\r
-.emtcode MATERIAL_EMISSION 0x04\r
-.emtcode MATERIAL_SHININESS 0x05\r
-\r
-/* state light property */\r
-.emtcode LIGHT_AMBIENT 0x01\r
-.emtcode LIGHT_DIFFUSE 0x02\r
-.emtcode LIGHT_SPECULAR 0x03\r
-.emtcode LIGHT_POSITION 0x04\r
-.emtcode LIGHT_ATTENUATION 0x05\r
-.emtcode LIGHT_HALF 0x06\r
-.emtcode LIGHT_SPOT_DIRECTION 0x07\r
-\r
-/* state light model property */\r
-.emtcode LIGHT_MODEL_AMBIENT 0x01\r
-.emtcode LIGHT_MODEL_SCENECOLOR 0x02\r
-\r
-/* state light product property */\r
-.emtcode LIGHT_PROD_AMBIENT 0x01\r
-.emtcode LIGHT_PROD_DIFFUSE 0x02\r
-.emtcode LIGHT_PROD_SPECULAR 0x03\r
-\r
-/* state texture environment property */\r
-.emtcode TEX_ENV_COLOR 0x01\r
-\r
-/* state texture generation coord property */\r
-.emtcode TEX_GEN_EYE 0x01\r
-.emtcode TEX_GEN_OBJECT 0x02\r
-\r
-/* state fog property */\r
-.emtcode FOG_COLOR 0x01\r
-.emtcode FOG_PARAMS 0x02\r
-\r
-/* state depth property */\r
-.emtcode DEPTH_RANGE 0x01\r
-\r
-/* state point parameters property */\r
-.emtcode POINT_SIZE 0x01\r
-.emtcode POINT_ATTENUATION 0x02\r
-\r
-/* declaration */\r
-.emtcode ATTRIB 0x01\r
-.emtcode PARAM 0x02\r
-.emtcode TEMP 0x03\r
-.emtcode OUTPUT 0x04\r
-.emtcode ALIAS 0x05\r
-/* GL_ARB_vertex_program */\r
-.emtcode ADDRESS 0x06\r
-\r
-/* error messages */\r
-.errtext UNKNOWN_PROGRAM_SIGNATURE "1001: '$e_signature$': unknown program signature"\r
-.errtext MISSING_END_OR_INVALID_STATEMENT "1002: '$e_statement$': invalid statement"\r
-.errtext CODE_AFTER_END "1003: '$e_statement$': code after 'END' keyword"\r
-.errtext INVALID_PROGRAM_OPTION "1004: '$e_identifier$': invalid program option"\r
-.errtext EXT_SWIZ_COMP_EXPECTED "1005: extended swizzle component expected but '$e_token$' found"\r
-.errtext TEX_TARGET_EXPECTED "1006: texture target expected but '$e_token$' found"\r
-.errtext TEXTURE_EXPECTED "1007: 'texture' expected but '$e_identifier$' found"\r
-.errtext SOURCE_REGISTER_EXPECTED "1008: source register expected but '$e_token$' found"\r
-.errtext DESTINATION_REGISTER_EXPECTED "1009: destination register expected but '$e_token$' found"\r
-.errtext INVALID_ADDRESS_COMPONENT "1010: '$e_identifier$': invalid address component"\r
-.errtext INVALID_ADDRESS_WRITEMASK "1011: '$e_identifier$': invalid address writemask"\r
-.errtext INVALID_COMPONENT "1012: '$e_charordigit$': invalid component"\r
-.errtext INVALID_SUFFIX "1013: '$e_identifier$': invalid suffix"\r
-.errtext INVALID_WRITEMASK "1014: '$e_identifier$': invalid writemask"\r
-.errtext FRAGMENT_EXPECTED "1015: 'fragment' expected but '$e_identifier$' found"\r
-.errtext VERTEX_EXPECTED "1016: 'vertex' expected but '$e_identifier$' found"\r
-.errtext INVALID_FRAGMENT_PROPERTY "1017: '$e_identifier$': invalid fragment property"\r
-.errtext INVALID_VERTEX_PROPERTY "1018: '$e_identifier$': invalid vertex property"\r
-.errtext INVALID_STATE_PROPERTY "1019: '$e_identifier$': invalid state property"\r
-.errtext INVALID_MATERIAL_PROPERTY "1020: '$e_identifier$': invalid material property"\r
-.errtext INVALID_LIGHT_PROPERTY "1021: '$e_identifier$': invalid light property"\r
-.errtext INVALID_SPOT_PROPERTY "1022: '$e_identifier$': invalid spot property"\r
-.errtext INVALID_LIGHTMODEL_PROPERTY "1023: '$e_identifier$': invalid light model property"\r
-.errtext INVALID_LIGHTPROD_PROPERTY "1024: '$e_identifier$': invalid light product property"\r
-.errtext INVALID_TEXENV_PROPERTY "1025: '$e_identifier$': invalid texture environment property"\r
-.errtext INVALID_TEXGEN_PROPERTY "1026: '$e_identifier$': invalid texture generating property"\r
-.errtext INVALID_TEXGEN_COORD "1027: '$e_identifier$': invalid texture generating coord"\r
-.errtext INVALID_FOG_PROPERTY "1028: '$e_identifier$': invalid fog property"\r
-.errtext INVALID_DEPTH_PROPERTY "1029: '$e_identifier$': invalid depth property"\r
-.errtext INVALID_CLIPPLANE_PROPERTY "1030: '$e_identifier$': invalid clip plane property"\r
-.errtext INVALID_POINT_PROPERTY "1031: '$e_identifier$': invalid point property"\r
-.errtext MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED "1032: matrix row selector or modifier expected but '$e_token$' found"\r
-.errtext INVALID_MATRIX_NAME "1033: '$e_identifier$': invalid matrix name"\r
-.errtext INVALID_PROGRAM_PROPERTY "1034: '$e_identifier$': invalid program property"\r
-.errtext RESULT_EXPECTED "1035: 'result' expected but '$e_token$' found"\r
-.errtext INVALID_RESULT_PROPERTY "1036: '$e_identifier$': invalid result property"\r
-.errtext INVALID_FACE_PROPERTY "1037: '$e_identifier$': invalid face property"\r
-.errtext INVALID_COLOR_PROPERTY "1038: '$e_identifier$': invalid color property"\r
-.errtext IDENTIFIER_EXPECTED "1039: identifier expected but '$e_token$' found"\r
-.errtext RESERVED_KEYWORD "1040: use of reserved keyword as an identifier"\r
-.errtext INTEGER_EXPECTED "1041: integer value expected but '$e_token$' found"\r
-.errtext MISSING_SEMICOLON "1042: ';' expected but '$e_token$' found"\r
-.errtext MISSING_COMMA "1043: ',' expected but '$e_token$' found"\r
-.errtext MISSING_LBRACKET "1044: '[' expected but '$e_token$' found"\r
-.errtext MISSING_RBRACKET "1045: ']' expected but '$e_token$' found"\r
-.errtext MISSING_DOT "1046: '.' expected but '$e_token$' found"\r
-.errtext MISSING_EQUAL "1047: '=' expected but '$e_token$' found"\r
-.errtext MISSING_LBRACE "1048: '{' expected but '$e_token$' found"\r
-.errtext MISSING_RBRACE "1049: '}' expected but '$e_token$' found"\r
-.errtext MISSING_DOTDOT "1050: '..' expected but '$e_token$' found"\r
-.errtext MISSING_FRACTION_OR_EXPONENT "1051: missing fraction part or exponent"\r
-.errtext MISSING_DOT_OR_EXPONENT "1052: missing '.' or exponent"\r
-.errtext EXPONENT_VALUE_EXPECTED "1053: exponent value expected"\r
-.errtext INTEGER_OUT_OF_RANGE "1054: integer value out of range"\r
-.errtext OPERATION_NEEDS_DESTINATION_VARIABLE "1055: operation needs destination variable"\r
-.errtext OPERATION_NEEDS_SOURCE_VARIABLE "1056: operation needs source variable"\r
-.errtext ADDRESS_REGISTER_EXPECTED "1057: address register expected but '$e_token$' found"\r
-.errtext ADDRESS_REGISTER_OR_INTEGER_EXPECTED "1058: address register or integer literal expected but '$e_token$' found"\r
-\r
-/* extension presence condition registers */\r
-\r
-/* GL_ARB_vertex_blend */\r
-/* GL_EXT_vertex_weighting */\r
-.regbyte vertex_blend 0x00\r
-\r
-/* GL_ARB_matrix_palette */\r
-.regbyte matrix_palette 0x00\r
-\r
-/* GL_ARB_point_parameters */\r
-/* GL_EXT_point_parameters */\r
-.regbyte point_parameters 0x01\r
-\r
-/* GL_EXT_secondary_color */\r
-.regbyte secondary_color 0x01\r
-\r
-/* GL_EXT_fog_coord */\r
-.regbyte fog_coord 0x01\r
-\r
-/* GL_EXT_texture_rectangle */\r
-/* GL_NV_texture_rectangle */\r
-.regbyte texture_rectangle 0x01\r
-\r
-/* GL_ARB_fragment_program_shadow */\r
-.regbyte fragment_program_shadow 0x00\r
-\r
-/* option presence condition registers */\r
-/* they are all initially set to zero - when a particular OPTION is encountered, the appropriate */\r
-/* register is set to 1 to indicate that the OPTION was specified. */\r
-\r
-/* GL_ARB_fragment_program */\r
-.regbyte ARB_precision_hint_fastest 0x00\r
-.regbyte ARB_precision_hint_nicest 0x00\r
-.regbyte ARB_fog_exp 0x00\r
-.regbyte ARB_fog_exp2 0x00\r
-.regbyte ARB_fog_linear 0x00\r
-\r
-/* GL_ARB_vertex_program */\r
-.regbyte ARB_position_invariant 0x00\r
-\r
-/* GL_ARB_fragment_program_shadow */\r
-.regbyte ARB_fragment_program_shadow 0x00\r
-\r
-/* program target condition register */\r
-/* this syntax script deals with two program targets - VERTEX_PROGRAM and FRAGMENT_PROGRAM. */\r
-/* to distinguish between them we need a register that will store for us the current target. */\r
-/* the client will typically set the register to apropriate value before parsing a particular */\r
-/* program. the mapping between program targets and their values is listed below. */\r
-/* */\r
-/* program target register value */\r
-/* ---------------------------------------------- */\r
-/* FRAGMENT_PROGRAM 0x10 */\r
-/* VERTEX_PROGRAM 0x20 */\r
-/* */\r
-/* the initial value of the register is 0 to catch potential errors with not setting the register */\r
-/* with the proper value. */\r
-.regbyte program_target 0x00\r
-\r
-/*\r
- <program> ::= <optionSequence> <statementSequence> "END"\r
-*/\r
-program\r
- programs .error UNKNOWN_PROGRAM_SIGNATURE .emit REVISION;\r
-programs\r
- .if (program_target == 0x10) frag_program_1_0 .emit FRAGMENT_PROGRAM .emit 0x01 .emit 0x00 .or\r
- .if (program_target == 0x20) vert_program_1_0 .emit VERTEX_PROGRAM .emit 0x01 .emit 0x00;\r
-frag_program_1_0\r
- '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'f' .and 'p' .and '1' .and '.' .and '0' .and\r
- optional_space .and fp_optionSequence .and fp_statementSequence .and\r
- "END" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and\r
- '\0' .error CODE_AFTER_END;\r
-vert_program_1_0\r
- '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'v' .and 'p' .and '1' .and '.' .and '0' .and\r
- optional_space .and vp_optionSequence .and vp_statementSequence .and\r
- "END" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and\r
- '\0' .error CODE_AFTER_END;\r
-\r
-/*\r
- <optionSequence> ::= <optionSequence> <option>\r
- | ""\r
-*/\r
-fp_optionSequence\r
- .loop fp_option;\r
-vp_optionSequence\r
- .loop vp_option;\r
-\r
-/*\r
- <option> ::= "OPTION" <identifier> ";"\r
-\r
-NOTE: options ARB_precision_hint_nicest and ARB_precision_hint_fastest are exclusive. When one of\r
- these options is encountered, the other one is automatically disabled.\r
- the same applies to options ARB_fog_exp, ARB_fog_exp2 and ARB_fog_linear.\r
-*/\r
-fp_option\r
- "OPTION" .emit OPTION .and space .error IDENTIFIER_EXPECTED .and\r
- fp_optionString .error INVALID_PROGRAM_OPTION .and semicolon;\r
-vp_option\r
- "OPTION" .emit OPTION .and space .error IDENTIFIER_EXPECTED .and\r
- vp_optionString .error INVALID_PROGRAM_OPTION .and semicolon;\r
-fp_optionString\r
- .if (ARB_precision_hint_nicest == 0x00) "ARB_precision_hint_fastest"\r
- .emit ARB_PRECISION_HINT_FASTEST .load ARB_precision_hint_fastest 0x01 .or\r
- .if (ARB_precision_hint_fastest == 0x00) "ARB_precision_hint_nicest"\r
- .emit ARB_PRECISION_HINT_NICEST .load ARB_precision_hint_nicest 0x01 .or\r
- fp_ARB_fog_exp .emit ARB_FOG_EXP .load ARB_fog_exp 0x01 .or\r
- fp_ARB_fog_exp2 .emit ARB_FOG_EXP2 .load ARB_fog_exp2 0x01 .or\r
- fp_ARB_fog_linear .emit ARB_FOG_LINEAR .load ARB_fog_linear 0x01 .or\r
- .if (fragment_program_shadow != 0x00) "ARB_fragment_program_shadow"\r
- .emit ARB_FRAGMENT_PROGRAM_SHADOW .load ARB_fragment_program_shadow 0x01;\r
-vp_optionString\r
- "ARB_position_invariant" .emit ARB_POSITION_INVARIANT .load ARB_position_invariant 0x01;\r
-fp_ARB_fog_exp\r
- .if (ARB_fog_exp2 == 0x00) .true .and .if (ARB_fog_linear == 0x00) "ARB_fog_exp";\r
-fp_ARB_fog_exp2\r
- .if (ARB_fog_exp == 0x00) .true .and .if (ARB_fog_linear == 0x00) "ARB_fog_exp2";\r
-fp_ARB_fog_linear\r
- .if (ARB_fog_exp == 0x00) .true .and .if (ARB_fog_exp2 == 0x00) "ARB_fog_linear";\r
-\r
-/*\r
- <statementSequence> ::= <statementSequence> <statement>\r
- | ""\r
-*/\r
-fp_statementSequence\r
- .loop fp_statement;\r
-vp_statementSequence\r
- .loop vp_statement;\r
-\r
-/*\r
- <statement> ::= <instruction> ";"\r
- | <namingStatement> ";"\r
-\r
-NOTE: ".emit $" in the definitions below means that we output instruction position (offset of\r
- the first character of instruction) for program debugging purposes.\r
-*/\r
-fp_statement\r
- fp_statement_1 .or fp_statement_2;\r
-vp_statement\r
- vp_statement_1 .or vp_statement_2;\r
-fp_statement_1\r
- fp_instruction .emit INSTRUCTION .emit $ .and semicolon;\r
-fp_statement_2\r
- fp_namingStatement .emit DECLARATION .and semicolon;\r
-vp_statement_1\r
- vp_instruction .emit INSTRUCTION .emit $ .and semicolon;\r
-vp_statement_2\r
- vp_namingStatement .emit DECLARATION .and semicolon;\r
-\r
-/*\r
-fragment program\r
- <instruction> ::= <ALUInstruction>\r
- | <TexInstruction>\r
-\r
-vertex program\r
- <instruction> ::= <ARL_instruction>\r
- | <VECTORop_instruction>\r
- | <SCALARop_instruction>\r
- | <BINSCop_instruction>\r
- | <BINop_instruction>\r
- | <TRIop_instruction>\r
- | <SWZ_instruction>\r
-*/\r
-fp_instruction\r
- ALUInstruction .emit OP_ALU_INST .or\r
- TexInstruction .emit OP_TEX_INST;\r
-vp_instruction\r
- ARL_instruction .emit OP_ALU_ARL .or\r
- vp_VECTORop_instruction .emit OP_ALU_VECTOR .or\r
- vp_SCALARop_instruction .emit OP_ALU_SCALAR .or\r
- vp_BINSCop_instruction .emit OP_ALU_BINSC .or\r
- vp_BINop_instruction .emit OP_ALU_BIN .or\r
- vp_TRIop_instruction .emit OP_ALU_TRI .or\r
- vp_SWZ_instruction .emit OP_ALU_SWZ;\r
-\r
-/*\r
-fragment program\r
- <ALUInstruction> ::= <VECTORop_instruction>\r
- | <SCALARop_instruction>\r
- | <BINSCop_instruction>\r
- | <BINop_instruction>\r
- | <TRIop_instruction>\r
- | <SWZ_instruction>\r
-*/\r
-ALUInstruction\r
- fp_VECTORop_instruction .emit OP_ALU_VECTOR .or\r
- fp_SCALARop_instruction .emit OP_ALU_SCALAR .or\r
- fp_BINSCop_instruction .emit OP_ALU_BINSC .or\r
- fp_BINop_instruction .emit OP_ALU_BIN .or\r
- fp_TRIop_instruction .emit OP_ALU_TRI .or\r
- fp_SWZ_instruction .emit OP_ALU_SWZ;\r
-\r
-/*\r
-fragment program\r
- <TexInstruction> ::= <SAMPLE_instruction>\r
- | <KIL_instruction>\r
-*/\r
-TexInstruction\r
- SAMPLE_instruction .emit OP_TEX_SAMPLE .or\r
- KIL_instruction .emit OP_TEX_KIL;\r
-\r
-/*\r
-vertex program\r
- <ARL_instruction> ::= "ARL" <maskedAddrReg> "," <scalarSrcReg>\r
-*/\r
-ARL_instruction\r
- "ARL" .emit OP_ARL .and space_dst .and maskedAddrReg .and comma .and vp_scalarSrcReg;\r
-\r
-/*\r
-fragment program\r
- <VECTORop_instruction> ::= <VECTORop> <maskedDstReg> "," \r
- <vectorSrcReg>\r
-\r
-vertex program\r
- <VECTORop_instruction> ::= <VECTORop> <maskedDstReg> "," <swizzleSrcReg>\r
-*/\r
-fp_VECTORop_instruction\r
- fp_VECTORop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg;\r
-vp_VECTORop_instruction\r
- vp_VECTORop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg;\r
-\r
-/*\r
-fragment program\r
- <VECTORop> ::= "ABS" | "ABS_SAT"\r
- | "FLR" | "FLR_SAT"\r
- | "FRC" | "FRC_SAT"\r
- | "LIT" | "LIT_SAT"\r
- | "MOV" | "MOV_SAT"\r
-\r
-vertex program\r
- <VECTORop> ::= "ABS"\r
- | "FLR"\r
- | "FRC"\r
- | "LIT"\r
- | "MOV"\r
-*/\r
-fp_VECTORop\r
- "ABS" .emit OP_ABS .or "ABS_SAT" .emit OP_ABS_SAT .or\r
- "FLR" .emit OP_FLR .or "FLR_SAT" .emit OP_FLR_SAT .or\r
- "FRC" .emit OP_FRC .or "FRC_SAT" .emit OP_FRC_SAT .or\r
- "LIT" .emit OP_LIT .or "LIT_SAT" .emit OP_LIT_SAT .or\r
- "MOV" .emit OP_MOV .or "MOV_SAT" .emit OP_MOV_SAT;\r
-vp_VECTORop\r
- "ABS" .emit OP_ABS .or\r
- "FLR" .emit OP_FLR .or\r
- "FRC" .emit OP_FRC .or\r
- "LIT" .emit OP_LIT .or\r
- "MOV" .emit OP_MOV;\r
-\r
-/*\r
- <SCALARop_instruction> ::= <SCALARop> <maskedDstReg> "," <scalarSrcReg>\r
-*/\r
-fp_SCALARop_instruction\r
- fp_SCALARop .and space_dst .and fp_maskedDstReg .and comma .and fp_scalarSrcReg;\r
-vp_SCALARop_instruction\r
- vp_SCALARop .and space_dst .and vp_maskedDstReg .and comma .and vp_scalarSrcReg;\r
-\r
-/*\r
-fragment program\r
- <SCALARop> ::= "COS" | "COS_SAT"\r
- | "EX2" | "EX2_SAT"\r
- | "LG2" | "LG2_SAT"\r
- | "RCP" | "RCP_SAT"\r
- | "RSQ" | "RSQ_SAT"\r
- | "SIN" | "SIN_SAT"\r
- | "SCS" | "SCS_SAT"\r
-\r
-vertex program\r
- <SCALARop> ::= "EX2"\r
- | "EXP"\r
- | "LG2"\r
- | "LOG"\r
- | "RCP"\r
- | "RSQ"\r
-*/\r
-fp_SCALARop\r
- "COS" .emit OP_COS .or "COS_SAT" .emit OP_COS_SAT .or\r
- "EX2" .emit OP_EX2 .or "EX2_SAT" .emit OP_EX2_SAT .or\r
- "LG2" .emit OP_LG2 .or "LG2_SAT" .emit OP_LG2_SAT .or\r
- "RCP" .emit OP_RCP .or "RCP_SAT" .emit OP_RCP_SAT .or\r
- "RSQ" .emit OP_RSQ .or "RSQ_SAT" .emit OP_RSQ_SAT .or\r
- "SIN" .emit OP_SIN .or "SIN_SAT" .emit OP_SIN_SAT .or\r
- "SCS" .emit OP_SCS .or "SCS_SAT" .emit OP_SCS_SAT;\r
-vp_SCALARop\r
- "EX2" .emit OP_EX2 .or\r
- "EXP" .emit OP_EXP .or\r
- "LG2" .emit OP_LG2 .or\r
- "LOG" .emit OP_LOG .or\r
- "RCP" .emit OP_RCP .or\r
- "RSQ" .emit OP_RSQ;\r
-\r
-/*\r
- <BINSCop_instruction> ::= <BINSCop> <maskedDstReg> "," <scalarSrcReg> ","\r
- <scalarSrcReg>\r
-*/\r
-fp_BINSCop_instruction\r
- fp_BINSCop .and space_dst .and fp_maskedDstReg .and comma .and fp_scalarSrcReg .and comma .and\r
- fp_scalarSrcReg;\r
-vp_BINSCop_instruction\r
- vp_BINSCop .and space_dst .and vp_maskedDstReg .and comma .and vp_scalarSrcReg .and comma .and\r
- vp_scalarSrcReg;\r
-\r
-/*\r
-fragment program\r
- <BINSCop> ::= "POW" | "POW_SAT"\r
-\r
-vertex program\r
- <BINSCop> ::= "POW"\r
-*/\r
-fp_BINSCop\r
- "POW" .emit OP_POW .or "POW_SAT" .emit OP_POW_SAT;\r
-vp_BINSCop\r
- "POW" .emit OP_POW;\r
-\r
-/*\r
-fragment program\r
- <BINop_instruction> ::= <BINop> <maskedDstReg> ","\r
- <vectorSrcReg> "," <vectorSrcReg>\r
-\r
-vertex program\r
- <BINop_instruction> ::= <BINop> <maskedDstReg> ","\r
- <swizzleSrcReg> "," <swizzleSrcReg>\r
-*/\r
-fp_BINop_instruction\r
- fp_BINop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\r
- vectorSrcReg;\r
-vp_BINop_instruction\r
- vp_BINop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and\r
- swizzleSrcReg;\r
-\r
-/*\r
-fragment program\r
- <BINop> ::= "ADD" | "ADD_SAT"\r
- | "DP3" | "DP3_SAT"\r
- | "DP4" | "DP4_SAT"\r
- | "DPH" | "DPH_SAT"\r
- | "DST" | "DST_SAT"\r
- | "MAX" | "MAX_SAT"\r
- | "MIN" | "MIN_SAT"\r
- | "MUL" | "MUL_SAT"\r
- | "SGE" | "SGE_SAT"\r
- | "SLT" | "SLT_SAT"\r
- | "SUB" | "SUB_SAT"\r
- | "XPD" | "XPD_SAT"\r
-\r
-vertex program\r
- <BINop> ::= "ADD"\r
- | "DP3"\r
- | "DP4"\r
- | "DPH"\r
- | "DST"\r
- | "MAX"\r
- | "MIN"\r
- | "MUL"\r
- | "SGE"\r
- | "SLT"\r
- | "SUB"\r
- | "XPD"\r
-*/\r
-fp_BINop\r
- "ADD" .emit OP_ADD .or "ADD_SAT" .emit OP_ADD_SAT .or\r
- "DP3" .emit OP_DP3 .or "DP3_SAT" .emit OP_DP3_SAT .or\r
- "DP4" .emit OP_DP4 .or "DP4_SAT" .emit OP_DP4_SAT .or\r
- "DPH" .emit OP_DPH .or "DPH_SAT" .emit OP_DPH_SAT .or\r
- "DST" .emit OP_DST .or "DST_SAT" .emit OP_DST_SAT .or\r
- "MAX" .emit OP_MAX .or "MAX_SAT" .emit OP_MAX_SAT .or\r
- "MIN" .emit OP_MIN .or "MIN_SAT" .emit OP_MIN_SAT .or\r
- "MUL" .emit OP_MUL .or "MUL_SAT" .emit OP_MUL_SAT .or\r
- "SGE" .emit OP_SGE .or "SGE_SAT" .emit OP_SGE_SAT .or\r
- "SLT" .emit OP_SLT .or "SLT_SAT" .emit OP_SLT_SAT .or\r
- "SUB" .emit OP_SUB .or "SUB_SAT" .emit OP_SUB_SAT .or\r
- "XPD" .emit OP_XPD .or "XPD_SAT" .emit OP_XPD_SAT;\r
-vp_BINop\r
- "ADD" .emit OP_ADD .or\r
- "DP3" .emit OP_DP3 .or\r
- "DP4" .emit OP_DP4 .or\r
- "DPH" .emit OP_DPH .or\r
- "DST" .emit OP_DST .or\r
- "MAX" .emit OP_MAX .or\r
- "MIN" .emit OP_MIN .or\r
- "MUL" .emit OP_MUL .or\r
- "SGE" .emit OP_SGE .or\r
- "SLT" .emit OP_SLT .or\r
- "SUB" .emit OP_SUB .or\r
- "XPD" .emit OP_XPD;\r
-\r
-/*\r
-fragment program\r
- <TRIop_instruction> ::= <TRIop> <maskedDstReg> ","\r
- <vectorSrcReg> "," <vectorSrcReg> ","\r
- <vectorSrcReg>\r
-\r
-vertex program\r
- <TRIop_instruction> ::= <TRIop> <maskedDstReg> ","\r
- <swizzleSrcReg> "," <swizzleSrcReg> ","\r
- <swizzleSrcReg>\r
-*/\r
-fp_TRIop_instruction\r
- fp_TRIop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\r
- vectorSrcReg .and comma .and vectorSrcReg;\r
-vp_TRIop_instruction\r
- vp_TRIop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and\r
- swizzleSrcReg .and comma .and swizzleSrcReg;\r
-\r
-/*\r
-fragment program\r
- <TRIop> ::= "CMP" | "CMP_SAT"\r
- | "LRP" | "LRP_SAT"\r
- | "MAD" | "MAD_SAT"\r
-\r
-vertex program\r
- <TRIop> ::= "MAD"\r
-*/\r
-fp_TRIop\r
- "CMP" .emit OP_CMP .or "CMP_SAT" .emit OP_CMP_SAT .or\r
- "LRP" .emit OP_LRP .or "LRP_SAT" .emit OP_LRP_SAT .or\r
- "MAD" .emit OP_MAD .or "MAD_SAT" .emit OP_MAD_SAT;\r
-vp_TRIop\r
- "MAD" .emit OP_MAD;\r
-\r
-/*\r
-fragment program\r
- <SWZ_instruction> ::= <SWZop> <maskedDstReg> "," \r
- <srcReg> "," <extendedSwizzle>\r
-\r
-vertex program\r
- <SWZ_instruction> ::= "SWZ" <maskedDstReg> "," <srcReg> "," \r
- <extendedSwizzle>\r
-*/\r
-fp_SWZ_instruction\r
- SWZop .and space_dst .and fp_maskedDstReg .and comma .and fp_srcReg .and comma .and\r
- fp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;\r
-vp_SWZ_instruction\r
- "SWZ" .emit OP_SWZ .and space_dst .and vp_maskedDstReg .and comma .and vp_srcReg .and comma .and\r
- vp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;\r
-\r
-/*\r
-fragment program\r
- <SWZop> ::= "SWZ" | "SWZ_SAT"\r
-*/\r
-SWZop\r
- "SWZ" .emit OP_SWZ .or "SWZ_SAT" .emit OP_SWZ_SAT;\r
-\r
-/*\r
-fragment program\r
- <SAMPLE_instruction> ::= <SAMPLEop> <maskedDstReg> ","\r
- <vectorSrcReg> "," <texImageUnit> "," \r
- <texTarget>\r
-*/\r
-SAMPLE_instruction\r
- SAMPLEop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\r
- texImageUnit .and comma .and texTarget .error TEX_TARGET_EXPECTED;\r
-\r
-/*\r
-fragment program\r
- <SAMPLEop> ::= "TEX" | "TEX_SAT"\r
- | "TXP" | "TXP_SAT"\r
- | "TXB" | "TXB_SAT"\r
-*/\r
-SAMPLEop\r
- "TEX" .emit OP_TEX .or "TEX_SAT" .emit OP_TEX_SAT .or\r
- "TXB" .emit OP_TXB .or "TXB_SAT" .emit OP_TXB_SAT .or\r
- "TXP" .emit OP_TXP .or "TXP_SAT" .emit OP_TXP_SAT;\r
-\r
-/*\r
-fragment program\r
- <KIL_instruction> ::= "KIL" <vectorSrcReg>\r
-*/\r
-KIL_instruction\r
- "KIL" .emit OP_KIL .and space_src .and vectorSrcReg;\r
-\r
-/*\r
-fragment program\r
- <texImageUnit> ::= "texture" <optTexImageUnitNum>\r
-*/\r
-texImageUnit\r
- "texture" .error TEXTURE_EXPECTED .and optTexImageUnitNum;\r
-\r
-/*\r
-fragment program\r
- <texTarget> ::= "1D"\r
- | "2D"\r
- | "3D"\r
- | "CUBE"\r
- | "RECT"\r
- | <shadowTarget> (if option ARB_fragment_program_shadow present)\r
-*/\r
-texTarget\r
- "1D" .emit TEXTARGET_1D .or\r
- "2D" .emit TEXTARGET_2D .or\r
- "3D" .emit TEXTARGET_3D .or\r
- .if (texture_rectangle != 0x00) "RECT" .emit TEXTARGET_RECT .or\r
- "CUBE" .emit TEXTARGET_CUBE .or\r
- .if (ARB_fragment_program_shadow != 0x00) shadowTarget;\r
-\r
-/*\r
-GL_ARB_fragment_program_shadow\r
- <shadowTarget> ::= "SHADOW1D"\r
- | "SHADOW2D"\r
- | "SHADOWRECT"\r
-*/\r
-shadowTarget\r
- "SHADOW1D" .emit TEXTARGET_SHADOW1D .or\r
- "SHADOW2D" .emit TEXTARGET_SHADOW2D .or\r
- .if (texture_rectangle != 0x00) "SHADOWRECT" .emit TEXTARGET_SHADOWRECT;\r
-\r
-/*\r
-fragment program\r
- <optTexImageUnitNum> ::= ""\r
- | "[" <texImageUnitNum> "]"\r
-*/\r
-optTexImageUnitNum\r
- optTexImageUnitNum_1 .or .true .emit 0x00;\r
-optTexImageUnitNum_1\r
- lbracket_ne .and texImageUnitNum .and rbracket;\r
-\r
-/*\r
-fragment program\r
- <texImageUnitNum> ::= <integer> from 0 to \r
- MAX_TEXTURE_IMAGE_UNITS_ARB-1\r
-*/\r
-texImageUnitNum\r
- integer;\r
-\r
-/*\r
- <scalarSrcReg> ::= <optionalSign> <srcReg> <scalarSuffix>\r
-*/\r
-fp_scalarSrcReg\r
- optionalSign .and fp_srcReg .and fp_scalarSuffix;\r
-vp_scalarSrcReg\r
- optionalSign .and vp_srcReg .and vp_scalarSuffix;\r
-\r
-/*\r
-vertex program\r
- <swizzleSrcReg> ::= <optionalSign> <srcReg> <swizzleSuffix>\r
-*/\r
-swizzleSrcReg\r
- optionalSign .and vp_srcReg .and swizzleSuffix;\r
-\r
-/*\r
-fragment program\r
- <vectorSrcReg> ::= <optionalSign> <srcReg> <optionalSuffix> \r
-*/\r
-vectorSrcReg\r
- optionalSign .and fp_srcReg .and optionalSuffix;\r
-\r
-/*\r
- <maskedDstReg> ::= <dstReg> <optionalMask>\r
-*/\r
-fp_maskedDstReg\r
- fp_dstReg .and fp_optionalMask;\r
-vp_maskedDstReg\r
- vp_dstReg .and vp_optionalMask;\r
-\r
-/*\r
-vertex program\r
- <maskedAddrReg> ::= <addrReg> <addrWriteMask>\r
-*/\r
-maskedAddrReg\r
- addrReg .error ADDRESS_REGISTER_EXPECTED .and addrWriteMask;\r
-\r
-/*\r
-fragment program\r
- <extendedSwizzle> ::= <xyzwExtendedSwizzle>\r
- | <rgbaExtendedSwizzle>\r
-\r
-vertex program\r
- <extendedSwizzle> ::= <extSwizComp> "," <extSwizComp> "," \r
- <extSwizComp> "," <extSwizComp>\r
-\r
-NOTE: do NOT change the order of <rgbaExtendedSwizzle> and <xyzwExtendedSwizzle> rulez\r
-*/\r
-fp_extendedSwizzle\r
- rgbaExtendedSwizzle .or xyzwExtendedSwizzle;\r
-vp_extendedSwizzle\r
- extSwizComp .and comma .and\r
- extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\r
- extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\r
- extSwizComp .error EXT_SWIZ_COMP_EXPECTED;\r
-\r
-/*\r
-fragment program\r
- <xyzwExtendedSwizzle> ::= <xyzwExtSwizComp> "," <xyzwExtSwizComp> "," \r
- <xyzwExtSwizComp> "," <xyzwExtSwizComp>\r
-*/\r
-xyzwExtendedSwizzle\r
- xyzwExtSwizComp .and comma .and\r
- xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\r
- xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\r
- xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\r
-\r
-/*\r
-fragment program\r
- <rgbaExtendedSwizzle> ::= <rgbaExtSwizComp> "," <rgbaExtSwizComp> "," \r
- <rgbaExtSwizComp> "," <rgbaExtSwizComp>\r
-*/\r
-rgbaExtendedSwizzle\r
- rgbaExtendedSwizzle_1 .or rgbaExtendedSwizzle_2 .or rgbaExtendedSwizzle_3 .or\r
- rgbaExtendedSwizzle_4;\r
-rgbaExtendedSwizzle_1\r
- rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_digit .and comma .and\r
- rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp;\r
-rgbaExtendedSwizzle_2\r
- rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_digit .and comma .and\r
- rgbaExtSwizComp_alpha .and comma .and rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\r
-rgbaExtendedSwizzle_3\r
- rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_alpha .and comma .and\r
- rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\r
- rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\r
-rgbaExtendedSwizzle_4\r
- rgbaExtSwizComp_alpha .and comma .and \r
- rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\r
- rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\r
- rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\r
-\r
-/*\r
-fragment program\r
- <xyzwExtSwizComp> ::= <optionalSign> <xyzwExtSwizSel>\r
-*/\r
-xyzwExtSwizComp\r
- optionalSign .and xyzwExtSwizSel;\r
-\r
-/*\r
-fragment program\r
- <rgbaExtSwizComp> ::= <optionalSign> <rgbaExtSwizSel>\r
-*/\r
-rgbaExtSwizComp\r
- optionalSign .and rgbaExtSwizSel;\r
-rgbaExtSwizComp_digit\r
- optionalSign .and rgbaExtSwizSel_digit;\r
-rgbaExtSwizComp_alpha\r
- optionalSign .and rgbaExtSwizSel_alpha;\r
-\r
-/*\r
-vertex program\r
- <extSwizComp> ::= <optionalSign> <extSwizSel>\r
-*/\r
-extSwizComp\r
- optionalSign .and extSwizSel;\r
-\r
-/*\r
-fragment program\r
- <xyzwExtSwizSel> ::= "0" \r
- | "1" \r
- | <xyzwComponent>\r
-*/\r
-xyzwExtSwizSel\r
- "0" .emit COMPONENT_0 .or "1" .emit COMPONENT_1 .or xyzwComponent_single;\r
-\r
-/*\r
-fragment program\r
- <rgbaExtSwizSel> ::= "0" \r
- | "1" \r
- | <rgbaComponent>\r
-*/\r
-rgbaExtSwizSel\r
- rgbaExtSwizSel_digit .or rgbaExtSwizSel_alpha;\r
-rgbaExtSwizSel_digit\r
- "0" .emit COMPONENT_0 .or "1" .emit COMPONENT_1;\r
-rgbaExtSwizSel_alpha\r
- rgbaComponent_single;\r
-\r
-/*\r
-vertex program\r
- <extSwizSel> ::= "0" \r
- | "1" \r
- | <component>\r
-*/\r
-extSwizSel\r
- "0" .emit COMPONENT_0 .or "1" .emit COMPONENT_1 .or vp_component_single;\r
-\r
-/*\r
-fragment program\r
- <srcReg> ::= <fragmentAttribReg>\r
- | <temporaryReg>\r
- | <progParamReg>\r
-\r
-vertex program\r
- <srcReg> ::= <vertexAttribReg>\r
- | <temporaryReg>\r
- | <progParamReg>\r
-*/\r
-fp_srcReg\r
- fp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;\r
-vp_srcReg\r
- vp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;\r
-fp_srcReg_1\r
- fragmentAttribReg .emit REGISTER_ATTRIB .or\r
- fp_progParamReg .emit REGISTER_PARAM .or\r
- fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\r
-vp_srcReg_1\r
- vertexAttribReg .emit REGISTER_ATTRIB .or\r
- vp_progParamReg .emit REGISTER_PARAM .or\r
- vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\r
-\r
-/*\r
-fragment program\r
- <dstReg> ::= <temporaryReg>\r
- | <fragmentResultReg>\r
-\r
-vertex program\r
- <dstReg> ::= <temporaryReg>\r
- | <vertexResultReg>\r
-*/\r
-fp_dstReg\r
- fp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;\r
-vp_dstReg\r
- vp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;\r
-fp_dstReg_1\r
- fragmentResultReg .emit REGISTER_RESULT .or\r
- fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\r
-vp_dstReg_1\r
- vertexResultReg .emit REGISTER_RESULT .or\r
- vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\r
-\r
-/*\r
-fragment program\r
- <fragmentAttribReg> ::= <establishedName>\r
- | <fragAttribBinding>\r
-\r
-NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <srcReg>\r
-*/\r
-fragmentAttribReg\r
- /*fp_establishedName .or */fragAttribBinding;\r
-\r
-/*\r
-vertex program\r
- <vertexAttribReg> ::= <establishedName>\r
- | <vtxAttribBinding>\r
-\r
-NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <srcReg>\r
-*/\r
-vertexAttribReg\r
- vtxAttribBinding;\r
-\r
-/*\r
- <temporaryReg> ::= <establishedName>\r
-*/\r
-fp_temporaryReg\r
- fp_establishedName_no_error_on_identifier;\r
-vp_temporaryReg\r
- vp_establishedName_no_error_on_identifier;\r
-\r
-/*\r
-fragment program\r
- <progParamReg> ::= <progParamSingle>\r
- | <progParamArray> "[" <progParamArrayAbs> "]"\r
- | <paramSingleItemUse>\r
-\r
-vertex program\r
- <progParamReg> ::= <progParamSingle>\r
- | <progParamArray> "[" <progParamArrayMem> "]"\r
- | <paramSingleItemUse>\r
-*/\r
-fp_progParamReg\r
- fp_paramSingleItemUse .or fp_progParamReg_1 .or fp_progParamSingle;\r
-vp_progParamReg\r
- vp_paramSingleItemUse .or vp_progParamReg_1 .or vp_progParamSingle;\r
-fp_progParamReg_1\r
- fp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayAbs .and\r
- rbracket;\r
-vp_progParamReg_1\r
- vp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayMem .and\r
- rbracket;\r
-\r
-/*\r
- <progParamSingle> ::= <establishedName>\r
-\r
-NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <srcReg>\r
-*/\r
-fp_progParamSingle\r
- .false;\r
-vp_progParamSingle\r
- .false;\r
-\r
-/*\r
- <progParamArray> ::= <establishedName>\r
-*/\r
-fp_progParamArray\r
- fp_establishedName_no_error_on_identifier;\r
-vp_progParamArray\r
- vp_establishedName_no_error_on_identifier;\r
-\r
-/*\r
-vertex program\r
- <progParamArrayMem> ::= <progParamArrayAbs>\r
- | <progParamArrayRel>\r
-*/\r
-progParamArrayMem\r
- progParamArrayAbs .or progParamArrayRel;\r
-\r
-/*\r
- <progParamArrayAbs> ::= <integer>\r
-*/\r
-progParamArrayAbs\r
- integer_ne .emit ARRAY_INDEX_ABSOLUTE;\r
-\r
-/*\r
-vertex program\r
- <progParamArrayRel> ::= <addrReg> <addrComponent> <addrRegRelOffset>\r
-*/\r
-progParamArrayRel\r
- addrReg .error ADDRESS_REGISTER_OR_INTEGER_EXPECTED .emit ARRAY_INDEX_RELATIVE .and\r
- addrComponent .and addrRegRelOffset;\r
-\r
-/*\r
-vertex program\r
- <addrRegRelOffset> ::= ""\r
- | "+" <addrRegPosOffset>\r
- | "-" <addrRegNegOffset>\r
-*/\r
-addrRegRelOffset\r
- addrRegRelOffset_1 .or addrRegRelOffset_2 .or .true .emit 0x00;\r
-addrRegRelOffset_1\r
- plus_ne .and addrRegPosOffset;\r
-addrRegRelOffset_2\r
- minus_ne .and addrRegNegOffset;\r
-\r
-/*\r
-vertex program\r
- <addrRegPosOffset> ::= <integer> from 0 to 63\r
-*/\r
-addrRegPosOffset\r
- integer_0_63;\r
-\r
-/*\r
-vertex program\r
- <addrRegNegOffset> ::= <integer> from 0 to 64\r
-*/\r
-addrRegNegOffset\r
- integer_0_64;\r
-\r
-/*\r
-fragment program\r
- <fragmentResultReg> ::= <establishedName>\r
- | <resultBinding>\r
-\r
-NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <dstReg>\r
-*/\r
-fragmentResultReg\r
- fp_resultBinding;\r
-\r
-/*\r
-vertex program\r
- <vertexResultReg> ::= <establishedName>\r
- | <resultBinding>\r
-\r
-NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <dstReg>\r
-*/\r
-vertexResultReg\r
- vp_resultBinding;\r
-\r
-/*\r
-vertex program\r
- <addrReg> ::= <establishedName>\r
-*/\r
-addrReg\r
- vp_establishedName_no_error_on_identifier;\r
-\r
-/*\r
-vertex program\r
- <addrComponent> ::= "." "x"\r
-*/\r
-addrComponent\r
- dot .and "x" .error INVALID_ADDRESS_COMPONENT .emit COMPONENT_X .emit COMPONENT_X\r
- .emit COMPONENT_X .emit COMPONENT_X;\r
-\r
-/*\r
-vertex program\r
- <addrWriteMask> ::= "." "x"\r
-*/\r
-addrWriteMask\r
- dot .and "x" .error INVALID_ADDRESS_WRITEMASK .emit 0x08;\r
-\r
-/*\r
- <scalarSuffix> ::= "." <component>\r
-*/\r
-fp_scalarSuffix\r
- dot .and fp_component_single .error INVALID_COMPONENT;\r
-vp_scalarSuffix\r
- dot .and vp_component_single .error INVALID_COMPONENT;\r
-\r
-/*\r
-vertex program\r
- <swizzleSuffix> ::= ""\r
- | "." <component>\r
- | "." <component> <component>\r
- <component> <component>\r
-*/\r
-swizzleSuffix\r
- swizzleSuffix_1 .or\r
- .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z .emit COMPONENT_W;\r
-swizzleSuffix_1\r
- dot_ne .and swizzleSuffix_2 .error INVALID_SUFFIX;\r
-swizzleSuffix_2\r
- swizzleSuffix_3 .or swizzleSuffix_4;\r
-swizzleSuffix_3\r
- vp_component_multi .and vp_component_multi .and vp_component_multi .error INVALID_COMPONENT .and\r
- vp_component_multi .error INVALID_COMPONENT;\r
-swizzleSuffix_4\r
- "x" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\r
- "y" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\r
- "z" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\r
- "w" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;\r
-\r
-/*\r
-fragment program\r
- <optionalSuffix> ::= "" \r
- | "." <component> \r
- | "." <xyzwComponent> <xyzwComponent>\r
- <xyzwComponent> <xyzwComponent>\r
- | "." <rgbaComponent> <rgbaComponent>\r
- <rgbaComponent> <rgbaComponent>\r
-*/\r
-optionalSuffix\r
- optionalSuffix_1 .or\r
- .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z .emit COMPONENT_W;\r
-optionalSuffix_1\r
- dot_ne .and optionalSuffix_2 .error INVALID_SUFFIX;\r
-optionalSuffix_2\r
- optionalSuffix_3 .or optionalSuffix_4 .or optionalSuffix_5;\r
-optionalSuffix_3\r
- xyzwComponent_multi .and xyzwComponent_multi .and\r
- xyzwComponent_multi .error INVALID_COMPONENT .and xyzwComponent_multi .error INVALID_COMPONENT;\r
-optionalSuffix_4\r
- rgbaComponent_multi .and rgbaComponent_multi .and\r
- rgbaComponent_multi .error INVALID_COMPONENT .and rgbaComponent_multi .error INVALID_COMPONENT;\r
-optionalSuffix_5\r
- "x" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\r
- "y" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\r
- "z" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\r
- "w" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .or\r
- "r" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\r
- "g" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\r
- "b" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\r
- "a" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;\r
-\r
-/*\r
-fragment program\r
- <component> ::= <xyzwComponent>\r
- | <rgbaComponent>\r
-\r
-vertex program\r
- <component> ::= "x"\r
- | "y"\r
- | "z"\r
- | "w"\r
-*/\r
-fp_component_single\r
- xyzwComponent_single .or rgbaComponent_single;\r
-vp_component_multi\r
- 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or\r
- 'w' .emit COMPONENT_W;\r
-vp_component_single\r
- "x" .emit COMPONENT_X .or "y" .emit COMPONENT_Y .or "z" .emit COMPONENT_Z .or\r
- "w" .emit COMPONENT_W;\r
-\r
-/*\r
-fragment program\r
- <xyzwComponent> ::= "x" | "y" | "z" | "w"\r
-*/\r
-xyzwComponent_multi\r
- 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or\r
- 'w' .emit COMPONENT_W;\r
-xyzwComponent_single\r
- "x" .emit COMPONENT_X .or "y" .emit COMPONENT_Y .or "z" .emit COMPONENT_Z .or\r
- "w" .emit COMPONENT_W;\r
-\r
-/*\r
-fragment program\r
- <rgbaComponent> ::= "r" | "g" | "b" | "a"\r
-*/\r
-rgbaComponent_multi\r
- 'r' .emit COMPONENT_X .or 'g' .emit COMPONENT_Y .or 'b' .emit COMPONENT_Z .or\r
- 'a' .emit COMPONENT_W;\r
-rgbaComponent_single\r
- "r" .emit COMPONENT_X .or "g" .emit COMPONENT_Y .or "b" .emit COMPONENT_Z .or\r
- "a" .emit COMPONENT_W;\r
-\r
-/*\r
-fragment program\r
- <optionalMask> ::= ""\r
- | <xyzwMask>\r
- | <rgbaMask>\r
-\r
-vertex program\r
- <optionalMask> ::= ""\r
- | "." "x"\r
- | "." "y"\r
- | "." "xy"\r
- | "." "z"\r
- | "." "xz"\r
- | "." "yz"\r
- | "." "xyz"\r
- | "." "w"\r
- | "." "xw"\r
- | "." "yw"\r
- | "." "xyw"\r
- | "." "zw"\r
- | "." "xzw"\r
- | "." "yzw"\r
- | "." "xyzw"\r
-\r
-NOTE: do NOT change the order of <rgbaMask> and <xyzwMask> rulez\r
-*/\r
-fp_optionalMask\r
- rgbaMask .or xyzwMask .or .true .emit 0x0F;\r
-vp_optionalMask\r
- xyzwMask .or .true .emit 0x0F;\r
-\r
-/*\r
-fragment program\r
- <xyzwMask> ::= "." "x"\r
- | "." "y"\r
- | "." "xy"\r
- | "." "z"\r
- | "." "xz"\r
- | "." "yz"\r
- | "." "xyz"\r
- | "." "w"\r
- | "." "xw"\r
- | "." "yw"\r
- | "." "xyw"\r
- | "." "zw"\r
- | "." "xzw"\r
- | "." "yzw"\r
- | "." "xyzw"\r
-\r
-NOTE: <xyzwMask> is also referenced by the vertex program symbol <optionalMask>.\r
-*/\r
-xyzwMask\r
- dot_ne .and xyzwMask_1 .error INVALID_WRITEMASK;\r
-xyzwMask_1\r
- "xyzw" .emit 0x0F .or "xyz" .emit 0x0E .or "xyw" .emit 0x0D .or "xy" .emit 0x0C .or\r
- "xzw" .emit 0x0B .or "xz" .emit 0x0A .or "xw" .emit 0x09 .or "x" .emit 0x08 .or\r
- "yzw" .emit 0x07 .or "yz" .emit 0x06 .or "yw" .emit 0x05 .or "y" .emit 0x04 .or\r
- "zw" .emit 0x03 .or "z" .emit 0x02 .or "w" .emit 0x01;\r
-\r
-/*\r
-fragment program\r
- <rgbaMask> ::= "." "r"\r
- | "." "g"\r
- | "." "rg"\r
- | "." "b"\r
- | "." "rb"\r
- | "." "gb"\r
- | "." "rgb"\r
- | "." "a"\r
- | "." "ra"\r
- | "." "ga"\r
- | "." "rga"\r
- | "." "ba"\r
- | "." "rba"\r
- | "." "gba"\r
- | "." "rgba"\r
-*/\r
-rgbaMask\r
- dot_ne .and rgbaMask_1;\r
-rgbaMask_1\r
- "rgba" .emit 0x0F .or "rgb" .emit 0x0E .or "rga" .emit 0x0D .or "rg" .emit 0x0C .or\r
- "rba" .emit 0x0B .or "rb" .emit 0x0A .or "ra" .emit 0x09 .or "r" .emit 0x08 .or\r
- "gba" .emit 0x07 .or "gb" .emit 0x06 .or "ga" .emit 0x05 .or "g" .emit 0x04 .or\r
- "ba" .emit 0x03 .or "b" .emit 0x02 .or "a" .emit 0x01;\r
-\r
-/*\r
-fragment program\r
- <namingStatement> ::= <ATTRIB_statement>\r
- | <PARAM_statement>\r
- | <TEMP_statement>\r
- | <OUTPUT_statement>\r
- | <ALIAS_statement>\r
-\r
-vertex program\r
- <namingStatement> ::= <ATTRIB_statement>\r
- | <PARAM_statement>\r
- | <TEMP_statement>\r
- | <ADDRESS_statement>\r
- | <OUTPUT_statement>\r
- | <ALIAS_statement>\r
-*/\r
-fp_namingStatement\r
- fp_ATTRIB_statement .emit ATTRIB .or\r
- fp_PARAM_statement .emit PARAM .or\r
- fp_TEMP_statement .emit TEMP .or\r
- fp_OUTPUT_statement .emit OUTPUT .or\r
- fp_ALIAS_statement .emit ALIAS;\r
-vp_namingStatement\r
- vp_ATTRIB_statement .emit ATTRIB .or\r
- vp_PARAM_statement .emit PARAM .or\r
- vp_TEMP_statement .emit TEMP .or\r
- ADDRESS_statement .emit ADDRESS .or\r
- vp_OUTPUT_statement .emit OUTPUT .or\r
- vp_ALIAS_statement .emit ALIAS;\r
-\r
-/*\r
-fragment program\r
- <ATTRIB_statement> ::= "ATTRIB" <establishName> "="\r
- <fragAttribBinding>\r
-\r
-vertex program\r
- <ATTRIB_statement> ::= "ATTRIB" <establishName> "="\r
- <vtxAttribBinding>\r
-*/\r
-fp_ATTRIB_statement\r
- "ATTRIB" .and space .and fp_establishName .and equal .and\r
- fragAttribBinding .error FRAGMENT_EXPECTED;\r
-vp_ATTRIB_statement\r
- "ATTRIB" .and space .and vp_establishName .and equal .and\r
- vtxAttribBinding .error VERTEX_EXPECTED;\r
-\r
-/*\r
-fragment program\r
- <fragAttribBinding> ::= "fragment" "." <fragAttribItem>\r
-*/\r
-fragAttribBinding\r
- "fragment" .and dot .and fragAttribItem .error INVALID_FRAGMENT_PROPERTY;\r
-\r
-/*\r
-vertex program\r
- <vtxAttribBinding> ::= "vertex" "." <vtxAttribItem>\r
-*/\r
-vtxAttribBinding\r
- "vertex" .and dot .and vtxAttribItem .error INVALID_VERTEX_PROPERTY;\r
-\r
-/*\r
-fragment program\r
- <fragAttribItem> ::= "color" <optColorType>\r
- | "texcoord" <optTexCoordNum>\r
- | "fogcoord"\r
- | "position"\r
-*/\r
-fragAttribItem\r
- fragAttribItem_1 .emit FRAGMENT_ATTRIB_COLOR .or\r
- fragAttribItem_2 .emit FRAGMENT_ATTRIB_TEXCOORD .or\r
- .if (fog_coord != 0x00) "fogcoord" .emit FRAGMENT_ATTRIB_FOGCOORD .or\r
- "position" .emit FRAGMENT_ATTRIB_POSITION;\r
-fragAttribItem_1\r
- "color" .and optColorType;\r
-fragAttribItem_2\r
- "texcoord" .and optTexCoordNum;\r
-\r
-/*\r
-vertex program\r
- <vtxAttribItem> ::= "position"\r
- | "weight" <vtxOptWeightNum>\r
- | "normal"\r
- | "color" <optColorType>\r
- | "fogcoord"\r
- | "texcoord" <optTexCoordNum>\r
- | "matrixindex" "[" <vtxWeightNum> "]"\r
- | "attrib" "[" <vtxAttribNum> "]"\r
-*/\r
-vtxAttribItem\r
- "position" .emit VERTEX_ATTRIB_POSITION .or\r
- .if (vertex_blend != 0x00) vtxAttribItem_1 .emit VERTEX_ATTRIB_WEIGHT .or\r
- "normal" .emit VERTEX_ATTRIB_NORMAL .or\r
- vtxAttribItem_2 .emit VERTEX_ATTRIB_COLOR .or\r
- "fogcoord" .emit VERTEX_ATTRIB_FOGCOORD .or\r
- vtxAttribItem_3 .emit VERTEX_ATTRIB_TEXCOORD .or\r
- .if (matrix_palette != 0x00) vtxAttribItem_4 .emit VERTEX_ATTRIB_MATRIXINDEX .or\r
- vtxAttribItem_5 .emit VERTEX_ATTRIB_GENERIC;\r
-vtxAttribItem_1\r
- "weight" .and vtxOptWeightNum;\r
-vtxAttribItem_2\r
- "color" .and optColorType;\r
-vtxAttribItem_3\r
- "texcoord" .and optTexCoordNum;\r
-vtxAttribItem_4\r
- "matrixindex" .and lbracket .and vtxWeightNum .and rbracket;\r
-vtxAttribItem_5\r
- "attrib" .and lbracket .and vtxAttribNum .and rbracket;\r
-\r
-/*\r
-vertex program\r
- <vtxAttribNum> ::= <integer> from 0 to MAX_VERTEX_ATTRIBS_ARB-1\r
-*/\r
-vtxAttribNum\r
- integer;\r
-\r
-/*\r
-vertex program\r
- <vtxOptWeightNum> ::= ""\r
- | "[" <vtxWeightNum> "]"\r
-*/\r
-vtxOptWeightNum\r
- vtxOptWeightNum_1 .or .true .emit 0x00;\r
-vtxOptWeightNum_1\r
- lbracket_ne .and vtxWeightNum .and rbracket;\r
-\r
-/*\r
-vertex program\r
- <vtxWeightNum> ::= <integer> from 0 to MAX_VERTEX_UNITS_ARB-1,\r
- must be divisible by four\r
-*/\r
-vtxWeightNum\r
- integer;\r
-\r
-/*\r
- <PARAM_statement> ::= <PARAM_singleStmt>\r
- | <PARAM_multipleStmt>\r
-*/\r
-fp_PARAM_statement\r
- fp_PARAM_multipleStmt .or fp_PARAM_singleStmt;\r
-vp_PARAM_statement\r
- vp_PARAM_multipleStmt .or vp_PARAM_singleStmt;\r
-\r
-/*\r
- <PARAM_singleStmt> ::= "PARAM" <establishName> <paramSingleInit>\r
-*/\r
-fp_PARAM_singleStmt\r
- "PARAM" .and space .and fp_establishName .and .true .emit 0x00 .and fp_paramSingleInit .and\r
- .true .emit PARAM_NULL;\r
-vp_PARAM_singleStmt\r
- "PARAM" .and space .and vp_establishName .and .true .emit 0x00 .and vp_paramSingleInit .and\r
- .true .emit PARAM_NULL;\r
-\r
-/*\r
- <PARAM_multipleStmt> ::= "PARAM" <establishName> "[" <optArraySize> "]"\r
- <paramMultipleInit>\r
-*/\r
-fp_PARAM_multipleStmt\r
- "PARAM" .and space .and fp_establishName .and lbracket_ne .and optArraySize .and rbracket .and\r
- fp_paramMultipleInit .and .true .emit PARAM_NULL;\r
-vp_PARAM_multipleStmt\r
- "PARAM" .and space .and vp_establishName .and lbracket_ne .and optArraySize .and rbracket .and\r
- vp_paramMultipleInit .and .true .emit PARAM_NULL;\r
-\r
-/*\r
- <optArraySize> ::= ""\r
- | <integer> from 1 to MAX_PROGRAM_PARAMETERS_ARB\r
- (maximum number of allowed program \r
- parameter bindings)\r
-*/\r
-optArraySize\r
- optional_integer;\r
-\r
-/*\r
- <paramSingleInit> ::= "=" <paramSingleItemDecl>\r
-*/\r
-fp_paramSingleInit\r
- equal .and fp_paramSingleItemDecl;\r
-vp_paramSingleInit\r
- equal .and vp_paramSingleItemDecl;\r
-\r
-/*\r
- <paramMultipleInit> ::= "=" "{" <paramMultInitList> "}"\r
-*/\r
-fp_paramMultipleInit\r
- equal .and lbrace .and fp_paramMultInitList .and rbrace;\r
-vp_paramMultipleInit\r
- equal .and lbrace .and vp_paramMultInitList .and rbrace;\r
-\r
-/*\r
- <paramMultInitList> ::= <paramMultipleItem>\r
- | <paramMultipleItem> "," <paramMultiInitList>\r
-*/\r
-fp_paramMultInitList\r
- fp_paramMultInitList_1 .or fp_paramMultipleItem;\r
-vp_paramMultInitList\r
- vp_paramMultInitList_1 .or vp_paramMultipleItem;\r
-fp_paramMultInitList_1\r
- fp_paramMultipleItem .and comma_ne .and fp_paramMultInitList;\r
-vp_paramMultInitList_1\r
- vp_paramMultipleItem .and comma_ne .and vp_paramMultInitList;\r
-\r
-/*\r
- <paramSingleItemDecl> ::= <stateSingleItem>\r
- | <programSingleItem>\r
- | <paramConstDecl>\r
-*/\r
-fp_paramSingleItemDecl\r
- fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\r
- programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\r
- paramConstDecl .emit PARAM_CONSTANT;\r
-vp_paramSingleItemDecl\r
- vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\r
- programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\r
- paramConstDecl .emit PARAM_CONSTANT;\r
-\r
-/*\r
- <paramSingleItemUse> ::= <stateSingleItem>\r
- | <programSingleItem>\r
- | <paramConstUse>\r
-*/\r
-fp_paramSingleItemUse\r
- fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\r
- programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\r
- paramConstUse .emit PARAM_CONSTANT;\r
-vp_paramSingleItemUse\r
- vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\r
- programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\r
- paramConstUse .emit PARAM_CONSTANT;\r
-\r
-/*\r
- <paramMultipleItem> ::= <stateMultipleItem>\r
- | <programMultipleItem>\r
- | <paramConstDecl>\r
-*/\r
-fp_paramMultipleItem\r
- fp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or\r
- programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or\r
- paramConstDecl .emit PARAM_CONSTANT;\r
-vp_paramMultipleItem\r
- vp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or\r
- programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or\r
- paramConstDecl .emit PARAM_CONSTANT;\r
-\r
-/*\r
- <stateMultipleItem> ::= <stateSingleItem>\r
- | "state" "." <stateMatrixRows>\r
-*/\r
-fp_stateMultipleItem\r
- stateMultipleItem_1 .or fp_stateSingleItem;\r
-vp_stateMultipleItem\r
- stateMultipleItem_1 .or vp_stateSingleItem;\r
-stateMultipleItem_1\r
- "state" .and dot .and stateMatrixRows .emit STATE_MATRIX_ROWS;\r
-\r
-/*\r
-fragment program\r
- <stateSingleItem> ::= "state" "." <stateMaterialItem>\r
- | "state" "." <stateLightItem>\r
- | "state" "." <stateLightModelItem>\r
- | "state" "." <stateLightProdItem>\r
- | "state" "." <stateTexEnvItem>\r
- | "state" "." <stateFogItem>\r
- | "state" "." <stateDepthItem>\r
- | "state" "." <stateMatrixRow>\r
-\r
-vertex program\r
- <stateSingleItem> ::= "state" "." <stateMaterialItem>\r
- | "state" "." <stateLightItem>\r
- | "state" "." <stateLightModelItem>\r
- | "state" "." <stateLightProdItem>\r
- | "state" "." <stateTexGenItem>\r
- | "state" "." <stateFogItem>\r
- | "state" "." <stateClipPlaneItem>\r
- | "state" "." <statePointItem>\r
- | "state" "." <stateMatrixRow>\r
-*/\r
-fp_stateSingleItem\r
- "state" .and dot .and fp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;\r
-vp_stateSingleItem\r
- "state" .and dot .and vp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;\r
-fp_stateSingleItem_1\r
- stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or\r
- stateSingleItem_5 .or stateSingleItem_7 .or stateSingleItem_8 .or stateSingleItem_11;\r
-vp_stateSingleItem_1\r
- stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or\r
- stateSingleItem_6 .or stateSingleItem_7 .or stateSingleItem_9 .or stateSingleItem_10 .or\r
- stateSingleItem_11;\r
-stateSingleItem_1\r
- stateMaterialItem .emit STATE_MATERIAL;\r
-stateSingleItem_2\r
- stateLightItem .emit STATE_LIGHT;\r
-stateSingleItem_3\r
- stateLightModelItem .emit STATE_LIGHT_MODEL;\r
-stateSingleItem_4\r
- stateLightProdItem .emit STATE_LIGHT_PROD;\r
-stateSingleItem_5\r
- stateTexEnvItem .emit STATE_TEX_ENV;\r
-stateSingleItem_6\r
- stateTexGenItem .emit STATE_TEX_GEN;\r
-stateSingleItem_7\r
- stateFogItem .emit STATE_FOG;\r
-stateSingleItem_8\r
- stateDepthItem .emit STATE_DEPTH;\r
-stateSingleItem_9\r
- stateClipPlaneItem .emit STATE_CLIP_PLANE;\r
-stateSingleItem_10\r
- statePointItem .emit STATE_POINT;\r
-stateSingleItem_11\r
- stateMatrixRow .emit STATE_MATRIX_ROWS;\r
-\r
-/*\r
- <stateMaterialItem> ::= "material" <optFaceType> "." <stateMatProperty>\r
-*/\r
-stateMaterialItem\r
- "material" .and optFaceType .and dot .and stateMatProperty .error INVALID_MATERIAL_PROPERTY;\r
-\r
-/*\r
- <stateMatProperty> ::= "ambient"\r
- | "diffuse"\r
- | "specular"\r
- | "emission"\r
- | "shininess"\r
-*/\r
-stateMatProperty\r
- "ambient" .emit MATERIAL_AMBIENT .or\r
- "diffuse" .emit MATERIAL_DIFFUSE .or\r
- "specular" .emit MATERIAL_SPECULAR .or\r
- "emission" .emit MATERIAL_EMISSION .or\r
- "shininess" .emit MATERIAL_SHININESS;\r
-\r
-/*\r
- <stateLightItem> ::= "light" "[" <stateLightNumber> "]" "." \r
- <stateLightProperty>\r
-*/\r
-stateLightItem\r
- "light" .and lbracket .and stateLightNumber .and rbracket .and dot .and\r
- stateLightProperty .error INVALID_LIGHT_PROPERTY;\r
-\r
-/*\r
- <stateLightProperty> ::= "ambient"\r
- | "diffuse" \r
- | "specular"\r
- | "position"\r
- | "attenuation"\r
- | "spot" "." <stateSpotProperty>\r
- | "half"\r
-*/\r
-stateLightProperty\r
- "ambient" .emit LIGHT_AMBIENT .or\r
- "diffuse" .emit LIGHT_DIFFUSE .or\r
- "specular" .emit LIGHT_SPECULAR .or\r
- "position" .emit LIGHT_POSITION .or\r
- "attenuation" .emit LIGHT_ATTENUATION .or\r
- stateLightProperty_1 .emit LIGHT_SPOT_DIRECTION .or\r
- "half" .emit LIGHT_HALF;\r
-stateLightProperty_1\r
- "spot" .and dot .and stateSpotProperty .error INVALID_SPOT_PROPERTY;\r
-\r
-/*\r
- <stateSpotProperty> ::= "direction" \r
-*/\r
-stateSpotProperty\r
- "direction";\r
-\r
-/*\r
- <stateLightModelItem> ::= "lightmodel" <stateLModProperty>\r
-*/\r
-stateLightModelItem\r
- "lightmodel" .and stateLModProperty .error INVALID_LIGHTMODEL_PROPERTY;\r
-\r
-/*\r
- <stateLModProperty> ::= "." "ambient"\r
- | <optFaceType> "." "scenecolor"\r
-*/\r
-stateLModProperty\r
- stateLModProperty_1 .or stateLModProperty_2;\r
-stateLModProperty_1\r
- dot .and "ambient" .emit LIGHT_MODEL_AMBIENT;\r
-stateLModProperty_2\r
- stateLModProperty_3 .emit LIGHT_MODEL_SCENECOLOR;\r
-stateLModProperty_3\r
- optFaceType .and dot .and "scenecolor";\r
-\r
-/*\r
- <stateLightProdItem> ::= "lightprod" "[" <stateLightNumber> "]"\r
- <optFaceType> "." <stateLProdProperty>\r
-*/\r
-stateLightProdItem\r
- "lightprod" .and lbracket .and stateLightNumber .and rbracket .and optFaceType .and dot .and\r
- stateLProdProperty .error INVALID_LIGHTPROD_PROPERTY;\r
-\r
-/*\r
- <stateLProdProperty> ::= "ambient"\r
- | "diffuse"\r
- | "specular"\r
-*/\r
-stateLProdProperty\r
- "ambient" .emit LIGHT_PROD_AMBIENT .or\r
- "diffuse" .emit LIGHT_PROD_DIFFUSE .or\r
- "specular" .emit LIGHT_PROD_SPECULAR;\r
-\r
-/*\r
- <stateLightNumber> ::= <integer> from 0 to MAX_LIGHTS-1\r
-*/\r
-stateLightNumber\r
- integer;\r
-\r
-/*\r
-fragment program\r
- <stateTexEnvItem> ::= "texenv" <optLegacyTexUnitNum> "." \r
- <stateTexEnvProperty>\r
-*/\r
-stateTexEnvItem\r
- "texenv" .and optLegacyTexUnitNum .and dot .and\r
- stateTexEnvProperty .error INVALID_TEXENV_PROPERTY;\r
-\r
-/*\r
-fragment program\r
- <stateTexEnvProperty> ::= "color"\r
-*/\r
-stateTexEnvProperty\r
- "color" .emit TEX_ENV_COLOR;\r
-\r
-/*\r
-fragment program\r
- <optLegacyTexUnitNum> ::= ""\r
- | "[" <legacyTexUnitNum> "]"\r
-\r
-NOTE: <optLegaceTexUnitNum> is not optional.\r
-*/\r
-optLegacyTexUnitNum\r
- lbracket_ne .and legacyTexUnitNum .and rbracket;\r
-\r
-/*\r
-fragment program\r
- <legacyTexUnitNum> ::= <integer> from 0 to MAX_TEXTURE_UNITS-1\r
-*/\r
-legacyTexUnitNum\r
- integer;\r
-\r
-/*\r
-vertex program\r
- <stateTexGenItem> ::= "texgen" <optTexCoordNum> "."\r
- <stateTexGenType> "." <stateTexGenCoord>\r
-*/\r
-stateTexGenItem\r
- "texgen" .and optTexCoordNum .and dot .and stateTexGenType .error INVALID_TEXGEN_PROPERTY .and\r
- dot .and stateTexGenCoord .error INVALID_TEXGEN_COORD;\r
-\r
-/*\r
-vertex program\r
- <stateTexGenType> ::= "eye"\r
- | "object"\r
-*/\r
-stateTexGenType\r
- "eye" .emit TEX_GEN_EYE .or\r
- "object" .emit TEX_GEN_OBJECT;\r
-\r
-/*\r
-vertex program\r
- <stateTexGenCoord> ::= "s"\r
- | "t"\r
- | "r"\r
- | "q"\r
-*/\r
-stateTexGenCoord\r
- "s" .emit COMPONENT_X .or\r
- "t" .emit COMPONENT_Y .or\r
- "r" .emit COMPONENT_Z .or\r
- "q" .emit COMPONENT_W;\r
-\r
-/*\r
- <stateFogItem> ::= "fog" "." <stateFogProperty>\r
-*/\r
-stateFogItem\r
- "fog" .and dot .and stateFogProperty .error INVALID_FOG_PROPERTY;\r
-\r
-/*\r
- <stateFogProperty> ::= "color"\r
- | "params"\r
-*/\r
-stateFogProperty\r
- "color" .emit FOG_COLOR .or\r
- "params" .emit FOG_PARAMS;\r
-\r
-/*\r
-fragment program\r
- <stateDepthItem> ::= "depth" "." <stateDepthProperty>\r
-*/\r
-stateDepthItem\r
- "depth" .and dot .and stateDepthProperty .error INVALID_DEPTH_PROPERTY;\r
-\r
-/*\r
-fragment program\r
- <stateDepthProperty> ::= "range"\r
-*/\r
-stateDepthProperty\r
- "range" .emit DEPTH_RANGE;\r
-\r
-/*\r
-vertex program\r
- <stateClipPlaneItem> ::= "clip" "[" <stateClipPlaneNum> "]" "." "plane"\r
-*/\r
-stateClipPlaneItem\r
- "clip" .and lbracket .and stateClipPlaneNum .and rbracket .and dot .and\r
- "plane" .error INVALID_CLIPPLANE_PROPERTY;\r
-\r
-/*\r
-vertex program\r
- <stateClipPlaneNum> ::= <integer> from 0 to MAX_CLIP_PLANES-1\r
-*/\r
-stateClipPlaneNum\r
- integer;\r
-\r
-/*\r
-vertex program\r
- <statePointItem> ::= "point" . <statePointProperty>\r
-*/\r
-statePointItem\r
- "point" .and dot .and statePointProperty .error INVALID_POINT_PROPERTY;\r
-\r
-/*\r
-vertex program\r
- <statePointProperty> ::= "size"\r
- | "attenuation"\r
-*/\r
-statePointProperty\r
- "size" .emit POINT_SIZE .or\r
- .if (point_parameters != 0x00) "attenuation" .emit POINT_ATTENUATION;\r
-\r
-/*\r
- <stateMatrixRow> ::= <stateMatrixItem> "." "row" "[" \r
- <stateMatrixRowNum> "]"\r
-*/\r
-stateMatrixRow\r
- stateMatrixItem .and dot .and "row" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and\r
- lbracket .and stateMatrixRowNum .and rbracket .emit 0x0;\r
-\r
-/*\r
- <stateMatrixRows> ::= <stateMatrixItem> <optMatrixRows>\r
-*/\r
-stateMatrixRows\r
- stateMatrixItem .and optMatrixRows;\r
-\r
-/*\r
- <optMatrixRows> ::= ""\r
- | "." "row" "[" <stateMatrixRowNum> ".." \r
- <stateMatrixRowNum> "]"\r
-*/\r
-optMatrixRows\r
- optMatrixRows_1 .or .true .emit 0x0 .emit '3' .emit 0x0 .emit $;\r
-optMatrixRows_1\r
- dot_ne .and "row" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and lbracket .and\r
- stateMatrixRowNum .and dotdot .and stateMatrixRowNum .and rbracket;\r
-\r
-/*\r
- <stateMatrixItem> ::= "matrix" . <stateMatrixName> \r
- <stateOptMatModifier>\r
-*/\r
-stateMatrixItem\r
- "matrix" .and dot .and stateMatrixName .error INVALID_MATRIX_NAME .and stateOptMatModifier;\r
-\r
-/*\r
- <stateOptMatModifier> ::= ""\r
- | "." <stateMatModifier>\r
-*/\r
-stateOptMatModifier\r
- stateOptMatModifier_1 .or .true .emit MATRIX_MODIFIER_IDENTITY;\r
-stateOptMatModifier_1\r
- dot_ne .and stateMatModifier;\r
-\r
-/*\r
- <stateMatModifier> ::= "inverse" \r
- | "transpose" \r
- | "invtrans"\r
-*/\r
-stateMatModifier\r
- "inverse" .emit MATRIX_MODIFIER_INVERSE .or\r
- "transpose" .emit MATRIX_MODIFIER_TRANSPOSE .or\r
- "invtrans" .emit MATRIX_MODIFIER_INVTRANS;\r
-\r
-/*\r
- <stateMatrixRowNum> ::= <integer> from 0 to 3\r
-*/\r
-stateMatrixRowNum\r
- integer_0_3;\r
-\r
-/*\r
- <stateMatrixName> ::= "modelview" <stateOptModMatNum>\r
- | "projection"\r
- | "mvp"\r
- | "texture" <optTexCoordNum>\r
- | "palette" "[" <statePaletteMatNum> "]"\r
- | "program" "[" <stateProgramMatNum> "]"\r
-*/\r
-stateMatrixName\r
- stateMatrixName_1_1 .emit MATRIX_MODELVIEW .or\r
- "projection" .emit MATRIX_PROJECTION .or\r
- "mvp" .emit MATRIX_MVP .or\r
- stateMatrixName_1_2 .emit MATRIX_TEXTURE .or\r
- .if (matrix_palette != 0x00) stateMatrixName_1_3 .emit MATRIX_PALETTE .or\r
- stateMatrixName_1_4 .emit MATRIX_PROGRAM;\r
-stateMatrixName_1_1\r
- "modelview" .and stateOptModMatNum;\r
-stateMatrixName_1_2\r
- "texture" .and optTexCoordNum;\r
-stateMatrixName_1_3\r
- "palette" .and lbracket .and statePaletteMatNum .and rbracket;\r
-stateMatrixName_1_4\r
- "program" .and lbracket .and stateProgramMatNum .and rbracket;\r
-\r
-/*\r
- <stateOptModMatNum> ::= ""\r
- | "[" <stateModMatNum> "]"\r
-*/\r
-stateOptModMatNum\r
- .if (vertex_blend != 0x00) stateOptModMatNum_1 .or\r
- .true .emit 0x00;\r
-stateOptModMatNum_1\r
- lbracket_ne .and stateModMatNum .and rbracket;\r
-\r
-/*\r
- <stateModMatNum> ::= <integer> from 0 to MAX_VERTEX_UNITS_ARB-1\r
-*/\r
-stateModMatNum\r
- integer;\r
-\r
-/*\r
- <optTexCoordNum> ::= ""\r
- | "[" <texCoordNum> "]"\r
-*/\r
-optTexCoordNum\r
- optTexCoordNum_1 .or .true .emit 0x00;\r
-optTexCoordNum_1\r
- lbracket_ne .and texCoordNum .and rbracket;\r
-\r
-/*\r
- <texCoordNum> ::= <integer> from 0 to MAX_TEXTURE_COORDS_ARB-1\r
-*/\r
-texCoordNum\r
- integer;\r
-\r
-/*\r
- <statePaletteMatNum> ::= <integer> from 0 to MAX_PALETTE_MATRICES_ARB-1\r
-*/\r
-statePaletteMatNum\r
- integer;\r
-\r
-/*\r
- <stateProgramMatNum> ::= <integer> from 0 to MAX_PROGRAM_MATRICES_ARB-1\r
-*/\r
-stateProgramMatNum\r
- integer;\r
-\r
-/*\r
- <programSingleItem> ::= <progEnvParam>\r
- | <progLocalParam>\r
-\r
-NOTE: <programSingleItem> has been modified for correct error handling. If program property\r
- is neither "env" nor "local" INVALID_PROGRAM_PROPERTY is generated.\r
-*/\r
-programSingleItem\r
- "program" .and dot .and programSingleItem_1 .error INVALID_PROGRAM_PROPERTY;\r
-programSingleItem_1\r
- progEnvParam .or progLocalParam;\r
-\r
-/*\r
- <programMultipleItem> ::= <progEnvParams>\r
- | <progLocalParams>\r
-\r
-NOTE: <programMultipleItem> has been modified for correct error handling. If program property\r
- is neither "env" nor "local" INVALID_PROGRAM_PROPERTY is generated.\r
-*/\r
-programMultipleItem\r
- "program" .and dot .and programMultipleItem_1 .error INVALID_PROGRAM_PROPERTY;\r
-programMultipleItem_1\r
- progEnvParams .or progLocalParams;\r
-\r
-/*\r
- <progEnvParams> ::= "program" "." "env" \r
- "[" <progEnvParamNums> "]"\r
-\r
-NOTE: "program" "." has been moved to <programMultipleItem>.\r
-*/\r
-progEnvParams\r
- "env" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNums .and rbracket;\r
-\r
-/*\r
- <progEnvParamNums> ::= <progEnvParamNum>\r
- | <progEnvParamNum> ".." <progEnvParamNum>\r
-*/\r
-progEnvParamNums\r
- progEnvParamNums_1 .or progEnvParamNums_2;\r
-progEnvParamNums_1\r
- progEnvParamNum .and dotdot_ne .and progEnvParamNum;\r
-progEnvParamNums_2\r
- progEnvParamNum .and .true .emit 0x00;\r
-\r
-/*\r
- <progEnvParam> ::= "program" "." "env" \r
- "[" <progEnvParamNum> "]"\r
-\r
-NOTE: "program" "." has been moved to <programSingleItem>.\r
-*/\r
-progEnvParam\r
- "env" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNum .and rbracket .emit 0x00;\r
-\r
-/*\r
- <progLocalParams> ::= "program" "." "local" \r
- "[" <progLocalParamNums> "]"\r
-\r
-NOTE: "program" "." has been moved to <programMultipleItem>.\r
-*/\r
-progLocalParams\r
- "local" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNums .and rbracket;\r
-\r
-/*\r
- <progLocalParamNums> ::= <progLocalParamNum>\r
- | <progLocalParamNum> ".." <progLocalParamNum>\r
-*/\r
-progLocalParamNums\r
- progLocalParamNums_1 .or progLocalParamNums_2;\r
-progLocalParamNums_1\r
- progLocalParamNum .and dotdot_ne .and progLocalParamNum;\r
-progLocalParamNums_2\r
- progLocalParamNum .and .true .emit 0x00;\r
-\r
-/*\r
- <progLocalParam> ::= "program" "." "local" \r
- "[" <progLocalParamNum> "]"\r
-\r
-NOTE: "program" "." has been moved to <programSingleItem>.\r
-*/\r
-progLocalParam\r
- "local" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNum .and rbracket .emit 0x00;\r
-\r
-/*\r
- <progEnvParamNum> ::= <integer> from 0 to\r
- MAX_PROGRAM_ENV_PARAMETERS_ARB - 1\r
-*/\r
-progEnvParamNum\r
- integer;\r
-\r
-/*\r
- <progLocalParamNum> ::= <integer> from 0 to\r
- MAX_PROGRAM_LOCAL_PARAMETERS_ARB - 1\r
-*/\r
-progLocalParamNum\r
- integer;\r
-\r
-/*\r
- <paramConstDecl> ::= <paramConstScalarDecl>\r
- | <paramConstVector>\r
-*/\r
-paramConstDecl\r
- paramConstScalarDecl .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;\r
-\r
-/*\r
- <paramConstUse> ::= <paramConstScalarUse>\r
- | <paramConstVector>\r
-*/\r
-paramConstUse\r
- paramConstScalarUse .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;\r
-\r
-/*\r
- <paramConstScalarDecl> ::= <signedFloatConstant>\r
-*/\r
-paramConstScalarDecl\r
- signedFloatConstant;\r
-\r
-/*\r
- <paramConstScalarUse> ::= <floatConstant>\r
-*/\r
-paramConstScalarUse\r
- floatConstant;\r
-\r
-/*\r
- <paramConstVector> ::= "{" <signedFloatConstant> "}"\r
- | "{" <signedFloatConstant> "," \r
- <signedFloatConstant> "}"\r
- | "{" <signedFloatConstant> "," \r
- <signedFloatConstant> ","\r
- <signedFloatConstant> "}"\r
- | "{" <signedFloatConstant> "," \r
- <signedFloatConstant> ","\r
- <signedFloatConstant> "," \r
- <signedFloatConstant> "}"\r
-*/\r
-paramConstVector\r
- paramConstVector_4 .emit 0x04 .or paramConstVector_3 .emit 0x03 .or\r
- paramConstVector_2 .emit 0x02 .or paramConstVector_1 .emit 0x01;\r
-paramConstVector_1\r
- lbrace_ne .and signedFloatConstant .and rbrace;\r
-paramConstVector_2\r
- lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;\r
-paramConstVector_3\r
- lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and\r
- signedFloatConstant .and rbrace;\r
-paramConstVector_4\r
- lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and\r
- signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;\r
-\r
-/*\r
- <signedFloatConstant> ::= <optionalSign> <floatConstant>\r
-*/\r
-signedFloatConstant\r
- optionalSign .and floatConstant;\r
-\r
-/*\r
- <floatConstant> ::= see text\r
- The <floatConstant> rule matches a floating-point constant consisting\r
- of an integer part, a decimal point, a fraction part, an "e" or\r
- "E", and an optionally signed integer exponent. The integer and\r
- fraction parts both consist of a sequence of one or more digits ("0"\r
- through "9"). Either the integer part or the fraction parts (not\r
- both) may be missing; either the decimal point or the "e" (or "E")\r
- and the exponent (not both) may be missing.\r
-*/\r
-floatConstant\r
- float;\r
-\r
-/*\r
- <optionalSign> ::= ""\r
- | "-"\r
- | "+"\r
-*/\r
-optionalSign\r
- optional_sign_ne;\r
-\r
-/*\r
- <TEMP_statement> ::= "TEMP" <varNameList>\r
-*/\r
-fp_TEMP_statement\r
- "TEMP" .and space .and fp_varNameList .and .true .emit 0x00;\r
-vp_TEMP_statement\r
- "TEMP" .and space .and vp_varNameList .and .true .emit 0x00;\r
-\r
-/*\r
-vertex program\r
- <ADDRESS_statement> ::= "ADDRESS" <varNameList>\r
-*/\r
-ADDRESS_statement\r
- "ADDRESS" .and space .and vp_varNameList .and .true .emit 0x00;\r
-\r
-/*\r
- <varNameList> ::= <establishName>\r
- | <establishName> "," <varNameList>\r
-*/\r
-fp_varNameList\r
- fp_varNameList_1 .or fp_establishName;\r
-vp_varNameList\r
- vp_varNameList_1 .or vp_establishName;\r
-fp_varNameList_1\r
- fp_establishName .and comma_ne .and fp_varNameList;\r
-vp_varNameList_1\r
- vp_establishName .and comma_ne .and vp_varNameList;\r
-\r
-/*\r
- <OUTPUT_statement> ::= "OUTPUT" <establishName> "="\r
- <resultBinding>\r
-*/\r
-fp_OUTPUT_statement\r
- "OUTPUT" .and space .and fp_establishName .and equal .and\r
- fp_resultBinding .error RESULT_EXPECTED;\r
-vp_OUTPUT_statement\r
- "OUTPUT" .and space .and vp_establishName .and equal .and\r
- vp_resultBinding .error RESULT_EXPECTED;\r
-\r
-/*\r
-fragment program\r
- <resultBinding> ::= "result" "." "color"\r
- | "result" "." "depth"\r
-\r
-vertex program\r
- <resultBinding> ::= "result" "." "position"\r
- | "result" "." <resultColBinding>\r
- | "result" "." "fogcoord"\r
- | "result" "." "pointsize"\r
- | "result" "." "texcoord" <optTexCoordNum>\r
-*/\r
-fp_resultBinding\r
- "result" .and dot .and fp_resultBinding_1 .error INVALID_RESULT_PROPERTY;\r
-vp_resultBinding\r
- "result" .and dot .and vp_resultBinding_1 .error INVALID_RESULT_PROPERTY;\r
-fp_resultBinding_1\r
- "color" .emit FRAGMENT_RESULT_COLOR .or\r
- "depth" .emit FRAGMENT_RESULT_DEPTH;\r
-vp_resultBinding_1\r
- .if (ARB_position_invariant == 0x00) "position" .emit VERTEX_RESULT_POSITION .or\r
- resultColBinding .emit VERTEX_RESULT_COLOR .or\r
- "fogcoord" .emit VERTEX_RESULT_FOGCOORD .or\r
- "pointsize" .emit VERTEX_RESULT_POINTSIZE .or\r
- vp_resultBinding_2 .emit VERTEX_RESULT_TEXCOORD;\r
-vp_resultBinding_2\r
- "texcoord" .and optTexCoordNum;\r
-\r
-/*\r
-vertex program\r
- <resultColBinding> ::= "color" <optFaceType> <optColorType>\r
-*/\r
-resultColBinding\r
- "color" .and optFaceType .and optColorType;\r
-\r
-/*\r
- <optFaceType> ::= ""\r
- | "." "front"\r
- | "." "back"\r
-*/\r
-optFaceType\r
- FaceType .or .true .emit FACE_FRONT;\r
-FaceType\r
- dot_ne .and FaceProperty;\r
-FaceProperty\r
- "front" .emit FACE_FRONT .or "back" .emit FACE_BACK;\r
-\r
-/*\r
- <optColorType> ::= ""\r
- | "." "primary"\r
- | "." "secondary"\r
-*/\r
-optColorType\r
- ColorType .or .true .emit COLOR_PRIMARY;\r
-ColorType\r
- dot_ne .and ColorProperty;\r
-ColorProperty\r
- "primary" .emit COLOR_PRIMARY .or\r
- .if (secondary_color != 0x00) "secondary" .emit COLOR_SECONDARY;\r
-\r
-/*\r
- <ALIAS_statement> ::= "ALIAS" <establishName> "="\r
- <establishedName>\r
-*/\r
-fp_ALIAS_statement\r
- "ALIAS" .and fp_ALIAS_statement_1 .error IDENTIFIER_EXPECTED .and equal .and fp_establishedName;\r
-vp_ALIAS_statement\r
- "ALIAS" .and vp_ALIAS_statement_1 .error IDENTIFIER_EXPECTED .and equal .and vp_establishedName;\r
-fp_ALIAS_statement_1\r
- space .and fp_establishName;\r
-vp_ALIAS_statement_1\r
- space .and vp_establishName;\r
-\r
-/*\r
- <establishName> ::= <identifier>\r
-*/\r
-fp_establishName\r
- fp_identifier;\r
-vp_establishName\r
- vp_identifier;\r
-\r
-/*\r
- <establishedName> ::= <identifier>\r
-*/\r
-fp_establishedName\r
- fp_identifier;\r
-vp_establishedName\r
- vp_identifier;\r
-fp_establishedName_no_error_on_identifier\r
- fp_identifier_ne;\r
-vp_establishedName_no_error_on_identifier\r
- vp_identifier_ne;\r
-\r
-/*\r
-fragment program\r
- <identifier> ::= see text\r
- The <identifier> rule matches a sequence of one or more letters ("A"\r
- through "Z", "a" through "z"), digits ("0" through "9), underscores \r
- ("_"), or dollar signs ("$"); the first character must not be a \r
- number. Upper and lower case letters are considered different \r
- (names are case-sensitive). The following strings are reserved \r
- keywords and may not be used as identifiers:\r
-\r
- ABS, ABS_SAT, ADD, ADD_SAT, ALIAS, ATTRIB, CMP, CMP_SAT, COS,\r
- COS_SAT, DP3, DP3_SAT, DP4, DP4_SAT, DPH, DPH_SAT, DST, DST_SAT, \r
- END, EX2, EX2_SAT, FLR, FLR_SAT, FRC, FRC_SAT, KIL, LG2, \r
- LG2_SAT, LIT, LIT_SAT, LRP, LRP_SAT, MAD, MAD_SAT, MAX, MAX_SAT, \r
- MIN, MIN_SAT, MOV, MOV_SAT, MUL, MUL_SAT, OPTION, OUTPUT, PARAM, \r
- POW, POW_SAT, RCP, RCP_SAT, RSQ, RSQ_SAT, SIN, SIN_SAT, SCS, \r
- SCS_SAT, SGE, SGE_SAT, SLT, SLT_SAT, SUB, SUB_SAT, SWZ, SWZ_SAT, \r
- TEMP, TEX, TEX_SAT, TXB, TXB_SAT, TXP, TXP_SAT, XPD, XPD_SAT, \r
- fragment, program, result, state, and texture.\r
-\r
-vertex program\r
- <identifier> ::= see text\r
- The <identifier> rule matches a sequence of one or more letters ("A"\r
- through "Z", "a" through "z"), digits ("0" through "9), underscores ("_"),\r
- or dollar signs ("$"); the first character must not be a number. Upper\r
- and lower case letters are considered different (names are\r
- case-sensitive). The following strings are reserved keywords and may not\r
- be used as identifiers:\r
-\r
- ABS, ADD, ADDRESS, ALIAS, ARL, ATTRIB, DP3, DP4, DPH, DST, END, EX2,\r
- EXP, FLR, FRC, LG2, LIT, LOG, MAD, MAX, MIN, MOV, MUL, OPTION, OUTPUT,\r
- PARAM, POW, RCP, RSQ, SGE, SLT, SUB, SWZ, TEMP, XPD, program, result,\r
- state, and vertex.\r
-*/\r
-fp_identifier\r
- fp_identifier_ne .error IDENTIFIER_EXPECTED;\r
-vp_identifier\r
- vp_identifier_ne .error IDENTIFIER_EXPECTED;\r
-fp_identifier_ne\r
- fp_not_reserved_identifier .and identifier_ne;\r
-vp_identifier_ne\r
- vp_not_reserved_identifier .and identifier_ne;\r
-\r
-fp_not_reserved_identifier\r
- fp_not_reserved_identifier_1 .or .true;\r
-fp_not_reserved_identifier_1\r
- fp_reserved_identifier .and .false .error RESERVED_KEYWORD;\r
-vp_not_reserved_identifier\r
- vp_not_reserved_identifier_1 .or .true;\r
-vp_not_reserved_identifier_1\r
- vp_reserved_identifier .and .false .error RESERVED_KEYWORD;\r
-\r
-fp_reserved_identifier\r
- "ABS" .or "ABS_SAT" .or "ADD" .or "ADD_SAT" .or "ALIAS" .or "ATTRIB" .or "CMP" .or "CMP_SAT" .or\r
- "COS" .or "COS_SAT" .or "DP3" .or "DP3_SAT" .or "DP4" .or "DP4_SAT" .or "DPH" .or "DPH_SAT" .or\r
- "DST" .or "DST_SAT" .or "END" .or "EX2" .or "EX2_SAT" .or "FLR" .or "FLR_SAT" .or "FRC" .or\r
- "FRC_SAT" .or "KIL" .or "LG2" .or "LG2_SAT" .or "LIT" .or "LIT_SAT" .or "LRP" .or "LRP_SAT" .or\r
- "MAD" .or "MAD_SAT" .or "MAX" .or "MAX_SAT" .or "MIN" .or "MIN_SAT" .or "MOV" .or "MOV_SAT" .or\r
- "MUL" .or "MUL_SAT" .or "OPTION" .or "OUTPUT" .or "PARAM" .or "POW" .or "POW_SAT" .or "RCP" .or\r
- "RCP_SAT" .or "RSQ" .or "RSQ_SAT" .or "SIN" .or "SIN_SAT" .or "SCS" .or "SCS_SAT" .or "SGE" .or\r
- "SGE_SAT" .or "SLT" .or "SLT_SAT" .or "SUB" .or "SUB_SAT" .or "SWZ" .or "SWZ_SAT" .or "TEMP" .or\r
- "TEX" .or "TEX_SAT" .or "TXB" .or "TXB_SAT" .or "TXP" .or "TXP_SAT" .or "XPD" .or "XPD_SAT" .or\r
- "fragment" .or "program" .or "result" .or "state" .or "texture";\r
-vp_reserved_identifier\r
- "ABS" .or "ADD" .or "ADDRESS" .or "ALIAS" .or "ARL" .or "ATTRIB" .or "DP3" .or "DP4" .or\r
- "DPH" .or "DST" .or "END" .or "EX2" .or "EXP" .or "FLR" .or "FRC" .or "LG2" .or "LIT" .or\r
- "LOG" .or "MAD" .or "MAX" .or "MIN" .or "MOV" .or "MUL" .or "OPTION" .or "OUTPUT" .or\r
- "PARAM" .or "POW" .or "RCP" .or "RSQ" .or "SGE" .or "SLT" .or "SUB" .or "SWZ" .or "TEMP" .or\r
- "XPD" .or "program" .or "result" .or "state" .or "vertex";\r
-\r
-/*\r
- The <integer> rule matches an integer constant. The integer consists\r
- of a sequence of one or more digits ("0" through "9").\r
-*/\r
-integer\r
- integer_ne .error INTEGER_EXPECTED;\r
-\r
-zero\r
- '0';\r
-\r
-leading_zeroes\r
- .loop zero;\r
-\r
-no_digit\r
- no_digit_1 .or .true;\r
-no_digit_1\r
- digit10 .and .false .error INTEGER_OUT_OF_RANGE;\r
-\r
-all_zeroes\r
- all_zeroes_1 .or no_digit_1;\r
-all_zeroes_1\r
- '0' .and .loop zero .and no_digit;\r
-\r
-integer_0_3\r
- integer_0_3_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;\r
-integer_0_3_1\r
- integer_0_3_2 .or all_zeroes .emit '0';\r
-integer_0_3_2 /* [1, 3] */\r
- leading_zeroes .and '1'-'3' .emit * .and no_digit;\r
-\r
-integer_0_63\r
- integer_0_63_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;\r
-integer_0_63_1\r
- integer_0_63_2 .or integer_0_63_3 .or integer_0_63_4 .or integer_0_63_5 .or\r
- all_zeroes .emit '0';\r
-integer_0_63_2 /* [7, 9] */\r
- leading_zeroes .and '7'-'9' .emit * .and no_digit;\r
-integer_0_63_3 /* [10, 59] */\r
- leading_zeroes .and '1'-'5' .emit * .and '0'-'9' .emit * .and no_digit;\r
-integer_0_63_4 /* [60, 63] */\r
- leading_zeroes .and '6' .emit * .and '0'-'3' .emit * .and no_digit;\r
-integer_0_63_5 /* [1, 6] */\r
- leading_zeroes .and '1'-'6' .emit * .and no_digit;\r
-\r
-integer_0_64\r
- integer_0_64_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;\r
-integer_0_64_1\r
- integer_0_64_2 .or integer_0_64_3 .or integer_0_64_4 .or integer_0_64_5 .or\r
- all_zeroes .emit '0';\r
-integer_0_64_2 /* [7, 9] */\r
- leading_zeroes .and '7'-'9' .emit * .and no_digit;\r
-integer_0_64_3 /* [10, 59] */\r
- leading_zeroes .and '1'-'5' .emit * .and '0'-'9' .emit * .and no_digit;\r
-integer_0_64_4 /* [60, 64] */\r
- leading_zeroes .and '6' .emit * .and '0'-'4' .emit * .and no_digit;\r
-integer_0_64_5 /* [1, 6] */\r
- leading_zeroes .and '1'-'6' .emit * .and no_digit;\r
-\r
-optional_space\r
- space .or .true;\r
-\r
-space_dst\r
- space .error OPERATION_NEEDS_DESTINATION_VARIABLE;\r
-\r
-space_src\r
- space .error OPERATION_NEEDS_SOURCE_VARIABLE;\r
-\r
-space\r
- single_space .and .loop single_space;\r
-\r
-single_space\r
- white_char .or comment_block;\r
-\r
-white_char\r
- ' ' .or '\t' .or '\n' .or '\r';\r
-\r
-comment_block\r
- '#' .and .loop comment_char .and new_line;\r
-\r
-/* All ASCII characters except '\r', '\n' and '\0' */\r
-comment_char\r
- '\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';\r
-\r
-new_line\r
- '\n' .or crlf .or '\0';\r
-\r
-crlf\r
- '\r' .and '\n';\r
-\r
-semicolon\r
- optional_space .and ';' .error MISSING_SEMICOLON .and optional_space;\r
-\r
-comma\r
- optional_space .and ',' .error MISSING_COMMA .and optional_space;\r
-\r
-comma_ne\r
- optional_space .and ',' .and optional_space;\r
-\r
-lbracket\r
- optional_space .and '[' .error MISSING_LBRACKET .and optional_space;\r
-\r
-lbracket_ne\r
- optional_space .and '[' .and optional_space;\r
-\r
-rbracket\r
- optional_space .and ']' .error MISSING_RBRACKET .and optional_space;\r
-\r
-dot\r
- optional_space .and '.' .error MISSING_DOT .and optional_space;\r
-\r
-dot_ne\r
- optional_space .and '.' .and optional_space;\r
-\r
-equal\r
- optional_space .and '=' .error MISSING_EQUAL .and optional_space;\r
-\r
-lbrace\r
- optional_space .and '{' .error MISSING_LBRACE .and optional_space;\r
-\r
-lbrace_ne\r
- optional_space .and '{' .and optional_space;\r
-\r
-rbrace\r
- optional_space .and '}' .error MISSING_RBRACE .and optional_space;\r
-\r
-dotdot\r
- optional_space .and '.' .and '.' .error MISSING_DOTDOT .and optional_space;\r
-\r
-dotdot_ne\r
- optional_space .and '.' .and '.' .and optional_space;\r
-\r
-/*\r
- The definition below accepts the following floating point number formats:\r
- .99 .99e99 99. 99.99 99.99e99 99.e99 99e99\r
- Also 99 format was considered and accepted because of a large number of existing program\r
- strings with such a format.\r
-*/\r
-float\r
- float_1 .or float_2 .or float_legacy;\r
-float_1\r
- '.' .emit 0x00 .and integer_ne .error MISSING_FRACTION_OR_EXPONENT .and optional_exponent;\r
-float_2\r
- integer_ne .and float_3;\r
-float_3\r
- float_4 .or float_5;\r
-float_4\r
- '.' .and optional_integer .and optional_exponent;\r
-float_5\r
- exponent .emit 0x00;\r
-float_legacy\r
- integer_ne .and .true .emit 0x00 .emit 0x00;\r
-\r
-/*\r
- Below is a correct version of <float> definiton.\r
-*/\r
-/*\r
-float\r
- float_1 .or float_2;\r
-float_1\r
- '.' .emit 0x00 .and integer_ne .error MISSING_FRACTION_OR_EXPONENT .and optional_exponent;\r
-float_2\r
- integer_ne .and float_3 .error MISSING_DOT_OR_EXPONENT;\r
-float_3\r
- float_4 .or float_5;\r
-float_4\r
- '.' .and optional_integer .and optional_exponent;\r
-float_5\r
- exponent .emit 0x00;\r
-*/\r
-\r
-integer_ne\r
- integer_ne_1 .and .true .emit 0x00 .emit $;\r
-integer_ne_1\r
- digit10 .emit * .and .loop digit10 .emit *;\r
-\r
-optional_integer\r
- integer_ne .or .true .emit 0x00;\r
-\r
-/*\r
-NOTE: If exponent part is omited we treat it as if it was "E+1".\r
-*/\r
-optional_exponent\r
- exponent .or .true .emit 0x00;\r
-\r
-exponent\r
- exponent_1 .and optional_sign_ne .and integer_ne .error EXPONENT_VALUE_EXPECTED;\r
-exponent_1\r
- 'e' .or 'E';\r
-\r
-optional_sign_ne\r
- minus_ne .or plus_ne .or .true;\r
-\r
-plus_ne\r
- optional_space .and '+' .and optional_space;\r
-\r
-minus_ne\r
- optional_space .and '-' .emit '-' .and optional_space;\r
-\r
-identifier_ne\r
- first_idchar .emit * .and .loop follow_idchar .emit * .and .true .emit 0x00 .emit $;\r
-\r
-follow_idchar\r
- first_idchar .or digit10;\r
-\r
-first_idchar\r
- 'a'-'z' .or 'A'-'Z' .or '_' .or '$';\r
-\r
-digit10\r
- '0'-'9';\r
-\r
-/*\r
- string filtering - if a string is encountered in grammar ("blabla"), the symbol below is\r
- executed to create the string. The symbol must not throw any errors and emit bytes - it should\r
- stop if it encounters invalid character. After this the resulting string (from starting\r
- position up to the invalid character (but without it) is compared with the grammar string.\r
-*/\r
-.string __string_filter;\r
-\r
-__string_filter\r
- .loop __identifier_char;\r
-\r
-__identifier_char\r
- 'a'-'z' .or 'A'-'Z' .or '_' .or '$' .or '0'-'9';\r
-\r
-/*\r
- error token filtering\r
-*/\r
-e_signature\r
- e_signature_char .and .loop e_signature_char;\r
-e_signature_char\r
- '!' .or '.' .or 'A'-'Z' .or 'a'-'z' .or '0'-'9';\r
-\r
-e_statement\r
- .loop e_statement_not_term;\r
-/* All ASCII characters to one of '\r', '\n', '\0' and ';' */\r
-e_statement_not_term\r
- '\x3C'-'\xFF' .or '\x0E'-'\x3A' .or '\x01'-'\x09' .or '\x0B'-'\x0C';\r
-\r
-e_identifier\r
- e_identifier_first .and .loop e_identifier_next;\r
-e_identifier_first\r
- 'a'-'z' .or 'A'-'Z' .or '_' .or '$';\r
-e_identifier_next\r
- e_identifier_first .or '0'-'9';\r
-\r
-e_token\r
- e_identifier .or e_token_number .or '[' .or ']' .or '.' .or '{' .or '}' .or '=' .or '+' .or\r
- '-' .or ',' .or ';';\r
-e_token_number\r
- e_token_digit .and .loop e_token_digit;\r
-e_token_digit\r
- '0'-'9';\r
-\r
-e_charordigit\r
- 'A'-'Z' .or 'a'-'z' .or '0'-'9';\r
-\r
+/*
+ * Mesa 3-D graphics library
+ * Version: 6.2
+ *
+ * Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+ /**
+ * \file arbprogram.syn
+ * ARB_fragment/vertex_program syntax
+ * \author Michal Krol
+ */
+
+.syntax program;
+
+/*
+ This value must be incremented every time emit code values or structure of the production
+ array changes. This value is placed at the beginning of the production array. The loader
+ compares the value with its REVISION value. If they do not match, the loader is not up
+ to date.
+*/
+.emtcode REVISION 0x0a
+
+/* program type */
+.emtcode FRAGMENT_PROGRAM 0x01
+.emtcode VERTEX_PROGRAM 0x02
+
+/* program section */
+.emtcode OPTION 0x01
+.emtcode INSTRUCTION 0x02
+.emtcode DECLARATION 0x03
+.emtcode END 0x04
+
+/* GL_ARB_fragment_program option */
+.emtcode ARB_PRECISION_HINT_FASTEST 0x00
+.emtcode ARB_PRECISION_HINT_NICEST 0x01
+.emtcode ARB_FOG_EXP 0x02
+.emtcode ARB_FOG_EXP2 0x03
+.emtcode ARB_FOG_LINEAR 0x04
+
+/* GL_ARB_vertex_program option */
+.emtcode ARB_POSITION_INVARIANT 0x05
+
+/* GL_ARB_fragment_program_shadow option */
+.emtcode ARB_FRAGMENT_PROGRAM_SHADOW 0x06
+
+/* GL_ARB_draw_buffers option */
+.emtcode ARB_DRAW_BUFFERS 0x07
+
+/* GL_MESA_texture_array option */
+.emtcode MESA_TEXTURE_ARRAY 0x08
+
+/* GL_ARB_fragment_program instruction class */
+.emtcode OP_ALU_INST 0x00
+.emtcode OP_TEX_INST 0x01
+
+/* GL_ARB_vertex_program instruction class */
+/* OP_ALU_INST */
+
+/* GL_ARB_fragment_program instruction type */
+.emtcode OP_ALU_VECTOR 0x00
+.emtcode OP_ALU_SCALAR 0x01
+.emtcode OP_ALU_BINSC 0x02
+.emtcode OP_ALU_BIN 0x03
+.emtcode OP_ALU_TRI 0x04
+.emtcode OP_ALU_SWZ 0x05
+.emtcode OP_TEX_SAMPLE 0x06
+.emtcode OP_TEX_KIL 0x07
+
+/* GL_ARB_vertex_program instruction type */
+.emtcode OP_ALU_ARL 0x08
+/* OP_ALU_VECTOR */
+/* OP_ALU_SCALAR */
+/* OP_ALU_BINSC */
+/* OP_ALU_BIN */
+/* OP_ALU_TRI */
+/* OP_ALU_SWZ */
+
+/* GL_ARB_fragment_program instruction code */
+.emtcode OP_ABS 0x00
+.emtcode OP_ABS_SAT 0x1B
+.emtcode OP_FLR 0x09
+.emtcode OP_FLR_SAT 0x26
+.emtcode OP_FRC 0x0A
+.emtcode OP_FRC_SAT 0x27
+.emtcode OP_LIT 0x0C
+.emtcode OP_LIT_SAT 0x2A
+.emtcode OP_MOV 0x11
+.emtcode OP_MOV_SAT 0x30
+.emtcode OP_COS 0x1F
+.emtcode OP_COS_SAT 0x20
+.emtcode OP_EX2 0x07
+.emtcode OP_EX2_SAT 0x25
+.emtcode OP_LG2 0x0B
+.emtcode OP_LG2_SAT 0x29
+.emtcode OP_RCP 0x14
+.emtcode OP_RCP_SAT 0x33
+.emtcode OP_RSQ 0x15
+.emtcode OP_RSQ_SAT 0x34
+.emtcode OP_SIN 0x38
+.emtcode OP_SIN_SAT 0x39
+.emtcode OP_SCS 0x35
+.emtcode OP_SCS_SAT 0x36
+.emtcode OP_POW 0x13
+.emtcode OP_POW_SAT 0x32
+.emtcode OP_ADD 0x01
+.emtcode OP_ADD_SAT 0x1C
+.emtcode OP_DP3 0x03
+.emtcode OP_DP3_SAT 0x21
+.emtcode OP_DP4 0x04
+.emtcode OP_DP4_SAT 0x22
+.emtcode OP_DPH 0x05
+.emtcode OP_DPH_SAT 0x23
+.emtcode OP_DST 0x06
+.emtcode OP_DST_SAT 0x24
+.emtcode OP_MAX 0x0F
+.emtcode OP_MAX_SAT 0x2E
+.emtcode OP_MIN 0x10
+.emtcode OP_MIN_SAT 0x2F
+.emtcode OP_MUL 0x12
+.emtcode OP_MUL_SAT 0x31
+.emtcode OP_SGE 0x16
+.emtcode OP_SGE_SAT 0x37
+.emtcode OP_SLT 0x17
+.emtcode OP_SLT_SAT 0x3A
+.emtcode OP_SUB 0x18
+.emtcode OP_SUB_SAT 0x3B
+.emtcode OP_XPD 0x1A
+.emtcode OP_XPD_SAT 0x43
+.emtcode OP_CMP 0x1D
+.emtcode OP_CMP_SAT 0x1E
+.emtcode OP_LRP 0x2B
+.emtcode OP_LRP_SAT 0x2C
+.emtcode OP_MAD 0x0E
+.emtcode OP_MAD_SAT 0x2D
+.emtcode OP_SWZ 0x19
+.emtcode OP_SWZ_SAT 0x3C
+.emtcode OP_TEX 0x3D
+.emtcode OP_TEX_SAT 0x3E
+.emtcode OP_TXB 0x3F
+.emtcode OP_TXB_SAT 0x40
+.emtcode OP_TXP 0x41
+.emtcode OP_TXP_SAT 0x42
+.emtcode OP_KIL 0x28
+
+/* GL_ARB_vertex_program instruction code */
+.emtcode OP_ARL 0x02
+/* OP_ABS */
+/* OP_FLR */
+/* OP_FRC */
+/* OP_LIT */
+/* OP_MOV */
+/* OP_EX2 */
+.emtcode OP_EXP 0x08
+/* OP_LG2 */
+.emtcode OP_LOG 0x0D
+/* OP_RCP */
+/* OP_RSQ */
+/* OP_POW */
+/* OP_ADD */
+/* OP_DP3 */
+/* OP_DP4 */
+/* OP_DPH */
+/* OP_DST */
+/* OP_MAX */
+/* OP_MIN */
+/* OP_MUL */
+/* OP_SGE */
+/* OP_SLT */
+/* OP_SUB */
+/* OP_XPD */
+/* OP_MAD */
+/* OP_SWZ */
+
+/* fragment attribute binding */
+.emtcode FRAGMENT_ATTRIB_COLOR 0x01
+.emtcode FRAGMENT_ATTRIB_TEXCOORD 0x02
+.emtcode FRAGMENT_ATTRIB_FOGCOORD 0x03
+.emtcode FRAGMENT_ATTRIB_POSITION 0x04
+
+/* vertex attribute binding */
+.emtcode VERTEX_ATTRIB_POSITION 0x01
+.emtcode VERTEX_ATTRIB_WEIGHT 0x02
+.emtcode VERTEX_ATTRIB_NORMAL 0x03
+.emtcode VERTEX_ATTRIB_COLOR 0x04
+.emtcode VERTEX_ATTRIB_FOGCOORD 0x05
+.emtcode VERTEX_ATTRIB_TEXCOORD 0x06
+.emtcode VERTEX_ATTRIB_MATRIXINDEX 0x07
+.emtcode VERTEX_ATTRIB_GENERIC 0x08
+
+/* fragment result binding */
+.emtcode FRAGMENT_RESULT_COLOR 0x01
+.emtcode FRAGMENT_RESULT_DEPTH 0x02
+
+/* vertex result binding */
+.emtcode VERTEX_RESULT_POSITION 0x01
+.emtcode VERTEX_RESULT_COLOR 0x02
+.emtcode VERTEX_RESULT_FOGCOORD 0x03
+.emtcode VERTEX_RESULT_POINTSIZE 0x04
+.emtcode VERTEX_RESULT_TEXCOORD 0x05
+
+/* texture target */
+.emtcode TEXTARGET_1D 0x01
+.emtcode TEXTARGET_2D 0x02
+.emtcode TEXTARGET_3D 0x03
+.emtcode TEXTARGET_RECT 0x04
+.emtcode TEXTARGET_CUBE 0x05
+/* GL_ARB_fragment_program_shadow */
+.emtcode TEXTARGET_SHADOW1D 0x06
+.emtcode TEXTARGET_SHADOW2D 0x07
+.emtcode TEXTARGET_SHADOWRECT 0x08
+/* GL_MESA_texture_array */
+.emtcode TEXTARGET_1D_ARRAY 0x09
+.emtcode TEXTARGET_2D_ARRAY 0x0a
+.emtcode TEXTARGET_SHADOW1D_ARRAY 0x0b
+.emtcode TEXTARGET_SHADOW2D_ARRAY 0x0c
+
+/* face type */
+.emtcode FACE_FRONT 0x00
+.emtcode FACE_BACK 0x01
+
+/* color type */
+.emtcode COLOR_PRIMARY 0x00
+.emtcode COLOR_SECONDARY 0x01
+
+/* component */
+.emtcode COMPONENT_X 0x00
+.emtcode COMPONENT_Y 0x01
+.emtcode COMPONENT_Z 0x02
+.emtcode COMPONENT_W 0x03
+.emtcode COMPONENT_0 0x04
+.emtcode COMPONENT_1 0x05
+
+/* array index type */
+.emtcode ARRAY_INDEX_ABSOLUTE 0x00
+.emtcode ARRAY_INDEX_RELATIVE 0x01
+
+/* matrix name */
+.emtcode MATRIX_MODELVIEW 0x01
+.emtcode MATRIX_PROJECTION 0x02
+.emtcode MATRIX_MVP 0x03
+.emtcode MATRIX_TEXTURE 0x04
+.emtcode MATRIX_PALETTE 0x05
+.emtcode MATRIX_PROGRAM 0x06
+
+/* matrix modifier */
+.emtcode MATRIX_MODIFIER_IDENTITY 0x00
+.emtcode MATRIX_MODIFIER_INVERSE 0x01
+.emtcode MATRIX_MODIFIER_TRANSPOSE 0x02
+.emtcode MATRIX_MODIFIER_INVTRANS 0x03
+
+/* constant type */
+.emtcode CONSTANT_SCALAR 0x01
+.emtcode CONSTANT_VECTOR 0x02
+
+/* program param type */
+.emtcode PROGRAM_PARAM_ENV 0x01
+.emtcode PROGRAM_PARAM_LOCAL 0x02
+
+/* register type */
+.emtcode REGISTER_ATTRIB 0x01
+.emtcode REGISTER_PARAM 0x02
+.emtcode REGISTER_RESULT 0x03
+.emtcode REGISTER_ESTABLISHED_NAME 0x04
+
+/* param binding */
+.emtcode PARAM_NULL 0x00
+.emtcode PARAM_ARRAY_ELEMENT 0x01
+.emtcode PARAM_STATE_ELEMENT 0x02
+.emtcode PARAM_PROGRAM_ELEMENT 0x03
+.emtcode PARAM_PROGRAM_ELEMENTS 0x04
+.emtcode PARAM_CONSTANT 0x05
+
+/* param state property */
+.emtcode STATE_MATERIAL 0x01
+.emtcode STATE_LIGHT 0x02
+.emtcode STATE_LIGHT_MODEL 0x03
+.emtcode STATE_LIGHT_PROD 0x04
+.emtcode STATE_FOG 0x05
+.emtcode STATE_MATRIX_ROWS 0x06
+/* GL_ARB_fragment_program */
+.emtcode STATE_TEX_ENV 0x07
+.emtcode STATE_DEPTH 0x08
+/* GL_ARB_vertex_program */
+.emtcode STATE_TEX_GEN 0x09
+.emtcode STATE_CLIP_PLANE 0x0A
+.emtcode STATE_POINT 0x0B
+
+/* state material property */
+.emtcode MATERIAL_AMBIENT 0x01
+.emtcode MATERIAL_DIFFUSE 0x02
+.emtcode MATERIAL_SPECULAR 0x03
+.emtcode MATERIAL_EMISSION 0x04
+.emtcode MATERIAL_SHININESS 0x05
+
+/* state light property */
+.emtcode LIGHT_AMBIENT 0x01
+.emtcode LIGHT_DIFFUSE 0x02
+.emtcode LIGHT_SPECULAR 0x03
+.emtcode LIGHT_POSITION 0x04
+.emtcode LIGHT_ATTENUATION 0x05
+.emtcode LIGHT_HALF 0x06
+.emtcode LIGHT_SPOT_DIRECTION 0x07
+
+/* state light model property */
+.emtcode LIGHT_MODEL_AMBIENT 0x01
+.emtcode LIGHT_MODEL_SCENECOLOR 0x02
+
+/* state light product property */
+.emtcode LIGHT_PROD_AMBIENT 0x01
+.emtcode LIGHT_PROD_DIFFUSE 0x02
+.emtcode LIGHT_PROD_SPECULAR 0x03
+
+/* state texture environment property */
+.emtcode TEX_ENV_COLOR 0x01
+
+/* state texture generation coord property */
+.emtcode TEX_GEN_EYE 0x01
+.emtcode TEX_GEN_OBJECT 0x02
+
+/* state fog property */
+.emtcode FOG_COLOR 0x01
+.emtcode FOG_PARAMS 0x02
+
+/* state depth property */
+.emtcode DEPTH_RANGE 0x01
+
+/* state point parameters property */
+.emtcode POINT_SIZE 0x01
+.emtcode POINT_ATTENUATION 0x02
+
+/* declaration */
+.emtcode ATTRIB 0x01
+.emtcode PARAM 0x02
+.emtcode TEMP 0x03
+.emtcode OUTPUT 0x04
+.emtcode ALIAS 0x05
+/* GL_ARB_vertex_program */
+.emtcode ADDRESS 0x06
+
+/* error messages */
+.errtext UNKNOWN_PROGRAM_SIGNATURE "1001: '$e_signature$': unknown program signature"
+.errtext MISSING_END_OR_INVALID_STATEMENT "1002: '$e_statement$': invalid statement"
+.errtext CODE_AFTER_END "1003: '$e_statement$': code after 'END' keyword"
+.errtext INVALID_PROGRAM_OPTION "1004: '$e_identifier$': invalid program option"
+.errtext EXT_SWIZ_COMP_EXPECTED "1005: extended swizzle component expected but '$e_token$' found"
+.errtext TEX_TARGET_EXPECTED "1006: texture target expected but '$e_token$' found"
+.errtext TEXTURE_EXPECTED "1007: 'texture' expected but '$e_identifier$' found"
+.errtext SOURCE_REGISTER_EXPECTED "1008: source register expected but '$e_token$' found"
+.errtext DESTINATION_REGISTER_EXPECTED "1009: destination register expected but '$e_token$' found"
+.errtext INVALID_ADDRESS_COMPONENT "1010: '$e_identifier$': invalid address component"
+.errtext INVALID_ADDRESS_WRITEMASK "1011: '$e_identifier$': invalid address writemask"
+.errtext INVALID_COMPONENT "1012: '$e_charordigit$': invalid component"
+.errtext INVALID_SUFFIX "1013: '$e_identifier$': invalid suffix"
+.errtext INVALID_WRITEMASK "1014: '$e_identifier$': invalid writemask"
+.errtext FRAGMENT_EXPECTED "1015: 'fragment' expected but '$e_identifier$' found"
+.errtext VERTEX_EXPECTED "1016: 'vertex' expected but '$e_identifier$' found"
+.errtext INVALID_FRAGMENT_PROPERTY "1017: '$e_identifier$': invalid fragment property"
+.errtext INVALID_VERTEX_PROPERTY "1018: '$e_identifier$': invalid vertex property"
+.errtext INVALID_STATE_PROPERTY "1019: '$e_identifier$': invalid state property"
+.errtext INVALID_MATERIAL_PROPERTY "1020: '$e_identifier$': invalid material property"
+.errtext INVALID_LIGHT_PROPERTY "1021: '$e_identifier$': invalid light property"
+.errtext INVALID_SPOT_PROPERTY "1022: '$e_identifier$': invalid spot property"
+.errtext INVALID_LIGHTMODEL_PROPERTY "1023: '$e_identifier$': invalid light model property"
+.errtext INVALID_LIGHTPROD_PROPERTY "1024: '$e_identifier$': invalid light product property"
+.errtext INVALID_TEXENV_PROPERTY "1025: '$e_identifier$': invalid texture environment property"
+.errtext INVALID_TEXGEN_PROPERTY "1026: '$e_identifier$': invalid texture generating property"
+.errtext INVALID_TEXGEN_COORD "1027: '$e_identifier$': invalid texture generating coord"
+.errtext INVALID_FOG_PROPERTY "1028: '$e_identifier$': invalid fog property"
+.errtext INVALID_DEPTH_PROPERTY "1029: '$e_identifier$': invalid depth property"
+.errtext INVALID_CLIPPLANE_PROPERTY "1030: '$e_identifier$': invalid clip plane property"
+.errtext INVALID_POINT_PROPERTY "1031: '$e_identifier$': invalid point property"
+.errtext MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED "1032: matrix row selector or modifier expected but '$e_token$' found"
+.errtext INVALID_MATRIX_NAME "1033: '$e_identifier$': invalid matrix name"
+.errtext INVALID_PROGRAM_PROPERTY "1034: '$e_identifier$': invalid program property"
+.errtext RESULT_EXPECTED "1035: 'result' expected but '$e_token$' found"
+.errtext INVALID_RESULT_PROPERTY "1036: '$e_identifier$': invalid result property"
+.errtext INVALID_FACE_PROPERTY "1037: '$e_identifier$': invalid face property"
+.errtext INVALID_COLOR_PROPERTY "1038: '$e_identifier$': invalid color property"
+.errtext IDENTIFIER_EXPECTED "1039: identifier expected but '$e_token$' found"
+.errtext RESERVED_KEYWORD "1040: use of reserved keyword as an identifier"
+.errtext INTEGER_EXPECTED "1041: integer value expected but '$e_token$' found"
+.errtext MISSING_SEMICOLON "1042: ';' expected but '$e_token$' found"
+.errtext MISSING_COMMA "1043: ',' expected but '$e_token$' found"
+.errtext MISSING_LBRACKET "1044: '[' expected but '$e_token$' found"
+.errtext MISSING_RBRACKET "1045: ']' expected but '$e_token$' found"
+.errtext MISSING_DOT "1046: '.' expected but '$e_token$' found"
+.errtext MISSING_EQUAL "1047: '=' expected but '$e_token$' found"
+.errtext MISSING_LBRACE "1048: '{' expected but '$e_token$' found"
+.errtext MISSING_RBRACE "1049: '}' expected but '$e_token$' found"
+.errtext MISSING_DOTDOT "1050: '..' expected but '$e_token$' found"
+.errtext MISSING_FRACTION_OR_EXPONENT "1051: missing fraction part or exponent"
+.errtext MISSING_DOT_OR_EXPONENT "1052: missing '.' or exponent"
+.errtext EXPONENT_VALUE_EXPECTED "1053: exponent value expected"
+.errtext INTEGER_OUT_OF_RANGE "1054: integer value out of range"
+.errtext OPERATION_NEEDS_DESTINATION_VARIABLE "1055: operation needs destination variable"
+.errtext OPERATION_NEEDS_SOURCE_VARIABLE "1056: operation needs source variable"
+.errtext ADDRESS_REGISTER_EXPECTED "1057: address register expected but '$e_token$' found"
+.errtext ADDRESS_REGISTER_OR_INTEGER_EXPECTED "1058: address register or integer literal expected but '$e_token$' found"
+
+/* extension presence condition registers */
+
+/* GL_ARB_vertex_blend */
+/* GL_EXT_vertex_weighting */
+.regbyte vertex_blend 0x00
+
+/* GL_ARB_matrix_palette */
+.regbyte matrix_palette 0x00
+
+/* GL_ARB_point_parameters */
+/* GL_EXT_point_parameters */
+.regbyte point_parameters 0x00
+
+/* GL_EXT_secondary_color */
+.regbyte secondary_color 0x00
+
+/* GL_EXT_fog_coord */
+.regbyte fog_coord 0x00
+
+/* GL_EXT_texture_rectangle */
+/* GL_NV_texture_rectangle */
+.regbyte texture_rectangle 0x00
+
+/* GL_ARB_fragment_program_shadow */
+.regbyte fragment_program_shadow 0x00
+
+/* GL_ARB_draw_buffers */
+.regbyte draw_buffers 0x00
+
+/* GL_MESA_texture_array */
+.regbyte texture_array 0x00
+
+/* option presence condition registers */
+/* they are all initially set to zero - when a particular OPTION is encountered, the appropriate */
+/* register is set to 1 to indicate that the OPTION was specified. */
+
+/* GL_ARB_fragment_program */
+.regbyte ARB_precision_hint_fastest 0x00
+.regbyte ARB_precision_hint_nicest 0x00
+.regbyte ARB_fog_exp 0x00
+.regbyte ARB_fog_exp2 0x00
+.regbyte ARB_fog_linear 0x00
+
+/* GL_ARB_vertex_program */
+.regbyte ARB_position_invariant 0x00
+
+/* GL_ARB_fragment_program_shadow */
+.regbyte ARB_fragment_program_shadow 0x00
+
+/* GL_ARB_draw_buffers */
+.regbyte ARB_draw_buffers 0x00
+
+/* GL_MESA_texture_array */
+.regbyte MESA_texture_array 0x00
+
+/* program target condition register */
+/* this syntax script deals with two program targets - VERTEX_PROGRAM and FRAGMENT_PROGRAM. */
+/* to distinguish between them we need a register that will store for us the current target. */
+/* the client will typically set the register to apropriate value before parsing a particular */
+/* program. the mapping between program targets and their values is listed below. */
+/* */
+/* program target register value */
+/* ---------------------------------------------- */
+/* FRAGMENT_PROGRAM 0x10 */
+/* VERTEX_PROGRAM 0x20 */
+/* */
+/* the initial value of the register is 0 to catch potential errors with not setting the register */
+/* with the proper value. */
+.regbyte program_target 0x00
+
+/*
+ <program> ::= <optionSequence> <statementSequence> "END"
+*/
+program
+ programs .error UNKNOWN_PROGRAM_SIGNATURE .emit REVISION;
+programs
+ .if (program_target == 0x10) frag_program_1_0 .emit FRAGMENT_PROGRAM .emit 0x01 .emit 0x00 .or
+ .if (program_target == 0x20) vert_program_1_0 .emit VERTEX_PROGRAM .emit 0x01 .emit 0x00;
+frag_program_1_0
+ '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'f' .and 'p' .and '1' .and '.' .and '0' .and
+ optional_space .and fp_optionSequence .and fp_statementSequence .and
+ "END" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and
+ '\0' .error CODE_AFTER_END;
+vert_program_1_0
+ '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'v' .and 'p' .and '1' .and '.' .and '0' .and
+ optional_space .and vp_optionSequence .and vp_statementSequence .and
+ "END" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and
+ '\0' .error CODE_AFTER_END;
+
+/*
+ <optionSequence> ::= <optionSequence> <option>
+ | ""
+*/
+fp_optionSequence
+ .loop fp_option;
+vp_optionSequence
+ .loop vp_option;
+
+/*
+ <option> ::= "OPTION" <identifier> ";"
+
+NOTE: options ARB_precision_hint_nicest and ARB_precision_hint_fastest are exclusive. When one of
+ these options is encountered, the other one is automatically disabled.
+ the same applies to options ARB_fog_exp, ARB_fog_exp2 and ARB_fog_linear.
+*/
+fp_option
+ "OPTION" .emit OPTION .and space .error IDENTIFIER_EXPECTED .and
+ fp_optionString .error INVALID_PROGRAM_OPTION .and semicolon;
+vp_option
+ "OPTION" .emit OPTION .and space .error IDENTIFIER_EXPECTED .and
+ vp_optionString .error INVALID_PROGRAM_OPTION .and semicolon;
+fp_optionString
+ .if (ARB_precision_hint_nicest == 0x00) "ARB_precision_hint_fastest"
+ .emit ARB_PRECISION_HINT_FASTEST .load ARB_precision_hint_fastest 0x01 .or
+ .if (ARB_precision_hint_fastest == 0x00) "ARB_precision_hint_nicest"
+ .emit ARB_PRECISION_HINT_NICEST .load ARB_precision_hint_nicest 0x01 .or
+ fp_ARB_fog_exp .emit ARB_FOG_EXP .load ARB_fog_exp 0x01 .or
+ fp_ARB_fog_exp2 .emit ARB_FOG_EXP2 .load ARB_fog_exp2 0x01 .or
+ fp_ARB_fog_linear .emit ARB_FOG_LINEAR .load ARB_fog_linear 0x01 .or
+ .if (fragment_program_shadow != 0x00) "ARB_fragment_program_shadow"
+ .emit ARB_FRAGMENT_PROGRAM_SHADOW .load ARB_fragment_program_shadow 0x01 .or
+ .if (draw_buffers != 0x00) "ARB_draw_buffers" .emit ARB_DRAW_BUFFERS
+ .load ARB_draw_buffers 0x01 .or
+ .if (texture_array != 0x00) "MESA_texture_array" .emit MESA_TEXTURE_ARRAY
+ .load MESA_texture_array 0x01;
+vp_optionString
+ "ARB_position_invariant" .emit ARB_POSITION_INVARIANT .load ARB_position_invariant 0x01;
+fp_ARB_fog_exp
+ .if (ARB_fog_exp2 == 0x00) .true .and .if (ARB_fog_linear == 0x00) "ARB_fog_exp";
+fp_ARB_fog_exp2
+ .if (ARB_fog_exp == 0x00) .true .and .if (ARB_fog_linear == 0x00) "ARB_fog_exp2";
+fp_ARB_fog_linear
+ .if (ARB_fog_exp == 0x00) .true .and .if (ARB_fog_exp2 == 0x00) "ARB_fog_linear";
+
+/*
+ <statementSequence> ::= <statementSequence> <statement>
+ | ""
+*/
+fp_statementSequence
+ .loop fp_statement;
+vp_statementSequence
+ .loop vp_statement;
+
+/*
+ <statement> ::= <instruction> ";"
+ | <namingStatement> ";"
+
+NOTE: ".emit $" in the definitions below means that we output instruction position (offset of
+ the first character of instruction) for program debugging purposes.
+*/
+fp_statement
+ fp_statement_1 .or fp_statement_2;
+vp_statement
+ vp_statement_1 .or vp_statement_2;
+fp_statement_1
+ fp_instruction .emit INSTRUCTION .emit $ .and semicolon;
+fp_statement_2
+ fp_namingStatement .emit DECLARATION .and semicolon;
+vp_statement_1
+ vp_instruction .emit INSTRUCTION .emit $ .and semicolon;
+vp_statement_2
+ vp_namingStatement .emit DECLARATION .and semicolon;
+
+/*
+fragment program
+ <instruction> ::= <ALUInstruction>
+ | <TexInstruction>
+
+vertex program
+ <instruction> ::= <ARL_instruction>
+ | <VECTORop_instruction>
+ | <SCALARop_instruction>
+ | <BINSCop_instruction>
+ | <BINop_instruction>
+ | <TRIop_instruction>
+ | <SWZ_instruction>
+*/
+fp_instruction
+ ALUInstruction .emit OP_ALU_INST .or
+ TexInstruction .emit OP_TEX_INST;
+vp_instruction
+ ARL_instruction .emit OP_ALU_ARL .or
+ vp_VECTORop_instruction .emit OP_ALU_VECTOR .or
+ vp_SCALARop_instruction .emit OP_ALU_SCALAR .or
+ vp_BINSCop_instruction .emit OP_ALU_BINSC .or
+ vp_BINop_instruction .emit OP_ALU_BIN .or
+ vp_TRIop_instruction .emit OP_ALU_TRI .or
+ vp_SWZ_instruction .emit OP_ALU_SWZ;
+
+/*
+fragment program
+ <ALUInstruction> ::= <VECTORop_instruction>
+ | <SCALARop_instruction>
+ | <BINSCop_instruction>
+ | <BINop_instruction>
+ | <TRIop_instruction>
+ | <SWZ_instruction>
+*/
+ALUInstruction
+ fp_VECTORop_instruction .emit OP_ALU_VECTOR .or
+ fp_SCALARop_instruction .emit OP_ALU_SCALAR .or
+ fp_BINSCop_instruction .emit OP_ALU_BINSC .or
+ fp_BINop_instruction .emit OP_ALU_BIN .or
+ fp_TRIop_instruction .emit OP_ALU_TRI .or
+ fp_SWZ_instruction .emit OP_ALU_SWZ;
+
+/*
+fragment program
+ <TexInstruction> ::= <SAMPLE_instruction>
+ | <KIL_instruction>
+*/
+TexInstruction
+ SAMPLE_instruction .emit OP_TEX_SAMPLE .or
+ KIL_instruction .emit OP_TEX_KIL;
+
+/*
+vertex program
+ <ARL_instruction> ::= "ARL" <maskedAddrReg> "," <scalarSrcReg>
+*/
+ARL_instruction
+ "ARL" .emit OP_ARL .and space_dst .and maskedAddrReg .and comma .and vp_scalarSrcReg;
+
+/*
+fragment program
+ <VECTORop_instruction> ::= <VECTORop> <maskedDstReg> ","
+ <vectorSrcReg>
+
+vertex program
+ <VECTORop_instruction> ::= <VECTORop> <maskedDstReg> "," <swizzleSrcReg>
+*/
+fp_VECTORop_instruction
+ fp_VECTORop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg;
+vp_VECTORop_instruction
+ vp_VECTORop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg;
+
+/*
+fragment program
+ <VECTORop> ::= "ABS" | "ABS_SAT"
+ | "FLR" | "FLR_SAT"
+ | "FRC" | "FRC_SAT"
+ | "LIT" | "LIT_SAT"
+ | "MOV" | "MOV_SAT"
+
+vertex program
+ <VECTORop> ::= "ABS"
+ | "FLR"
+ | "FRC"
+ | "LIT"
+ | "MOV"
+*/
+fp_VECTORop
+ "ABS" .emit OP_ABS .or "ABS_SAT" .emit OP_ABS_SAT .or
+ "FLR" .emit OP_FLR .or "FLR_SAT" .emit OP_FLR_SAT .or
+ "FRC" .emit OP_FRC .or "FRC_SAT" .emit OP_FRC_SAT .or
+ "LIT" .emit OP_LIT .or "LIT_SAT" .emit OP_LIT_SAT .or
+ "MOV" .emit OP_MOV .or "MOV_SAT" .emit OP_MOV_SAT;
+vp_VECTORop
+ "ABS" .emit OP_ABS .or
+ "FLR" .emit OP_FLR .or
+ "FRC" .emit OP_FRC .or
+ "LIT" .emit OP_LIT .or
+ "MOV" .emit OP_MOV;
+
+/*
+ <SCALARop_instruction> ::= <SCALARop> <maskedDstReg> "," <scalarSrcReg>
+*/
+fp_SCALARop_instruction
+ fp_SCALARop .and space_dst .and fp_maskedDstReg .and comma .and fp_scalarSrcReg;
+vp_SCALARop_instruction
+ vp_SCALARop .and space_dst .and vp_maskedDstReg .and comma .and vp_scalarSrcReg;
+
+/*
+fragment program
+ <SCALARop> ::= "COS" | "COS_SAT"
+ | "EX2" | "EX2_SAT"
+ | "LG2" | "LG2_SAT"
+ | "RCP" | "RCP_SAT"
+ | "RSQ" | "RSQ_SAT"
+ | "SIN" | "SIN_SAT"
+ | "SCS" | "SCS_SAT"
+
+vertex program
+ <SCALARop> ::= "EX2"
+ | "EXP"
+ | "LG2"
+ | "LOG"
+ | "RCP"
+ | "RSQ"
+*/
+fp_SCALARop
+ "COS" .emit OP_COS .or "COS_SAT" .emit OP_COS_SAT .or
+ "EX2" .emit OP_EX2 .or "EX2_SAT" .emit OP_EX2_SAT .or
+ "LG2" .emit OP_LG2 .or "LG2_SAT" .emit OP_LG2_SAT .or
+ "RCP" .emit OP_RCP .or "RCP_SAT" .emit OP_RCP_SAT .or
+ "RSQ" .emit OP_RSQ .or "RSQ_SAT" .emit OP_RSQ_SAT .or
+ "SIN" .emit OP_SIN .or "SIN_SAT" .emit OP_SIN_SAT .or
+ "SCS" .emit OP_SCS .or "SCS_SAT" .emit OP_SCS_SAT;
+vp_SCALARop
+ "EX2" .emit OP_EX2 .or
+ "EXP" .emit OP_EXP .or
+ "LG2" .emit OP_LG2 .or
+ "LOG" .emit OP_LOG .or
+ "RCP" .emit OP_RCP .or
+ "RSQ" .emit OP_RSQ;
+
+/*
+ <BINSCop_instruction> ::= <BINSCop> <maskedDstReg> "," <scalarSrcReg> ","
+ <scalarSrcReg>
+*/
+fp_BINSCop_instruction
+ fp_BINSCop .and space_dst .and fp_maskedDstReg .and comma .and fp_scalarSrcReg .and comma .and
+ fp_scalarSrcReg;
+vp_BINSCop_instruction
+ vp_BINSCop .and space_dst .and vp_maskedDstReg .and comma .and vp_scalarSrcReg .and comma .and
+ vp_scalarSrcReg;
+
+/*
+fragment program
+ <BINSCop> ::= "POW" | "POW_SAT"
+
+vertex program
+ <BINSCop> ::= "POW"
+*/
+fp_BINSCop
+ "POW" .emit OP_POW .or "POW_SAT" .emit OP_POW_SAT;
+vp_BINSCop
+ "POW" .emit OP_POW;
+
+/*
+fragment program
+ <BINop_instruction> ::= <BINop> <maskedDstReg> ","
+ <vectorSrcReg> "," <vectorSrcReg>
+
+vertex program
+ <BINop_instruction> ::= <BINop> <maskedDstReg> ","
+ <swizzleSrcReg> "," <swizzleSrcReg>
+*/
+fp_BINop_instruction
+ fp_BINop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and
+ vectorSrcReg;
+vp_BINop_instruction
+ vp_BINop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and
+ swizzleSrcReg;
+
+/*
+fragment program
+ <BINop> ::= "ADD" | "ADD_SAT"
+ | "DP3" | "DP3_SAT"
+ | "DP4" | "DP4_SAT"
+ | "DPH" | "DPH_SAT"
+ | "DST" | "DST_SAT"
+ | "MAX" | "MAX_SAT"
+ | "MIN" | "MIN_SAT"
+ | "MUL" | "MUL_SAT"
+ | "SGE" | "SGE_SAT"
+ | "SLT" | "SLT_SAT"
+ | "SUB" | "SUB_SAT"
+ | "XPD" | "XPD_SAT"
+
+vertex program
+ <BINop> ::= "ADD"
+ | "DP3"
+ | "DP4"
+ | "DPH"
+ | "DST"
+ | "MAX"
+ | "MIN"
+ | "MUL"
+ | "SGE"
+ | "SLT"
+ | "SUB"
+ | "XPD"
+*/
+fp_BINop
+ "ADD" .emit OP_ADD .or "ADD_SAT" .emit OP_ADD_SAT .or
+ "DP3" .emit OP_DP3 .or "DP3_SAT" .emit OP_DP3_SAT .or
+ "DP4" .emit OP_DP4 .or "DP4_SAT" .emit OP_DP4_SAT .or
+ "DPH" .emit OP_DPH .or "DPH_SAT" .emit OP_DPH_SAT .or
+ "DST" .emit OP_DST .or "DST_SAT" .emit OP_DST_SAT .or
+ "MAX" .emit OP_MAX .or "MAX_SAT" .emit OP_MAX_SAT .or
+ "MIN" .emit OP_MIN .or "MIN_SAT" .emit OP_MIN_SAT .or
+ "MUL" .emit OP_MUL .or "MUL_SAT" .emit OP_MUL_SAT .or
+ "SGE" .emit OP_SGE .or "SGE_SAT" .emit OP_SGE_SAT .or
+ "SLT" .emit OP_SLT .or "SLT_SAT" .emit OP_SLT_SAT .or
+ "SUB" .emit OP_SUB .or "SUB_SAT" .emit OP_SUB_SAT .or
+ "XPD" .emit OP_XPD .or "XPD_SAT" .emit OP_XPD_SAT;
+vp_BINop
+ "ADD" .emit OP_ADD .or
+ "DP3" .emit OP_DP3 .or
+ "DP4" .emit OP_DP4 .or
+ "DPH" .emit OP_DPH .or
+ "DST" .emit OP_DST .or
+ "MAX" .emit OP_MAX .or
+ "MIN" .emit OP_MIN .or
+ "MUL" .emit OP_MUL .or
+ "SGE" .emit OP_SGE .or
+ "SLT" .emit OP_SLT .or
+ "SUB" .emit OP_SUB .or
+ "XPD" .emit OP_XPD;
+
+/*
+fragment program
+ <TRIop_instruction> ::= <TRIop> <maskedDstReg> ","
+ <vectorSrcReg> "," <vectorSrcReg> ","
+ <vectorSrcReg>
+
+vertex program
+ <TRIop_instruction> ::= <TRIop> <maskedDstReg> ","
+ <swizzleSrcReg> "," <swizzleSrcReg> ","
+ <swizzleSrcReg>
+*/
+fp_TRIop_instruction
+ fp_TRIop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and
+ vectorSrcReg .and comma .and vectorSrcReg;
+vp_TRIop_instruction
+ vp_TRIop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and
+ swizzleSrcReg .and comma .and swizzleSrcReg;
+
+/*
+fragment program
+ <TRIop> ::= "CMP" | "CMP_SAT"
+ | "LRP" | "LRP_SAT"
+ | "MAD" | "MAD_SAT"
+
+vertex program
+ <TRIop> ::= "MAD"
+*/
+fp_TRIop
+ "CMP" .emit OP_CMP .or "CMP_SAT" .emit OP_CMP_SAT .or
+ "LRP" .emit OP_LRP .or "LRP_SAT" .emit OP_LRP_SAT .or
+ "MAD" .emit OP_MAD .or "MAD_SAT" .emit OP_MAD_SAT;
+vp_TRIop
+ "MAD" .emit OP_MAD;
+
+/*
+fragment program
+ <SWZ_instruction> ::= <SWZop> <maskedDstReg> ","
+ <srcReg> "," <extendedSwizzle>
+
+vertex program
+ <SWZ_instruction> ::= "SWZ" <maskedDstReg> "," <srcReg> ","
+ <extendedSwizzle>
+*/
+fp_SWZ_instruction
+ SWZop .and space_dst .and fp_maskedDstReg .and comma .and fp_srcReg .and comma .and
+ fp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;
+vp_SWZ_instruction
+ "SWZ" .emit OP_SWZ .and space_dst .and vp_maskedDstReg .and comma .and vp_srcReg .and comma .and
+ vp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;
+
+/*
+fragment program
+ <SWZop> ::= "SWZ" | "SWZ_SAT"
+*/
+SWZop
+ "SWZ" .emit OP_SWZ .or "SWZ_SAT" .emit OP_SWZ_SAT;
+
+/*
+fragment program
+ <SAMPLE_instruction> ::= <SAMPLEop> <maskedDstReg> ","
+ <vectorSrcReg> "," <texImageUnit> ","
+ <texTarget>
+*/
+SAMPLE_instruction
+ SAMPLEop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and
+ texImageUnit .and comma .and texTarget .error TEX_TARGET_EXPECTED;
+
+/*
+fragment program
+ <SAMPLEop> ::= "TEX" | "TEX_SAT"
+ | "TXP" | "TXP_SAT"
+ | "TXB" | "TXB_SAT"
+*/
+SAMPLEop
+ "TEX" .emit OP_TEX .or "TEX_SAT" .emit OP_TEX_SAT .or
+ "TXB" .emit OP_TXB .or "TXB_SAT" .emit OP_TXB_SAT .or
+ "TXP" .emit OP_TXP .or "TXP_SAT" .emit OP_TXP_SAT;
+
+/*
+fragment program
+ <KIL_instruction> ::= "KIL" <vectorSrcReg>
+*/
+KIL_instruction
+ "KIL" .emit OP_KIL .and space_src .and vectorSrcReg;
+
+/*
+fragment program
+ <texImageUnit> ::= "texture" <optTexImageUnitNum>
+*/
+texImageUnit
+ "texture" .error TEXTURE_EXPECTED .and optTexImageUnitNum;
+
+/*
+fragment program
+ <texTarget> ::= "1D"
+ | "2D"
+ | "3D"
+ | "CUBE"
+ | "RECT"
+ | <shadowTarget> (if option ARB_fragment_program_shadow present)
+ | <arrayTarget> (if option MESA_texture_array present)
+*/
+texTarget
+ "1D" .emit TEXTARGET_1D .or
+ "2D" .emit TEXTARGET_2D .or
+ "3D" .emit TEXTARGET_3D .or
+ .if (texture_rectangle != 0x00) "RECT" .emit TEXTARGET_RECT .or
+ "CUBE" .emit TEXTARGET_CUBE .or
+ .if (ARB_fragment_program_shadow != 0x00) shadowTarget .or
+ .if (MESA_texture_array != 0x00) arrayTarget;
+
+/*
+GL_ARB_fragment_program_shadow
+ <shadowTarget> ::= "SHADOW1D"
+ | "SHADOW2D"
+ | "SHADOWRECT"
+ | <shadowArrayTarget> (if option MESA_texture_array present)
+*/
+shadowTarget
+ "SHADOW1D" .emit TEXTARGET_SHADOW1D .or
+ "SHADOW2D" .emit TEXTARGET_SHADOW2D .or
+ .if (texture_rectangle != 0x00) "SHADOWRECT" .emit TEXTARGET_SHADOWRECT .or
+ .if (MESA_texture_array != 0x00) shadowArrayTarget;
+
+/*
+GL_MESA_texture_array
+
+ <arrayTarget> ::= "ARRAY1D"
+ | "ARRAY2D"
+
+ <shadowArrayTarget> ::= "SHADOWARRAY1D"
+ | "SHADOWARRAY2D"
+*/
+
+arrayTarget
+ "ARRAY1D" .emit TEXTARGET_1D_ARRAY .or
+ "ARRAY2D" .emit TEXTARGET_2D_ARRAY;
+
+shadowArrayTarget
+ "SHADOWARRAY1D" .emit TEXTARGET_SHADOW1D_ARRAY .or
+ "SHADOWARRAY2D" .emit TEXTARGET_SHADOW2D_ARRAY;
+
+/*
+fragment program
+ <optTexImageUnitNum> ::= ""
+ | "[" <texImageUnitNum> "]"
+*/
+optTexImageUnitNum
+ optTexImageUnitNum_1 .or .true .emit 0x00;
+optTexImageUnitNum_1
+ lbracket_ne .and texImageUnitNum .and rbracket;
+
+/*
+fragment program
+ <texImageUnitNum> ::= <integer> from 0 to
+ MAX_TEXTURE_IMAGE_UNITS_ARB-1
+*/
+texImageUnitNum
+ integer;
+
+/*
+ <scalarSrcReg> ::= <optionalSign> <srcReg> <scalarSuffix>
+*/
+fp_scalarSrcReg
+ optionalSign .and fp_srcReg .and fp_scalarSuffix;
+vp_scalarSrcReg
+ optionalSign .and vp_srcReg .and vp_scalarSuffix;
+
+/*
+vertex program
+ <swizzleSrcReg> ::= <optionalSign> <srcReg> <swizzleSuffix>
+*/
+swizzleSrcReg
+ optionalSign .and vp_srcReg .and swizzleSuffix;
+
+/*
+fragment program
+ <vectorSrcReg> ::= <optionalSign> <srcReg> <optionalSuffix>
+*/
+vectorSrcReg
+ optionalSign .and fp_srcReg .and optionalSuffix;
+
+/*
+ <maskedDstReg> ::= <dstReg> <optionalMask>
+*/
+fp_maskedDstReg
+ fp_dstReg .and fp_optionalMask;
+vp_maskedDstReg
+ vp_dstReg .and vp_optionalMask;
+
+/*
+vertex program
+ <maskedAddrReg> ::= <addrReg> <addrWriteMask>
+*/
+maskedAddrReg
+ addrReg .error ADDRESS_REGISTER_EXPECTED .and addrWriteMask;
+
+/*
+fragment program
+ <extendedSwizzle> ::= <xyzwExtendedSwizzle>
+ | <rgbaExtendedSwizzle>
+
+vertex program
+ <extendedSwizzle> ::= <extSwizComp> "," <extSwizComp> ","
+ <extSwizComp> "," <extSwizComp>
+
+NOTE: do NOT change the order of <rgbaExtendedSwizzle> and <xyzwExtendedSwizzle> rulez
+*/
+fp_extendedSwizzle
+ rgbaExtendedSwizzle .or xyzwExtendedSwizzle;
+vp_extendedSwizzle
+ extSwizComp .and comma .and
+ extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and
+ extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and
+ extSwizComp .error EXT_SWIZ_COMP_EXPECTED;
+
+/*
+fragment program
+ <xyzwExtendedSwizzle> ::= <xyzwExtSwizComp> "," <xyzwExtSwizComp> ","
+ <xyzwExtSwizComp> "," <xyzwExtSwizComp>
+*/
+xyzwExtendedSwizzle
+ xyzwExtSwizComp .and comma .and
+ xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and
+ xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and
+ xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;
+
+/*
+fragment program
+ <rgbaExtendedSwizzle> ::= <rgbaExtSwizComp> "," <rgbaExtSwizComp> ","
+ <rgbaExtSwizComp> "," <rgbaExtSwizComp>
+*/
+rgbaExtendedSwizzle
+ rgbaExtendedSwizzle_1 .or rgbaExtendedSwizzle_2 .or rgbaExtendedSwizzle_3 .or
+ rgbaExtendedSwizzle_4;
+rgbaExtendedSwizzle_1
+ rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_digit .and comma .and
+ rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp;
+rgbaExtendedSwizzle_2
+ rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_digit .and comma .and
+ rgbaExtSwizComp_alpha .and comma .and rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;
+rgbaExtendedSwizzle_3
+ rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_alpha .and comma .and
+ rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and
+ rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;
+rgbaExtendedSwizzle_4
+ rgbaExtSwizComp_alpha .and comma .and
+ rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and
+ rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and
+ rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;
+
+/*
+fragment program
+ <xyzwExtSwizComp> ::= <optionalSign> <xyzwExtSwizSel>
+*/
+xyzwExtSwizComp
+ optionalSign .and xyzwExtSwizSel;
+
+/*
+fragment program
+ <rgbaExtSwizComp> ::= <optionalSign> <rgbaExtSwizSel>
+*/
+rgbaExtSwizComp
+ optionalSign .and rgbaExtSwizSel;
+rgbaExtSwizComp_digit
+ optionalSign .and rgbaExtSwizSel_digit;
+rgbaExtSwizComp_alpha
+ optionalSign .and rgbaExtSwizSel_alpha;
+
+/*
+vertex program
+ <extSwizComp> ::= <optionalSign> <extSwizSel>
+*/
+extSwizComp
+ optionalSign .and extSwizSel;
+
+/*
+fragment program
+ <xyzwExtSwizSel> ::= "0"
+ | "1"
+ | <xyzwComponent>
+*/
+xyzwExtSwizSel
+ "0" .emit COMPONENT_0 .or "1" .emit COMPONENT_1 .or xyzwComponent_single;
+
+/*
+fragment program
+ <rgbaExtSwizSel> ::= "0"
+ | "1"
+ | <rgbaComponent>
+*/
+rgbaExtSwizSel
+ rgbaExtSwizSel_digit .or rgbaExtSwizSel_alpha;
+rgbaExtSwizSel_digit
+ "0" .emit COMPONENT_0 .or "1" .emit COMPONENT_1;
+rgbaExtSwizSel_alpha
+ rgbaComponent_single;
+
+/*
+vertex program
+ <extSwizSel> ::= "0"
+ | "1"
+ | <component>
+*/
+extSwizSel
+ "0" .emit COMPONENT_0 .or "1" .emit COMPONENT_1 .or vp_component_single;
+
+/*
+fragment program
+ <srcReg> ::= <fragmentAttribReg>
+ | <temporaryReg>
+ | <progParamReg>
+
+vertex program
+ <srcReg> ::= <vertexAttribReg>
+ | <temporaryReg>
+ | <progParamReg>
+*/
+fp_srcReg
+ fp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;
+vp_srcReg
+ vp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;
+fp_srcReg_1
+ fragmentAttribReg .emit REGISTER_ATTRIB .or
+ fp_progParamReg .emit REGISTER_PARAM .or
+ fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;
+vp_srcReg_1
+ vertexAttribReg .emit REGISTER_ATTRIB .or
+ vp_progParamReg .emit REGISTER_PARAM .or
+ vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;
+
+/*
+fragment program
+ <dstReg> ::= <temporaryReg>
+ | <fragmentResultReg>
+
+vertex program
+ <dstReg> ::= <temporaryReg>
+ | <vertexResultReg>
+*/
+fp_dstReg
+ fp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;
+vp_dstReg
+ vp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;
+fp_dstReg_1
+ fragmentResultReg .emit REGISTER_RESULT .or
+ fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;
+vp_dstReg_1
+ vertexResultReg .emit REGISTER_RESULT .or
+ vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;
+
+/*
+fragment program
+ <fragmentAttribReg> ::= <establishedName>
+ | <fragAttribBinding>
+
+NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <srcReg>
+*/
+fragmentAttribReg
+ /*fp_establishedName .or */fragAttribBinding;
+
+/*
+vertex program
+ <vertexAttribReg> ::= <establishedName>
+ | <vtxAttribBinding>
+
+NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <srcReg>
+*/
+vertexAttribReg
+ vtxAttribBinding;
+
+/*
+ <temporaryReg> ::= <establishedName>
+*/
+fp_temporaryReg
+ fp_establishedName_no_error_on_identifier;
+vp_temporaryReg
+ vp_establishedName_no_error_on_identifier;
+
+/*
+fragment program
+ <progParamReg> ::= <progParamSingle>
+ | <progParamArray> "[" <progParamArrayAbs> "]"
+ | <paramSingleItemUse>
+
+vertex program
+ <progParamReg> ::= <progParamSingle>
+ | <progParamArray> "[" <progParamArrayMem> "]"
+ | <paramSingleItemUse>
+*/
+fp_progParamReg
+ fp_paramSingleItemUse .or fp_progParamReg_1 .or fp_progParamSingle;
+vp_progParamReg
+ vp_paramSingleItemUse .or vp_progParamReg_1 .or vp_progParamSingle;
+fp_progParamReg_1
+ fp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayAbs .and
+ rbracket;
+vp_progParamReg_1
+ vp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayMem .and
+ rbracket;
+
+/*
+ <progParamSingle> ::= <establishedName>
+
+NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <srcReg>
+*/
+fp_progParamSingle
+ .false;
+vp_progParamSingle
+ .false;
+
+/*
+ <progParamArray> ::= <establishedName>
+*/
+fp_progParamArray
+ fp_establishedName_no_error_on_identifier;
+vp_progParamArray
+ vp_establishedName_no_error_on_identifier;
+
+/*
+vertex program
+ <progParamArrayMem> ::= <progParamArrayAbs>
+ | <progParamArrayRel>
+*/
+progParamArrayMem
+ progParamArrayAbs .or progParamArrayRel;
+
+/*
+ <progParamArrayAbs> ::= <integer>
+*/
+progParamArrayAbs
+ integer_ne .emit ARRAY_INDEX_ABSOLUTE;
+
+/*
+vertex program
+ <progParamArrayRel> ::= <addrReg> <addrComponent> <addrRegRelOffset>
+*/
+progParamArrayRel
+ addrReg .error ADDRESS_REGISTER_OR_INTEGER_EXPECTED .emit ARRAY_INDEX_RELATIVE .and
+ addrComponent .and addrRegRelOffset;
+
+/*
+vertex program
+ <addrRegRelOffset> ::= ""
+ | "+" <addrRegPosOffset>
+ | "-" <addrRegNegOffset>
+*/
+addrRegRelOffset
+ addrRegRelOffset_1 .or addrRegRelOffset_2 .or .true .emit 0x00;
+addrRegRelOffset_1
+ plus_ne .and addrRegPosOffset;
+addrRegRelOffset_2
+ minus_ne .and addrRegNegOffset;
+
+/*
+vertex program
+ <addrRegPosOffset> ::= <integer> from 0 to 63
+*/
+addrRegPosOffset
+ integer_0_63;
+
+/*
+vertex program
+ <addrRegNegOffset> ::= <integer> from 0 to 64
+*/
+addrRegNegOffset
+ integer_0_64;
+
+/*
+fragment program
+ <fragmentResultReg> ::= <establishedName>
+ | <resultBinding>
+
+NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <dstReg>
+*/
+fragmentResultReg
+ fp_resultBinding;
+
+/*
+vertex program
+ <vertexResultReg> ::= <establishedName>
+ | <resultBinding>
+
+NOTE: <establishedName> is driven by <temporaryReg> rule at the end of <dstReg>
+*/
+vertexResultReg
+ vp_resultBinding;
+
+/*
+vertex program
+ <addrReg> ::= <establishedName>
+*/
+addrReg
+ vp_establishedName_no_error_on_identifier;
+
+/*
+vertex program
+ <addrComponent> ::= "." "x"
+*/
+addrComponent
+ dot .and "x" .error INVALID_ADDRESS_COMPONENT .emit COMPONENT_X .emit COMPONENT_X
+ .emit COMPONENT_X .emit COMPONENT_X;
+
+/*
+vertex program
+ <addrWriteMask> ::= "." "x"
+*/
+addrWriteMask
+ dot .and "x" .error INVALID_ADDRESS_WRITEMASK .emit 0x08;
+
+/*
+ <scalarSuffix> ::= "." <component>
+*/
+fp_scalarSuffix
+ dot .and fp_component_single .error INVALID_COMPONENT;
+vp_scalarSuffix
+ dot .and vp_component_single .error INVALID_COMPONENT;
+
+/*
+vertex program
+ <swizzleSuffix> ::= ""
+ | "." <component>
+ | "." <component> <component>
+ <component> <component>
+*/
+swizzleSuffix
+ swizzleSuffix_1 .or
+ .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z .emit COMPONENT_W;
+swizzleSuffix_1
+ dot_ne .and swizzleSuffix_2 .error INVALID_SUFFIX;
+swizzleSuffix_2
+ swizzleSuffix_3 .or swizzleSuffix_4;
+swizzleSuffix_3
+ vp_component_multi .and vp_component_multi .and vp_component_multi .error INVALID_COMPONENT .and
+ vp_component_multi .error INVALID_COMPONENT;
+swizzleSuffix_4
+ "x" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or
+ "y" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or
+ "z" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or
+ "w" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;
+
+/*
+fragment program
+ <optionalSuffix> ::= ""
+ | "." <component>
+ | "." <xyzwComponent> <xyzwComponent>
+ <xyzwComponent> <xyzwComponent>
+ | "." <rgbaComponent> <rgbaComponent>
+ <rgbaComponent> <rgbaComponent>
+*/
+optionalSuffix
+ optionalSuffix_1 .or
+ .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z .emit COMPONENT_W;
+optionalSuffix_1
+ dot_ne .and optionalSuffix_2 .error INVALID_SUFFIX;
+optionalSuffix_2
+ optionalSuffix_3 .or optionalSuffix_4 .or optionalSuffix_5;
+optionalSuffix_3
+ xyzwComponent_multi .and xyzwComponent_multi .and
+ xyzwComponent_multi .error INVALID_COMPONENT .and xyzwComponent_multi .error INVALID_COMPONENT;
+optionalSuffix_4
+ rgbaComponent_multi .and rgbaComponent_multi .and
+ rgbaComponent_multi .error INVALID_COMPONENT .and rgbaComponent_multi .error INVALID_COMPONENT;
+optionalSuffix_5
+ "x" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or
+ "y" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or
+ "z" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or
+ "w" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .or
+ "r" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or
+ "g" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or
+ "b" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or
+ "a" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;
+
+/*
+fragment program
+ <component> ::= <xyzwComponent>
+ | <rgbaComponent>
+
+vertex program
+ <component> ::= "x"
+ | "y"
+ | "z"
+ | "w"
+*/
+fp_component_single
+ xyzwComponent_single .or rgbaComponent_single;
+vp_component_multi
+ 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or
+ 'w' .emit COMPONENT_W;
+vp_component_single
+ "x" .emit COMPONENT_X .or "y" .emit COMPONENT_Y .or "z" .emit COMPONENT_Z .or
+ "w" .emit COMPONENT_W;
+
+/*
+fragment program
+ <xyzwComponent> ::= "x" | "y" | "z" | "w"
+*/
+xyzwComponent_multi
+ 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or
+ 'w' .emit COMPONENT_W;
+xyzwComponent_single
+ "x" .emit COMPONENT_X .or "y" .emit COMPONENT_Y .or "z" .emit COMPONENT_Z .or
+ "w" .emit COMPONENT_W;
+
+/*
+fragment program
+ <rgbaComponent> ::= "r" | "g" | "b" | "a"
+*/
+rgbaComponent_multi
+ 'r' .emit COMPONENT_X .or 'g' .emit COMPONENT_Y .or 'b' .emit COMPONENT_Z .or
+ 'a' .emit COMPONENT_W;
+rgbaComponent_single
+ "r" .emit COMPONENT_X .or "g" .emit COMPONENT_Y .or "b" .emit COMPONENT_Z .or
+ "a" .emit COMPONENT_W;
+
+/*
+fragment program
+ <optionalMask> ::= ""
+ | <xyzwMask>
+ | <rgbaMask>
+
+vertex program
+ <optionalMask> ::= ""
+ | "." "x"
+ | "." "y"
+ | "." "xy"
+ | "." "z"
+ | "." "xz"
+ | "." "yz"
+ | "." "xyz"
+ | "." "w"
+ | "." "xw"
+ | "." "yw"
+ | "." "xyw"
+ | "." "zw"
+ | "." "xzw"
+ | "." "yzw"
+ | "." "xyzw"
+
+NOTE: do NOT change the order of <rgbaMask> and <xyzwMask> rulez
+*/
+fp_optionalMask
+ rgbaMask .or xyzwMask .or .true .emit 0x0F;
+vp_optionalMask
+ xyzwMask .or .true .emit 0x0F;
+
+/*
+fragment program
+ <xyzwMask> ::= "." "x"
+ | "." "y"
+ | "." "xy"
+ | "." "z"
+ | "." "xz"
+ | "." "yz"
+ | "." "xyz"
+ | "." "w"
+ | "." "xw"
+ | "." "yw"
+ | "." "xyw"
+ | "." "zw"
+ | "." "xzw"
+ | "." "yzw"
+ | "." "xyzw"
+
+NOTE: <xyzwMask> is also referenced by the vertex program symbol <optionalMask>.
+*/
+xyzwMask
+ dot_ne .and xyzwMask_1 .error INVALID_WRITEMASK;
+xyzwMask_1
+ "xyzw" .emit 0x0F .or "xyz" .emit 0x0E .or "xyw" .emit 0x0D .or "xy" .emit 0x0C .or
+ "xzw" .emit 0x0B .or "xz" .emit 0x0A .or "xw" .emit 0x09 .or "x" .emit 0x08 .or
+ "yzw" .emit 0x07 .or "yz" .emit 0x06 .or "yw" .emit 0x05 .or "y" .emit 0x04 .or
+ "zw" .emit 0x03 .or "z" .emit 0x02 .or "w" .emit 0x01;
+
+/*
+fragment program
+ <rgbaMask> ::= "." "r"
+ | "." "g"
+ | "." "rg"
+ | "." "b"
+ | "." "rb"
+ | "." "gb"
+ | "." "rgb"
+ | "." "a"
+ | "." "ra"
+ | "." "ga"
+ | "." "rga"
+ | "." "ba"
+ | "." "rba"
+ | "." "gba"
+ | "." "rgba"
+*/
+rgbaMask
+ dot_ne .and rgbaMask_1;
+rgbaMask_1
+ "rgba" .emit 0x0F .or "rgb" .emit 0x0E .or "rga" .emit 0x0D .or "rg" .emit 0x0C .or
+ "rba" .emit 0x0B .or "rb" .emit 0x0A .or "ra" .emit 0x09 .or "r" .emit 0x08 .or
+ "gba" .emit 0x07 .or "gb" .emit 0x06 .or "ga" .emit 0x05 .or "g" .emit 0x04 .or
+ "ba" .emit 0x03 .or "b" .emit 0x02 .or "a" .emit 0x01;
+
+/*
+fragment program
+ <namingStatement> ::= <ATTRIB_statement>
+ | <PARAM_statement>
+ | <TEMP_statement>
+ | <OUTPUT_statement>
+ | <ALIAS_statement>
+
+vertex program
+ <namingStatement> ::= <ATTRIB_statement>
+ | <PARAM_statement>
+ | <TEMP_statement>
+ | <ADDRESS_statement>
+ | <OUTPUT_statement>
+ | <ALIAS_statement>
+*/
+fp_namingStatement
+ fp_ATTRIB_statement .emit ATTRIB .or
+ fp_PARAM_statement .emit PARAM .or
+ fp_TEMP_statement .emit TEMP .or
+ fp_OUTPUT_statement .emit OUTPUT .or
+ fp_ALIAS_statement .emit ALIAS;
+vp_namingStatement
+ vp_ATTRIB_statement .emit ATTRIB .or
+ vp_PARAM_statement .emit PARAM .or
+ vp_TEMP_statement .emit TEMP .or
+ ADDRESS_statement .emit ADDRESS .or
+ vp_OUTPUT_statement .emit OUTPUT .or
+ vp_ALIAS_statement .emit ALIAS;
+
+/*
+fragment program
+ <ATTRIB_statement> ::= "ATTRIB" <establishName> "="
+ <fragAttribBinding>
+
+vertex program
+ <ATTRIB_statement> ::= "ATTRIB" <establishName> "="
+ <vtxAttribBinding>
+*/
+fp_ATTRIB_statement
+ "ATTRIB" .and space .and fp_establishName .and equal .and
+ fragAttribBinding .error FRAGMENT_EXPECTED;
+vp_ATTRIB_statement
+ "ATTRIB" .and space .and vp_establishName .and equal .and
+ vtxAttribBinding .error VERTEX_EXPECTED;
+
+/*
+fragment program
+ <fragAttribBinding> ::= "fragment" "." <fragAttribItem>
+*/
+fragAttribBinding
+ "fragment" .and dot .and fragAttribItem .error INVALID_FRAGMENT_PROPERTY;
+
+/*
+vertex program
+ <vtxAttribBinding> ::= "vertex" "." <vtxAttribItem>
+*/
+vtxAttribBinding
+ "vertex" .and dot .and vtxAttribItem .error INVALID_VERTEX_PROPERTY;
+
+/*
+fragment program
+ <fragAttribItem> ::= "color" <optColorType>
+ | "texcoord" <optTexCoordNum>
+ | "fogcoord"
+ | "position"
+*/
+fragAttribItem
+ fragAttribItem_1 .emit FRAGMENT_ATTRIB_COLOR .or
+ fragAttribItem_2 .emit FRAGMENT_ATTRIB_TEXCOORD .or
+ .if (fog_coord != 0x00) "fogcoord" .emit FRAGMENT_ATTRIB_FOGCOORD .or
+ "position" .emit FRAGMENT_ATTRIB_POSITION;
+fragAttribItem_1
+ "color" .and optColorType;
+fragAttribItem_2
+ "texcoord" .and optTexCoordNum;
+
+/*
+vertex program
+ <vtxAttribItem> ::= "position"
+ | "weight" <vtxOptWeightNum>
+ | "normal"
+ | "color" <optColorType>
+ | "fogcoord"
+ | "texcoord" <optTexCoordNum>
+ | "matrixindex" "[" <vtxWeightNum> "]"
+ | "attrib" "[" <vtxAttribNum> "]"
+*/
+vtxAttribItem
+ "position" .emit VERTEX_ATTRIB_POSITION .or
+ .if (vertex_blend != 0x00) vtxAttribItem_1 .emit VERTEX_ATTRIB_WEIGHT .or
+ "normal" .emit VERTEX_ATTRIB_NORMAL .or
+ vtxAttribItem_2 .emit VERTEX_ATTRIB_COLOR .or
+ "fogcoord" .emit VERTEX_ATTRIB_FOGCOORD .or
+ vtxAttribItem_3 .emit VERTEX_ATTRIB_TEXCOORD .or
+ .if (matrix_palette != 0x00) vtxAttribItem_4 .emit VERTEX_ATTRIB_MATRIXINDEX .or
+ vtxAttribItem_5 .emit VERTEX_ATTRIB_GENERIC;
+vtxAttribItem_1
+ "weight" .and vtxOptWeightNum;
+vtxAttribItem_2
+ "color" .and optColorType;
+vtxAttribItem_3
+ "texcoord" .and optTexCoordNum;
+vtxAttribItem_4
+ "matrixindex" .and lbracket .and vtxWeightNum .and rbracket;
+vtxAttribItem_5
+ "attrib" .and lbracket .and vtxAttribNum .and rbracket;
+
+/*
+vertex program
+ <vtxAttribNum> ::= <integer> from 0 to MAX_VERTEX_ATTRIBS_ARB-1
+*/
+vtxAttribNum
+ integer;
+
+/*
+vertex program
+ <vtxOptWeightNum> ::= ""
+ | "[" <vtxWeightNum> "]"
+*/
+vtxOptWeightNum
+ vtxOptWeightNum_1 .or .true .emit 0x00;
+vtxOptWeightNum_1
+ lbracket_ne .and vtxWeightNum .and rbracket;
+
+/*
+vertex program
+ <vtxWeightNum> ::= <integer> from 0 to MAX_VERTEX_UNITS_ARB-1,
+ must be divisible by four
+*/
+vtxWeightNum
+ integer;
+
+/*
+ <PARAM_statement> ::= <PARAM_singleStmt>
+ | <PARAM_multipleStmt>
+*/
+fp_PARAM_statement
+ fp_PARAM_multipleStmt .or fp_PARAM_singleStmt;
+vp_PARAM_statement
+ vp_PARAM_multipleStmt .or vp_PARAM_singleStmt;
+
+/*
+ <PARAM_singleStmt> ::= "PARAM" <establishName> <paramSingleInit>
+*/
+fp_PARAM_singleStmt
+ "PARAM" .and space .and fp_establishName .and .true .emit 0x00 .and fp_paramSingleInit .and
+ .true .emit PARAM_NULL;
+vp_PARAM_singleStmt
+ "PARAM" .and space .and vp_establishName .and .true .emit 0x00 .and vp_paramSingleInit .and
+ .true .emit PARAM_NULL;
+
+/*
+ <PARAM_multipleStmt> ::= "PARAM" <establishName> "[" <optArraySize> "]"
+ <paramMultipleInit>
+*/
+fp_PARAM_multipleStmt
+ "PARAM" .and space .and fp_establishName .and lbracket_ne .and optArraySize .and rbracket .and
+ fp_paramMultipleInit .and .true .emit PARAM_NULL;
+vp_PARAM_multipleStmt
+ "PARAM" .and space .and vp_establishName .and lbracket_ne .and optArraySize .and rbracket .and
+ vp_paramMultipleInit .and .true .emit PARAM_NULL;
+
+/*
+ <optArraySize> ::= ""
+ | <integer> from 1 to MAX_PROGRAM_PARAMETERS_ARB
+ (maximum number of allowed program
+ parameter bindings)
+*/
+optArraySize
+ optional_integer;
+
+/*
+ <paramSingleInit> ::= "=" <paramSingleItemDecl>
+*/
+fp_paramSingleInit
+ equal .and fp_paramSingleItemDecl;
+vp_paramSingleInit
+ equal .and vp_paramSingleItemDecl;
+
+/*
+ <paramMultipleInit> ::= "=" "{" <paramMultInitList> "}"
+*/
+fp_paramMultipleInit
+ equal .and lbrace .and fp_paramMultInitList .and rbrace;
+vp_paramMultipleInit
+ equal .and lbrace .and vp_paramMultInitList .and rbrace;
+
+/*
+ <paramMultInitList> ::= <paramMultipleItem>
+ | <paramMultipleItem> "," <paramMultiInitList>
+*/
+fp_paramMultInitList
+ fp_paramMultInitList_1 .or fp_paramMultipleItem;
+vp_paramMultInitList
+ vp_paramMultInitList_1 .or vp_paramMultipleItem;
+fp_paramMultInitList_1
+ fp_paramMultipleItem .and comma_ne .and fp_paramMultInitList;
+vp_paramMultInitList_1
+ vp_paramMultipleItem .and comma_ne .and vp_paramMultInitList;
+
+/*
+ <paramSingleItemDecl> ::= <stateSingleItem>
+ | <programSingleItem>
+ | <paramConstDecl>
+*/
+fp_paramSingleItemDecl
+ fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or
+ programSingleItem .emit PARAM_PROGRAM_ELEMENT .or
+ paramConstDecl .emit PARAM_CONSTANT;
+vp_paramSingleItemDecl
+ vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or
+ programSingleItem .emit PARAM_PROGRAM_ELEMENT .or
+ paramConstDecl .emit PARAM_CONSTANT;
+
+/*
+ <paramSingleItemUse> ::= <stateSingleItem>
+ | <programSingleItem>
+ | <paramConstUse>
+*/
+fp_paramSingleItemUse
+ fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or
+ programSingleItem .emit PARAM_PROGRAM_ELEMENT .or
+ paramConstUse .emit PARAM_CONSTANT;
+vp_paramSingleItemUse
+ vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or
+ programSingleItem .emit PARAM_PROGRAM_ELEMENT .or
+ paramConstUse .emit PARAM_CONSTANT;
+
+/*
+ <paramMultipleItem> ::= <stateMultipleItem>
+ | <programMultipleItem>
+ | <paramConstDecl>
+*/
+fp_paramMultipleItem
+ fp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or
+ programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or
+ paramConstDecl .emit PARAM_CONSTANT;
+vp_paramMultipleItem
+ vp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or
+ programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or
+ paramConstDecl .emit PARAM_CONSTANT;
+
+/*
+ <stateMultipleItem> ::= <stateSingleItem>
+ | "state" "." <stateMatrixRows>
+*/
+fp_stateMultipleItem
+ stateMultipleItem_1 .or fp_stateSingleItem;
+vp_stateMultipleItem
+ stateMultipleItem_1 .or vp_stateSingleItem;
+stateMultipleItem_1
+ "state" .and dot .and stateMatrixRows .emit STATE_MATRIX_ROWS;
+
+/*
+fragment program
+ <stateSingleItem> ::= "state" "." <stateMaterialItem>
+ | "state" "." <stateLightItem>
+ | "state" "." <stateLightModelItem>
+ | "state" "." <stateLightProdItem>
+ | "state" "." <stateTexEnvItem>
+ | "state" "." <stateFogItem>
+ | "state" "." <stateDepthItem>
+ | "state" "." <stateMatrixRow>
+
+vertex program
+ <stateSingleItem> ::= "state" "." <stateMaterialItem>
+ | "state" "." <stateLightItem>
+ | "state" "." <stateLightModelItem>
+ | "state" "." <stateLightProdItem>
+ | "state" "." <stateTexGenItem>
+ | "state" "." <stateFogItem>
+ | "state" "." <stateClipPlaneItem>
+ | "state" "." <statePointItem>
+ | "state" "." <stateMatrixRow>
+*/
+fp_stateSingleItem
+ "state" .and dot .and fp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;
+vp_stateSingleItem
+ "state" .and dot .and vp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;
+fp_stateSingleItem_1
+ stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or
+ stateSingleItem_5 .or stateSingleItem_7 .or stateSingleItem_8 .or stateSingleItem_11;
+vp_stateSingleItem_1
+ stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or
+ stateSingleItem_6 .or stateSingleItem_7 .or stateSingleItem_9 .or stateSingleItem_10 .or
+ stateSingleItem_11;
+stateSingleItem_1
+ stateMaterialItem .emit STATE_MATERIAL;
+stateSingleItem_2
+ stateLightItem .emit STATE_LIGHT;
+stateSingleItem_3
+ stateLightModelItem .emit STATE_LIGHT_MODEL;
+stateSingleItem_4
+ stateLightProdItem .emit STATE_LIGHT_PROD;
+stateSingleItem_5
+ stateTexEnvItem .emit STATE_TEX_ENV;
+stateSingleItem_6
+ stateTexGenItem .emit STATE_TEX_GEN;
+stateSingleItem_7
+ stateFogItem .emit STATE_FOG;
+stateSingleItem_8
+ stateDepthItem .emit STATE_DEPTH;
+stateSingleItem_9
+ stateClipPlaneItem .emit STATE_CLIP_PLANE;
+stateSingleItem_10
+ statePointItem .emit STATE_POINT;
+stateSingleItem_11
+ stateMatrixRow .emit STATE_MATRIX_ROWS;
+
+/*
+ <stateMaterialItem> ::= "material" <optFaceType> "." <stateMatProperty>
+*/
+stateMaterialItem
+ "material" .and optFaceType .and dot .and stateMatProperty .error INVALID_MATERIAL_PROPERTY;
+
+/*
+ <stateMatProperty> ::= "ambient"
+ | "diffuse"
+ | "specular"
+ | "emission"
+ | "shininess"
+*/
+stateMatProperty
+ "ambient" .emit MATERIAL_AMBIENT .or
+ "diffuse" .emit MATERIAL_DIFFUSE .or
+ "specular" .emit MATERIAL_SPECULAR .or
+ "emission" .emit MATERIAL_EMISSION .or
+ "shininess" .emit MATERIAL_SHININESS;
+
+/*
+ <stateLightItem> ::= "light" "[" <stateLightNumber> "]" "."
+ <stateLightProperty>
+*/
+stateLightItem
+ "light" .and lbracket .and stateLightNumber .and rbracket .and dot .and
+ stateLightProperty .error INVALID_LIGHT_PROPERTY;
+
+/*
+ <stateLightProperty> ::= "ambient"
+ | "diffuse"
+ | "specular"
+ | "position"
+ | "attenuation"
+ | "spot" "." <stateSpotProperty>
+ | "half"
+*/
+stateLightProperty
+ "ambient" .emit LIGHT_AMBIENT .or
+ "diffuse" .emit LIGHT_DIFFUSE .or
+ "specular" .emit LIGHT_SPECULAR .or
+ "position" .emit LIGHT_POSITION .or
+ "attenuation" .emit LIGHT_ATTENUATION .or
+ stateLightProperty_1 .emit LIGHT_SPOT_DIRECTION .or
+ "half" .emit LIGHT_HALF;
+stateLightProperty_1
+ "spot" .and dot .and stateSpotProperty .error INVALID_SPOT_PROPERTY;
+
+/*
+ <stateSpotProperty> ::= "direction"
+*/
+stateSpotProperty
+ "direction";
+
+/*
+ <stateLightModelItem> ::= "lightmodel" <stateLModProperty>
+*/
+stateLightModelItem
+ "lightmodel" .and stateLModProperty .error INVALID_LIGHTMODEL_PROPERTY;
+
+/*
+ <stateLModProperty> ::= "." "ambient"
+ | <optFaceType> "." "scenecolor"
+*/
+stateLModProperty
+ stateLModProperty_1 .or stateLModProperty_2;
+stateLModProperty_1
+ dot .and "ambient" .emit LIGHT_MODEL_AMBIENT;
+stateLModProperty_2
+ stateLModProperty_3 .emit LIGHT_MODEL_SCENECOLOR;
+stateLModProperty_3
+ optFaceType .and dot .and "scenecolor";
+
+/*
+ <stateLightProdItem> ::= "lightprod" "[" <stateLightNumber> "]"
+ <optFaceType> "." <stateLProdProperty>
+*/
+stateLightProdItem
+ "lightprod" .and lbracket .and stateLightNumber .and rbracket .and optFaceType .and dot .and
+ stateLProdProperty .error INVALID_LIGHTPROD_PROPERTY;
+
+/*
+ <stateLProdProperty> ::= "ambient"
+ | "diffuse"
+ | "specular"
+*/
+stateLProdProperty
+ "ambient" .emit LIGHT_PROD_AMBIENT .or
+ "diffuse" .emit LIGHT_PROD_DIFFUSE .or
+ "specular" .emit LIGHT_PROD_SPECULAR;
+
+/*
+ <stateLightNumber> ::= <integer> from 0 to MAX_LIGHTS-1
+*/
+stateLightNumber
+ integer;
+
+/*
+fragment program
+ <stateTexEnvItem> ::= "texenv" <optLegacyTexUnitNum> "."
+ <stateTexEnvProperty>
+*/
+stateTexEnvItem
+ "texenv" .and optLegacyTexUnitNum .and dot .and
+ stateTexEnvProperty .error INVALID_TEXENV_PROPERTY;
+
+/*
+fragment program
+ <stateTexEnvProperty> ::= "color"
+*/
+stateTexEnvProperty
+ "color" .emit TEX_ENV_COLOR;
+
+/*
+fragment program
+ <optLegacyTexUnitNum> ::= ""
+ | "[" <legacyTexUnitNum> "]"
+*/
+optLegacyTexUnitNum
+ optLegacyTexUnitNum_1 .or .true .emit 0x00;
+optLegacyTexUnitNum_1
+ lbracket_ne .and legacyTexUnitNum .and rbracket;
+
+/*
+fragment program
+ <legacyTexUnitNum> ::= <integer> from 0 to MAX_TEXTURE_UNITS-1
+*/
+legacyTexUnitNum
+ integer;
+
+/*
+vertex program
+ <stateTexGenItem> ::= "texgen" <optTexCoordNum> "."
+ <stateTexGenType> "." <stateTexGenCoord>
+*/
+stateTexGenItem
+ "texgen" .and optTexCoordNum .and dot .and stateTexGenType .error INVALID_TEXGEN_PROPERTY .and
+ dot .and stateTexGenCoord .error INVALID_TEXGEN_COORD;
+
+/*
+vertex program
+ <stateTexGenType> ::= "eye"
+ | "object"
+*/
+stateTexGenType
+ "eye" .emit TEX_GEN_EYE .or
+ "object" .emit TEX_GEN_OBJECT;
+
+/*
+vertex program
+ <stateTexGenCoord> ::= "s"
+ | "t"
+ | "r"
+ | "q"
+*/
+stateTexGenCoord
+ "s" .emit COMPONENT_X .or
+ "t" .emit COMPONENT_Y .or
+ "r" .emit COMPONENT_Z .or
+ "q" .emit COMPONENT_W;
+
+/*
+ <stateFogItem> ::= "fog" "." <stateFogProperty>
+*/
+stateFogItem
+ "fog" .and dot .and stateFogProperty .error INVALID_FOG_PROPERTY;
+
+/*
+ <stateFogProperty> ::= "color"
+ | "params"
+*/
+stateFogProperty
+ "color" .emit FOG_COLOR .or
+ "params" .emit FOG_PARAMS;
+
+/*
+fragment program
+ <stateDepthItem> ::= "depth" "." <stateDepthProperty>
+*/
+stateDepthItem
+ "depth" .and dot .and stateDepthProperty .error INVALID_DEPTH_PROPERTY;
+
+/*
+fragment program
+ <stateDepthProperty> ::= "range"
+*/
+stateDepthProperty
+ "range" .emit DEPTH_RANGE;
+
+/*
+vertex program
+ <stateClipPlaneItem> ::= "clip" "[" <stateClipPlaneNum> "]" "." "plane"
+*/
+stateClipPlaneItem
+ "clip" .and lbracket .and stateClipPlaneNum .and rbracket .and dot .and
+ "plane" .error INVALID_CLIPPLANE_PROPERTY;
+
+/*
+vertex program
+ <stateClipPlaneNum> ::= <integer> from 0 to MAX_CLIP_PLANES-1
+*/
+stateClipPlaneNum
+ integer;
+
+/*
+vertex program
+ <statePointItem> ::= "point" "." <statePointProperty>
+*/
+statePointItem
+ "point" .and dot .and statePointProperty .error INVALID_POINT_PROPERTY;
+
+/*
+vertex program
+ <statePointProperty> ::= "size"
+ | "attenuation"
+*/
+statePointProperty
+ "size" .emit POINT_SIZE .or
+ .if (point_parameters != 0x00) "attenuation" .emit POINT_ATTENUATION;
+
+/*
+ <stateMatrixRow> ::= <stateMatrixItem> "." "row" "["
+ <stateMatrixRowNum> "]"
+*/
+stateMatrixRow
+ stateMatrixItem .and dot .and "row" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and
+ lbracket .and stateMatrixRowNum .and rbracket .emit 0x0;
+
+/*
+ <stateMatrixRows> ::= <stateMatrixItem> <optMatrixRows>
+*/
+stateMatrixRows
+ stateMatrixItem .and optMatrixRows;
+
+/*
+ <optMatrixRows> ::= ""
+ | "." "row" "[" <stateMatrixRowNum> ".."
+ <stateMatrixRowNum> "]"
+*/
+optMatrixRows
+ optMatrixRows_1 .or .true .emit 0x0 .emit '3' .emit 0x0 .emit $;
+optMatrixRows_1
+ dot_ne .and "row" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and lbracket .and
+ stateMatrixRowNum .and dotdot .and stateMatrixRowNum .and rbracket;
+
+/*
+ <stateMatrixItem> ::= "matrix" "." <stateMatrixName>
+ <stateOptMatModifier>
+*/
+stateMatrixItem
+ "matrix" .and dot .and stateMatrixName .error INVALID_MATRIX_NAME .and stateOptMatModifier;
+
+/*
+ <stateOptMatModifier> ::= ""
+ | "." <stateMatModifier>
+*/
+stateOptMatModifier
+ stateOptMatModifier_1 .or .true .emit MATRIX_MODIFIER_IDENTITY;
+stateOptMatModifier_1
+ dot_ne .and stateMatModifier;
+
+/*
+ <stateMatModifier> ::= "inverse"
+ | "transpose"
+ | "invtrans"
+*/
+stateMatModifier
+ "inverse" .emit MATRIX_MODIFIER_INVERSE .or
+ "transpose" .emit MATRIX_MODIFIER_TRANSPOSE .or
+ "invtrans" .emit MATRIX_MODIFIER_INVTRANS;
+
+/*
+ <stateMatrixRowNum> ::= <integer> from 0 to 3
+*/
+stateMatrixRowNum
+ integer_0_3;
+
+/*
+ <stateMatrixName> ::= "modelview" <stateOptModMatNum>
+ | "projection"
+ | "mvp"
+ | "texture" <optTexCoordNum>
+ | "palette" "[" <statePaletteMatNum> "]"
+ | "program" "[" <stateProgramMatNum> "]"
+*/
+stateMatrixName
+ stateMatrixName_1_1 .emit MATRIX_MODELVIEW .or
+ "projection" .emit MATRIX_PROJECTION .or
+ "mvp" .emit MATRIX_MVP .or
+ stateMatrixName_1_2 .emit MATRIX_TEXTURE .or
+ .if (matrix_palette != 0x00) stateMatrixName_1_3 .emit MATRIX_PALETTE .or
+ stateMatrixName_1_4 .emit MATRIX_PROGRAM;
+stateMatrixName_1_1
+ "modelview" .and stateOptModMatNum;
+stateMatrixName_1_2
+ "texture" .and optTexCoordNum;
+stateMatrixName_1_3
+ "palette" .and lbracket .and statePaletteMatNum .and rbracket;
+stateMatrixName_1_4
+ "program" .and lbracket .and stateProgramMatNum .and rbracket;
+
+/*
+ <stateOptModMatNum> ::= ""
+ | "[" <stateModMatNum> "]"
+*/
+stateOptModMatNum
+ .if (vertex_blend != 0x00) stateOptModMatNum_1 .or
+ .true .emit 0x00;
+stateOptModMatNum_1
+ lbracket_ne .and stateModMatNum .and rbracket;
+
+/*
+ <stateModMatNum> ::= <integer> from 0 to MAX_VERTEX_UNITS_ARB-1
+*/
+stateModMatNum
+ integer;
+
+/*
+ <optTexCoordNum> ::= ""
+ | "[" <texCoordNum> "]"
+*/
+optTexCoordNum
+ optTexCoordNum_1 .or .true .emit 0x00;
+optTexCoordNum_1
+ lbracket_ne .and texCoordNum .and rbracket;
+
+/*
+ <texCoordNum> ::= <integer> from 0 to MAX_TEXTURE_COORDS_ARB-1
+*/
+texCoordNum
+ integer;
+
+/*
+ <statePaletteMatNum> ::= <integer> from 0 to MAX_PALETTE_MATRICES_ARB-1
+*/
+statePaletteMatNum
+ integer;
+
+/*
+ <stateProgramMatNum> ::= <integer> from 0 to MAX_PROGRAM_MATRICES_ARB-1
+*/
+stateProgramMatNum
+ integer;
+
+/*
+ <programSingleItem> ::= <progEnvParam>
+ | <progLocalParam>
+
+NOTE: <programSingleItem> has been modified for correct error handling. If program property
+ is neither "env" nor "local" INVALID_PROGRAM_PROPERTY is generated.
+*/
+programSingleItem
+ "program" .and dot .and programSingleItem_1 .error INVALID_PROGRAM_PROPERTY;
+programSingleItem_1
+ progEnvParam .or progLocalParam;
+
+/*
+ <programMultipleItem> ::= <progEnvParams>
+ | <progLocalParams>
+
+NOTE: <programMultipleItem> has been modified for correct error handling. If program property
+ is neither "env" nor "local" INVALID_PROGRAM_PROPERTY is generated.
+*/
+programMultipleItem
+ "program" .and dot .and programMultipleItem_1 .error INVALID_PROGRAM_PROPERTY;
+programMultipleItem_1
+ progEnvParams .or progLocalParams;
+
+/*
+ <progEnvParams> ::= "program" "." "env"
+ "[" <progEnvParamNums> "]"
+
+NOTE: "program" "." has been moved to <programMultipleItem>.
+*/
+progEnvParams
+ "env" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNums .and rbracket;
+
+/*
+ <progEnvParamNums> ::= <progEnvParamNum>
+ | <progEnvParamNum> ".." <progEnvParamNum>
+*/
+progEnvParamNums
+ progEnvParamNums_1 .or progEnvParamNums_2;
+progEnvParamNums_1
+ progEnvParamNum .and dotdot_ne .and progEnvParamNum;
+progEnvParamNums_2
+ progEnvParamNum .and .true .emit 0x00;
+
+/*
+ <progEnvParam> ::= "program" "." "env"
+ "[" <progEnvParamNum> "]"
+
+NOTE: "program" "." has been moved to <programSingleItem>.
+*/
+progEnvParam
+ "env" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNum .and rbracket .emit 0x00;
+
+/*
+ <progLocalParams> ::= "program" "." "local"
+ "[" <progLocalParamNums> "]"
+
+NOTE: "program" "." has been moved to <programMultipleItem>.
+*/
+progLocalParams
+ "local" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNums .and rbracket;
+
+/*
+ <progLocalParamNums> ::= <progLocalParamNum>
+ | <progLocalParamNum> ".." <progLocalParamNum>
+*/
+progLocalParamNums
+ progLocalParamNums_1 .or progLocalParamNums_2;
+progLocalParamNums_1
+ progLocalParamNum .and dotdot_ne .and progLocalParamNum;
+progLocalParamNums_2
+ progLocalParamNum .and .true .emit 0x00;
+
+/*
+ <progLocalParam> ::= "program" "." "local"
+ "[" <progLocalParamNum> "]"
+
+NOTE: "program" "." has been moved to <programSingleItem>.
+*/
+progLocalParam
+ "local" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNum .and rbracket .emit 0x00;
+
+/*
+ <progEnvParamNum> ::= <integer> from 0 to
+ MAX_PROGRAM_ENV_PARAMETERS_ARB - 1
+*/
+progEnvParamNum
+ integer;
+
+/*
+ <progLocalParamNum> ::= <integer> from 0 to
+ MAX_PROGRAM_LOCAL_PARAMETERS_ARB - 1
+*/
+progLocalParamNum
+ integer;
+
+/*
+ <paramConstDecl> ::= <paramConstScalarDecl>
+ | <paramConstVector>
+*/
+paramConstDecl
+ paramConstScalarDecl .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;
+
+/*
+ <paramConstUse> ::= <paramConstScalarUse>
+ | <paramConstVector>
+*/
+paramConstUse
+ paramConstScalarUse .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;
+
+/*
+ <paramConstScalarDecl> ::= <signedFloatConstant>
+*/
+paramConstScalarDecl
+ signedFloatConstant;
+
+/*
+ <paramConstScalarUse> ::= <floatConstant>
+*/
+paramConstScalarUse
+ floatConstant;
+
+/*
+ <paramConstVector> ::= "{" <signedFloatConstant> "}"
+ | "{" <signedFloatConstant> ","
+ <signedFloatConstant> "}"
+ | "{" <signedFloatConstant> ","
+ <signedFloatConstant> ","
+ <signedFloatConstant> "}"
+ | "{" <signedFloatConstant> ","
+ <signedFloatConstant> ","
+ <signedFloatConstant> ","
+ <signedFloatConstant> "}"
+*/
+paramConstVector
+ paramConstVector_4 .emit 0x04 .or paramConstVector_3 .emit 0x03 .or
+ paramConstVector_2 .emit 0x02 .or paramConstVector_1 .emit 0x01;
+paramConstVector_1
+ lbrace_ne .and signedFloatConstant .and rbrace;
+paramConstVector_2
+ lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;
+paramConstVector_3
+ lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and
+ signedFloatConstant .and rbrace;
+paramConstVector_4
+ lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and
+ signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;
+
+/*
+ <signedFloatConstant> ::= <optionalSign> <floatConstant>
+*/
+signedFloatConstant
+ optionalSign .and floatConstant;
+
+/*
+ <floatConstant> ::= see text
+ The <floatConstant> rule matches a floating-point constant consisting
+ of an integer part, a decimal point, a fraction part, an "e" or
+ "E", and an optionally signed integer exponent. The integer and
+ fraction parts both consist of a sequence of one or more digits ("0"
+ through "9"). Either the integer part or the fraction parts (not
+ both) may be missing; either the decimal point or the "e" (or "E")
+ and the exponent (not both) may be missing.
+*/
+floatConstant
+ float;
+
+/*
+ <optionalSign> ::= ""
+ | "-"
+ | "+"
+*/
+optionalSign
+ optional_sign_ne;
+
+/*
+ <TEMP_statement> ::= "TEMP" <varNameList>
+*/
+fp_TEMP_statement
+ "TEMP" .and space .and fp_varNameList .and .true .emit 0x00;
+vp_TEMP_statement
+ "TEMP" .and space .and vp_varNameList .and .true .emit 0x00;
+
+/*
+vertex program
+ <ADDRESS_statement> ::= "ADDRESS" <varNameList>
+*/
+ADDRESS_statement
+ "ADDRESS" .and space .and vp_varNameList .and .true .emit 0x00;
+
+/*
+ <varNameList> ::= <establishName>
+ | <establishName> "," <varNameList>
+*/
+fp_varNameList
+ fp_varNameList_1 .or fp_establishName;
+vp_varNameList
+ vp_varNameList_1 .or vp_establishName;
+fp_varNameList_1
+ fp_establishName .and comma_ne .and fp_varNameList;
+vp_varNameList_1
+ vp_establishName .and comma_ne .and vp_varNameList;
+
+/*
+ <OUTPUT_statement> ::= "OUTPUT" <establishName> "="
+ <resultBinding>
+*/
+fp_OUTPUT_statement
+ "OUTPUT" .and space .and fp_establishName .and equal .and
+ fp_resultBinding .error RESULT_EXPECTED;
+vp_OUTPUT_statement
+ "OUTPUT" .and space .and vp_establishName .and equal .and
+ vp_resultBinding .error RESULT_EXPECTED;
+
+/*
+fragment program
+ <resultBinding> ::= "result" "." "color"
+ | "result" "." "color" <optOutputColorNum> (if option ARB_draw_buffers present)
+ | "result" "." "depth"
+
+vertex program
+ <resultBinding> ::= "result" "." "position"
+ | "result" "." <resultColBinding>
+ | "result" "." "fogcoord"
+ | "result" "." "pointsize"
+ | "result" "." "texcoord" <optTexCoordNum>
+*/
+fp_resultBinding
+ "result" .and dot .and fp_resultBinding_1 .error INVALID_RESULT_PROPERTY;
+vp_resultBinding
+ "result" .and dot .and vp_resultBinding_1 .error INVALID_RESULT_PROPERTY;
+fp_resultBinding_1
+ fp_resultBinding_2 .emit FRAGMENT_RESULT_COLOR .or
+ "depth" .emit FRAGMENT_RESULT_DEPTH;
+fp_resultBinding_2
+ "color" .and optOutputColorNum;
+vp_resultBinding_1
+ .if (ARB_position_invariant == 0x00) "position" .emit VERTEX_RESULT_POSITION .or
+ resultColBinding .emit VERTEX_RESULT_COLOR .or
+ "fogcoord" .emit VERTEX_RESULT_FOGCOORD .or
+ "pointsize" .emit VERTEX_RESULT_POINTSIZE .or
+ vp_resultBinding_2 .emit VERTEX_RESULT_TEXCOORD;
+vp_resultBinding_2
+ "texcoord" .and optTexCoordNum;
+
+/*
+GL_ARB_draw_buffers
+ <optOutputColorNum> ::= ""
+ | "[" <outputColorNum> "]"
+*/
+optOutputColorNum
+ .if (ARB_draw_buffers != 0x00) optOutputColorNum_1 .or .true .emit 0x00;
+optOutputColorNum_1
+ lbracket_ne .and outputColorNum .and rbracket;
+
+/*
+GL_ARB_draw_buffers
+ <outputColorNum> ::= <integer> from 0 to MAX_DRAW_BUFFERS_ARB-1
+*/
+outputColorNum
+ integer;
+
+/*
+vertex program
+ <resultColBinding> ::= "color" <optFaceType> <optColorType>
+*/
+resultColBinding
+ "color" .and optFaceType .and optColorType;
+
+/*
+ <optFaceType> ::= ""
+ | "." "front"
+ | "." "back"
+*/
+optFaceType
+ FaceType .or .true .emit FACE_FRONT;
+FaceType
+ dot_ne .and FaceProperty;
+FaceProperty
+ "front" .emit FACE_FRONT .or "back" .emit FACE_BACK;
+
+/*
+ <optColorType> ::= ""
+ | "." "primary"
+ | "." "secondary"
+*/
+optColorType
+ ColorType .or .true .emit COLOR_PRIMARY;
+ColorType
+ dot_ne .and ColorProperty;
+ColorProperty
+ "primary" .emit COLOR_PRIMARY .or
+ .if (secondary_color != 0x00) "secondary" .emit COLOR_SECONDARY;
+
+/*
+ <ALIAS_statement> ::= "ALIAS" <establishName> "="
+ <establishedName>
+*/
+fp_ALIAS_statement
+ "ALIAS" .and fp_ALIAS_statement_1 .error IDENTIFIER_EXPECTED .and equal .and fp_establishedName;
+vp_ALIAS_statement
+ "ALIAS" .and vp_ALIAS_statement_1 .error IDENTIFIER_EXPECTED .and equal .and vp_establishedName;
+fp_ALIAS_statement_1
+ space .and fp_establishName;
+vp_ALIAS_statement_1
+ space .and vp_establishName;
+
+/*
+ <establishName> ::= <identifier>
+*/
+fp_establishName
+ fp_identifier;
+vp_establishName
+ vp_identifier;
+
+/*
+ <establishedName> ::= <identifier>
+*/
+fp_establishedName
+ fp_identifier;
+vp_establishedName
+ vp_identifier;
+fp_establishedName_no_error_on_identifier
+ fp_identifier_ne;
+vp_establishedName_no_error_on_identifier
+ vp_identifier_ne;
+
+/*
+fragment program
+ <identifier> ::= see text
+ The <identifier> rule matches a sequence of one or more letters ("A"
+ through "Z", "a" through "z"), digits ("0" through "9), underscores
+ ("_"), or dollar signs ("$"); the first character must not be a
+ number. Upper and lower case letters are considered different
+ (names are case-sensitive). The following strings are reserved
+ keywords and may not be used as identifiers:
+
+ ABS, ABS_SAT, ADD, ADD_SAT, ALIAS, ATTRIB, CMP, CMP_SAT, COS,
+ COS_SAT, DP3, DP3_SAT, DP4, DP4_SAT, DPH, DPH_SAT, DST, DST_SAT,
+ END, EX2, EX2_SAT, FLR, FLR_SAT, FRC, FRC_SAT, KIL, LG2,
+ LG2_SAT, LIT, LIT_SAT, LRP, LRP_SAT, MAD, MAD_SAT, MAX, MAX_SAT,
+ MIN, MIN_SAT, MOV, MOV_SAT, MUL, MUL_SAT, OPTION, OUTPUT, PARAM,
+ POW, POW_SAT, RCP, RCP_SAT, RSQ, RSQ_SAT, SIN, SIN_SAT, SCS,
+ SCS_SAT, SGE, SGE_SAT, SLT, SLT_SAT, SUB, SUB_SAT, SWZ, SWZ_SAT,
+ TEMP, TEX, TEX_SAT, TXB, TXB_SAT, TXP, TXP_SAT, XPD, XPD_SAT,
+ fragment, program, result, state, and texture.
+
+vertex program
+ <identifier> ::= see text
+ The <identifier> rule matches a sequence of one or more letters ("A"
+ through "Z", "a" through "z"), digits ("0" through "9), underscores ("_"),
+ or dollar signs ("$"); the first character must not be a number. Upper
+ and lower case letters are considered different (names are
+ case-sensitive). The following strings are reserved keywords and may not
+ be used as identifiers:
+
+ ABS, ADD, ADDRESS, ALIAS, ARL, ATTRIB, DP3, DP4, DPH, DST, END, EX2,
+ EXP, FLR, FRC, LG2, LIT, LOG, MAD, MAX, MIN, MOV, MUL, OPTION, OUTPUT,
+ PARAM, POW, RCP, RSQ, SGE, SLT, SUB, SWZ, TEMP, XPD, program, result,
+ state, and vertex.
+*/
+fp_identifier
+ fp_identifier_ne .error IDENTIFIER_EXPECTED;
+vp_identifier
+ vp_identifier_ne .error IDENTIFIER_EXPECTED;
+fp_identifier_ne
+ fp_not_reserved_identifier .and identifier_ne;
+vp_identifier_ne
+ vp_not_reserved_identifier .and identifier_ne;
+
+fp_not_reserved_identifier
+ fp_not_reserved_identifier_1 .or .true;
+fp_not_reserved_identifier_1
+ fp_reserved_identifier .and .false .error RESERVED_KEYWORD;
+vp_not_reserved_identifier
+ vp_not_reserved_identifier_1 .or .true;
+vp_not_reserved_identifier_1
+ vp_reserved_identifier .and .false .error RESERVED_KEYWORD;
+
+fp_reserved_identifier
+ "ABS" .or "ABS_SAT" .or "ADD" .or "ADD_SAT" .or "ALIAS" .or "ATTRIB" .or "CMP" .or "CMP_SAT" .or
+ "COS" .or "COS_SAT" .or "DP3" .or "DP3_SAT" .or "DP4" .or "DP4_SAT" .or "DPH" .or "DPH_SAT" .or
+ "DST" .or "DST_SAT" .or "END" .or "EX2" .or "EX2_SAT" .or "FLR" .or "FLR_SAT" .or "FRC" .or
+ "FRC_SAT" .or "KIL" .or "LG2" .or "LG2_SAT" .or "LIT" .or "LIT_SAT" .or "LRP" .or "LRP_SAT" .or
+ "MAD" .or "MAD_SAT" .or "MAX" .or "MAX_SAT" .or "MIN" .or "MIN_SAT" .or "MOV" .or "MOV_SAT" .or
+ "MUL" .or "MUL_SAT" .or "OPTION" .or "OUTPUT" .or "PARAM" .or "POW" .or "POW_SAT" .or "RCP" .or
+ "RCP_SAT" .or "RSQ" .or "RSQ_SAT" .or "SIN" .or "SIN_SAT" .or "SCS" .or "SCS_SAT" .or "SGE" .or
+ "SGE_SAT" .or "SLT" .or "SLT_SAT" .or "SUB" .or "SUB_SAT" .or "SWZ" .or "SWZ_SAT" .or "TEMP" .or
+ "TEX" .or "TEX_SAT" .or "TXB" .or "TXB_SAT" .or "TXP" .or "TXP_SAT" .or "XPD" .or "XPD_SAT" .or
+ "fragment" .or "program" .or "result" .or "state" .or "texture";
+vp_reserved_identifier
+ "ABS" .or "ADD" .or "ADDRESS" .or "ALIAS" .or "ARL" .or "ATTRIB" .or "DP3" .or "DP4" .or
+ "DPH" .or "DST" .or "END" .or "EX2" .or "EXP" .or "FLR" .or "FRC" .or "LG2" .or "LIT" .or
+ "LOG" .or "MAD" .or "MAX" .or "MIN" .or "MOV" .or "MUL" .or "OPTION" .or "OUTPUT" .or
+ "PARAM" .or "POW" .or "RCP" .or "RSQ" .or "SGE" .or "SLT" .or "SUB" .or "SWZ" .or "TEMP" .or
+ "XPD" .or "program" .or "result" .or "state" .or "vertex";
+
+/*
+ The <integer> rule matches an integer constant. The integer consists
+ of a sequence of one or more digits ("0" through "9").
+*/
+integer
+ integer_ne .error INTEGER_EXPECTED;
+
+zero
+ '0';
+
+leading_zeroes
+ .loop zero;
+
+no_digit
+ no_digit_1 .or .true;
+no_digit_1
+ digit10 .and .false .error INTEGER_OUT_OF_RANGE;
+
+all_zeroes
+ all_zeroes_1 .or no_digit_1;
+all_zeroes_1
+ '0' .and .loop zero .and no_digit;
+
+integer_0_3
+ integer_0_3_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;
+integer_0_3_1
+ integer_0_3_2 .or all_zeroes .emit '0';
+integer_0_3_2 /* [1, 3] */
+ leading_zeroes .and '1'-'3' .emit * .and no_digit;
+
+integer_0_63
+ integer_0_63_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;
+integer_0_63_1
+ integer_0_63_2 .or integer_0_63_3 .or integer_0_63_4 .or integer_0_63_5 .or
+ all_zeroes .emit '0';
+integer_0_63_2 /* [7, 9] */
+ leading_zeroes .and '7'-'9' .emit * .and no_digit;
+integer_0_63_3 /* [10, 59] */
+ leading_zeroes .and '1'-'5' .emit * .and '0'-'9' .emit * .and no_digit;
+integer_0_63_4 /* [60, 63] */
+ leading_zeroes .and '6' .emit * .and '0'-'3' .emit * .and no_digit;
+integer_0_63_5 /* [1, 6] */
+ leading_zeroes .and '1'-'6' .emit * .and no_digit;
+
+integer_0_64
+ integer_0_64_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;
+integer_0_64_1
+ integer_0_64_2 .or integer_0_64_3 .or integer_0_64_4 .or integer_0_64_5 .or
+ all_zeroes .emit '0';
+integer_0_64_2 /* [7, 9] */
+ leading_zeroes .and '7'-'9' .emit * .and no_digit;
+integer_0_64_3 /* [10, 59] */
+ leading_zeroes .and '1'-'5' .emit * .and '0'-'9' .emit * .and no_digit;
+integer_0_64_4 /* [60, 64] */
+ leading_zeroes .and '6' .emit * .and '0'-'4' .emit * .and no_digit;
+integer_0_64_5 /* [1, 6] */
+ leading_zeroes .and '1'-'6' .emit * .and no_digit;
+
+optional_space
+ space .or .true;
+
+space_dst
+ space .error OPERATION_NEEDS_DESTINATION_VARIABLE;
+
+space_src
+ space .error OPERATION_NEEDS_SOURCE_VARIABLE;
+
+space
+ single_space .and .loop single_space;
+
+single_space
+ white_char .or comment_block;
+
+white_char
+ ' ' .or '\t' .or '\n' .or '\r';
+
+comment_block
+ '#' .and .loop comment_char .and optional_new_line;
+
+/* All ASCII characters except '\r', '\n' and '\0' */
+comment_char
+ '\x0E'-'\xFF' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
+
+optional_new_line
+ '\n' .or crlf .or .true;
+
+crlf
+ '\r' .and '\n';
+
+semicolon
+ optional_space .and ';' .error MISSING_SEMICOLON .and optional_space;
+
+comma
+ optional_space .and ',' .error MISSING_COMMA .and optional_space;
+
+comma_ne
+ optional_space .and ',' .and optional_space;
+
+lbracket
+ optional_space .and '[' .error MISSING_LBRACKET .and optional_space;
+
+lbracket_ne
+ optional_space .and '[' .and optional_space;
+
+rbracket
+ optional_space .and ']' .error MISSING_RBRACKET .and optional_space;
+
+dot
+ optional_space .and '.' .error MISSING_DOT .and optional_space;
+
+dot_ne
+ optional_space .and '.' .and optional_space;
+
+equal
+ optional_space .and '=' .error MISSING_EQUAL .and optional_space;
+
+lbrace
+ optional_space .and '{' .error MISSING_LBRACE .and optional_space;
+
+lbrace_ne
+ optional_space .and '{' .and optional_space;
+
+rbrace
+ optional_space .and '}' .error MISSING_RBRACE .and optional_space;
+
+dotdot
+ optional_space .and '.' .and '.' .error MISSING_DOTDOT .and optional_space;
+
+dotdot_ne
+ optional_space .and '.' .and '.' .and optional_space;
+
+/*
+ The definition below accepts the following floating point number formats:
+ .99 .99e99 99. 99.99 99.99e99 99.e99 99e99
+ Also 99 format was considered and accepted because of a large number of existing program
+ strings with such a format.
+*/
+float
+ float_1 .or float_2 .or float_legacy;
+float_1
+ '.' .emit 0x00 .and integer_ne .error MISSING_FRACTION_OR_EXPONENT .and optional_exponent;
+float_2
+ integer_ne .and float_3;
+float_3
+ float_4 .or float_5;
+float_4
+ '.' .and optional_integer .and optional_exponent;
+float_5
+ exponent .emit 0x00;
+float_legacy
+ integer_ne .and .true .emit 0x00 .emit 0x00;
+
+/*
+ Below is a correct version of <float> definiton.
+*/
+/*
+float
+ float_1 .or float_2;
+float_1
+ '.' .emit 0x00 .and integer_ne .error MISSING_FRACTION_OR_EXPONENT .and optional_exponent;
+float_2
+ integer_ne .and float_3 .error MISSING_DOT_OR_EXPONENT;
+float_3
+ float_4 .or float_5;
+float_4
+ '.' .and optional_integer .and optional_exponent;
+float_5
+ exponent .emit 0x00;
+*/
+
+integer_ne
+ integer_ne_1 .and .true .emit 0x00 .emit $;
+integer_ne_1
+ digit10 .emit * .and .loop digit10 .emit *;
+
+optional_integer
+ integer_ne .or .true .emit 0x00;
+
+/*
+NOTE: If exponent part is omited we treat it as if it was "E+1".
+*/
+optional_exponent
+ exponent .or .true .emit 0x00;
+
+exponent
+ exponent_1 .and optional_sign_ne .and integer_ne .error EXPONENT_VALUE_EXPECTED;
+exponent_1
+ 'e' .or 'E';
+
+optional_sign_ne
+ minus_ne .or plus_ne .or .true;
+
+plus_ne
+ optional_space .and '+' .and optional_space;
+
+minus_ne
+ optional_space .and '-' .emit '-' .and optional_space;
+
+identifier_ne
+ first_idchar .emit * .and .loop follow_idchar .emit * .and .true .emit 0x00 .emit $;
+
+follow_idchar
+ first_idchar .or digit10;
+
+first_idchar
+ 'a'-'z' .or 'A'-'Z' .or '_' .or '$';
+
+digit10
+ '0'-'9';
+
+/*
+ string filtering - if a string is encountered in grammar ("blabla"), the symbol below is
+ executed to create the string. The symbol must not throw any errors and emit bytes - it should
+ stop if it encounters invalid character. After this the resulting string (from starting
+ position up to the invalid character (but without it) is compared with the grammar string.
+*/
+.string __string_filter;
+
+__string_filter
+ .loop __identifier_char;
+
+__identifier_char
+ 'a'-'z' .or 'A'-'Z' .or '_' .or '$' .or '0'-'9';
+
+/*
+ error token filtering
+*/
+e_signature
+ e_signature_char .and .loop e_signature_char;
+e_signature_char
+ '!' .or '.' .or 'A'-'Z' .or 'a'-'z' .or '0'-'9';
+
+e_statement
+ .loop e_statement_not_term;
+/* All ASCII characters to one of '\r', '\n', '\0' and ';' */
+e_statement_not_term
+ '\x3C'-'\xFF' .or '\x0E'-'\x3A' .or '\x01'-'\x09' .or '\x0B'-'\x0C';
+
+e_identifier
+ e_identifier_first .and .loop e_identifier_next;
+e_identifier_first
+ 'a'-'z' .or 'A'-'Z' .or '_' .or '$';
+e_identifier_next
+ e_identifier_first .or '0'-'9';
+
+e_token
+ e_identifier .or e_token_number .or '[' .or ']' .or '.' .or '{' .or '}' .or '=' .or '+' .or
+ '-' .or ',' .or ';';
+e_token_number
+ e_token_digit .and .loop e_token_digit;
+e_token_digit
+ '0'-'9';
+
+e_charordigit
+ 'A'-'Z' .or 'a'-'z' .or '0'-'9';
+