--- /dev/null
+.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
--- /dev/null
+".syntax program;\n"\r
+".emtcode REVISION 0x07\n"\r
+".emtcode FRAGMENT_PROGRAM 0x01\n"\r
+".emtcode VERTEX_PROGRAM 0x02\n"\r
+".emtcode OPTION 0x01\n"\r
+".emtcode INSTRUCTION 0x02\n"\r
+".emtcode DECLARATION 0x03\n"\r
+".emtcode END 0x04\n"\r
+".emtcode ARB_PRECISION_HINT_FASTEST 0x01\n"\r
+".emtcode ARB_PRECISION_HINT_NICEST 0x02\n"\r
+".emtcode ARB_FOG_EXP 0x04\n"\r
+".emtcode ARB_FOG_EXP2 0x08\n"\r
+".emtcode ARB_FOG_LINEAR 0x10\n"\r
+".emtcode ARB_POSITION_INVARIANT 0x20\n"\r
+".emtcode ARB_FRAGMENT_PROGRAM_SHADOW 0x40\n"\r
+".emtcode OP_ALU_INST 0x00\n"\r
+".emtcode OP_TEX_INST 0x01\n"\r
+".emtcode OP_ALU_VECTOR 0x00\n"\r
+".emtcode OP_ALU_SCALAR 0x01\n"\r
+".emtcode OP_ALU_BINSC 0x02\n"\r
+".emtcode OP_ALU_BIN 0x03\n"\r
+".emtcode OP_ALU_TRI 0x04\n"\r
+".emtcode OP_ALU_SWZ 0x05\n"\r
+".emtcode OP_TEX_SAMPLE 0x06\n"\r
+".emtcode OP_TEX_KIL 0x07\n"\r
+".emtcode OP_ALU_ARL 0x08\n"\r
+".emtcode OP_ABS 0x00\n"\r
+".emtcode OP_ABS_SAT 0x1B\n"\r
+".emtcode OP_FLR 0x09\n"\r
+".emtcode OP_FLR_SAT 0x26\n"\r
+".emtcode OP_FRC 0x0A\n"\r
+".emtcode OP_FRC_SAT 0x27\n"\r
+".emtcode OP_LIT 0x0C\n"\r
+".emtcode OP_LIT_SAT 0x2A\n"\r
+".emtcode OP_MOV 0x11\n"\r
+".emtcode OP_MOV_SAT 0x30\n"\r
+".emtcode OP_COS 0x1F\n"\r
+".emtcode OP_COS_SAT 0x20\n"\r
+".emtcode OP_EX2 0x07\n"\r
+".emtcode OP_EX2_SAT 0x25\n"\r
+".emtcode OP_LG2 0x0B\n"\r
+".emtcode OP_LG2_SAT 0x29\n"\r
+".emtcode OP_RCP 0x14\n"\r
+".emtcode OP_RCP_SAT 0x33\n"\r
+".emtcode OP_RSQ 0x15\n"\r
+".emtcode OP_RSQ_SAT 0x34\n"\r
+".emtcode OP_SIN 0x38\n"\r
+".emtcode OP_SIN_SAT 0x39\n"\r
+".emtcode OP_SCS 0x35\n"\r
+".emtcode OP_SCS_SAT 0x36\n"\r
+".emtcode OP_POW 0x13\n"\r
+".emtcode OP_POW_SAT 0x32\n"\r
+".emtcode OP_ADD 0x01\n"\r
+".emtcode OP_ADD_SAT 0x1C\n"\r
+".emtcode OP_DP3 0x03\n"\r
+".emtcode OP_DP3_SAT 0x21\n"\r
+".emtcode OP_DP4 0x04\n"\r
+".emtcode OP_DP4_SAT 0x22\n"\r
+".emtcode OP_DPH 0x05\n"\r
+".emtcode OP_DPH_SAT 0x23\n"\r
+".emtcode OP_DST 0x06\n"\r
+".emtcode OP_DST_SAT 0x24\n"\r
+".emtcode OP_MAX 0x0F\n"\r
+".emtcode OP_MAX_SAT 0x2E\n"\r
+".emtcode OP_MIN 0x10\n"\r
+".emtcode OP_MIN_SAT 0x2F\n"\r
+".emtcode OP_MUL 0x12\n"\r
+".emtcode OP_MUL_SAT 0x31\n"\r
+".emtcode OP_SGE 0x16\n"\r
+".emtcode OP_SGE_SAT 0x37\n"\r
+".emtcode OP_SLT 0x17\n"\r
+".emtcode OP_SLT_SAT 0x3A\n"\r
+".emtcode OP_SUB 0x18\n"\r
+".emtcode OP_SUB_SAT 0x3B\n"\r
+".emtcode OP_XPD 0x1A\n"\r
+".emtcode OP_XPD_SAT 0x43\n"\r
+".emtcode OP_CMP 0x1D\n"\r
+".emtcode OP_CMP_SAT 0x1E\n"\r
+".emtcode OP_LRP 0x2B\n"\r
+".emtcode OP_LRP_SAT 0x2C\n"\r
+".emtcode OP_MAD 0x0E\n"\r
+".emtcode OP_MAD_SAT 0x2D\n"\r
+".emtcode OP_SWZ 0x19\n"\r
+".emtcode OP_SWZ_SAT 0x3C\n"\r
+".emtcode OP_TEX 0x3D\n"\r
+".emtcode OP_TEX_SAT 0x3E\n"\r
+".emtcode OP_TXB 0x3F\n"\r
+".emtcode OP_TXB_SAT 0x40\n"\r
+".emtcode OP_TXP 0x41\n"\r
+".emtcode OP_TXP_SAT 0x42\n"\r
+".emtcode OP_KIL 0x28\n"\r
+".emtcode OP_ARL 0x02\n"\r
+".emtcode OP_EXP 0x08\n"\r
+".emtcode OP_LOG 0x0D\n"\r
+".emtcode FRAGMENT_ATTRIB_COLOR 0x01\n"\r
+".emtcode FRAGMENT_ATTRIB_TEXCOORD 0x02\n"\r
+".emtcode FRAGMENT_ATTRIB_FOGCOORD 0x03\n"\r
+".emtcode FRAGMENT_ATTRIB_POSITION 0x04\n"\r
+".emtcode VERTEX_ATTRIB_POSITION 0x01\n"\r
+".emtcode VERTEX_ATTRIB_WEIGHT 0x02\n"\r
+".emtcode VERTEX_ATTRIB_NORMAL 0x03\n"\r
+".emtcode VERTEX_ATTRIB_COLOR 0x04\n"\r
+".emtcode VERTEX_ATTRIB_FOGCOORD 0x05\n"\r
+".emtcode VERTEX_ATTRIB_TEXCOORD 0x06\n"\r
+".emtcode VERTEX_ATTRIB_MATRIXINDEX 0x07\n"\r
+".emtcode VERTEX_ATTRIB_GENERIC 0x08\n"\r
+".emtcode FRAGMENT_RESULT_COLOR 0x01\n"\r
+".emtcode FRAGMENT_RESULT_DEPTH 0x02\n"\r
+".emtcode VERTEX_RESULT_POSITION 0x01\n"\r
+".emtcode VERTEX_RESULT_COLOR 0x02\n"\r
+".emtcode VERTEX_RESULT_FOGCOORD 0x03\n"\r
+".emtcode VERTEX_RESULT_POINTSIZE 0x04\n"\r
+".emtcode VERTEX_RESULT_TEXCOORD 0x05\n"\r
+".emtcode TEXTARGET_1D 0x01\n"\r
+".emtcode TEXTARGET_2D 0x02\n"\r
+".emtcode TEXTARGET_3D 0x03\n"\r
+".emtcode TEXTARGET_RECT 0x04\n"\r
+".emtcode TEXTARGET_CUBE 0x05\n"\r
+".emtcode TEXTARGET_SHADOW1D 0x06\n"\r
+".emtcode TEXTARGET_SHADOW2D 0x07\n"\r
+".emtcode TEXTARGET_SHADOWRECT 0x08\n"\r
+".emtcode FACE_FRONT 0x00\n"\r
+".emtcode FACE_BACK 0x01\n"\r
+".emtcode COLOR_PRIMARY 0x00\n"\r
+".emtcode COLOR_SECONDARY 0x01\n"\r
+".emtcode COMPONENT_X 0x00\n"\r
+".emtcode COMPONENT_Y 0x01\n"\r
+".emtcode COMPONENT_Z 0x02\n"\r
+".emtcode COMPONENT_W 0x03\n"\r
+".emtcode COMPONENT_0 0x04\n"\r
+".emtcode COMPONENT_1 0x05\n"\r
+".emtcode ARRAY_INDEX_ABSOLUTE 0x00\n"\r
+".emtcode ARRAY_INDEX_RELATIVE 0x01\n"\r
+".emtcode MATRIX_MODELVIEW 0x01\n"\r
+".emtcode MATRIX_PROJECTION 0x02\n"\r
+".emtcode MATRIX_MVP 0x03\n"\r
+".emtcode MATRIX_TEXTURE 0x04\n"\r
+".emtcode MATRIX_PALETTE 0x05\n"\r
+".emtcode MATRIX_PROGRAM 0x06\n"\r
+".emtcode MATRIX_MODIFIER_IDENTITY 0x00\n"\r
+".emtcode MATRIX_MODIFIER_INVERSE 0x01\n"\r
+".emtcode MATRIX_MODIFIER_TRANSPOSE 0x02\n"\r
+".emtcode MATRIX_MODIFIER_INVTRANS 0x03\n"\r
+".emtcode CONSTANT_SCALAR 0x01\n"\r
+".emtcode CONSTANT_VECTOR 0x02\n"\r
+".emtcode PROGRAM_PARAM_ENV 0x01\n"\r
+".emtcode PROGRAM_PARAM_LOCAL 0x02\n"\r
+".emtcode REGISTER_ATTRIB 0x01\n"\r
+".emtcode REGISTER_PARAM 0x02\n"\r
+".emtcode REGISTER_RESULT 0x03\n"\r
+".emtcode REGISTER_ESTABLISHED_NAME 0x04\n"\r
+".emtcode PARAM_NULL 0x00\n"\r
+".emtcode PARAM_ARRAY_ELEMENT 0x01\n"\r
+".emtcode PARAM_STATE_ELEMENT 0x02\n"\r
+".emtcode PARAM_PROGRAM_ELEMENT 0x03\n"\r
+".emtcode PARAM_PROGRAM_ELEMENTS 0x04\n"\r
+".emtcode PARAM_CONSTANT 0x05\n"\r
+".emtcode STATE_MATERIAL 0x01\n"\r
+".emtcode STATE_LIGHT 0x02\n"\r
+".emtcode STATE_LIGHT_MODEL 0x03\n"\r
+".emtcode STATE_LIGHT_PROD 0x04\n"\r
+".emtcode STATE_FOG 0x05\n"\r
+".emtcode STATE_MATRIX_ROWS 0x06\n"\r
+".emtcode STATE_TEX_ENV 0x07\n"\r
+".emtcode STATE_DEPTH 0x08\n"\r
+".emtcode STATE_TEX_GEN 0x09\n"\r
+".emtcode STATE_CLIP_PLANE 0x0A\n"\r
+".emtcode STATE_POINT 0x0B\n"\r
+".emtcode MATERIAL_AMBIENT 0x01\n"\r
+".emtcode MATERIAL_DIFFUSE 0x02\n"\r
+".emtcode MATERIAL_SPECULAR 0x03\n"\r
+".emtcode MATERIAL_EMISSION 0x04\n"\r
+".emtcode MATERIAL_SHININESS 0x05\n"\r
+".emtcode LIGHT_AMBIENT 0x01\n"\r
+".emtcode LIGHT_DIFFUSE 0x02\n"\r
+".emtcode LIGHT_SPECULAR 0x03\n"\r
+".emtcode LIGHT_POSITION 0x04\n"\r
+".emtcode LIGHT_ATTENUATION 0x05\n"\r
+".emtcode LIGHT_HALF 0x06\n"\r
+".emtcode LIGHT_SPOT_DIRECTION 0x07\n"\r
+".emtcode LIGHT_MODEL_AMBIENT 0x01\n"\r
+".emtcode LIGHT_MODEL_SCENECOLOR 0x02\n"\r
+".emtcode LIGHT_PROD_AMBIENT 0x01\n"\r
+".emtcode LIGHT_PROD_DIFFUSE 0x02\n"\r
+".emtcode LIGHT_PROD_SPECULAR 0x03\n"\r
+".emtcode TEX_ENV_COLOR 0x01\n"\r
+".emtcode TEX_GEN_EYE 0x01\n"\r
+".emtcode TEX_GEN_OBJECT 0x02\n"\r
+".emtcode FOG_COLOR 0x01\n"\r
+".emtcode FOG_PARAMS 0x02\n"\r
+".emtcode DEPTH_RANGE 0x01\n"\r
+".emtcode POINT_SIZE 0x01\n"\r
+".emtcode POINT_ATTENUATION 0x02\n"\r
+".emtcode ATTRIB 0x01\n"\r
+".emtcode PARAM 0x02\n"\r
+".emtcode TEMP 0x03\n"\r
+".emtcode OUTPUT 0x04\n"\r
+".emtcode ALIAS 0x05\n"\r
+".emtcode ADDRESS 0x06\n"\r
+".errtext UNKNOWN_PROGRAM_SIGNATURE \"1001: '$e_signature$': unknown program signature\"\n"\r
+".errtext MISSING_END_OR_INVALID_STATEMENT \"1002: '$e_statement$': invalid statement\"\n"\r
+".errtext CODE_AFTER_END \"1003: '$e_statement$': code after 'END' keyword\"\n"\r
+".errtext INVALID_PROGRAM_OPTION \"1004: '$e_identifier$': invalid program option\"\n"\r
+".errtext EXT_SWIZ_COMP_EXPECTED \"1005: extended swizzle component expected but '$e_token$' found\"\n"\r
+".errtext TEX_TARGET_EXPECTED \"1006: texture target expected but '$e_token$' found\"\n"\r
+".errtext TEXTURE_EXPECTED \"1007: 'texture' expected but '$e_identifier$' found\"\n"\r
+".errtext SOURCE_REGISTER_EXPECTED \"1008: source register expected but '$e_token$' found\"\n"\r
+".errtext DESTINATION_REGISTER_EXPECTED \"1009: destination register expected but '$e_token$' found\"\n"\r
+".errtext INVALID_ADDRESS_COMPONENT \"1010: '$e_identifier$': invalid address component\"\n"\r
+".errtext INVALID_ADDRESS_WRITEMASK \"1011: '$e_identifier$': invalid address writemask\"\n"\r
+".errtext INVALID_COMPONENT \"1012: '$e_charordigit$': invalid component\"\n"\r
+".errtext INVALID_SUFFIX \"1013: '$e_identifier$': invalid suffix\"\n"\r
+".errtext INVALID_WRITEMASK \"1014: '$e_identifier$': invalid writemask\"\n"\r
+".errtext FRAGMENT_EXPECTED \"1015: 'fragment' expected but '$e_identifier$' found\"\n"\r
+".errtext VERTEX_EXPECTED \"1016: 'vertex' expected but '$e_identifier$' found\"\n"\r
+".errtext INVALID_FRAGMENT_PROPERTY \"1017: '$e_identifier$': invalid fragment property\"\n"\r
+".errtext INVALID_VERTEX_PROPERTY \"1018: '$e_identifier$': invalid vertex property\"\n"\r
+".errtext INVALID_STATE_PROPERTY \"1019: '$e_identifier$': invalid state property\"\n"\r
+".errtext INVALID_MATERIAL_PROPERTY \"1020: '$e_identifier$': invalid material property\"\n"\r
+".errtext INVALID_LIGHT_PROPERTY \"1021: '$e_identifier$': invalid light property\"\n"\r
+".errtext INVALID_SPOT_PROPERTY \"1022: '$e_identifier$': invalid spot property\"\n"\r
+".errtext INVALID_LIGHTMODEL_PROPERTY \"1023: '$e_identifier$': invalid light model property\"\n"\r
+".errtext INVALID_LIGHTPROD_PROPERTY \"1024: '$e_identifier$': invalid light product property\"\n"\r
+".errtext INVALID_TEXENV_PROPERTY \"1025: '$e_identifier$': invalid texture environment property\"\n"\r
+".errtext INVALID_TEXGEN_PROPERTY \"1026: '$e_identifier$': invalid texture generating property\"\n"\r
+".errtext INVALID_TEXGEN_COORD \"1027: '$e_identifier$': invalid texture generating coord\"\n"\r
+".errtext INVALID_FOG_PROPERTY \"1028: '$e_identifier$': invalid fog property\"\n"\r
+".errtext INVALID_DEPTH_PROPERTY \"1029: '$e_identifier$': invalid depth property\"\n"\r
+".errtext INVALID_CLIPPLANE_PROPERTY \"1030: '$e_identifier$': invalid clip plane property\"\n"\r
+".errtext INVALID_POINT_PROPERTY \"1031: '$e_identifier$': invalid point property\"\n"\r
+".errtext MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED \"1032: matrix row selector or modifier expected but '$e_token$' found\"\n"\r
+".errtext INVALID_MATRIX_NAME \"1033: '$e_identifier$': invalid matrix name\"\n"\r
+".errtext INVALID_PROGRAM_PROPERTY \"1034: '$e_identifier$': invalid program property\"\n"\r
+".errtext RESULT_EXPECTED \"1035: 'result' expected but '$e_token$' found\"\n"\r
+".errtext INVALID_RESULT_PROPERTY \"1036: '$e_identifier$': invalid result property\"\n"\r
+".errtext INVALID_FACE_PROPERTY \"1037: '$e_identifier$': invalid face property\"\n"\r
+".errtext INVALID_COLOR_PROPERTY \"1038: '$e_identifier$': invalid color property\"\n"\r
+".errtext IDENTIFIER_EXPECTED \"1039: identifier expected but '$e_token$' found\"\n"\r
+".errtext RESERVED_KEYWORD \"1040: use of reserved keyword as an identifier\"\n"\r
+".errtext INTEGER_EXPECTED \"1041: integer value expected but '$e_token$' found\"\n"\r
+".errtext MISSING_SEMICOLON \"1042: ';' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_COMMA \"1043: ',' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_LBRACKET \"1044: '[' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_RBRACKET \"1045: ']' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_DOT \"1046: '.' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_EQUAL \"1047: '=' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_LBRACE \"1048: '{' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_RBRACE \"1049: '}' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_DOTDOT \"1050: '..' expected but '$e_token$' found\"\n"\r
+".errtext MISSING_FRACTION_OR_EXPONENT \"1051: missing fraction part or exponent\"\n"\r
+".errtext MISSING_DOT_OR_EXPONENT \"1052: missing '.' or exponent\"\n"\r
+".errtext EXPONENT_VALUE_EXPECTED \"1053: exponent value expected\"\n"\r
+".errtext INTEGER_OUT_OF_RANGE \"1054: integer value out of range\"\n"\r
+".errtext OPERATION_NEEDS_DESTINATION_VARIABLE \"1055: operation needs destination variable\"\n"\r
+".errtext OPERATION_NEEDS_SOURCE_VARIABLE \"1056: operation needs source variable\"\n"\r
+".errtext ADDRESS_REGISTER_EXPECTED \"1057: address register expected but '$e_token$' found\"\n"\r
+".errtext ADDRESS_REGISTER_OR_INTEGER_EXPECTED \"1058: address register or integer literal expected but '$e_token$' found\"\n"\r
+".regbyte vertex_blend 0x00\n"\r
+".regbyte matrix_palette 0x00\n"\r
+".regbyte point_parameters 0x01\n"\r
+".regbyte secondary_color 0x01\n"\r
+".regbyte fog_coord 0x01\n"\r
+".regbyte texture_rectangle 0x01\n"\r
+".regbyte fragment_program_shadow 0x00\n"\r
+".regbyte ARB_precision_hint_fastest 0x00\n"\r
+".regbyte ARB_precision_hint_nicest 0x00\n"\r
+".regbyte ARB_fog_exp 0x00\n"\r
+".regbyte ARB_fog_exp2 0x00\n"\r
+".regbyte ARB_fog_linear 0x00\n"\r
+".regbyte ARB_position_invariant 0x00\n"\r
+".regbyte ARB_fragment_program_shadow 0x00\n"\r
+".regbyte program_target 0x00\n"\r
+"program\n"\r
+" programs .error UNKNOWN_PROGRAM_SIGNATURE .emit REVISION;\n"\r
+"programs\n"\r
+" .if (program_target == 0x10) frag_program_1_0 .emit FRAGMENT_PROGRAM .emit 0x01 .emit 0x00 .or\n"\r
+" .if (program_target == 0x20) vert_program_1_0 .emit VERTEX_PROGRAM .emit 0x01 .emit 0x00;\n"\r
+"frag_program_1_0\n"\r
+" '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'f' .and 'p' .and '1' .and '.' .and '0' .and\n"\r
+" optional_space .and fp_optionSequence .and fp_statementSequence .and\n"\r
+" \"END\" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and\n"\r
+" '\\0' .error CODE_AFTER_END;\n"\r
+"vert_program_1_0\n"\r
+" '!' .and '!' .and 'A' .and 'R' .and 'B' .and 'v' .and 'p' .and '1' .and '.' .and '0' .and\n"\r
+" optional_space .and vp_optionSequence .and vp_statementSequence .and\n"\r
+" \"END\" .error MISSING_END_OR_INVALID_STATEMENT .emit END .and optional_space .and\n"\r
+" '\\0' .error CODE_AFTER_END;\n"\r
+"fp_optionSequence\n"\r
+" .loop fp_option;\n"\r
+"vp_optionSequence\n"\r
+" .loop vp_option;\n"\r
+"fp_option\n"\r
+" \"OPTION\" .emit OPTION .and space .error IDENTIFIER_EXPECTED .and\n"\r
+" fp_optionString .error INVALID_PROGRAM_OPTION .and semicolon;\n"\r
+"vp_option\n"\r
+" \"OPTION\" .emit OPTION .and space .error IDENTIFIER_EXPECTED .and\n"\r
+" vp_optionString .error INVALID_PROGRAM_OPTION .and semicolon;\n"\r
+"fp_optionString\n"\r
+" .if (ARB_precision_hint_nicest == 0x00) \"ARB_precision_hint_fastest\"\n"\r
+" .emit ARB_PRECISION_HINT_FASTEST .load ARB_precision_hint_fastest 0x01 .or\n"\r
+" .if (ARB_precision_hint_fastest == 0x00) \"ARB_precision_hint_nicest\"\n"\r
+" .emit ARB_PRECISION_HINT_NICEST .load ARB_precision_hint_nicest 0x01 .or\n"\r
+" fp_ARB_fog_exp .emit ARB_FOG_EXP .load ARB_fog_exp 0x01 .or\n"\r
+" fp_ARB_fog_exp2 .emit ARB_FOG_EXP2 .load ARB_fog_exp2 0x01 .or\n"\r
+" fp_ARB_fog_linear .emit ARB_FOG_LINEAR .load ARB_fog_linear 0x01 .or\n"\r
+" .if (fragment_program_shadow != 0x00) \"ARB_fragment_program_shadow\"\n"\r
+" .emit ARB_FRAGMENT_PROGRAM_SHADOW .load ARB_fragment_program_shadow 0x01;\n"\r
+"vp_optionString\n"\r
+" \"ARB_position_invariant\" .emit ARB_POSITION_INVARIANT .load ARB_position_invariant 0x01;\n"\r
+"fp_ARB_fog_exp\n"\r
+" .if (ARB_fog_exp2 == 0x00) .true .and .if (ARB_fog_linear == 0x00) \"ARB_fog_exp\";\n"\r
+"fp_ARB_fog_exp2\n"\r
+" .if (ARB_fog_exp == 0x00) .true .and .if (ARB_fog_linear == 0x00) \"ARB_fog_exp2\";\n"\r
+"fp_ARB_fog_linear\n"\r
+" .if (ARB_fog_exp == 0x00) .true .and .if (ARB_fog_exp2 == 0x00) \"ARB_fog_linear\";\n"\r
+"fp_statementSequence\n"\r
+" .loop fp_statement;\n"\r
+"vp_statementSequence\n"\r
+" .loop vp_statement;\n"\r
+"fp_statement\n"\r
+" fp_statement_1 .or fp_statement_2;\n"\r
+"vp_statement\n"\r
+" vp_statement_1 .or vp_statement_2;\n"\r
+"fp_statement_1\n"\r
+" fp_instruction .emit INSTRUCTION .emit $ .and semicolon;\n"\r
+"fp_statement_2\n"\r
+" fp_namingStatement .emit DECLARATION .and semicolon;\n"\r
+"vp_statement_1\n"\r
+" vp_instruction .emit INSTRUCTION .emit $ .and semicolon;\n"\r
+"vp_statement_2\n"\r
+" vp_namingStatement .emit DECLARATION .and semicolon;\n"\r
+"fp_instruction\n"\r
+" ALUInstruction .emit OP_ALU_INST .or\n"\r
+" TexInstruction .emit OP_TEX_INST;\n"\r
+"vp_instruction\n"\r
+" ARL_instruction .emit OP_ALU_ARL .or\n"\r
+" vp_VECTORop_instruction .emit OP_ALU_VECTOR .or\n"\r
+" vp_SCALARop_instruction .emit OP_ALU_SCALAR .or\n"\r
+" vp_BINSCop_instruction .emit OP_ALU_BINSC .or\n"\r
+" vp_BINop_instruction .emit OP_ALU_BIN .or\n"\r
+" vp_TRIop_instruction .emit OP_ALU_TRI .or\n"\r
+" vp_SWZ_instruction .emit OP_ALU_SWZ;\n"\r
+"ALUInstruction\n"\r
+" fp_VECTORop_instruction .emit OP_ALU_VECTOR .or\n"\r
+" fp_SCALARop_instruction .emit OP_ALU_SCALAR .or\n"\r
+" fp_BINSCop_instruction .emit OP_ALU_BINSC .or\n"\r
+" fp_BINop_instruction .emit OP_ALU_BIN .or\n"\r
+" fp_TRIop_instruction .emit OP_ALU_TRI .or\n"\r
+" fp_SWZ_instruction .emit OP_ALU_SWZ;\n"\r
+"TexInstruction\n"\r
+" SAMPLE_instruction .emit OP_TEX_SAMPLE .or\n"\r
+" KIL_instruction .emit OP_TEX_KIL;\n"\r
+"ARL_instruction\n"\r
+" \"ARL\" .emit OP_ARL .and space_dst .and maskedAddrReg .and comma .and vp_scalarSrcReg;\n"\r
+"fp_VECTORop_instruction\n"\r
+" fp_VECTORop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg;\n"\r
+"vp_VECTORop_instruction\n"\r
+" vp_VECTORop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg;\n"\r
+"fp_VECTORop\n"\r
+" \"ABS\" .emit OP_ABS .or \"ABS_SAT\" .emit OP_ABS_SAT .or\n"\r
+" \"FLR\" .emit OP_FLR .or \"FLR_SAT\" .emit OP_FLR_SAT .or\n"\r
+" \"FRC\" .emit OP_FRC .or \"FRC_SAT\" .emit OP_FRC_SAT .or\n"\r
+" \"LIT\" .emit OP_LIT .or \"LIT_SAT\" .emit OP_LIT_SAT .or\n"\r
+" \"MOV\" .emit OP_MOV .or \"MOV_SAT\" .emit OP_MOV_SAT;\n"\r
+"vp_VECTORop\n"\r
+" \"ABS\" .emit OP_ABS .or\n"\r
+" \"FLR\" .emit OP_FLR .or\n"\r
+" \"FRC\" .emit OP_FRC .or\n"\r
+" \"LIT\" .emit OP_LIT .or\n"\r
+" \"MOV\" .emit OP_MOV;\n"\r
+"fp_SCALARop_instruction\n"\r
+" fp_SCALARop .and space_dst .and fp_maskedDstReg .and comma .and fp_scalarSrcReg;\n"\r
+"vp_SCALARop_instruction\n"\r
+" vp_SCALARop .and space_dst .and vp_maskedDstReg .and comma .and vp_scalarSrcReg;\n"\r
+"fp_SCALARop\n"\r
+" \"COS\" .emit OP_COS .or \"COS_SAT\" .emit OP_COS_SAT .or\n"\r
+" \"EX2\" .emit OP_EX2 .or \"EX2_SAT\" .emit OP_EX2_SAT .or\n"\r
+" \"LG2\" .emit OP_LG2 .or \"LG2_SAT\" .emit OP_LG2_SAT .or\n"\r
+" \"RCP\" .emit OP_RCP .or \"RCP_SAT\" .emit OP_RCP_SAT .or\n"\r
+" \"RSQ\" .emit OP_RSQ .or \"RSQ_SAT\" .emit OP_RSQ_SAT .or\n"\r
+" \"SIN\" .emit OP_SIN .or \"SIN_SAT\" .emit OP_SIN_SAT .or\n"\r
+" \"SCS\" .emit OP_SCS .or \"SCS_SAT\" .emit OP_SCS_SAT;\n"\r
+"vp_SCALARop\n"\r
+" \"EX2\" .emit OP_EX2 .or\n"\r
+" \"EXP\" .emit OP_EXP .or\n"\r
+" \"LG2\" .emit OP_LG2 .or\n"\r
+" \"LOG\" .emit OP_LOG .or\n"\r
+" \"RCP\" .emit OP_RCP .or\n"\r
+" \"RSQ\" .emit OP_RSQ;\n"\r
+"fp_BINSCop_instruction\n"\r
+" fp_BINSCop .and space_dst .and fp_maskedDstReg .and comma .and fp_scalarSrcReg .and comma .and\n"\r
+" fp_scalarSrcReg;\n"\r
+"vp_BINSCop_instruction\n"\r
+" vp_BINSCop .and space_dst .and vp_maskedDstReg .and comma .and vp_scalarSrcReg .and comma .and\n"\r
+" vp_scalarSrcReg;\n"\r
+"fp_BINSCop\n"\r
+" \"POW\" .emit OP_POW .or \"POW_SAT\" .emit OP_POW_SAT;\n"\r
+"vp_BINSCop\n"\r
+" \"POW\" .emit OP_POW;\n"\r
+"fp_BINop_instruction\n"\r
+" fp_BINop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\n"\r
+" vectorSrcReg;\n"\r
+"vp_BINop_instruction\n"\r
+" vp_BINop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and\n"\r
+" swizzleSrcReg;\n"\r
+"fp_BINop\n"\r
+" \"ADD\" .emit OP_ADD .or \"ADD_SAT\" .emit OP_ADD_SAT .or\n"\r
+" \"DP3\" .emit OP_DP3 .or \"DP3_SAT\" .emit OP_DP3_SAT .or\n"\r
+" \"DP4\" .emit OP_DP4 .or \"DP4_SAT\" .emit OP_DP4_SAT .or\n"\r
+" \"DPH\" .emit OP_DPH .or \"DPH_SAT\" .emit OP_DPH_SAT .or\n"\r
+" \"DST\" .emit OP_DST .or \"DST_SAT\" .emit OP_DST_SAT .or\n"\r
+" \"MAX\" .emit OP_MAX .or \"MAX_SAT\" .emit OP_MAX_SAT .or\n"\r
+" \"MIN\" .emit OP_MIN .or \"MIN_SAT\" .emit OP_MIN_SAT .or\n"\r
+" \"MUL\" .emit OP_MUL .or \"MUL_SAT\" .emit OP_MUL_SAT .or\n"\r
+" \"SGE\" .emit OP_SGE .or \"SGE_SAT\" .emit OP_SGE_SAT .or\n"\r
+" \"SLT\" .emit OP_SLT .or \"SLT_SAT\" .emit OP_SLT_SAT .or\n"\r
+" \"SUB\" .emit OP_SUB .or \"SUB_SAT\" .emit OP_SUB_SAT .or\n"\r
+" \"XPD\" .emit OP_XPD .or \"XPD_SAT\" .emit OP_XPD_SAT;\n"\r
+"vp_BINop\n"\r
+" \"ADD\" .emit OP_ADD .or\n"\r
+" \"DP3\" .emit OP_DP3 .or\n"\r
+" \"DP4\" .emit OP_DP4 .or\n"\r
+" \"DPH\" .emit OP_DPH .or\n"\r
+" \"DST\" .emit OP_DST .or\n"\r
+" \"MAX\" .emit OP_MAX .or\n"\r
+" \"MIN\" .emit OP_MIN .or\n"\r
+" \"MUL\" .emit OP_MUL .or\n"\r
+" \"SGE\" .emit OP_SGE .or\n"\r
+" \"SLT\" .emit OP_SLT .or\n"\r
+" \"SUB\" .emit OP_SUB .or\n"\r
+" \"XPD\" .emit OP_XPD;\n"\r
+"fp_TRIop_instruction\n"\r
+" fp_TRIop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\n"\r
+" vectorSrcReg .and comma .and vectorSrcReg;\n"\r
+"vp_TRIop_instruction\n"\r
+" vp_TRIop .and space_dst .and vp_maskedDstReg .and comma .and swizzleSrcReg .and comma .and\n"\r
+" swizzleSrcReg .and comma .and swizzleSrcReg;\n"\r
+"fp_TRIop\n"\r
+" \"CMP\" .emit OP_CMP .or \"CMP_SAT\" .emit OP_CMP_SAT .or\n"\r
+" \"LRP\" .emit OP_LRP .or \"LRP_SAT\" .emit OP_LRP_SAT .or\n"\r
+" \"MAD\" .emit OP_MAD .or \"MAD_SAT\" .emit OP_MAD_SAT;\n"\r
+"vp_TRIop\n"\r
+" \"MAD\" .emit OP_MAD;\n"\r
+"fp_SWZ_instruction\n"\r
+" SWZop .and space_dst .and fp_maskedDstReg .and comma .and fp_srcReg .and comma .and\n"\r
+" fp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;\n"\r
+"vp_SWZ_instruction\n"\r
+" \"SWZ\" .emit OP_SWZ .and space_dst .and vp_maskedDstReg .and comma .and vp_srcReg .and comma .and\n"\r
+" vp_extendedSwizzle .error EXT_SWIZ_COMP_EXPECTED;\n"\r
+"SWZop\n"\r
+" \"SWZ\" .emit OP_SWZ .or \"SWZ_SAT\" .emit OP_SWZ_SAT;\n"\r
+"SAMPLE_instruction\n"\r
+" SAMPLEop .and space_dst .and fp_maskedDstReg .and comma .and vectorSrcReg .and comma .and\n"\r
+" texImageUnit .and comma .and texTarget .error TEX_TARGET_EXPECTED;\n"\r
+"SAMPLEop\n"\r
+" \"TEX\" .emit OP_TEX .or \"TEX_SAT\" .emit OP_TEX_SAT .or\n"\r
+" \"TXB\" .emit OP_TXB .or \"TXB_SAT\" .emit OP_TXB_SAT .or\n"\r
+" \"TXP\" .emit OP_TXP .or \"TXP_SAT\" .emit OP_TXP_SAT;\n"\r
+"KIL_instruction\n"\r
+" \"KIL\" .emit OP_KIL .and space_src .and vectorSrcReg;\n"\r
+"texImageUnit\n"\r
+" \"texture\" .error TEXTURE_EXPECTED .and optTexImageUnitNum;\n"\r
+"texTarget\n"\r
+" \"1D\" .emit TEXTARGET_1D .or\n"\r
+" \"2D\" .emit TEXTARGET_2D .or\n"\r
+" \"3D\" .emit TEXTARGET_3D .or\n"\r
+" .if (texture_rectangle != 0x00) \"RECT\" .emit TEXTARGET_RECT .or\n"\r
+" \"CUBE\" .emit TEXTARGET_CUBE .or\n"\r
+" .if (ARB_fragment_program_shadow != 0x00) shadowTarget;\n"\r
+"shadowTarget\n"\r
+" \"SHADOW1D\" .emit TEXTARGET_SHADOW1D .or\n"\r
+" \"SHADOW2D\" .emit TEXTARGET_SHADOW2D .or\n"\r
+" .if (texture_rectangle != 0x00) \"SHADOWRECT\" .emit TEXTARGET_SHADOWRECT;\n"\r
+"optTexImageUnitNum\n"\r
+" optTexImageUnitNum_1 .or .true .emit 0x00;\n"\r
+"optTexImageUnitNum_1\n"\r
+" lbracket_ne .and texImageUnitNum .and rbracket;\n"\r
+"texImageUnitNum\n"\r
+" integer;\n"\r
+"fp_scalarSrcReg\n"\r
+" optionalSign .and fp_srcReg .and fp_scalarSuffix;\n"\r
+"vp_scalarSrcReg\n"\r
+" optionalSign .and vp_srcReg .and vp_scalarSuffix;\n"\r
+"swizzleSrcReg\n"\r
+" optionalSign .and vp_srcReg .and swizzleSuffix;\n"\r
+"vectorSrcReg\n"\r
+" optionalSign .and fp_srcReg .and optionalSuffix;\n"\r
+"fp_maskedDstReg\n"\r
+" fp_dstReg .and fp_optionalMask;\n"\r
+"vp_maskedDstReg\n"\r
+" vp_dstReg .and vp_optionalMask;\n"\r
+"maskedAddrReg\n"\r
+" addrReg .error ADDRESS_REGISTER_EXPECTED .and addrWriteMask;\n"\r
+"fp_extendedSwizzle\n"\r
+" rgbaExtendedSwizzle .or xyzwExtendedSwizzle;\n"\r
+"vp_extendedSwizzle\n"\r
+" extSwizComp .and comma .and\n"\r
+" extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n"\r
+" extSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n"\r
+" extSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n"\r
+"xyzwExtendedSwizzle\n"\r
+" xyzwExtSwizComp .and comma .and\n"\r
+" xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n"\r
+" xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n"\r
+" xyzwExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n"\r
+"rgbaExtendedSwizzle\n"\r
+" rgbaExtendedSwizzle_1 .or rgbaExtendedSwizzle_2 .or rgbaExtendedSwizzle_3 .or\n"\r
+" rgbaExtendedSwizzle_4;\n"\r
+"rgbaExtendedSwizzle_1\n"\r
+" rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_digit .and comma .and\n"\r
+" rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp;\n"\r
+"rgbaExtendedSwizzle_2\n"\r
+" rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_digit .and comma .and\n"\r
+" rgbaExtSwizComp_alpha .and comma .and rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n"\r
+"rgbaExtendedSwizzle_3\n"\r
+" rgbaExtSwizComp_digit .and comma .and rgbaExtSwizComp_alpha .and comma .and\n"\r
+" rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n"\r
+" rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n"\r
+"rgbaExtendedSwizzle_4\n"\r
+" rgbaExtSwizComp_alpha .and comma .and \n"\r
+"rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n"\r
+" rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED .and comma .and\n"\r
+" rgbaExtSwizComp .error EXT_SWIZ_COMP_EXPECTED;\n"\r
+"xyzwExtSwizComp\n"\r
+" optionalSign .and xyzwExtSwizSel;\n"\r
+"rgbaExtSwizComp\n"\r
+" optionalSign .and rgbaExtSwizSel;\n"\r
+"rgbaExtSwizComp_digit\n"\r
+" optionalSign .and rgbaExtSwizSel_digit;\n"\r
+"rgbaExtSwizComp_alpha\n"\r
+" optionalSign .and rgbaExtSwizSel_alpha;\n"\r
+"extSwizComp\n"\r
+" optionalSign .and extSwizSel;\n"\r
+"xyzwExtSwizSel\n"\r
+" \"0\" .emit COMPONENT_0 .or \"1\" .emit COMPONENT_1 .or xyzwComponent_single;\n"\r
+"rgbaExtSwizSel\n"\r
+" rgbaExtSwizSel_digit .or rgbaExtSwizSel_alpha;\n"\r
+"rgbaExtSwizSel_digit\n"\r
+" \"0\" .emit COMPONENT_0 .or \"1\" .emit COMPONENT_1;\n"\r
+"rgbaExtSwizSel_alpha\n"\r
+" rgbaComponent_single;\n"\r
+"extSwizSel\n"\r
+" \"0\" .emit COMPONENT_0 .or \"1\" .emit COMPONENT_1 .or vp_component_single;\n"\r
+"fp_srcReg\n"\r
+" fp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;\n"\r
+"vp_srcReg\n"\r
+" vp_srcReg_1 .error SOURCE_REGISTER_EXPECTED;\n"\r
+"fp_srcReg_1\n"\r
+" fragmentAttribReg .emit REGISTER_ATTRIB .or\n"\r
+" fp_progParamReg .emit REGISTER_PARAM .or\n"\r
+" fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n"\r
+"vp_srcReg_1\n"\r
+" vertexAttribReg .emit REGISTER_ATTRIB .or\n"\r
+" vp_progParamReg .emit REGISTER_PARAM .or\n"\r
+" vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n"\r
+"fp_dstReg\n"\r
+" fp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;\n"\r
+"vp_dstReg\n"\r
+" vp_dstReg_1 .error DESTINATION_REGISTER_EXPECTED;\n"\r
+"fp_dstReg_1\n"\r
+" fragmentResultReg .emit REGISTER_RESULT .or\n"\r
+" fp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n"\r
+"vp_dstReg_1\n"\r
+" vertexResultReg .emit REGISTER_RESULT .or\n"\r
+" vp_temporaryReg .emit REGISTER_ESTABLISHED_NAME;\n"\r
+"fragmentAttribReg\n"\r
+" fragAttribBinding;\n"\r
+"vertexAttribReg\n"\r
+" vtxAttribBinding;\n"\r
+"fp_temporaryReg\n"\r
+" fp_establishedName_no_error_on_identifier;\n"\r
+"vp_temporaryReg\n"\r
+" vp_establishedName_no_error_on_identifier;\n"\r
+"fp_progParamReg\n"\r
+" fp_paramSingleItemUse .or fp_progParamReg_1 .or fp_progParamSingle;\n"\r
+"vp_progParamReg\n"\r
+" vp_paramSingleItemUse .or vp_progParamReg_1 .or vp_progParamSingle;\n"\r
+"fp_progParamReg_1\n"\r
+" fp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayAbs .and\n"\r
+" rbracket;\n"\r
+"vp_progParamReg_1\n"\r
+" vp_progParamArray .emit PARAM_ARRAY_ELEMENT .and lbracket_ne .and progParamArrayMem .and\n"\r
+" rbracket;\n"\r
+"fp_progParamSingle\n"\r
+" .false;\n"\r
+"vp_progParamSingle\n"\r
+" .false;\n"\r
+"fp_progParamArray\n"\r
+" fp_establishedName_no_error_on_identifier;\n"\r
+"vp_progParamArray\n"\r
+" vp_establishedName_no_error_on_identifier;\n"\r
+"progParamArrayMem\n"\r
+" progParamArrayAbs .or progParamArrayRel;\n"\r
+"progParamArrayAbs\n"\r
+" integer_ne .emit ARRAY_INDEX_ABSOLUTE;\n"\r
+"progParamArrayRel\n"\r
+" addrReg .error ADDRESS_REGISTER_OR_INTEGER_EXPECTED .emit ARRAY_INDEX_RELATIVE .and\n"\r
+" addrComponent .and addrRegRelOffset;\n"\r
+"addrRegRelOffset\n"\r
+" addrRegRelOffset_1 .or addrRegRelOffset_2 .or .true .emit 0x00;\n"\r
+"addrRegRelOffset_1\n"\r
+" plus_ne .and addrRegPosOffset;\n"\r
+"addrRegRelOffset_2\n"\r
+" minus_ne .and addrRegNegOffset;\n"\r
+"addrRegPosOffset\n"\r
+" integer_0_63;\n"\r
+"addrRegNegOffset\n"\r
+" integer_0_64;\n"\r
+"fragmentResultReg\n"\r
+" fp_resultBinding;\n"\r
+"vertexResultReg\n"\r
+" vp_resultBinding;\n"\r
+"addrReg\n"\r
+" vp_establishedName_no_error_on_identifier;\n"\r
+"addrComponent\n"\r
+" dot .and \"x\" .error INVALID_ADDRESS_COMPONENT .emit COMPONENT_X .emit COMPONENT_X\n"\r
+" .emit COMPONENT_X .emit COMPONENT_X;\n"\r
+"addrWriteMask\n"\r
+" dot .and \"x\" .error INVALID_ADDRESS_WRITEMASK .emit 0x08;\n"\r
+"fp_scalarSuffix\n"\r
+" dot .and fp_component_single .error INVALID_COMPONENT;\n"\r
+"vp_scalarSuffix\n"\r
+" dot .and vp_component_single .error INVALID_COMPONENT;\n"\r
+"swizzleSuffix\n"\r
+" swizzleSuffix_1 .or\n"\r
+" .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z .emit COMPONENT_W;\n"\r
+"swizzleSuffix_1\n"\r
+" dot_ne .and swizzleSuffix_2 .error INVALID_SUFFIX;\n"\r
+"swizzleSuffix_2\n"\r
+" swizzleSuffix_3 .or swizzleSuffix_4;\n"\r
+"swizzleSuffix_3\n"\r
+" vp_component_multi .and vp_component_multi .and vp_component_multi .error INVALID_COMPONENT .and\n"\r
+" vp_component_multi .error INVALID_COMPONENT;\n"\r
+"swizzleSuffix_4\n"\r
+" \"x\" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\n"\r
+" \"y\" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\n"\r
+" \"z\" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\n"\r
+" \"w\" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;\n"\r
+"optionalSuffix\n"\r
+" optionalSuffix_1 .or\n"\r
+" .true .emit COMPONENT_X .emit COMPONENT_Y .emit COMPONENT_Z .emit COMPONENT_W;\n"\r
+"optionalSuffix_1\n"\r
+" dot_ne .and optionalSuffix_2 .error INVALID_SUFFIX;\n"\r
+"optionalSuffix_2\n"\r
+" optionalSuffix_3 .or optionalSuffix_4 .or optionalSuffix_5;\n"\r
+"optionalSuffix_3\n"\r
+" xyzwComponent_multi .and xyzwComponent_multi .and\n"\r
+" xyzwComponent_multi .error INVALID_COMPONENT .and xyzwComponent_multi .error INVALID_COMPONENT;\n"\r
+"optionalSuffix_4\n"\r
+" rgbaComponent_multi .and rgbaComponent_multi .and\n"\r
+" rgbaComponent_multi .error INVALID_COMPONENT .and rgbaComponent_multi .error INVALID_COMPONENT;\n"\r
+"optionalSuffix_5\n"\r
+" \"x\" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\n"\r
+" \"y\" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\n"\r
+" \"z\" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\n"\r
+" \"w\" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .or\n"\r
+" \"r\" .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .emit COMPONENT_X .or\n"\r
+" \"g\" .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .emit COMPONENT_Y .or\n"\r
+" \"b\" .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .emit COMPONENT_Z .or\n"\r
+" \"a\" .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W .emit COMPONENT_W;\n"\r
+"fp_component_single\n"\r
+" xyzwComponent_single .or rgbaComponent_single;\n"\r
+"vp_component_multi\n"\r
+" 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or\n"\r
+" 'w' .emit COMPONENT_W;\n"\r
+"vp_component_single\n"\r
+" \"x\" .emit COMPONENT_X .or \"y\" .emit COMPONENT_Y .or \"z\" .emit COMPONENT_Z .or\n"\r
+" \"w\" .emit COMPONENT_W;\n"\r
+"xyzwComponent_multi\n"\r
+" 'x' .emit COMPONENT_X .or 'y' .emit COMPONENT_Y .or 'z' .emit COMPONENT_Z .or\n"\r
+" 'w' .emit COMPONENT_W;\n"\r
+"xyzwComponent_single\n"\r
+" \"x\" .emit COMPONENT_X .or \"y\" .emit COMPONENT_Y .or \"z\" .emit COMPONENT_Z .or\n"\r
+" \"w\" .emit COMPONENT_W;\n"\r
+"rgbaComponent_multi\n"\r
+" 'r' .emit COMPONENT_X .or 'g' .emit COMPONENT_Y .or 'b' .emit COMPONENT_Z .or\n"\r
+" 'a' .emit COMPONENT_W;\n"\r
+"rgbaComponent_single\n"\r
+" \"r\" .emit COMPONENT_X .or \"g\" .emit COMPONENT_Y .or \"b\" .emit COMPONENT_Z .or\n"\r
+" \"a\" .emit COMPONENT_W;\n"\r
+"fp_optionalMask\n"\r
+" rgbaMask .or xyzwMask .or .true .emit 0x0F;\n"\r
+"vp_optionalMask\n"\r
+" xyzwMask .or .true .emit 0x0F;\n"\r
+"xyzwMask\n"\r
+" dot_ne .and xyzwMask_1 .error INVALID_WRITEMASK;\n"\r
+"xyzwMask_1\n"\r
+" \"xyzw\" .emit 0x0F .or \"xyz\" .emit 0x0E .or \"xyw\" .emit 0x0D .or \"xy\" .emit 0x0C .or\n"\r
+" \"xzw\" .emit 0x0B .or \"xz\" .emit 0x0A .or \"xw\" .emit 0x09 .or \"x\" .emit 0x08 .or\n"\r
+" \"yzw\" .emit 0x07 .or \"yz\" .emit 0x06 .or \"yw\" .emit 0x05 .or \"y\" .emit 0x04 .or\n"\r
+" \"zw\" .emit 0x03 .or \"z\" .emit 0x02 .or \"w\" .emit 0x01;\n"\r
+"rgbaMask\n"\r
+" dot_ne .and rgbaMask_1;\n"\r
+"rgbaMask_1\n"\r
+" \"rgba\" .emit 0x0F .or \"rgb\" .emit 0x0E .or \"rga\" .emit 0x0D .or \"rg\" .emit 0x0C .or\n"\r
+" \"rba\" .emit 0x0B .or \"rb\" .emit 0x0A .or \"ra\" .emit 0x09 .or \"r\" .emit 0x08 .or\n"\r
+" \"gba\" .emit 0x07 .or \"gb\" .emit 0x06 .or \"ga\" .emit 0x05 .or \"g\" .emit 0x04 .or\n"\r
+" \"ba\" .emit 0x03 .or \"b\" .emit 0x02 .or \"a\" .emit 0x01;\n"\r
+"fp_namingStatement\n"\r
+" fp_ATTRIB_statement .emit ATTRIB .or\n"\r
+" fp_PARAM_statement .emit PARAM .or\n"\r
+" fp_TEMP_statement .emit TEMP .or\n"\r
+" fp_OUTPUT_statement .emit OUTPUT .or\n"\r
+" fp_ALIAS_statement .emit ALIAS;\n"\r
+"vp_namingStatement\n"\r
+" vp_ATTRIB_statement .emit ATTRIB .or\n"\r
+" vp_PARAM_statement .emit PARAM .or\n"\r
+" vp_TEMP_statement .emit TEMP .or\n"\r
+" ADDRESS_statement .emit ADDRESS .or\n"\r
+" vp_OUTPUT_statement .emit OUTPUT .or\n"\r
+" vp_ALIAS_statement .emit ALIAS;\n"\r
+"fp_ATTRIB_statement\n"\r
+" \"ATTRIB\" .and space .and fp_establishName .and equal .and\n"\r
+" fragAttribBinding .error FRAGMENT_EXPECTED;\n"\r
+"vp_ATTRIB_statement\n"\r
+" \"ATTRIB\" .and space .and vp_establishName .and equal .and\n"\r
+" vtxAttribBinding .error VERTEX_EXPECTED;\n"\r
+"fragAttribBinding\n"\r
+" \"fragment\" .and dot .and fragAttribItem .error INVALID_FRAGMENT_PROPERTY;\n"\r
+"vtxAttribBinding\n"\r
+" \"vertex\" .and dot .and vtxAttribItem .error INVALID_VERTEX_PROPERTY;\n"\r
+"fragAttribItem\n"\r
+" fragAttribItem_1 .emit FRAGMENT_ATTRIB_COLOR .or\n"\r
+" fragAttribItem_2 .emit FRAGMENT_ATTRIB_TEXCOORD .or\n"\r
+" .if (fog_coord != 0x00) \"fogcoord\" .emit FRAGMENT_ATTRIB_FOGCOORD .or\n"\r
+" \"position\" .emit FRAGMENT_ATTRIB_POSITION;\n"\r
+"fragAttribItem_1\n"\r
+" \"color\" .and optColorType;\n"\r
+"fragAttribItem_2\n"\r
+" \"texcoord\" .and optTexCoordNum;\n"\r
+"vtxAttribItem\n"\r
+" \"position\" .emit VERTEX_ATTRIB_POSITION .or\n"\r
+" .if (vertex_blend != 0x00) vtxAttribItem_1 .emit VERTEX_ATTRIB_WEIGHT .or\n"\r
+" \"normal\" .emit VERTEX_ATTRIB_NORMAL .or\n"\r
+" vtxAttribItem_2 .emit VERTEX_ATTRIB_COLOR .or\n"\r
+" \"fogcoord\" .emit VERTEX_ATTRIB_FOGCOORD .or\n"\r
+" vtxAttribItem_3 .emit VERTEX_ATTRIB_TEXCOORD .or\n"\r
+" .if (matrix_palette != 0x00) vtxAttribItem_4 .emit VERTEX_ATTRIB_MATRIXINDEX .or\n"\r
+" vtxAttribItem_5 .emit VERTEX_ATTRIB_GENERIC;\n"\r
+"vtxAttribItem_1\n"\r
+" \"weight\" .and vtxOptWeightNum;\n"\r
+"vtxAttribItem_2\n"\r
+" \"color\" .and optColorType;\n"\r
+"vtxAttribItem_3\n"\r
+" \"texcoord\" .and optTexCoordNum;\n"\r
+"vtxAttribItem_4\n"\r
+" \"matrixindex\" .and lbracket .and vtxWeightNum .and rbracket;\n"\r
+"vtxAttribItem_5\n"\r
+" \"attrib\" .and lbracket .and vtxAttribNum .and rbracket;\n"\r
+"vtxAttribNum\n"\r
+" integer;\n"\r
+"vtxOptWeightNum\n"\r
+" vtxOptWeightNum_1 .or .true .emit 0x00;\n"\r
+"vtxOptWeightNum_1\n"\r
+" lbracket_ne .and vtxWeightNum .and rbracket;\n"\r
+"vtxWeightNum\n"\r
+" integer;\n"\r
+"fp_PARAM_statement\n"\r
+" fp_PARAM_multipleStmt .or fp_PARAM_singleStmt;\n"\r
+"vp_PARAM_statement\n"\r
+" vp_PARAM_multipleStmt .or vp_PARAM_singleStmt;\n"\r
+"fp_PARAM_singleStmt\n"\r
+" \"PARAM\" .and space .and fp_establishName .and .true .emit 0x00 .and fp_paramSingleInit .and\n"\r
+" .true .emit PARAM_NULL;\n"\r
+"vp_PARAM_singleStmt\n"\r
+" \"PARAM\" .and space .and vp_establishName .and .true .emit 0x00 .and vp_paramSingleInit .and\n"\r
+" .true .emit PARAM_NULL;\n"\r
+"fp_PARAM_multipleStmt\n"\r
+" \"PARAM\" .and space .and fp_establishName .and lbracket_ne .and optArraySize .and rbracket .and\n"\r
+" fp_paramMultipleInit .and .true .emit PARAM_NULL;\n"\r
+"vp_PARAM_multipleStmt\n"\r
+" \"PARAM\" .and space .and vp_establishName .and lbracket_ne .and optArraySize .and rbracket .and\n"\r
+" vp_paramMultipleInit .and .true .emit PARAM_NULL;\n"\r
+"optArraySize\n"\r
+" optional_integer;\n"\r
+"fp_paramSingleInit\n"\r
+" equal .and fp_paramSingleItemDecl;\n"\r
+"vp_paramSingleInit\n"\r
+" equal .and vp_paramSingleItemDecl;\n"\r
+"fp_paramMultipleInit\n"\r
+" equal .and lbrace .and fp_paramMultInitList .and rbrace;\n"\r
+"vp_paramMultipleInit\n"\r
+" equal .and lbrace .and vp_paramMultInitList .and rbrace;\n"\r
+"fp_paramMultInitList\n"\r
+" fp_paramMultInitList_1 .or fp_paramMultipleItem;\n"\r
+"vp_paramMultInitList\n"\r
+" vp_paramMultInitList_1 .or vp_paramMultipleItem;\n"\r
+"fp_paramMultInitList_1\n"\r
+" fp_paramMultipleItem .and comma_ne .and fp_paramMultInitList;\n"\r
+"vp_paramMultInitList_1\n"\r
+" vp_paramMultipleItem .and comma_ne .and vp_paramMultInitList;\n"\r
+"fp_paramSingleItemDecl\n"\r
+" fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n"\r
+" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n"\r
+" paramConstDecl .emit PARAM_CONSTANT;\n"\r
+"vp_paramSingleItemDecl\n"\r
+" vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n"\r
+" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n"\r
+" paramConstDecl .emit PARAM_CONSTANT;\n"\r
+"fp_paramSingleItemUse\n"\r
+" fp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n"\r
+" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n"\r
+" paramConstUse .emit PARAM_CONSTANT;\n"\r
+"vp_paramSingleItemUse\n"\r
+" vp_stateSingleItem .emit PARAM_STATE_ELEMENT .or\n"\r
+" programSingleItem .emit PARAM_PROGRAM_ELEMENT .or\n"\r
+" paramConstUse .emit PARAM_CONSTANT;\n"\r
+"fp_paramMultipleItem\n"\r
+" fp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or\n"\r
+" programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or\n"\r
+" paramConstDecl .emit PARAM_CONSTANT;\n"\r
+"vp_paramMultipleItem\n"\r
+" vp_stateMultipleItem .emit PARAM_STATE_ELEMENT .or\n"\r
+" programMultipleItem .emit PARAM_PROGRAM_ELEMENT .or\n"\r
+" paramConstDecl .emit PARAM_CONSTANT;\n"\r
+"fp_stateMultipleItem\n"\r
+" stateMultipleItem_1 .or fp_stateSingleItem;\n"\r
+"vp_stateMultipleItem\n"\r
+" stateMultipleItem_1 .or vp_stateSingleItem;\n"\r
+"stateMultipleItem_1\n"\r
+" \"state\" .and dot .and stateMatrixRows .emit STATE_MATRIX_ROWS;\n"\r
+"fp_stateSingleItem\n"\r
+" \"state\" .and dot .and fp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;\n"\r
+"vp_stateSingleItem\n"\r
+" \"state\" .and dot .and vp_stateSingleItem_1 .error INVALID_STATE_PROPERTY;\n"\r
+"fp_stateSingleItem_1\n"\r
+" stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or\n"\r
+" stateSingleItem_5 .or stateSingleItem_7 .or stateSingleItem_8 .or stateSingleItem_11;\n"\r
+"vp_stateSingleItem_1\n"\r
+" stateSingleItem_1 .or stateSingleItem_2 .or stateSingleItem_3 .or stateSingleItem_4 .or\n"\r
+" stateSingleItem_6 .or stateSingleItem_7 .or stateSingleItem_9 .or stateSingleItem_10 .or\n"\r
+" stateSingleItem_11;\n"\r
+"stateSingleItem_1\n"\r
+" stateMaterialItem .emit STATE_MATERIAL;\n"\r
+"stateSingleItem_2\n"\r
+" stateLightItem .emit STATE_LIGHT;\n"\r
+"stateSingleItem_3\n"\r
+" stateLightModelItem .emit STATE_LIGHT_MODEL;\n"\r
+"stateSingleItem_4\n"\r
+" stateLightProdItem .emit STATE_LIGHT_PROD;\n"\r
+"stateSingleItem_5\n"\r
+" stateTexEnvItem .emit STATE_TEX_ENV;\n"\r
+"stateSingleItem_6\n"\r
+" stateTexGenItem .emit STATE_TEX_GEN;\n"\r
+"stateSingleItem_7\n"\r
+" stateFogItem .emit STATE_FOG;\n"\r
+"stateSingleItem_8\n"\r
+" stateDepthItem .emit STATE_DEPTH;\n"\r
+"stateSingleItem_9\n"\r
+" stateClipPlaneItem .emit STATE_CLIP_PLANE;\n"\r
+"stateSingleItem_10\n"\r
+" statePointItem .emit STATE_POINT;\n"\r
+"stateSingleItem_11\n"\r
+" stateMatrixRow .emit STATE_MATRIX_ROWS;\n"\r
+"stateMaterialItem\n"\r
+" \"material\" .and optFaceType .and dot .and stateMatProperty .error INVALID_MATERIAL_PROPERTY;\n"\r
+"stateMatProperty\n"\r
+" \"ambient\" .emit MATERIAL_AMBIENT .or\n"\r
+" \"diffuse\" .emit MATERIAL_DIFFUSE .or\n"\r
+" \"specular\" .emit MATERIAL_SPECULAR .or\n"\r
+" \"emission\" .emit MATERIAL_EMISSION .or\n"\r
+" \"shininess\" .emit MATERIAL_SHININESS;\n"\r
+"stateLightItem\n"\r
+" \"light\" .and lbracket .and stateLightNumber .and rbracket .and dot .and\n"\r
+" stateLightProperty .error INVALID_LIGHT_PROPERTY;\n"\r
+"stateLightProperty\n"\r
+" \"ambient\" .emit LIGHT_AMBIENT .or\n"\r
+" \"diffuse\" .emit LIGHT_DIFFUSE .or\n"\r
+" \"specular\" .emit LIGHT_SPECULAR .or\n"\r
+" \"position\" .emit LIGHT_POSITION .or\n"\r
+" \"attenuation\" .emit LIGHT_ATTENUATION .or\n"\r
+" stateLightProperty_1 .emit LIGHT_SPOT_DIRECTION .or\n"\r
+" \"half\" .emit LIGHT_HALF;\n"\r
+"stateLightProperty_1\n"\r
+" \"spot\" .and dot .and stateSpotProperty .error INVALID_SPOT_PROPERTY;\n"\r
+"stateSpotProperty\n"\r
+" \"direction\";\n"\r
+"stateLightModelItem\n"\r
+" \"lightmodel\" .and stateLModProperty .error INVALID_LIGHTMODEL_PROPERTY;\n"\r
+"stateLModProperty\n"\r
+" stateLModProperty_1 .or stateLModProperty_2;\n"\r
+"stateLModProperty_1\n"\r
+" dot .and \"ambient\" .emit LIGHT_MODEL_AMBIENT;\n"\r
+"stateLModProperty_2\n"\r
+" stateLModProperty_3 .emit LIGHT_MODEL_SCENECOLOR;\n"\r
+"stateLModProperty_3\n"\r
+" optFaceType .and dot .and \"scenecolor\";\n"\r
+"stateLightProdItem\n"\r
+" \"lightprod\" .and lbracket .and stateLightNumber .and rbracket .and optFaceType .and dot .and\n"\r
+" stateLProdProperty .error INVALID_LIGHTPROD_PROPERTY;\n"\r
+"stateLProdProperty\n"\r
+" \"ambient\" .emit LIGHT_PROD_AMBIENT .or\n"\r
+" \"diffuse\" .emit LIGHT_PROD_DIFFUSE .or\n"\r
+" \"specular\" .emit LIGHT_PROD_SPECULAR;\n"\r
+"stateLightNumber\n"\r
+" integer;\n"\r
+"stateTexEnvItem\n"\r
+" \"texenv\" .and optLegacyTexUnitNum .and dot .and\n"\r
+" stateTexEnvProperty .error INVALID_TEXENV_PROPERTY;\n"\r
+"stateTexEnvProperty\n"\r
+" \"color\" .emit TEX_ENV_COLOR;\n"\r
+"optLegacyTexUnitNum\n"\r
+" lbracket_ne .and legacyTexUnitNum .and rbracket;\n"\r
+"legacyTexUnitNum\n"\r
+" integer;\n"\r
+"stateTexGenItem\n"\r
+" \"texgen\" .and optTexCoordNum .and dot .and stateTexGenType .error INVALID_TEXGEN_PROPERTY .and\n"\r
+" dot .and stateTexGenCoord .error INVALID_TEXGEN_COORD;\n"\r
+"stateTexGenType\n"\r
+" \"eye\" .emit TEX_GEN_EYE .or\n"\r
+" \"object\" .emit TEX_GEN_OBJECT;\n"\r
+"stateTexGenCoord\n"\r
+" \"s\" .emit COMPONENT_X .or\n"\r
+" \"t\" .emit COMPONENT_Y .or\n"\r
+" \"r\" .emit COMPONENT_Z .or\n"\r
+" \"q\" .emit COMPONENT_W;\n"\r
+"stateFogItem\n"\r
+" \"fog\" .and dot .and stateFogProperty .error INVALID_FOG_PROPERTY;\n"\r
+"stateFogProperty\n"\r
+" \"color\" .emit FOG_COLOR .or\n"\r
+" \"params\" .emit FOG_PARAMS;\n"\r
+"stateDepthItem\n"\r
+" \"depth\" .and dot .and stateDepthProperty .error INVALID_DEPTH_PROPERTY;\n"\r
+"stateDepthProperty\n"\r
+" \"range\" .emit DEPTH_RANGE;\n"\r
+"stateClipPlaneItem\n"\r
+" \"clip\" .and lbracket .and stateClipPlaneNum .and rbracket .and dot .and\n"\r
+" \"plane\" .error INVALID_CLIPPLANE_PROPERTY;\n"\r
+"stateClipPlaneNum\n"\r
+" integer;\n"\r
+"statePointItem\n"\r
+" \"point\" .and dot .and statePointProperty .error INVALID_POINT_PROPERTY;\n"\r
+"statePointProperty\n"\r
+" \"size\" .emit POINT_SIZE .or\n"\r
+" .if (point_parameters != 0x00) \"attenuation\" .emit POINT_ATTENUATION;\n"\r
+"stateMatrixRow\n"\r
+" stateMatrixItem .and dot .and \"row\" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and\n"\r
+" lbracket .and stateMatrixRowNum .and rbracket .emit 0x0;\n"\r
+"stateMatrixRows\n"\r
+" stateMatrixItem .and optMatrixRows;\n"\r
+"optMatrixRows\n"\r
+" optMatrixRows_1 .or .true .emit 0x0 .emit '3' .emit 0x0 .emit $;\n"\r
+"optMatrixRows_1\n"\r
+" dot_ne .and \"row\" .error MATRIX_ROW_SELECTOR_OR_MODIFIER_EXPECTED .and lbracket .and\n"\r
+" stateMatrixRowNum .and dotdot .and stateMatrixRowNum .and rbracket;\n"\r
+"stateMatrixItem\n"\r
+" \"matrix\" .and dot .and stateMatrixName .error INVALID_MATRIX_NAME .and stateOptMatModifier;\n"\r
+"stateOptMatModifier\n"\r
+" stateOptMatModifier_1 .or .true .emit MATRIX_MODIFIER_IDENTITY;\n"\r
+"stateOptMatModifier_1\n"\r
+" dot_ne .and stateMatModifier;\n"\r
+"stateMatModifier\n"\r
+" \"inverse\" .emit MATRIX_MODIFIER_INVERSE .or\n"\r
+" \"transpose\" .emit MATRIX_MODIFIER_TRANSPOSE .or\n"\r
+" \"invtrans\" .emit MATRIX_MODIFIER_INVTRANS;\n"\r
+"stateMatrixRowNum\n"\r
+" integer_0_3;\n"\r
+"stateMatrixName\n"\r
+" stateMatrixName_1_1 .emit MATRIX_MODELVIEW .or\n"\r
+" \"projection\" .emit MATRIX_PROJECTION .or\n"\r
+" \"mvp\" .emit MATRIX_MVP .or\n"\r
+" stateMatrixName_1_2 .emit MATRIX_TEXTURE .or\n"\r
+" .if (matrix_palette != 0x00) stateMatrixName_1_3 .emit MATRIX_PALETTE .or\n"\r
+" stateMatrixName_1_4 .emit MATRIX_PROGRAM;\n"\r
+"stateMatrixName_1_1\n"\r
+" \"modelview\" .and stateOptModMatNum;\n"\r
+"stateMatrixName_1_2\n"\r
+" \"texture\" .and optTexCoordNum;\n"\r
+"stateMatrixName_1_3\n"\r
+" \"palette\" .and lbracket .and statePaletteMatNum .and rbracket;\n"\r
+"stateMatrixName_1_4\n"\r
+" \"program\" .and lbracket .and stateProgramMatNum .and rbracket;\n"\r
+"stateOptModMatNum\n"\r
+" .if (vertex_blend != 0x00) stateOptModMatNum_1 .or\n"\r
+" .true .emit 0x00;\n"\r
+"stateOptModMatNum_1\n"\r
+" lbracket_ne .and stateModMatNum .and rbracket;\n"\r
+"stateModMatNum\n"\r
+" integer;\n"\r
+"optTexCoordNum\n"\r
+" optTexCoordNum_1 .or .true .emit 0x00;\n"\r
+"optTexCoordNum_1\n"\r
+" lbracket_ne .and texCoordNum .and rbracket;\n"\r
+"texCoordNum\n"\r
+" integer;\n"\r
+"statePaletteMatNum\n"\r
+" integer;\n"\r
+"stateProgramMatNum\n"\r
+" integer;\n"\r
+"programSingleItem\n"\r
+" \"program\" .and dot .and programSingleItem_1 .error INVALID_PROGRAM_PROPERTY;\n"\r
+"programSingleItem_1\n"\r
+" progEnvParam .or progLocalParam;\n"\r
+"programMultipleItem\n"\r
+" \"program\" .and dot .and programMultipleItem_1 .error INVALID_PROGRAM_PROPERTY;\n"\r
+"programMultipleItem_1\n"\r
+" progEnvParams .or progLocalParams;\n"\r
+"progEnvParams\n"\r
+" \"env\" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNums .and rbracket;\n"\r
+"progEnvParamNums\n"\r
+" progEnvParamNums_1 .or progEnvParamNums_2;\n"\r
+"progEnvParamNums_1\n"\r
+" progEnvParamNum .and dotdot_ne .and progEnvParamNum;\n"\r
+"progEnvParamNums_2\n"\r
+" progEnvParamNum .and .true .emit 0x00;\n"\r
+"progEnvParam\n"\r
+" \"env\" .emit PROGRAM_PARAM_ENV .and lbracket .and progEnvParamNum .and rbracket .emit 0x00;\n"\r
+"progLocalParams\n"\r
+" \"local\" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNums .and rbracket;\n"\r
+"progLocalParamNums\n"\r
+" progLocalParamNums_1 .or progLocalParamNums_2;\n"\r
+"progLocalParamNums_1\n"\r
+" progLocalParamNum .and dotdot_ne .and progLocalParamNum;\n"\r
+"progLocalParamNums_2\n"\r
+" progLocalParamNum .and .true .emit 0x00;\n"\r
+"progLocalParam\n"\r
+" \"local\" .emit PROGRAM_PARAM_LOCAL .and lbracket .and progLocalParamNum .and rbracket .emit 0x00;\n"\r
+"progEnvParamNum\n"\r
+" integer;\n"\r
+"progLocalParamNum\n"\r
+" integer;\n"\r
+"paramConstDecl\n"\r
+" paramConstScalarDecl .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;\n"\r
+"paramConstUse\n"\r
+" paramConstScalarUse .emit CONSTANT_SCALAR .or paramConstVector .emit CONSTANT_VECTOR;\n"\r
+"paramConstScalarDecl\n"\r
+" signedFloatConstant;\n"\r
+"paramConstScalarUse\n"\r
+" floatConstant;\n"\r
+"paramConstVector\n"\r
+" paramConstVector_4 .emit 0x04 .or paramConstVector_3 .emit 0x03 .or\n"\r
+" paramConstVector_2 .emit 0x02 .or paramConstVector_1 .emit 0x01;\n"\r
+"paramConstVector_1\n"\r
+" lbrace_ne .and signedFloatConstant .and rbrace;\n"\r
+"paramConstVector_2\n"\r
+" lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;\n"\r
+"paramConstVector_3\n"\r
+" lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and\n"\r
+" signedFloatConstant .and rbrace;\n"\r
+"paramConstVector_4\n"\r
+" lbrace_ne .and signedFloatConstant .and comma_ne .and signedFloatConstant .and comma_ne .and\n"\r
+" signedFloatConstant .and comma_ne .and signedFloatConstant .and rbrace;\n"\r
+"signedFloatConstant\n"\r
+" optionalSign .and floatConstant;\n"\r
+"floatConstant\n"\r
+" float;\n"\r
+"optionalSign\n"\r
+" optional_sign_ne;\n"\r
+"fp_TEMP_statement\n"\r
+" \"TEMP\" .and space .and fp_varNameList .and .true .emit 0x00;\n"\r
+"vp_TEMP_statement\n"\r
+" \"TEMP\" .and space .and vp_varNameList .and .true .emit 0x00;\n"\r
+"ADDRESS_statement\n"\r
+" \"ADDRESS\" .and space .and vp_varNameList .and .true .emit 0x00;\n"\r
+"fp_varNameList\n"\r
+" fp_varNameList_1 .or fp_establishName;\n"\r
+"vp_varNameList\n"\r
+" vp_varNameList_1 .or vp_establishName;\n"\r
+"fp_varNameList_1\n"\r
+" fp_establishName .and comma_ne .and fp_varNameList;\n"\r
+"vp_varNameList_1\n"\r
+" vp_establishName .and comma_ne .and vp_varNameList;\n"\r
+"fp_OUTPUT_statement\n"\r
+" \"OUTPUT\" .and space .and fp_establishName .and equal .and\n"\r
+" fp_resultBinding .error RESULT_EXPECTED;\n"\r
+"vp_OUTPUT_statement\n"\r
+" \"OUTPUT\" .and space .and vp_establishName .and equal .and\n"\r
+" vp_resultBinding .error RESULT_EXPECTED;\n"\r
+"fp_resultBinding\n"\r
+" \"result\" .and dot .and fp_resultBinding_1 .error INVALID_RESULT_PROPERTY;\n"\r
+"vp_resultBinding\n"\r
+" \"result\" .and dot .and vp_resultBinding_1 .error INVALID_RESULT_PROPERTY;\n"\r
+"fp_resultBinding_1\n"\r
+" \"color\" .emit FRAGMENT_RESULT_COLOR .or\n"\r
+" \"depth\" .emit FRAGMENT_RESULT_DEPTH;\n"\r
+"vp_resultBinding_1\n"\r
+" .if (ARB_position_invariant == 0x00) \"position\" .emit VERTEX_RESULT_POSITION .or\n"\r
+" resultColBinding .emit VERTEX_RESULT_COLOR .or\n"\r
+" \"fogcoord\" .emit VERTEX_RESULT_FOGCOORD .or\n"\r
+" \"pointsize\" .emit VERTEX_RESULT_POINTSIZE .or\n"\r
+" vp_resultBinding_2 .emit VERTEX_RESULT_TEXCOORD;\n"\r
+"vp_resultBinding_2\n"\r
+" \"texcoord\" .and optTexCoordNum;\n"\r
+"resultColBinding\n"\r
+" \"color\" .and optFaceType .and optColorType;\n"\r
+"optFaceType\n"\r
+" FaceType .or .true .emit FACE_FRONT;\n"\r
+"FaceType\n"\r
+" dot_ne .and FaceProperty;\n"\r
+"FaceProperty\n"\r
+" \"front\" .emit FACE_FRONT .or \"back\" .emit FACE_BACK;\n"\r
+"optColorType\n"\r
+" ColorType .or .true .emit COLOR_PRIMARY;\n"\r
+"ColorType\n"\r
+" dot_ne .and ColorProperty;\n"\r
+"ColorProperty\n"\r
+" \"primary\" .emit COLOR_PRIMARY .or\n"\r
+" .if (secondary_color != 0x00) \"secondary\" .emit COLOR_SECONDARY;\n"\r
+"fp_ALIAS_statement\n"\r
+" \"ALIAS\" .and fp_ALIAS_statement_1 .error IDENTIFIER_EXPECTED .and equal .and fp_establishedName;\n"\r
+"vp_ALIAS_statement\n"\r
+" \"ALIAS\" .and vp_ALIAS_statement_1 .error IDENTIFIER_EXPECTED .and equal .and vp_establishedName;\n"\r
+"fp_ALIAS_statement_1\n"\r
+" space .and fp_establishName;\n"\r
+"vp_ALIAS_statement_1\n"\r
+" space .and vp_establishName;\n"\r
+"fp_establishName\n"\r
+" fp_identifier;\n"\r
+"vp_establishName\n"\r
+" vp_identifier;\n"\r
+"fp_establishedName\n"\r
+" fp_identifier;\n"\r
+"vp_establishedName\n"\r
+" vp_identifier;\n"\r
+"fp_establishedName_no_error_on_identifier\n"\r
+" fp_identifier_ne;\n"\r
+"vp_establishedName_no_error_on_identifier\n"\r
+" vp_identifier_ne;\n"\r
+"fp_identifier\n"\r
+" fp_identifier_ne .error IDENTIFIER_EXPECTED;\n"\r
+"vp_identifier\n"\r
+" vp_identifier_ne .error IDENTIFIER_EXPECTED;\n"\r
+"fp_identifier_ne\n"\r
+" fp_not_reserved_identifier .and identifier_ne;\n"\r
+"vp_identifier_ne\n"\r
+" vp_not_reserved_identifier .and identifier_ne;\n"\r
+"fp_not_reserved_identifier\n"\r
+" fp_not_reserved_identifier_1 .or .true;\n"\r
+"fp_not_reserved_identifier_1\n"\r
+" fp_reserved_identifier .and .false .error RESERVED_KEYWORD;\n"\r
+"vp_not_reserved_identifier\n"\r
+" vp_not_reserved_identifier_1 .or .true;\n"\r
+"vp_not_reserved_identifier_1\n"\r
+" vp_reserved_identifier .and .false .error RESERVED_KEYWORD;\n"\r
+"fp_reserved_identifier\n"\r
+" \"ABS\" .or \"ABS_SAT\" .or \"ADD\" .or \"ADD_SAT\" .or \"ALIAS\" .or \"ATTRIB\" .or \"CMP\" .or \"CMP_SAT\" .or\n"\r
+" \"COS\" .or \"COS_SAT\" .or \"DP3\" .or \"DP3_SAT\" .or \"DP4\" .or \"DP4_SAT\" .or \"DPH\" .or \"DPH_SAT\" .or\n"\r
+" \"DST\" .or \"DST_SAT\" .or \"END\" .or \"EX2\" .or \"EX2_SAT\" .or \"FLR\" .or \"FLR_SAT\" .or \"FRC\" .or\n"\r
+" \"FRC_SAT\" .or \"KIL\" .or \"LG2\" .or \"LG2_SAT\" .or \"LIT\" .or \"LIT_SAT\" .or \"LRP\" .or \"LRP_SAT\" .or\n"\r
+" \"MAD\" .or \"MAD_SAT\" .or \"MAX\" .or \"MAX_SAT\" .or \"MIN\" .or \"MIN_SAT\" .or \"MOV\" .or \"MOV_SAT\" .or\n"\r
+" \"MUL\" .or \"MUL_SAT\" .or \"OPTION\" .or \"OUTPUT\" .or \"PARAM\" .or \"POW\" .or \"POW_SAT\" .or \"RCP\" .or\n"\r
+" \"RCP_SAT\" .or \"RSQ\" .or \"RSQ_SAT\" .or \"SIN\" .or \"SIN_SAT\" .or \"SCS\" .or \"SCS_SAT\" .or \"SGE\" .or\n"\r
+" \"SGE_SAT\" .or \"SLT\" .or \"SLT_SAT\" .or \"SUB\" .or \"SUB_SAT\" .or \"SWZ\" .or \"SWZ_SAT\" .or \"TEMP\" .or\n"\r
+" \"TEX\" .or \"TEX_SAT\" .or \"TXB\" .or \"TXB_SAT\" .or \"TXP\" .or \"TXP_SAT\" .or \"XPD\" .or \"XPD_SAT\" .or\n"\r
+" \"fragment\" .or \"program\" .or \"result\" .or \"state\" .or \"texture\";\n"\r
+"vp_reserved_identifier\n"\r
+" \"ABS\" .or \"ADD\" .or \"ADDRESS\" .or \"ALIAS\" .or \"ARL\" .or \"ATTRIB\" .or \"DP3\" .or \"DP4\" .or\n"\r
+" \"DPH\" .or \"DST\" .or \"END\" .or \"EX2\" .or \"EXP\" .or \"FLR\" .or \"FRC\" .or \"LG2\" .or \"LIT\" .or\n"\r
+" \"LOG\" .or \"MAD\" .or \"MAX\" .or \"MIN\" .or \"MOV\" .or \"MUL\" .or \"OPTION\" .or \"OUTPUT\" .or\n"\r
+" \"PARAM\" .or \"POW\" .or \"RCP\" .or \"RSQ\" .or \"SGE\" .or \"SLT\" .or \"SUB\" .or \"SWZ\" .or \"TEMP\" .or\n"\r
+" \"XPD\" .or \"program\" .or \"result\" .or \"state\" .or \"vertex\";\n"\r
+"integer\n"\r
+" integer_ne .error INTEGER_EXPECTED;\n"\r
+"zero\n"\r
+" '0';\n"\r
+"leading_zeroes\n"\r
+" .loop zero;\n"\r
+"no_digit\n"\r
+" no_digit_1 .or .true;\n"\r
+"no_digit_1\n"\r
+" digit10 .and .false .error INTEGER_OUT_OF_RANGE;\n"\r
+"all_zeroes\n"\r
+" all_zeroes_1 .or no_digit_1;\n"\r
+"all_zeroes_1\n"\r
+" '0' .and .loop zero .and no_digit;\n"\r
+"integer_0_3\n"\r
+" integer_0_3_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;\n"\r
+"integer_0_3_1\n"\r
+" integer_0_3_2 .or all_zeroes .emit '0';\n"\r
+"integer_0_3_2 \n"\r
+" leading_zeroes .and '1'-'3' .emit * .and no_digit;\n"\r
+"integer_0_63\n"\r
+" integer_0_63_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;\n"\r
+"integer_0_63_1\n"\r
+" integer_0_63_2 .or integer_0_63_3 .or integer_0_63_4 .or integer_0_63_5 .or\n"\r
+" all_zeroes .emit '0';\n"\r
+"integer_0_63_2 \n"\r
+" leading_zeroes .and '7'-'9' .emit * .and no_digit;\n"\r
+"integer_0_63_3 \n"\r
+" leading_zeroes .and '1'-'5' .emit * .and '0'-'9' .emit * .and no_digit;\n"\r
+"integer_0_63_4 \n"\r
+" leading_zeroes .and '6' .emit * .and '0'-'3' .emit * .and no_digit;\n"\r
+"integer_0_63_5 \n"\r
+" leading_zeroes .and '1'-'6' .emit * .and no_digit;\n"\r
+"integer_0_64\n"\r
+" integer_0_64_1 .error INTEGER_EXPECTED .and .true .emit 0x00 .emit $;\n"\r
+"integer_0_64_1\n"\r
+" integer_0_64_2 .or integer_0_64_3 .or integer_0_64_4 .or integer_0_64_5 .or\n"\r
+" all_zeroes .emit '0';\n"\r
+"integer_0_64_2 \n"\r
+" leading_zeroes .and '7'-'9' .emit * .and no_digit;\n"\r
+"integer_0_64_3 \n"\r
+" leading_zeroes .and '1'-'5' .emit * .and '0'-'9' .emit * .and no_digit;\n"\r
+"integer_0_64_4 \n"\r
+" leading_zeroes .and '6' .emit * .and '0'-'4' .emit * .and no_digit;\n"\r
+"integer_0_64_5 \n"\r
+" leading_zeroes .and '1'-'6' .emit * .and no_digit;\n"\r
+"optional_space\n"\r
+" space .or .true;\n"\r
+"space_dst\n"\r
+" space .error OPERATION_NEEDS_DESTINATION_VARIABLE;\n"\r
+"space_src\n"\r
+" space .error OPERATION_NEEDS_SOURCE_VARIABLE;\n"\r
+"space\n"\r
+" single_space .and .loop single_space;\n"\r
+"single_space\n"\r
+" white_char .or comment_block;\n"\r
+"white_char\n"\r
+" ' ' .or '\\t' .or '\\n' .or '\\r';\n"\r
+"comment_block\n"\r
+" '#' .and .loop comment_char .and new_line;\n"\r
+"comment_char\n"\r
+" '\\x0E'-'\\xFF' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"\r
+"new_line\n"\r
+" '\\n' .or crlf .or '\\0';\n"\r
+"crlf\n"\r
+" '\\r' .and '\\n';\n"\r
+"semicolon\n"\r
+" optional_space .and ';' .error MISSING_SEMICOLON .and optional_space;\n"\r
+"comma\n"\r
+" optional_space .and ',' .error MISSING_COMMA .and optional_space;\n"\r
+"comma_ne\n"\r
+" optional_space .and ',' .and optional_space;\n"\r
+"lbracket\n"\r
+" optional_space .and '[' .error MISSING_LBRACKET .and optional_space;\n"\r
+"lbracket_ne\n"\r
+" optional_space .and '[' .and optional_space;\n"\r
+"rbracket\n"\r
+" optional_space .and ']' .error MISSING_RBRACKET .and optional_space;\n"\r
+"dot\n"\r
+" optional_space .and '.' .error MISSING_DOT .and optional_space;\n"\r
+"dot_ne\n"\r
+" optional_space .and '.' .and optional_space;\n"\r
+"equal\n"\r
+" optional_space .and '=' .error MISSING_EQUAL .and optional_space;\n"\r
+"lbrace\n"\r
+" optional_space .and '{' .error MISSING_LBRACE .and optional_space;\n"\r
+"lbrace_ne\n"\r
+" optional_space .and '{' .and optional_space;\n"\r
+"rbrace\n"\r
+" optional_space .and '}' .error MISSING_RBRACE .and optional_space;\n"\r
+"dotdot\n"\r
+" optional_space .and '.' .and '.' .error MISSING_DOTDOT .and optional_space;\n"\r
+"dotdot_ne\n"\r
+" optional_space .and '.' .and '.' .and optional_space;\n"\r
+"float\n"\r
+" float_1 .or float_2 .or float_legacy;\n"\r
+"float_1\n"\r
+" '.' .emit 0x00 .and integer_ne .error MISSING_FRACTION_OR_EXPONENT .and optional_exponent;\n"\r
+"float_2\n"\r
+" integer_ne .and float_3;\n"\r
+"float_3\n"\r
+" float_4 .or float_5;\n"\r
+"float_4\n"\r
+" '.' .and optional_integer .and optional_exponent;\n"\r
+"float_5\n"\r
+" exponent .emit 0x00;\n"\r
+"float_legacy\n"\r
+" integer_ne .and .true .emit 0x00 .emit 0x00;\n"\r
+"integer_ne\n"\r
+" integer_ne_1 .and .true .emit 0x00 .emit $;\n"\r
+"integer_ne_1\n"\r
+" digit10 .emit * .and .loop digit10 .emit *;\n"\r
+"optional_integer\n"\r
+" integer_ne .or .true .emit 0x00;\n"\r
+"optional_exponent\n"\r
+" exponent .or .true .emit 0x00;\n"\r
+"exponent\n"\r
+" exponent_1 .and optional_sign_ne .and integer_ne .error EXPONENT_VALUE_EXPECTED;\n"\r
+"exponent_1\n"\r
+" 'e' .or 'E';\n"\r
+"optional_sign_ne\n"\r
+" minus_ne .or plus_ne .or .true;\n"\r
+"plus_ne\n"\r
+" optional_space .and '+' .and optional_space;\n"\r
+"minus_ne\n"\r
+" optional_space .and '-' .emit '-' .and optional_space;\n"\r
+"identifier_ne\n"\r
+" first_idchar .emit * .and .loop follow_idchar .emit * .and .true .emit 0x00 .emit $;\n"\r
+"follow_idchar\n"\r
+" first_idchar .or digit10;\n"\r
+"first_idchar\n"\r
+" 'a'-'z' .or 'A'-'Z' .or '_' .or '$';\n"\r
+"digit10\n"\r
+" '0'-'9';\n"\r
+".string __string_filter;\n"\r
+"__string_filter\n"\r
+" .loop __identifier_char;\n"\r
+"__identifier_char\n"\r
+" 'a'-'z' .or 'A'-'Z' .or '_' .or '$' .or '0'-'9';\n"\r
+"e_signature\n"\r
+" e_signature_char .and .loop e_signature_char;\n"\r
+"e_signature_char\n"\r
+" '!' .or '.' .or 'A'-'Z' .or 'a'-'z' .or '0'-'9';\n"\r
+"e_statement\n"\r
+" .loop e_statement_not_term;\n"\r
+"e_statement_not_term\n"\r
+" '\\x3C'-'\\xFF' .or '\\x0E'-'\\x3A' .or '\\x01'-'\\x09' .or '\\x0B'-'\\x0C';\n"\r
+"e_identifier\n"\r
+" e_identifier_first .and .loop e_identifier_next;\n"\r
+"e_identifier_first\n"\r
+" 'a'-'z' .or 'A'-'Z' .or '_' .or '$';\n"\r
+"e_identifier_next\n"\r
+" e_identifier_first .or '0'-'9';\n"\r
+"e_token\n"\r
+" e_identifier .or e_token_number .or '[' .or ']' .or '.' .or '{' .or '}' .or '=' .or '+' .or\n"\r
+" '-' .or ',' .or ';';\n"\r
+"e_token_number\n"\r
+" e_token_digit .and .loop e_token_digit;\n"\r
+"e_token_digit\n"\r
+" '0'-'9';\n"\r
+"e_charordigit\n"\r
+" 'A'-'Z' .or 'a'-'z' .or '0'-'9';\n"\r
+""
\ No newline at end of file