diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/shader/Makefile | 7 | ||||
| -rw-r--r-- | src/mesa/shader/arbprogparse.c | 121 | ||||
| -rw-r--r-- | src/mesa/shader/hash_table.c | 153 | ||||
| -rw-r--r-- | src/mesa/shader/hash_table.h | 108 | ||||
| -rw-r--r-- | src/mesa/shader/lex.yy.c | 3530 | ||||
| -rw-r--r-- | src/mesa/shader/prog_parameter_layout.c | 205 | ||||
| -rw-r--r-- | src/mesa/shader/prog_parameter_layout.h | 41 | ||||
| -rw-r--r-- | src/mesa/shader/program_lexer.l | 482 | ||||
| -rw-r--r-- | src/mesa/shader/program_parse.tab.c | 4915 | ||||
| -rw-r--r-- | src/mesa/shader/program_parse.tab.h | 193 | ||||
| -rw-r--r-- | src/mesa/shader/program_parse.y | 2130 | ||||
| -rw-r--r-- | src/mesa/shader/program_parse_extra.c | 109 | ||||
| -rw-r--r-- | src/mesa/shader/program_parser.h | 256 | ||||
| -rw-r--r-- | src/mesa/shader/symbol_table.c | 334 | ||||
| -rw-r--r-- | src/mesa/shader/symbol_table.h | 54 | ||||
| -rw-r--r-- | src/mesa/sources.mak | 8 | 
16 files changed, 12596 insertions, 50 deletions
diff --git a/src/mesa/shader/Makefile b/src/mesa/shader/Makefile new file mode 100644 index 0000000000..400a543bda --- /dev/null +++ b/src/mesa/shader/Makefile @@ -0,0 +1,7 @@ +all: program_parse.tab.c lex.yy.c + +program_parse.tab.c program_parse.tab.h: program_parse.y +	bison -v -d $< + +lex.yy.c: program_lexer.l +	flex --never-interactive $< diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c index bc65aba39a..36470b669c 100644 --- a/src/mesa/shader/arbprogparse.c +++ b/src/mesa/shader/arbprogparse.c @@ -63,6 +63,7 @@ having three separate program parameter arrays.  #include "prog_parameter.h"  #include "prog_statevars.h"  #include "prog_instruction.h" +#include "program_parser.h"  /**   * This is basically a union of the vertex_program and fragment_program @@ -96,7 +97,7 @@ struct arb_program  }; - +#if 0  /* TODO:   *    Fragment Program Stuff:   *    ----------------------------------------------------- @@ -3923,7 +3924,7 @@ _mesa_parse_arb_program(GLcontext *ctx, GLenum target,     return !err;  } - +#endif  void @@ -3931,11 +3932,18 @@ _mesa_parse_arb_fragment_program(GLcontext* ctx, GLenum target,                                   const GLvoid *str, GLsizei len,                                   struct gl_fragment_program *program)  { -   struct arb_program ap; +   struct gl_program prog; +   struct asm_parser_state state;     GLuint i;     ASSERT(target == GL_FRAGMENT_PROGRAM_ARB); -   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, &ap)) { + +   memset(&prog, 0, sizeof(prog)); +   memset(&state, 0, sizeof(state)); +   state.prog = &prog; + +   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, +				&state)) {        /* Error in the program. Just return. */        return;     } @@ -3943,33 +3951,39 @@ _mesa_parse_arb_fragment_program(GLcontext* ctx, GLenum target,     /* Copy the relevant contents of the arb_program struct into the      * fragment_program struct.      */ -   program->Base.String          = ap.Base.String; -   program->Base.NumInstructions = ap.Base.NumInstructions; -   program->Base.NumTemporaries  = ap.Base.NumTemporaries; -   program->Base.NumParameters   = ap.Base.NumParameters; -   program->Base.NumAttributes   = ap.Base.NumAttributes; -   program->Base.NumAddressRegs  = ap.Base.NumAddressRegs; -   program->Base.NumNativeInstructions = ap.Base.NumNativeInstructions; -   program->Base.NumNativeTemporaries = ap.Base.NumNativeTemporaries; -   program->Base.NumNativeParameters = ap.Base.NumNativeParameters; -   program->Base.NumNativeAttributes = ap.Base.NumNativeAttributes; -   program->Base.NumNativeAddressRegs = ap.Base.NumNativeAddressRegs; -   program->Base.NumAluInstructions   = ap.Base.NumAluInstructions; -   program->Base.NumTexInstructions   = ap.Base.NumTexInstructions; -   program->Base.NumTexIndirections   = ap.Base.NumTexIndirections; -   program->Base.NumNativeAluInstructions = ap.Base.NumAluInstructions; -   program->Base.NumNativeTexInstructions = ap.Base.NumTexInstructions; -   program->Base.NumNativeTexIndirections = ap.Base.NumTexIndirections; -   program->Base.InputsRead      = ap.Base.InputsRead; -   program->Base.OutputsWritten  = ap.Base.OutputsWritten; +   program->Base.String          = prog.String; +   program->Base.NumInstructions = prog.NumInstructions; +   program->Base.NumTemporaries  = prog.NumTemporaries; +   program->Base.NumParameters   = prog.NumParameters; +   program->Base.NumAttributes   = prog.NumAttributes; +   program->Base.NumAddressRegs  = prog.NumAddressRegs; +   program->Base.NumNativeInstructions = prog.NumNativeInstructions; +   program->Base.NumNativeTemporaries = prog.NumNativeTemporaries; +   program->Base.NumNativeParameters = prog.NumNativeParameters; +   program->Base.NumNativeAttributes = prog.NumNativeAttributes; +   program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs; +   program->Base.NumAluInstructions   = prog.NumAluInstructions; +   program->Base.NumTexInstructions   = prog.NumTexInstructions; +   program->Base.NumTexIndirections   = prog.NumTexIndirections; +   program->Base.NumNativeAluInstructions = prog.NumAluInstructions; +   program->Base.NumNativeTexInstructions = prog.NumTexInstructions; +   program->Base.NumNativeTexIndirections = prog.NumTexIndirections; +   program->Base.InputsRead      = prog.InputsRead; +   program->Base.OutputsWritten  = prog.OutputsWritten;     for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) { -      program->Base.TexturesUsed[i] = ap.TexturesUsed[i]; -      if (ap.TexturesUsed[i]) +      program->Base.TexturesUsed[i] = state.fragment.TexturesUsed[i]; +      if (state.fragment.TexturesUsed[i])           program->Base.SamplersUsed |= (1 << i);     } -   program->Base.ShadowSamplers = ap.ShadowSamplers; -   program->FogOption          = ap.FogOption; -   program->UsesKill          = ap.UsesKill; +   program->Base.ShadowSamplers = state.fragment.ShadowSamplers; +   switch (state.option.Fog) { +   case OPTION_FOG_EXP:    program->FogOption = GL_EXP;    break; +   case OPTION_FOG_EXP2:   program->FogOption = GL_EXP2;   break; +   case OPTION_FOG_LINEAR: program->FogOption = GL_LINEAR; break; +   default:                program->FogOption = GL_NONE;   break; +   } + +   program->UsesKill            = state.fragment.UsesKill;     if (program->FogOption)        program->Base.InputsRead |= FRAG_BIT_FOGC; @@ -3983,11 +3997,11 @@ _mesa_parse_arb_fragment_program(GLcontext* ctx, GLenum target,     if (program->Base.Instructions)        _mesa_free(program->Base.Instructions); -   program->Base.Instructions = ap.Base.Instructions; +   program->Base.Instructions = prog.Instructions;     if (program->Base.Parameters)        _mesa_free_parameter_list(program->Base.Parameters); -   program->Base.Parameters    = ap.Base.Parameters; +   program->Base.Parameters    = prog.Parameters;     /* Append fog instructions now if the program has "OPTION ARB_fog_exp"      * or similar.  We used to leave this up to drivers, but it appears @@ -4017,11 +4031,17 @@ _mesa_parse_arb_vertex_program(GLcontext *ctx, GLenum target,  			       const GLvoid *str, GLsizei len,  			       struct gl_vertex_program *program)  { -   struct arb_program ap; +   struct gl_program prog; +   struct asm_parser_state state;     ASSERT(target == GL_VERTEX_PROGRAM_ARB); -   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, &ap)) { +   memset(&prog, 0, sizeof(prog)); +   memset(&state, 0, sizeof(state)); +   state.prog = &prog; + +   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, +				&state)) {        _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramString(bad program)");        return;     } @@ -4029,31 +4049,34 @@ _mesa_parse_arb_vertex_program(GLcontext *ctx, GLenum target,     /* Copy the relevant contents of the arb_program struct into the       * vertex_program struct.      */ -   program->Base.String          = ap.Base.String; -   program->Base.NumInstructions = ap.Base.NumInstructions; -   program->Base.NumTemporaries  = ap.Base.NumTemporaries; -   program->Base.NumParameters   = ap.Base.NumParameters; -   program->Base.NumAttributes   = ap.Base.NumAttributes; -   program->Base.NumAddressRegs  = ap.Base.NumAddressRegs; -   program->Base.NumNativeInstructions = ap.Base.NumNativeInstructions; -   program->Base.NumNativeTemporaries = ap.Base.NumNativeTemporaries; -   program->Base.NumNativeParameters = ap.Base.NumNativeParameters; -   program->Base.NumNativeAttributes = ap.Base.NumNativeAttributes; -   program->Base.NumNativeAddressRegs = ap.Base.NumNativeAddressRegs; -   program->Base.InputsRead     = ap.Base.InputsRead; -   program->Base.OutputsWritten = ap.Base.OutputsWritten; -   program->IsPositionInvariant = ap.HintPositionInvariant; +   program->Base.String          = prog.String; +   program->Base.NumInstructions = prog.NumInstructions; +   program->Base.NumTemporaries  = prog.NumTemporaries; +   program->Base.NumParameters   = prog.NumParameters; +   program->Base.NumAttributes   = prog.NumAttributes; +   program->Base.NumAddressRegs  = prog.NumAddressRegs; +   program->Base.NumNativeInstructions = prog.NumNativeInstructions; +   program->Base.NumNativeTemporaries = prog.NumNativeTemporaries; +   program->Base.NumNativeParameters = prog.NumNativeParameters; +   program->Base.NumNativeAttributes = prog.NumNativeAttributes; +   program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs; +   program->Base.InputsRead     = prog.InputsRead; +   program->Base.OutputsWritten = prog.OutputsWritten; +   program->IsPositionInvariant = (state.option.PositionInvariant) +      ? GL_TRUE : GL_FALSE;     if (program->Base.Instructions)        _mesa_free(program->Base.Instructions); -   program->Base.Instructions = ap.Base.Instructions; +   program->Base.Instructions = prog.Instructions;     if (program->Base.Parameters)        _mesa_free_parameter_list(program->Base.Parameters); -   program->Base.Parameters = ap.Base.Parameters;  +   program->Base.Parameters = prog.Parameters;  -#if DEBUG_VP +#if 1 || DEBUG_VP     _mesa_printf("____________Vertex program %u __________\n", program->Base.Id);     _mesa_print_program(&program->Base); +   _mesa_printf("inputs = 0x%04x, outputs = 0x%04x\n", program->Base.InputsRead, +		program->Base.OutputsWritten);  #endif  } diff --git a/src/mesa/shader/hash_table.c b/src/mesa/shader/hash_table.c new file mode 100644 index 0000000000..9b8f251bcc --- /dev/null +++ b/src/mesa/shader/hash_table.c @@ -0,0 +1,153 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * \file hash_table.c + * \brief Implementation of a generic, opaque hash table data type. + * + * \author Ian Romanick <ian.d.romanick@intel.com> + */ +#include <stdlib.h> +#include <string.h> + +#include <assert.h> + +#include "main/simple_list.h" +#include "hash_table.h" + +struct node { +   struct node *next; +   struct node *prev; +}; + +struct hash_table { +    hash_func_t    hash; +    hash_compare_func_t  compare; + +    unsigned num_buckets; +    struct node buckets[1]; +}; + + +struct hash_node { +    struct node link; +    const void *key; +    void *data; +}; + + +struct hash_table * +hash_table_ctor(unsigned num_buckets, hash_func_t hash, +                hash_compare_func_t compare) +{ +    struct hash_table *ht; +    unsigned i; + + +    if (num_buckets < 16) { +        num_buckets = 16; +    } + +    ht = malloc(sizeof(*ht) + ((num_buckets - 1) * sizeof(ht->buckets[0]))); +    if (ht != NULL) { +        ht->hash = hash; +        ht->compare = compare; +        ht->num_buckets = num_buckets; + +        for (i = 0; i < num_buckets; i++) { +            make_empty_list(& ht->buckets[i]); +        } +    } + +    return ht; +} + + +void +hash_table_clear(struct hash_table *ht) +{ +   struct node *node; +   struct node *temp; +   unsigned i; + + +   for (i = 0; i < ht->num_buckets; i++) { +      foreach_s(node, temp, & ht->buckets[i]) { +	 remove_from_list(node); +	 free(node); +      } + +      assert(is_empty_list(& ht->buckets[i])); +   } +} + + +void * +hash_table_find(struct hash_table *ht, const void *key) +{ +    const unsigned hash_value = (*ht->hash)(key); +    const unsigned bucket = hash_value % ht->num_buckets; +    struct node *node; + +    foreach(node, & ht->buckets[bucket]) { +       struct hash_node *hn = (struct hash_node *) node; + +       if ((*ht->compare)(hn->key, key) == 0) { +	  return hn->data; +       } +    } + +    return NULL; +} + + +void +hash_table_insert(struct hash_table *ht, void *data, const void *key) +{ +    const unsigned hash_value = (*ht->hash)(key); +    const unsigned bucket = hash_value % ht->num_buckets; +    struct hash_node *node; + +    node = calloc(1, sizeof(*node)); + +    node->data = data; +    node->key = key; + +    insert_at_head(& ht->buckets[bucket], & node->link); +} + + +unsigned +hash_table_string_hash(const void *key) +{ +    const char *str = (const char *) key; +    unsigned hash = 5381; + + +    while (*str != '\0') { +        hash = (hash * 33) + *str; +        str++; +    } + +    return hash; +} diff --git a/src/mesa/shader/hash_table.h b/src/mesa/shader/hash_table.h new file mode 100644 index 0000000000..83ae7f07c7 --- /dev/null +++ b/src/mesa/shader/hash_table.h @@ -0,0 +1,108 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * \file hash_table.h + * \brief Implementation of a generic, opaque hash table data type. + * + * \author Ian Romanick <ian.d.romanick@intel.com> + */ + +#ifndef HASH_TABLE_H +#define HASH_TABLE_H + +#include <string.h> + +struct hash_table; + +typedef unsigned (*hash_func_t)(const void *key); +typedef int (*hash_compare_func_t)(const void *key1, const void *key2); + +/** + * Hash table constructor + * + * Creates a hash table with the specified number of buckets.  The supplied + * \c hash and \c compare routines are used when adding elements to the table + * and when searching for elements in the table. + * + * \param num_buckets  Number of buckets (bins) in the hash table. + * \param hash         Function used to compute hash value of input keys. + * \param compare      Function used to compare keys. + */ +extern struct hash_table *hash_table_ctor(unsigned num_buckets, +    hash_func_t hash, hash_compare_func_t compare); + + +/** + * Flush all entries from a hash table + * + * \param ht  Table to be cleared of its entries. + */ +extern void hash_table_clear(struct hash_table *ht); + + +/** + * Search a hash table for a specific element + * + * \param ht   Table to be searched + * \param key  Key of the desired element + * + * \return + * The \c data value supplied to \c hash_table_insert when the element with + * the matching key was added.  If no matching key exists in the table, + * \c NULL is returned. + */ +extern void *hash_table_find(struct hash_table *ht, const void *key); + + +/** + * Add an element to a hash table + */ +extern void hash_table_insert(struct hash_table *ht, void *data, +    const void *key); + + +/** + * Compute hash value of a string + * + * Computes the hash value of a string using the DJB2 algorithm developed by + * Professor Daniel J. Bernstein.  It was published on comp.lang.c once upon + * a time.  I was unable to find the original posting in the archives. + * + * \param key  Pointer to a NUL terminated string to be hashed. + * + * \sa hash_table_string_compare + */ +extern unsigned hash_table_string_hash(const void *key); + + +/** + * Compare two strings used as keys + * + * This is just a macro wrapper around \c strcmp. + * + * \sa hash_table_string_hash + */ +#define hash_table_string_compare ((hash_compare_func_t) strcmp) + +#endif /* HASH_TABLE_H */ diff --git a/src/mesa/shader/lex.yy.c b/src/mesa/shader/lex.yy.c new file mode 100644 index 0000000000..120e18eb19 --- /dev/null +++ b/src/mesa/shader/lex.yy.c @@ -0,0 +1,3530 @@ + +#line 3 "lex.yy.c" + +#define  YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 35 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with  platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types.  + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include <inttypes.h> +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t;  +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN               (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN              (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN              (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX               (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX              (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX              (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX              (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX             (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX             (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else	/* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif	/* defined (__STDC__) */ +#endif	/* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index.  If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* An opaque pointer. */ +#ifndef YY_TYPEDEF_YY_SCANNER_T +#define YY_TYPEDEF_YY_SCANNER_T +typedef void* yyscan_t; +#endif + +/* For convenience, these vars (plus the bison vars far below) +   are macros in the reentrant scanner. */ +#define yyin yyg->yyin_r +#define yyout yyg->yyout_r +#define yyextra yyg->yyextra_r +#define yyleng yyg->yyleng_r +#define yytext yyg->yytext_r +#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) +#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) +#define yy_flex_debug yyg->yy_flex_debug_r + +/* Enter a start condition.  This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yyg->yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state.  The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yyg->yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ,yyscanner ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +    #define YY_LESS_LINENO(n) +     +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ +	do \ +		{ \ +		/* Undo effects of setting up yytext. */ \ +        int yyless_macro_arg = (n); \ +        YY_LESS_LINENO(yyless_macro_arg);\ +		*yy_cp = yyg->yy_hold_char; \ +		YY_RESTORE_YY_MORE_OFFSET \ +		yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ +		YY_DO_BEFORE_ACTION; /* set up yytext again */ \ +		} \ +	while ( 0 ) + +#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state +	{ +	FILE *yy_input_file; + +	char *yy_ch_buf;		/* input buffer */ +	char *yy_buf_pos;		/* current position in input buffer */ + +	/* Size of input buffer in bytes, not including room for EOB +	 * characters. +	 */ +	yy_size_t yy_buf_size; + +	/* Number of characters read into yy_ch_buf, not including EOB +	 * characters. +	 */ +	int yy_n_chars; + +	/* Whether we "own" the buffer - i.e., we know we created it, +	 * and can realloc() it to grow it, and should free() it to +	 * delete it. +	 */ +	int yy_is_our_buffer; + +	/* Whether this is an "interactive" input source; if so, and +	 * if we're using stdio for input, then we want to use getc() +	 * instead of fread(), to make sure we stop fetching input after +	 * each newline. +	 */ +	int yy_is_interactive; + +	/* Whether we're considered to be at the beginning of a line. +	 * If so, '^' rules will be active on the next match, otherwise +	 * not. +	 */ +	int yy_at_bol; + +    int yy_bs_lineno; /**< The line count. */ +    int yy_bs_column; /**< The column count. */ +     +	/* Whether to try to fill the input buffer when we reach the +	 * end of it. +	 */ +	int yy_fill_buffer; + +	int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 +	/* When an EOF's been seen but there's still some text to process +	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we +	 * shouldn't try reading from the input source any more.  We might +	 * still have a bunch of tokens to match, though, because of +	 * possible backing-up. +	 * +	 * When we actually see the EOF, we change the status to "new" +	 * (via yyrestart()), so that the user can continue scanning by +	 * just pointing yyin at a new input file. +	 */ +#define YY_BUFFER_EOF_PENDING 2 + +	}; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ +                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ +                          : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] + +void yyrestart (FILE *input_file ,yyscan_t yyscanner ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); +void yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); +void yypop_buffer_state (yyscan_t yyscanner ); + +static void yyensure_buffer_stack (yyscan_t yyscanner ); +static void yy_load_buffer_state (yyscan_t yyscanner ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner ); + +void *yyalloc (yy_size_t ,yyscan_t yyscanner ); +void *yyrealloc (void *,yy_size_t ,yyscan_t yyscanner ); +void yyfree (void * ,yyscan_t yyscanner ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ +	{ \ +	if ( ! YY_CURRENT_BUFFER ){ \ +        yyensure_buffer_stack (yyscanner); \ +		YY_CURRENT_BUFFER_LVALUE =    \ +            yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ +	} \ +	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ +	} + +#define yy_set_bol(at_bol) \ +	{ \ +	if ( ! YY_CURRENT_BUFFER ){\ +        yyensure_buffer_stack (yyscanner); \ +		YY_CURRENT_BUFFER_LVALUE =    \ +            yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ +	} \ +	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ +	} + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define yywrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +typedef int yy_state_type; + +#define yytext_ptr yytext_r + +static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner); +static int yy_get_next_buffer (yyscan_t yyscanner ); +static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ +	yyg->yytext_ptr = yy_bp; \ +	yyleng = (size_t) (yy_cp - yy_bp); \ +	yyg->yy_hold_char = *yy_cp; \ +	*yy_cp = '\0'; \ +	yyg->yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 176 +#define YY_END_OF_BUFFER 177 +/* This struct is not used in this scanner, +   but its presence is necessary. */ +struct yy_trans_info +	{ +	flex_int32_t yy_verify; +	flex_int32_t yy_nxt; +	}; +static yyconst flex_int16_t yy_accept[645] = +    {   0, +        0,    0,  177,  175,  173,  172,  175,  175,  145,  171, +      147,  147,  147,  147,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  173,    0,    0,  174,  145,    0, +      146,  148,  168,  168,    0,    0,    0,    0,  168,    0, +        0,    0,    0,    0,    0,    0,  132,  169,  133,  134, +      159,  159,  159,  159,    0,  147,    0,  140,  141,  142, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, + +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,    0,    0,    0,    0,    0, +        0,    0,    0,    0,  167,    0,    0,    0,    0,    0, +        0,    0,    0,    0,  166,  166,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,  165, +      165,  165,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,  156,  156,  156,  157,  157,  158,  149,  148, +      149,    0,  150,   11,   13,  145,   15,  145,   16,   18, +      145,   20,   22,   24,   26,    6,   28,   30,   31,   33, +       35,   38,   36,   40,   41,   43,   45,   47,   49,   51, + +      145,  145,  145,   53,   55,  145,   57,   59,   61,   63, +       65,   67,   69,  145,   71,   73,   75,   77,  145,  145, +      145,  145,  145,  145,    0,    0,    0,    0,  148,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,   93, +       94,   96,    0,  164,    0,    0,    0,    0,    0,    0, +      110,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,  163,  162,  162,  122,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,  153,  153,  154,  155,    0, +      151,  145,  145,  145,  145,  145,  145,  145,  143,  145, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, + +      145,  145,  145,  145,  145,  145,  145,  145,  145,  144, +      145,  145,  145,  145,  145,  145,  145,   10,  145,  145, +      145,  145,  145,  145,  145,  145,  145,  145,    0,  170, +        0,    0,    0,   86,   87,    0,    0,    0,    0,    0, +        0,    0,   98,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,  161,    0,    0,    0,  126,    0,  128,    0,    0, +        0,    0,    0,    0,  160,  152,  145,  145,  145,    4, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, + +        9,  145,  145,  145,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,  145,  145,   82,  145,  145, +        0,    0,    0,    0,    0,   88,   89,    0,    0,    0, +        0,   97,    0,    0,  101,  104,    0,    0,    0,    0, +        0,    0,    0,  115,  116,    0,    0,    0,    0,  121, +        0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +      145,  145,  145,    5,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,  145,  145,  145,  145,  145, +      145,    7,    8,  145,  145,  145,  145,  145,  145,  145, +      145,  145,  145,  145,  145,  145,  145,  145,   83,  145, + +       79,    0,    0,    0,    0,  137,    0,    0,    0,    0, +        0,    0,    0,    0,    0,  107,    0,  111,  112,    0, +      114,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,  130,  131,    0,    0,  138,   12,    3,   14,   17, +       19,   21,   23,   25,   27,   29,   32,   34,   39,   37, +       42,   44,   46,   48,   50,   52,   54,   56,   58,   60, +       62,   64,   66,   68,   70,   72,   74,   76,   78,  145, +       81,  139,    0,    0,   84,    0,   90,    0,    0,    0, +       99,    0,    0,    0,    0,    0,    0,  113,    0,    0, +      119,  106,    0,    0,    0,    0,    0,    0,  135,    0, + +       80,    0,    0,    0,    0,   92,   95,  100,    0,    0, +      105,    0,    0,    0,  118,    0,    0,    0,    0,  127, +      129,    0,    2,    1,    0,   91,    0,  103,    0,  109, +      117,    0,    0,  124,  125,  136,    0,  102,    0,  120, +      123,   85,  108,    0 +    } ; + +static yyconst flex_int32_t yy_ec[256] = +    {   0, +        1,    1,    1,    1,    1,    1,    1,    1,    2,    3, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    2,    4,    1,    5,    6,    1,    1,    1,    1, +        1,    1,    7,    1,    7,    8,    1,    9,   10,   11, +       12,   13,   14,   14,   14,   14,   14,    1,    1,    1, +        1,    1,    1,    1,   15,   16,   17,   18,   19,   20, +       21,   22,   23,    6,   24,   25,   26,   27,   28,   29, +       30,   31,   32,   33,   34,   35,   36,   37,    6,   38, +        1,    1,    1,    1,   39,    1,   40,   41,   42,   43, + +       44,   45,   46,   47,   48,   49,   50,   51,   52,   53, +       54,   55,   56,   57,   58,   59,   60,   61,   62,   63, +       64,   65,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, + +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1 +    } ; + +static yyconst flex_int32_t yy_meta[66] = +    {   0, +        1,    1,    1,    1,    1,    2,    1,    3,    4,    4, +        4,    4,    4,    4,    2,    2,    2,    4,    4,    2, +        2,    2,    2,    2,    2,    2,    2,    2,    2,    2, +        2,    2,    2,    2,    2,    2,    2,    2,    2,    2, +        2,    2,    2,    4,    2,    2,    2,    2,    2,    2, +        2,    2,    2,    2,    2,    2,    2,    2,    2,    2, +        2,    2,    2,    2,    2 +    } ; + +static yyconst flex_int16_t yy_base[649] = +    {   0, +        0,    0,  904,  905,  901,  905,  898,  898,    0,   64, +       80,   95,  117,  882,  115,   53,   38,   58,   55,  876, +      121,  122,   67,   54,  115,  134,   65,  869,  840,  839, +      851,  835,  849,  848,  889,  875,  886,  905,    0,  169, +      905,  153,  133,  136,   17,  110,  131,   43,  148,  848, +      834,  121,  146,  832,  844,  147,  905,  189,  190,   86, +      189,  177,  185,  193,  250,  262,  273,  905,  905,  905, +      852,  865,  859,  856,  847,  850,  846,  861,  255,  843, +      857,  149,  843,  856,  847,  860,  837,  848,  839,  162, +      840,  831,  840,  831,  830,  831,  825,  831,  842,  828, + +      825,  837,  828,  821,  837,  814,  165,  190,  833,  810, +      795,  790,  807,  783,  788,  813,  144,  803,  225,  798, +      286,  261,  800,  781,  263,  791,  787,  782,   96,  788, +      774,  790,  787,  778,  270,  273,  780,  769,  783,  786, +      768,  783,  770,  767,  774,  264,  782,  160,  269,  285, +      288,  295,  759,  776,  777,  770,  752,  234,  753,  775, +      766,  227,  284,  291,  295,  299,  303,  307,  905,  364, +      375,  381,  387,  774,  205,  797,    0,  780,  771,  770, +      789,  768,  767,  766,  765,    0,  764,    0,  763,  762, +        0,  761,  760,    0,  759,  758,  757,  756,  755,  754, + +      769,  762,  775,  750,  749,  754,  747,  746,  745,  744, +      743,  742,  741,  750,  739,  738,  737,  736,  728,  727, +      712,  712,  711,  710,  752,  725,  713,  393,  400,  375, +      717,  280,  714,  708,  708,  702,  715,  715,  700,  905, +      905,  715,  703,  377,  710,   39,  707,  713,  376,  708, +      905,  699,  706,  705,  708,  694,  693,  697,  692,  294, +      697,  384,  396,  398,  905,  689,  687,  687,  695,  696, +      678,  401,  683,  689,  364,  386,  394,  399,  403,  460, +      466,  702,  714,  700,  699,  707,  697,  696,    0,  695, +      694,  693,  692,  691,  690,  689,  688,  687,  686,  685, + +      684,  683,  682,  681,  684,  677,  684,  677,  676,    0, +      675,  674,  673,  672,  671,  670,  669,    0,  668,  667, +      666,  665,  644,  638,  643,  649,  632,  647,  374,  905, +      646,  636,  640,  905,  905,  630,  639,  625,  642,  625, +      628,  622,  905,  623,  622,  619,  626,  619,  627,  623, +      633,  630,  612,  618,  625,  609,  608,  626,  608,  620, +      619,  905,  618,  608,  612,  905,  599,  905,  604,  604, +      612,  595,  596,  606,  905,  905,  637,  619,  635,    0, +      633,  633,  632,  631,  630,  629,  628,  627,  626,  625, +      624,  623,  622,  621,  620,  619,  618,  617,  604,  597, + +        0,  614,  613,  612,  611,  610,  609,  608,  607,  606, +      605,  604,  603,  602,  572,  575,  555,    0,  556,  549, +      556,  555,  556,  548,  566,  905,  905,  548,  546,  556, +      549,  905,  544,  561,  429,  905,  552,  536,  537,  546, +      537,  536,  536,  905,  535,  544,  534,  550,  547,  905, +      546,  544,  533,  534,  530,  522,  529,  524,  525,  520, +      545,  545,  543,    0,  542,  541,  540,  539,  538,  537, +      536,  535,  534,  533,  532,  531,  530,  529,  528,  527, +      526,    0,    0,  525,  524,  523,  522,  521,  520,  519, +      518,  517,  516,  515,  514,  513,  492,  492,    0,  499, + +        0,  532,  531,  481,  499,  905,  494,  489,  482,  478, +      490,  480,  478,  474,  490,  481,  480,  905,  905,  483, +      905,  478,  471,  460,  471,  463,  467,  480,  475,  478, +      460,  905,  905,  472,  461,  905,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,    0, +        0,    0,    0,    0,    0,    0,    0,    0,    0,  455, +        0,    0,  505,  504,  905,  452,  905,  456,  456,  465, +      905,  449,  463,  451,  453,  450,  458,  905,  436,  447, +      905,  905,  451,  447,  439,  432,  426,  439,  905,  396, + +        0,  443,  437,  392,  378,  905,  905,  905,  378,  338, +      905,  337,  317,  307,  905,  296,  290,  275,  275,  905, +      905,  288,  905,  905,  268,  905,  261,  905,  264,  905, +      905,  213,  158,  905,  905,  905,  128,  905,   75,  905, +      905,  905,  905,  905,  484,  487,  489,  493 +    } ; + +static yyconst flex_int16_t yy_def[649] = +    {   0, +      644,    1,  644,  644,  644,  644,  644,  645,  646,  644, +      644,  647,  647,   13,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  644,  644,  645,  644,  646,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  648,  644,  644,  644,  644,  644, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, + +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, + +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, + +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, + +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, + +      646,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  646,  646,  646,  646,  646,  646,  646,  646, +      646,  646,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, + +      646,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,    0,  644,  644,  644,  644 +    } ; + +static yyconst flex_int16_t yy_nxt[971] = +    {   0, +        4,    5,    6,    7,    8,    9,    4,   10,   11,   12, +       13,   14,   11,   11,   15,    9,   16,   17,   18,   19, +        9,    9,    9,   20,   21,   22,    9,   23,   24,    9, +       25,   26,   27,    9,    9,    9,   28,    9,    9,    9, +        9,    9,    9,    9,   29,    9,    9,    9,    9,    9, +        9,    9,    9,    9,   30,    9,   31,   32,   33,    9, +       34,    9,    9,    9,    9,   40,   79,  126,   96,   80, +      127,   41,   42,   42,   42,   42,   42,   42,   76,   83, +       77,   97,  344,  107,   81,   84,   78,   65,   66,   66, +       66,   66,   66,   66,   82,   94,  133,  345,   67,  134, + +       95,  108,   65,   43,   44,   45,   46,   47,   48,   49, +       50,   51,   68,   67,   52,   53,   54,   55,   56,   57, +       58,   59,   60,   67,   65,   61,   62,   63,   64,  159, +       71,   98,   72,   99,   69,   67,   90,  643,   67,   73, +      237,   86,  160,   87,   91,   74,  100,   75,   88,   92, +      101,   89,  238,  128,  102,   93,  103,  129,  104,  187, +       67,   42,   42,   42,   42,   42,   42,  105,  139,  106, +       40,  121,  122,  122,  140,  125,  122,  188,  122,  196, +      642,  122,  130,  131,  123,  141,  146,  135,  136,  122, +      214,  124,  122,  122,  132,  123,  121,  147,  197,  142, + +      148,  215,  124,  149,  122,  216,  143,  257,  117,  118, +       45,   46,   47,   48,  641,   50,   51,  258,  217,   52, +       53,   54,   55,   56,   57,  119,   59,   60,  150,  151, +      120,  154,  161,  155,  152,  283,  156,  157,  163,  162, +      164,  165,  153,  284,  158,  122,  166,  162,  162,  167, +      162,  162,  162,  162,  168,  162,  162,  162,  170,  170, +      170,  170,  170,  170,  227,  640,  182,  183,  171,   65, +       66,   66,   66,   66,   66,   66,  184,  270,  153,  172, +       67,  173,  173,  173,  173,  173,  173,  271,  275,  275, +      275,  275,  228,  171,  229,  229,  229,  229,  229,  229, + +      230,  230,  230,  230,  233,   67,  230,  639,  230,  230, +      230,  638,  244,  230,  254,  230,  259,  230,  230,  230, +      255,  637,  260,  332,  230,  230,  230,  262,  230,  230, +      230,  636,  635,  230,  263,  264,  333,  261,  634,  359, +      230,  230,  360,  633,  230,  275,  275,  275,  275,  632, +      631,  230,  276,  275,  275,  277,  278,  275,  275,  275, +      275,  275,  275,  275,  279,  275,  275,  275,  275,  275, +      275,  275,   42,   42,   42,   42,   42,   42,  630,  629, +      628,  280,  121,  281,  281,  281,  281,  281,  281,  173, +      173,  173,  173,  173,  173,  173,  173,  173,  173,  173, + +      173,  229,  229,  229,  229,  229,  229,  121,  229,  229, +      229,  229,  229,  229,  330,  330,  330,  330,  421,  348, +      330,  627,  330,  330,  330,  375,  375,  375,  375,  330, +      626,  330,  349,  330,  422,  330,  330,  362,  330,  625, +      330,  330,  369,  330,  370,  624,  371,  375,  375,  375, +      375,  623,  330,  622,  330,  376,  375,  375,  375,  372, +      375,  375,  375,  375,  375,  375,  375,  375,  281,  281, +      281,  281,  281,  281,  281,  281,  281,  281,  281,  281, +      513,  621,  620,  514,   37,   37,   37,   37,   39,  619, +       39,   66,   66,  169,  169,  618,  169,  617,  616,  615, + +      614,  613,  612,  611,  610,  609,  608,  607,  606,  605, +      604,  603,  602,  601,  600,  599,  598,  597,  596,  595, +      594,  593,  592,  591,  590,  589,  588,  587,  586,  585, +      584,  583,  582,  581,  580,  579,  578,  577,  576,  575, +      574,  573,  572,  571,  570,  569,  568,  567,  566,  565, +      564,  563,  562,  561,  560,  559,  558,  557,  556,  555, +      554,  553,  552,  551,  550,  549,  548,  547,  546,  545, +      544,  543,  542,  541,  540,  539,  538,  537,  536,  535, +      534,  533,  532,  531,  530,  529,  528,  527,  526,  525, +      524,  523,  522,  521,  520,  519,  518,  517,  516,  515, + +      512,  511,  510,  509,  508,  507,  506,  505,  504,  503, +      502,  501,  500,  499,  498,  497,  496,  495,  494,  493, +      492,  491,  490,  489,  488,  487,  486,  485,  484,  483, +      482,  481,  480,  479,  478,  477,  476,  475,  474,  473, +      472,  471,  470,  469,  468,  467,  466,  465,  464,  463, +      462,  461,  460,  459,  458,  457,  456,  455,  454,  453, +      452,  451,  450,  449,  448,  447,  446,  445,  444,  443, +      442,  441,  440,  439,  438,  437,  436,  435,  434,  433, +      432,  431,  430,  429,  428,  427,  426,  425,  424,  423, +      420,  419,  418,  417,  416,  415,  414,  413,  412,  411, + +      410,  409,  408,  407,  406,  405,  404,  403,  402,  401, +      400,  399,  398,  397,  396,  395,  394,  393,  392,  391, +      390,  389,  388,  387,  386,  385,  384,  383,  382,  381, +      380,  379,  378,  377,  374,  373,  368,  367,  366,  365, +      364,  363,  361,  358,  357,  356,  355,  354,  353,  352, +      351,  350,  347,  346,  343,  342,  341,  340,  339,  338, +      337,  336,  335,  334,  331,  261,  233,  329,  328,  327, +      326,  325,  324,  323,  322,  321,  320,  319,  318,  317, +      316,  315,  314,  313,  312,  311,  310,  309,  308,  307, +      306,  305,  304,  303,  302,  301,  300,  299,  298,  297, + +      296,  295,  294,  293,  292,  291,  290,  289,  288,  287, +      286,  285,  282,  274,  273,  272,  269,  268,  267,  266, +      265,  256,  253,  252,  251,  250,  249,  248,  247,  246, +      245,  243,  242,  241,  240,  239,  236,  235,  234,  232, +      231,  161,  226,  225,  224,  223,  222,  221,  220,  219, +      218,  213,  212,  211,  210,  209,  208,  207,  206,  205, +      204,  203,  202,  201,  200,  199,  198,  195,  194,  193, +      192,  191,  190,  189,  186,  185,  181,  180,  179,  178, +      177,  176,  175,  174,  145,  144,  138,  137,   38,  116, +       35,  115,  114,  113,  112,  111,  110,  109,   85,   70, + +       38,   36,   35,  644,    3,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644 +    } ; + +static yyconst flex_int16_t yy_chk[971] = +    {   0, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,    1,    1,    1,    1,    1, +        1,    1,    1,    1,    1,   10,   17,   45,   24,   17, +       45,   10,   10,   10,   10,   10,   10,   10,   16,   19, +       16,   24,  246,   27,   18,   19,   16,   11,   11,   11, +       11,   11,   11,   11,   18,   23,   48,  246,   11,   48, + +       23,   27,   12,   10,   10,   10,   10,   10,   10,   10, +       10,   10,   12,   12,   10,   10,   10,   10,   10,   10, +       10,   10,   10,   11,   13,   10,   10,   10,   10,   60, +       15,   25,   15,   25,   13,   13,   22,  639,   12,   15, +      129,   21,   60,   21,   22,   15,   25,   15,   21,   22, +       26,   21,  129,   46,   26,   22,   26,   46,   26,   82, +       13,   42,   42,   42,   42,   42,   42,   26,   52,   26, +       40,   42,   43,   43,   52,   44,   44,   82,   43,   90, +      637,   44,   47,   47,   43,   53,   56,   49,   49,   43, +      107,   43,   44,   49,   47,  117,   42,   56,   90,   53, + +       56,  107,  117,   56,   49,  108,   53,  148,   40,   40, +       40,   40,   40,   40,  633,   40,   40,  148,  108,   40, +       40,   40,   40,   40,   40,   40,   40,   40,   58,   58, +       40,   59,   61,   59,   58,  175,   59,   59,   62,   62, +       62,   62,   58,  175,   59,   58,   63,   63,   63,   63, +       61,   61,   61,   61,   64,   64,   64,   64,   65,   65, +       65,   65,   65,   65,  119,  632,   79,   79,   65,   66, +       66,   66,   66,   66,   66,   66,   79,  158,  119,   67, +       66,   67,   67,   67,   67,   67,   67,  158,  162,  162, +      162,  162,  121,   65,  121,  121,  121,  121,  121,  121, + +      122,  122,  125,  125,  125,   66,  122,  629,  125,  135, +      135,  627,  136,  136,  146,  135,  149,  122,  136,  125, +      146,  625,  149,  232,  150,  150,  135,  151,  151,  136, +      150,  622,  619,  151,  152,  152,  232,  150,  618,  260, +      152,  150,  260,  617,  151,  163,  163,  163,  163,  616, +      614,  152,  164,  164,  164,  164,  165,  165,  165,  165, +      166,  166,  166,  166,  167,  167,  167,  167,  168,  168, +      168,  168,  170,  170,  170,  170,  170,  170,  613,  612, +      610,  171,  170,  171,  171,  171,  171,  171,  171,  172, +      172,  172,  172,  172,  172,  173,  173,  173,  173,  173, + +      173,  228,  228,  228,  228,  228,  228,  170,  229,  229, +      229,  229,  229,  229,  230,  230,  244,  244,  329,  249, +      230,  609,  244,  262,  262,  275,  275,  275,  275,  262, +      605,  230,  249,  244,  329,  263,  263,  264,  264,  604, +      262,  263,  272,  264,  272,  603,  272,  276,  276,  276, +      276,  602,  263,  600,  264,  277,  277,  277,  277,  272, +      278,  278,  278,  278,  279,  279,  279,  279,  280,  280, +      280,  280,  280,  280,  281,  281,  281,  281,  281,  281, +      435,  598,  597,  435,  645,  645,  645,  645,  646,  596, +      646,  647,  647,  648,  648,  595,  648,  594,  593,  590, + +      589,  587,  586,  585,  584,  583,  582,  580,  579,  578, +      576,  574,  573,  570,  535,  534,  531,  530,  529,  528, +      527,  526,  525,  524,  523,  522,  520,  517,  516,  515, +      514,  513,  512,  511,  510,  509,  508,  507,  505,  504, +      503,  502,  500,  498,  497,  496,  495,  494,  493,  492, +      491,  490,  489,  488,  487,  486,  485,  484,  481,  480, +      479,  478,  477,  476,  475,  474,  473,  472,  471,  470, +      469,  468,  467,  466,  465,  463,  462,  461,  460,  459, +      458,  457,  456,  455,  454,  453,  452,  451,  449,  448, +      447,  446,  445,  443,  442,  441,  440,  439,  438,  437, + +      434,  433,  431,  430,  429,  428,  425,  424,  423,  422, +      421,  420,  419,  417,  416,  415,  414,  413,  412,  411, +      410,  409,  408,  407,  406,  405,  404,  403,  402,  400, +      399,  398,  397,  396,  395,  394,  393,  392,  391,  390, +      389,  388,  387,  386,  385,  384,  383,  382,  381,  379, +      378,  377,  374,  373,  372,  371,  370,  369,  367,  365, +      364,  363,  361,  360,  359,  358,  357,  356,  355,  354, +      353,  352,  351,  350,  349,  348,  347,  346,  345,  344, +      342,  341,  340,  339,  338,  337,  336,  333,  332,  331, +      328,  327,  326,  325,  324,  323,  322,  321,  320,  319, + +      317,  316,  315,  314,  313,  312,  311,  309,  308,  307, +      306,  305,  304,  303,  302,  301,  300,  299,  298,  297, +      296,  295,  294,  293,  292,  291,  290,  288,  287,  286, +      285,  284,  283,  282,  274,  273,  271,  270,  269,  268, +      267,  266,  261,  259,  258,  257,  256,  255,  254,  253, +      252,  250,  248,  247,  245,  243,  242,  239,  238,  237, +      236,  235,  234,  233,  231,  227,  226,  225,  224,  223, +      222,  221,  220,  219,  218,  217,  216,  215,  214,  213, +      212,  211,  210,  209,  208,  207,  206,  205,  204,  203, +      202,  201,  200,  199,  198,  197,  196,  195,  193,  192, + +      190,  189,  187,  185,  184,  183,  182,  181,  180,  179, +      178,  176,  174,  161,  160,  159,  157,  156,  155,  154, +      153,  147,  145,  144,  143,  142,  141,  140,  139,  138, +      137,  134,  133,  132,  131,  130,  128,  127,  126,  124, +      123,  120,  118,  116,  115,  114,  113,  112,  111,  110, +      109,  106,  105,  104,  103,  102,  101,  100,   99,   98, +       97,   96,   95,   94,   93,   92,   91,   89,   88,   87, +       86,   85,   84,   83,   81,   80,   78,   77,   76,   75, +       74,   73,   72,   71,   55,   54,   51,   50,   37,   36, +       35,   34,   33,   32,   31,   30,   29,   28,   20,   14, + +        8,    7,    5,    3,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644, +      644,  644,  644,  644,  644,  644,  644,  644,  644,  644 +    } ; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +#line 1 "program_lexer.l" +#line 2 "program_lexer.l" +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include "main/glheader.h" +#include "prog_instruction.h" + +#include "program_parser.h" +#include "program_parse.tab.h" + +#define require_ARB_vp (yyextra->mode == ARB_vertex) +#define require_ARB_fp (yyextra->mode == ARB_fragment) + +#define return_token_or_IDENTIFIER(condition, token)	\ +   do {							\ +      if (condition) {					\ +	 return token;					\ +      } else {						\ +	 yylval->string = strdup(yytext);		\ +	 return IDENTIFIER;				\ +      }							\ +   } while (0) + +#define return_token_or_DOT(condition, token)		\ +   do {							\ +      if (condition) {					\ +	 return token;					\ +      } else {						\ +	 yyless(1);					\ +	 return DOT;					\ +      }							\ +   } while (0) + + +#define return_opcode(condition, token, opcode, sat)	\ +   do {							\ +      if (condition) {					\ +	 yylval->temp_inst.Opcode = OPCODE_ ## opcode;	\ +	 yylval->temp_inst.SaturateMode = SATURATE_ ## sat; \ +	 return token;					\ +      } else {						\ +	 yylval->string = strdup(yytext);		\ +	 return IDENTIFIER;				\ +      }							\ +   } while (0) + +#define SWIZZLE_INVAL  MAKE_SWIZZLE4(SWIZZLE_NIL, SWIZZLE_NIL, \ +				     SWIZZLE_NIL, SWIZZLE_NIL) + +static unsigned +mask_from_char(char c) +{ +   switch (c) { +   case 'x': +   case 'r': +      return WRITEMASK_X; +   case 'y': +   case 'g': +      return WRITEMASK_Y; +   case 'z': +   case 'b': +      return WRITEMASK_Z; +   case 'w': +   case 'a': +      return WRITEMASK_W; +   } + +   return 0; +} + +static unsigned +swiz_from_char(char c) +{ +   switch (c) { +   case 'x': +   case 'r': +      return SWIZZLE_X; +   case 'y': +   case 'g': +      return SWIZZLE_Y; +   case 'z': +   case 'b': +      return SWIZZLE_Z; +   case 'w': +   case 'a': +      return SWIZZLE_W; +   } + +   return 0; +} + +#define YY_USER_ACTION							\ +   do {									\ +      yylloc->first_column = yylloc->last_column;			\ +      yylloc->last_column += yyleng;					\ +      if ((yylloc->first_line == 1)					\ +	  && (yylloc->first_column == 1)) {				\ +	 yylloc->position = 1;						\ +      } else {								\ +	 yylloc->position += yylloc->last_column - yylloc->first_column; \ +      }									\ +   } while(0); + +#define YY_EXTRA_TYPE struct asm_parser_state * +#line 989 "lex.yy.c" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include <unistd.h> +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Holds the entire state of the reentrant scanner. */ +struct yyguts_t +    { + +    /* User-defined. Not touched by flex. */ +    YY_EXTRA_TYPE yyextra_r; + +    /* The rest are the same as the globals declared in the non-reentrant scanner. */ +    FILE *yyin_r, *yyout_r; +    size_t yy_buffer_stack_top; /**< index of top of stack. */ +    size_t yy_buffer_stack_max; /**< capacity of stack. */ +    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ +    char yy_hold_char; +    int yy_n_chars; +    int yyleng_r; +    char *yy_c_buf_p; +    int yy_init; +    int yy_start; +    int yy_did_buffer_switch_on_eof; +    int yy_start_stack_ptr; +    int yy_start_stack_depth; +    int *yy_start_stack; +    yy_state_type yy_last_accepting_state; +    char* yy_last_accepting_cpos; + +    int yylineno_r; +    int yy_flex_debug_r; + +    char *yytext_r; +    int yy_more_flag; +    int yy_more_len; + +    YYSTYPE * yylval_r; + +    YYLTYPE * yylloc_r; + +    }; /* end struct yyguts_t */ + +static int yy_init_globals (yyscan_t yyscanner ); + +    /* This must go here because YYSTYPE and YYLTYPE are included +     * from bison output in section 1.*/ +    #    define yylval yyg->yylval_r +     +    #    define yylloc yyg->yylloc_r +     +int yylex_init (yyscan_t* scanner); + +int yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); + +/* Accessor methods to globals. +   These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (yyscan_t yyscanner ); + +int yyget_debug (yyscan_t yyscanner ); + +void yyset_debug (int debug_flag ,yyscan_t yyscanner ); + +YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); + +FILE *yyget_in (yyscan_t yyscanner ); + +void yyset_in  (FILE * in_str ,yyscan_t yyscanner ); + +FILE *yyget_out (yyscan_t yyscanner ); + +void yyset_out  (FILE * out_str ,yyscan_t yyscanner ); + +int yyget_leng (yyscan_t yyscanner ); + +char *yyget_text (yyscan_t yyscanner ); + +int yyget_lineno (yyscan_t yyscanner ); + +void yyset_lineno (int line_number ,yyscan_t yyscanner ); + +YYSTYPE * yyget_lval (yyscan_t yyscanner ); + +void yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); + +       YYLTYPE *yyget_lloc (yyscan_t yyscanner ); +     +        void yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner ); +     +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (yyscan_t yyscanner ); +#else +extern int yywrap (yyscan_t yyscanner ); +#endif +#endif + +    static void yyunput (int c,char *buf_ptr  ,yyscan_t yyscanner); +     +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (yyscan_t yyscanner ); +#else +static int input (yyscan_t yyscanner ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ +	if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ +		{ \ +		int c = '*'; \ +		size_t n; \ +		for ( n = 0; n < max_size && \ +			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ +			buf[n] = (char) c; \ +		if ( c == '\n' ) \ +			buf[n++] = (char) c; \ +		if ( c == EOF && ferror( yyin ) ) \ +			YY_FATAL_ERROR( "input in flex scanner failed" ); \ +		result = n; \ +		} \ +	else \ +		{ \ +		errno=0; \ +		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ +			{ \ +			if( errno != EINTR) \ +				{ \ +				YY_FATAL_ERROR( "input in flex scanner failed" ); \ +				break; \ +				} \ +			errno=0; \ +			clearerr(yyin); \ +			} \ +		}\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex \ +               (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner); + +#define YY_DECL int yylex \ +               (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ +	YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ +	register yy_state_type yy_current_state; +	register char *yy_cp, *yy_bp; +	register int yy_act; +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +#line 132 "program_lexer.l" + + +#line 1238 "lex.yy.c" + +    yylval = yylval_param; + +    yylloc = yylloc_param; + +	if ( !yyg->yy_init ) +		{ +		yyg->yy_init = 1; + +#ifdef YY_USER_INIT +		YY_USER_INIT; +#endif + +		if ( ! yyg->yy_start ) +			yyg->yy_start = 1;	/* first start state */ + +		if ( ! yyin ) +			yyin = stdin; + +		if ( ! yyout ) +			yyout = stdout; + +		if ( ! YY_CURRENT_BUFFER ) { +			yyensure_buffer_stack (yyscanner); +			YY_CURRENT_BUFFER_LVALUE = +				yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); +		} + +		yy_load_buffer_state(yyscanner ); +		} + +	while ( 1 )		/* loops until end-of-file is reached */ +		{ +		yy_cp = yyg->yy_c_buf_p; + +		/* Support of yytext. */ +		*yy_cp = yyg->yy_hold_char; + +		/* yy_bp points to the position in yy_ch_buf of the start of +		 * the current run. +		 */ +		yy_bp = yy_cp; + +		yy_current_state = yyg->yy_start; +yy_match: +		do +			{ +			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; +			if ( yy_accept[yy_current_state] ) +				{ +				yyg->yy_last_accepting_state = yy_current_state; +				yyg->yy_last_accepting_cpos = yy_cp; +				} +			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +				{ +				yy_current_state = (int) yy_def[yy_current_state]; +				if ( yy_current_state >= 645 ) +					yy_c = yy_meta[(unsigned int) yy_c]; +				} +			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +			++yy_cp; +			} +		while ( yy_base[yy_current_state] != 905 ); + +yy_find_action: +		yy_act = yy_accept[yy_current_state]; +		if ( yy_act == 0 ) +			{ /* have to back up */ +			yy_cp = yyg->yy_last_accepting_cpos; +			yy_current_state = yyg->yy_last_accepting_state; +			yy_act = yy_accept[yy_current_state]; +			} + +		YY_DO_BEFORE_ACTION; + +do_action:	/* This label is used only to access EOF actions. */ + +		switch ( yy_act ) +	{ /* beginning of action switch */ +			case 0: /* must back up */ +			/* undo the effects of YY_DO_BEFORE_ACTION */ +			*yy_cp = yyg->yy_hold_char; +			yy_cp = yyg->yy_last_accepting_cpos; +			yy_current_state = yyg->yy_last_accepting_state; +			goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 134 "program_lexer.l" +{ return ARBvp_10; } +	YY_BREAK +case 2: +YY_RULE_SETUP +#line 135 "program_lexer.l" +{ return ARBfp_10; } +	YY_BREAK +case 3: +YY_RULE_SETUP +#line 136 "program_lexer.l" +{ +   yylval->integer = at_address; +   return_token_or_IDENTIFIER(require_ARB_vp, ADDRESS); +} +	YY_BREAK +case 4: +YY_RULE_SETUP +#line 140 "program_lexer.l" +{ return ALIAS; } +	YY_BREAK +case 5: +YY_RULE_SETUP +#line 141 "program_lexer.l" +{ return ATTRIB; } +	YY_BREAK +case 6: +YY_RULE_SETUP +#line 142 "program_lexer.l" +{ return END; } +	YY_BREAK +case 7: +YY_RULE_SETUP +#line 143 "program_lexer.l" +{ return OPTION; } +	YY_BREAK +case 8: +YY_RULE_SETUP +#line 144 "program_lexer.l" +{ return OUTPUT; } +	YY_BREAK +case 9: +YY_RULE_SETUP +#line 145 "program_lexer.l" +{ return PARAM; } +	YY_BREAK +case 10: +YY_RULE_SETUP +#line 146 "program_lexer.l" +{ yylval->integer = at_temp; return TEMP; } +	YY_BREAK +case 11: +YY_RULE_SETUP +#line 148 "program_lexer.l" +{ return_opcode(             1, VECTOR_OP, ABS, OFF); } +	YY_BREAK +case 12: +YY_RULE_SETUP +#line 149 "program_lexer.l" +{ return_opcode(require_ARB_fp, VECTOR_OP, ABS, ZERO_ONE); } +	YY_BREAK +case 13: +YY_RULE_SETUP +#line 150 "program_lexer.l" +{ return_opcode(             1, BIN_OP, ADD, OFF); } +	YY_BREAK +case 14: +YY_RULE_SETUP +#line 151 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, ADD, ZERO_ONE); } +	YY_BREAK +case 15: +YY_RULE_SETUP +#line 152 "program_lexer.l" +{ return_opcode(require_ARB_vp, ARL, ARL, OFF); } +	YY_BREAK +case 16: +YY_RULE_SETUP +#line 154 "program_lexer.l" +{ return_opcode(require_ARB_fp, TRI_OP, CMP, OFF); } +	YY_BREAK +case 17: +YY_RULE_SETUP +#line 155 "program_lexer.l" +{ return_opcode(require_ARB_fp, TRI_OP, CMP, ZERO_ONE); } +	YY_BREAK +case 18: +YY_RULE_SETUP +#line 156 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, COS, OFF); } +	YY_BREAK +case 19: +YY_RULE_SETUP +#line 157 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, COS, ZERO_ONE); } +	YY_BREAK +case 20: +YY_RULE_SETUP +#line 159 "program_lexer.l" +{ return_opcode(             1, BIN_OP, DP3, OFF); } +	YY_BREAK +case 21: +YY_RULE_SETUP +#line 160 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, DP3, ZERO_ONE); } +	YY_BREAK +case 22: +YY_RULE_SETUP +#line 161 "program_lexer.l" +{ return_opcode(             1, BIN_OP, DP4, OFF); } +	YY_BREAK +case 23: +YY_RULE_SETUP +#line 162 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, DP4, ZERO_ONE); } +	YY_BREAK +case 24: +YY_RULE_SETUP +#line 163 "program_lexer.l" +{ return_opcode(             1, BIN_OP, DPH, OFF); } +	YY_BREAK +case 25: +YY_RULE_SETUP +#line 164 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, DPH, ZERO_ONE); } +	YY_BREAK +case 26: +YY_RULE_SETUP +#line 165 "program_lexer.l" +{ return_opcode(             1, BIN_OP, DST, OFF); } +	YY_BREAK +case 27: +YY_RULE_SETUP +#line 166 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, DST, ZERO_ONE); } +	YY_BREAK +case 28: +YY_RULE_SETUP +#line 168 "program_lexer.l" +{ return_opcode(             1, SCALAR_OP, EX2, OFF); } +	YY_BREAK +case 29: +YY_RULE_SETUP +#line 169 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, EX2, ZERO_ONE); } +	YY_BREAK +case 30: +YY_RULE_SETUP +#line 170 "program_lexer.l" +{ return_opcode(require_ARB_vp, SCALAR_OP, EXP, OFF); } +	YY_BREAK +case 31: +YY_RULE_SETUP +#line 172 "program_lexer.l" +{ return_opcode(             1, VECTOR_OP, FLR, OFF); } +	YY_BREAK +case 32: +YY_RULE_SETUP +#line 173 "program_lexer.l" +{ return_opcode(require_ARB_fp, VECTOR_OP, FLR, ZERO_ONE); } +	YY_BREAK +case 33: +YY_RULE_SETUP +#line 174 "program_lexer.l" +{ return_opcode(             1, VECTOR_OP, FRC, OFF); } +	YY_BREAK +case 34: +YY_RULE_SETUP +#line 175 "program_lexer.l" +{ return_opcode(require_ARB_fp, VECTOR_OP, FRC, ZERO_ONE); } +	YY_BREAK +case 35: +YY_RULE_SETUP +#line 177 "program_lexer.l" +{ return_opcode(require_ARB_fp, KIL, KIL, OFF); } +	YY_BREAK +case 36: +YY_RULE_SETUP +#line 179 "program_lexer.l" +{ return_opcode(             1, VECTOR_OP, LIT, OFF); } +	YY_BREAK +case 37: +YY_RULE_SETUP +#line 180 "program_lexer.l" +{ return_opcode(require_ARB_fp, VECTOR_OP, LIT, ZERO_ONE); } +	YY_BREAK +case 38: +YY_RULE_SETUP +#line 181 "program_lexer.l" +{ return_opcode(             1, SCALAR_OP, LG2, OFF); } +	YY_BREAK +case 39: +YY_RULE_SETUP +#line 182 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, LG2, ZERO_ONE); } +	YY_BREAK +case 40: +YY_RULE_SETUP +#line 183 "program_lexer.l" +{ return_opcode(require_ARB_vp, SCALAR_OP, LOG, OFF); } +	YY_BREAK +case 41: +YY_RULE_SETUP +#line 184 "program_lexer.l" +{ return_opcode(require_ARB_fp, TRI_OP, LRP, OFF); } +	YY_BREAK +case 42: +YY_RULE_SETUP +#line 185 "program_lexer.l" +{ return_opcode(require_ARB_fp, TRI_OP, LRP, ZERO_ONE); } +	YY_BREAK +case 43: +YY_RULE_SETUP +#line 187 "program_lexer.l" +{ return_opcode(             1, TRI_OP, MAD, OFF); } +	YY_BREAK +case 44: +YY_RULE_SETUP +#line 188 "program_lexer.l" +{ return_opcode(require_ARB_fp, TRI_OP, MAD, ZERO_ONE); } +	YY_BREAK +case 45: +YY_RULE_SETUP +#line 189 "program_lexer.l" +{ return_opcode(             1, BIN_OP, MAX, OFF); } +	YY_BREAK +case 46: +YY_RULE_SETUP +#line 190 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, MAX, ZERO_ONE); } +	YY_BREAK +case 47: +YY_RULE_SETUP +#line 191 "program_lexer.l" +{ return_opcode(             1, BIN_OP, MIN, OFF); } +	YY_BREAK +case 48: +YY_RULE_SETUP +#line 192 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, MIN, ZERO_ONE); } +	YY_BREAK +case 49: +YY_RULE_SETUP +#line 193 "program_lexer.l" +{ return_opcode(             1, VECTOR_OP, MOV, OFF); } +	YY_BREAK +case 50: +YY_RULE_SETUP +#line 194 "program_lexer.l" +{ return_opcode(require_ARB_fp, VECTOR_OP, MOV, ZERO_ONE); } +	YY_BREAK +case 51: +YY_RULE_SETUP +#line 195 "program_lexer.l" +{ return_opcode(             1, BIN_OP, MUL, OFF); } +	YY_BREAK +case 52: +YY_RULE_SETUP +#line 196 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, MUL, ZERO_ONE); } +	YY_BREAK +case 53: +YY_RULE_SETUP +#line 198 "program_lexer.l" +{ return_opcode(             1, BINSC_OP, POW, OFF); } +	YY_BREAK +case 54: +YY_RULE_SETUP +#line 199 "program_lexer.l" +{ return_opcode(require_ARB_fp, BINSC_OP, POW, ZERO_ONE); } +	YY_BREAK +case 55: +YY_RULE_SETUP +#line 201 "program_lexer.l" +{ return_opcode(             1, SCALAR_OP, RCP, OFF); } +	YY_BREAK +case 56: +YY_RULE_SETUP +#line 202 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, RCP, ZERO_ONE); } +	YY_BREAK +case 57: +YY_RULE_SETUP +#line 203 "program_lexer.l" +{ return_opcode(             1, SCALAR_OP, RSQ, OFF); } +	YY_BREAK +case 58: +YY_RULE_SETUP +#line 204 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, RSQ, ZERO_ONE); } +	YY_BREAK +case 59: +YY_RULE_SETUP +#line 206 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, SCS, OFF); } +	YY_BREAK +case 60: +YY_RULE_SETUP +#line 207 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, SCS, ZERO_ONE); } +	YY_BREAK +case 61: +YY_RULE_SETUP +#line 208 "program_lexer.l" +{ return_opcode(             1, BIN_OP, SGE, OFF); } +	YY_BREAK +case 62: +YY_RULE_SETUP +#line 209 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, SGE, ZERO_ONE); } +	YY_BREAK +case 63: +YY_RULE_SETUP +#line 210 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, SIN, OFF); } +	YY_BREAK +case 64: +YY_RULE_SETUP +#line 211 "program_lexer.l" +{ return_opcode(require_ARB_fp, SCALAR_OP, SIN, ZERO_ONE); } +	YY_BREAK +case 65: +YY_RULE_SETUP +#line 212 "program_lexer.l" +{ return_opcode(             1, BIN_OP, SLT, OFF); } +	YY_BREAK +case 66: +YY_RULE_SETUP +#line 213 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, SLT, ZERO_ONE); } +	YY_BREAK +case 67: +YY_RULE_SETUP +#line 214 "program_lexer.l" +{ return_opcode(             1, BIN_OP, SUB, OFF); } +	YY_BREAK +case 68: +YY_RULE_SETUP +#line 215 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, SUB, ZERO_ONE); } +	YY_BREAK +case 69: +YY_RULE_SETUP +#line 216 "program_lexer.l" +{ return_opcode(             1, SWZ, SWZ, OFF); } +	YY_BREAK +case 70: +YY_RULE_SETUP +#line 217 "program_lexer.l" +{ return_opcode(require_ARB_fp, SWZ, SWZ, ZERO_ONE); } +	YY_BREAK +case 71: +YY_RULE_SETUP +#line 219 "program_lexer.l" +{ return_opcode(require_ARB_fp, SAMPLE_OP, TEX, OFF); } +	YY_BREAK +case 72: +YY_RULE_SETUP +#line 220 "program_lexer.l" +{ return_opcode(require_ARB_fp, SAMPLE_OP, TEX, ZERO_ONE); } +	YY_BREAK +case 73: +YY_RULE_SETUP +#line 221 "program_lexer.l" +{ return_opcode(require_ARB_fp, SAMPLE_OP, TXB, OFF); } +	YY_BREAK +case 74: +YY_RULE_SETUP +#line 222 "program_lexer.l" +{ return_opcode(require_ARB_fp, SAMPLE_OP, TXB, ZERO_ONE); } +	YY_BREAK +case 75: +YY_RULE_SETUP +#line 223 "program_lexer.l" +{ return_opcode(require_ARB_fp, SAMPLE_OP, TXP, OFF); } +	YY_BREAK +case 76: +YY_RULE_SETUP +#line 224 "program_lexer.l" +{ return_opcode(require_ARB_fp, SAMPLE_OP, TXP, ZERO_ONE); } +	YY_BREAK +case 77: +YY_RULE_SETUP +#line 226 "program_lexer.l" +{ return_opcode(             1, BIN_OP, XPD, OFF); } +	YY_BREAK +case 78: +YY_RULE_SETUP +#line 227 "program_lexer.l" +{ return_opcode(require_ARB_fp, BIN_OP, XPD, ZERO_ONE); } +	YY_BREAK +case 79: +YY_RULE_SETUP +#line 229 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_vp, VERTEX); } +	YY_BREAK +case 80: +YY_RULE_SETUP +#line 230 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_fp, FRAGMENT); } +	YY_BREAK +case 81: +YY_RULE_SETUP +#line 231 "program_lexer.l" +{ return PROGRAM; } +	YY_BREAK +case 82: +YY_RULE_SETUP +#line 232 "program_lexer.l" +{ return STATE; } +	YY_BREAK +case 83: +YY_RULE_SETUP +#line 233 "program_lexer.l" +{ return RESULT; } +	YY_BREAK +case 84: +YY_RULE_SETUP +#line 235 "program_lexer.l" +{ return AMBIENT; } +	YY_BREAK +case 85: +YY_RULE_SETUP +#line 236 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, ATTENUATION); } +	YY_BREAK +case 86: +YY_RULE_SETUP +#line 237 "program_lexer.l" +{ return BACK; } +	YY_BREAK +case 87: +YY_RULE_SETUP +#line 238 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, CLIP); } +	YY_BREAK +case 88: +YY_RULE_SETUP +#line 239 "program_lexer.l" +{ return COLOR; } +	YY_BREAK +case 89: +YY_RULE_SETUP +#line 240 "program_lexer.l" +{ return_token_or_DOT(require_ARB_fp, DEPTH); } +	YY_BREAK +case 90: +YY_RULE_SETUP +#line 241 "program_lexer.l" +{ return DIFFUSE; } +	YY_BREAK +case 91: +YY_RULE_SETUP +#line 242 "program_lexer.l" +{ return DIRECTION; } +	YY_BREAK +case 92: +YY_RULE_SETUP +#line 243 "program_lexer.l" +{ return EMISSION; } +	YY_BREAK +case 93: +YY_RULE_SETUP +#line 244 "program_lexer.l" +{ return ENV; } +	YY_BREAK +case 94: +YY_RULE_SETUP +#line 245 "program_lexer.l" +{ return EYE; } +	YY_BREAK +case 95: +YY_RULE_SETUP +#line 246 "program_lexer.l" +{ return FOGCOORD; } +	YY_BREAK +case 96: +YY_RULE_SETUP +#line 247 "program_lexer.l" +{ return FOG; } +	YY_BREAK +case 97: +YY_RULE_SETUP +#line 248 "program_lexer.l" +{ return FRONT; } +	YY_BREAK +case 98: +YY_RULE_SETUP +#line 249 "program_lexer.l" +{ return HALF; } +	YY_BREAK +case 99: +YY_RULE_SETUP +#line 250 "program_lexer.l" +{ return INVERSE; } +	YY_BREAK +case 100: +YY_RULE_SETUP +#line 251 "program_lexer.l" +{ return INVTRANS; } +	YY_BREAK +case 101: +YY_RULE_SETUP +#line 252 "program_lexer.l" +{ return LIGHT; } +	YY_BREAK +case 102: +YY_RULE_SETUP +#line 253 "program_lexer.l" +{ return LIGHTMODEL; } +	YY_BREAK +case 103: +YY_RULE_SETUP +#line 254 "program_lexer.l" +{ return LIGHTPROD; } +	YY_BREAK +case 104: +YY_RULE_SETUP +#line 255 "program_lexer.l" +{ return LOCAL; } +	YY_BREAK +case 105: +YY_RULE_SETUP +#line 256 "program_lexer.l" +{ return MATERIAL; } +	YY_BREAK +case 106: +YY_RULE_SETUP +#line 257 "program_lexer.l" +{ return MAT_PROGRAM; } +	YY_BREAK +case 107: +YY_RULE_SETUP +#line 258 "program_lexer.l" +{ return MATRIX; } +	YY_BREAK +case 108: +YY_RULE_SETUP +#line 259 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, MATRIXINDEX); } +	YY_BREAK +case 109: +YY_RULE_SETUP +#line 260 "program_lexer.l" +{ return MODELVIEW; } +	YY_BREAK +case 110: +YY_RULE_SETUP +#line 261 "program_lexer.l" +{ return MVP; } +	YY_BREAK +case 111: +YY_RULE_SETUP +#line 262 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, NORMAL); } +	YY_BREAK +case 112: +YY_RULE_SETUP +#line 263 "program_lexer.l" +{ return OBJECT; } +	YY_BREAK +case 113: +YY_RULE_SETUP +#line 264 "program_lexer.l" +{ return PALETTE; } +	YY_BREAK +case 114: +YY_RULE_SETUP +#line 265 "program_lexer.l" +{ return PARAMS; } +	YY_BREAK +case 115: +YY_RULE_SETUP +#line 266 "program_lexer.l" +{ return PLANE; } +	YY_BREAK +case 116: +YY_RULE_SETUP +#line 267 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, POINT); } +	YY_BREAK +case 117: +YY_RULE_SETUP +#line 268 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, POINTSIZE); } +	YY_BREAK +case 118: +YY_RULE_SETUP +#line 269 "program_lexer.l" +{ return POSITION; } +	YY_BREAK +case 119: +YY_RULE_SETUP +#line 270 "program_lexer.l" +{ return PRIMARY; } +	YY_BREAK +case 120: +YY_RULE_SETUP +#line 271 "program_lexer.l" +{ return PROJECTION; } +	YY_BREAK +case 121: +YY_RULE_SETUP +#line 272 "program_lexer.l" +{ return_token_or_DOT(require_ARB_fp, RANGE); } +	YY_BREAK +case 122: +YY_RULE_SETUP +#line 273 "program_lexer.l" +{ return ROW; } +	YY_BREAK +case 123: +YY_RULE_SETUP +#line 274 "program_lexer.l" +{ return SCENECOLOR; } +	YY_BREAK +case 124: +YY_RULE_SETUP +#line 275 "program_lexer.l" +{ return SECONDARY; } +	YY_BREAK +case 125: +YY_RULE_SETUP +#line 276 "program_lexer.l" +{ return SHININESS; } +	YY_BREAK +case 126: +YY_RULE_SETUP +#line 277 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, SIZE); } +	YY_BREAK +case 127: +YY_RULE_SETUP +#line 278 "program_lexer.l" +{ return SPECULAR; } +	YY_BREAK +case 128: +YY_RULE_SETUP +#line 279 "program_lexer.l" +{ return SPOT; } +	YY_BREAK +case 129: +YY_RULE_SETUP +#line 280 "program_lexer.l" +{ return TEXCOORD; } +	YY_BREAK +case 130: +YY_RULE_SETUP +#line 281 "program_lexer.l" +{ return_token_or_DOT(require_ARB_fp, TEXENV); } +	YY_BREAK +case 131: +YY_RULE_SETUP +#line 282 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, TEXGEN); } +	YY_BREAK +case 132: +YY_RULE_SETUP +#line 283 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, TEXGEN_Q); } +	YY_BREAK +case 133: +YY_RULE_SETUP +#line 284 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, TEXGEN_S); } +	YY_BREAK +case 134: +YY_RULE_SETUP +#line 285 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, TEXGEN_T); } +	YY_BREAK +case 135: +YY_RULE_SETUP +#line 286 "program_lexer.l" +{ return TEXTURE; } +	YY_BREAK +case 136: +YY_RULE_SETUP +#line 287 "program_lexer.l" +{ return TRANSPOSE; } +	YY_BREAK +case 137: +YY_RULE_SETUP +#line 288 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, VTXATTRIB); } +	YY_BREAK +case 138: +YY_RULE_SETUP +#line 289 "program_lexer.l" +{ return_token_or_DOT(require_ARB_vp, WEIGHT); } +	YY_BREAK +case 139: +YY_RULE_SETUP +#line 291 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_fp, TEXTURE_UNIT); } +	YY_BREAK +case 140: +YY_RULE_SETUP +#line 292 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_fp, TEX_1D); } +	YY_BREAK +case 141: +YY_RULE_SETUP +#line 293 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_fp, TEX_2D); } +	YY_BREAK +case 142: +YY_RULE_SETUP +#line 294 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); } +	YY_BREAK +case 143: +YY_RULE_SETUP +#line 295 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); } +	YY_BREAK +case 144: +YY_RULE_SETUP +#line 296 "program_lexer.l" +{ return_token_or_IDENTIFIER(require_ARB_fp, TEX_RECT); } +	YY_BREAK +case 145: +YY_RULE_SETUP +#line 298 "program_lexer.l" +{ +   yylval->string = strdup(yytext); +   return IDENTIFIER; +} +	YY_BREAK +case 146: +YY_RULE_SETUP +#line 303 "program_lexer.l" +{ return DOT_DOT; } +	YY_BREAK +case 147: +YY_RULE_SETUP +#line 305 "program_lexer.l" +{ +   yylval->integer = strtol(yytext, NULL, 10); +   return INTEGER; +} +	YY_BREAK +case 148: +YY_RULE_SETUP +#line 309 "program_lexer.l" +{ +   yylval->real = strtod(yytext, NULL); +   return REAL; +} +	YY_BREAK +case 149: +/* rule 149 can match eol */ +*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ +yyg->yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 313 "program_lexer.l" +{ +   yylval->real = strtod(yytext, NULL); +   return REAL; +} +	YY_BREAK +case 150: +YY_RULE_SETUP +#line 317 "program_lexer.l" +{ +   yylval->real = strtod(yytext, NULL); +   return REAL; +} +	YY_BREAK +case 151: +YY_RULE_SETUP +#line 321 "program_lexer.l" +{ +   yylval->real = strtod(yytext, NULL); +   return REAL; +} +	YY_BREAK +case 152: +YY_RULE_SETUP +#line 326 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_NOOP; +   yylval->swiz_mask.mask = WRITEMASK_XYZW; +   return MASK4; +} +	YY_BREAK +case 153: +YY_RULE_SETUP +#line 332 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XY +      | mask_from_char(yytext[3]); +   return MASK3; +} +	YY_BREAK +case 154: +YY_RULE_SETUP +#line 338 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XZW; +   return MASK3; +} +	YY_BREAK +case 155: +YY_RULE_SETUP +#line 343 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_YZW; +   return MASK3; +} +	YY_BREAK +case 156: +YY_RULE_SETUP +#line 349 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_X +      | mask_from_char(yytext[2]); +   return MASK2; +} +	YY_BREAK +case 157: +YY_RULE_SETUP +#line 355 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_Y +      | mask_from_char(yytext[2]); +   return MASK2; +} +	YY_BREAK +case 158: +YY_RULE_SETUP +#line 361 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_ZW; +   return MASK2; +} +	YY_BREAK +case 159: +YY_RULE_SETUP +#line 367 "program_lexer.l" +{ +   const unsigned s = swiz_from_char(yytext[1]); +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s); +   yylval->swiz_mask.mask = mask_from_char(yytext[1]); +   return MASK1;  +} +	YY_BREAK +case 160: +YY_RULE_SETUP +#line 374 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]), +					    swiz_from_char(yytext[2]), +					    swiz_from_char(yytext[3]), +					    swiz_from_char(yytext[4])); +   yylval->swiz_mask.mask = 0; +   return SWIZZLE; +} +	YY_BREAK +case 161: +YY_RULE_SETUP +#line 383 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_NOOP; +   yylval->swiz_mask.mask = WRITEMASK_XYZW; +   return_token_or_DOT(require_ARB_fp, MASK4); +} +	YY_BREAK +case 162: +YY_RULE_SETUP +#line 389 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XY +      | mask_from_char(yytext[3]); +   return_token_or_DOT(require_ARB_fp, MASK3); +} +	YY_BREAK +case 163: +YY_RULE_SETUP +#line 395 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XZW; +   return_token_or_DOT(require_ARB_fp, MASK3); +} +	YY_BREAK +case 164: +YY_RULE_SETUP +#line 400 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_YZW; +   return_token_or_DOT(require_ARB_fp, MASK3); +} +	YY_BREAK +case 165: +YY_RULE_SETUP +#line 406 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_X +      | mask_from_char(yytext[2]); +   return_token_or_DOT(require_ARB_fp, MASK2); +} +	YY_BREAK +case 166: +YY_RULE_SETUP +#line 412 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_Y +      | mask_from_char(yytext[2]); +   return_token_or_DOT(require_ARB_fp, MASK2); +} +	YY_BREAK +case 167: +YY_RULE_SETUP +#line 418 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_ZW; +   return_token_or_DOT(require_ARB_fp, MASK2); +} +	YY_BREAK +case 168: +YY_RULE_SETUP +#line 424 "program_lexer.l" +{ +   const unsigned s = swiz_from_char(yytext[1]); +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s); +   yylval->swiz_mask.mask = mask_from_char(yytext[1]); +   return_token_or_DOT(require_ARB_fp, MASK1); +} +	YY_BREAK +case 169: +YY_RULE_SETUP +#line 432 "program_lexer.l" +{ +   if (require_ARB_vp) { +      return TEXGEN_R; +   } else { +      yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, +						SWIZZLE_X, SWIZZLE_X); +      yylval->swiz_mask.mask = WRITEMASK_X; +      return MASK1; +   } +} +	YY_BREAK +case 170: +YY_RULE_SETUP +#line 443 "program_lexer.l" +{ +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]), +					    swiz_from_char(yytext[2]), +					    swiz_from_char(yytext[3]), +					    swiz_from_char(yytext[4])); +   yylval->swiz_mask.mask = 0; +   return_token_or_DOT(require_ARB_fp, SWIZZLE); +} +	YY_BREAK +case 171: +YY_RULE_SETUP +#line 452 "program_lexer.l" +{ return DOT; } +	YY_BREAK +case 172: +/* rule 172 can match eol */ +YY_RULE_SETUP +#line 454 "program_lexer.l" +{ +   yylloc->first_line++; +   yylloc->first_column = 1; +   yylloc->last_line++; +   yylloc->last_column = 1; +   yylloc->position++; +} +	YY_BREAK +case 173: +YY_RULE_SETUP +#line 461 "program_lexer.l" +/* eat whitespace */ ; +	YY_BREAK +case 174: +*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ +yyg->yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 462 "program_lexer.l" +/* eat comments */ ; +	YY_BREAK +case 175: +YY_RULE_SETUP +#line 463 "program_lexer.l" +{ return yytext[0]; } +	YY_BREAK +case 176: +YY_RULE_SETUP +#line 464 "program_lexer.l" +ECHO; +	YY_BREAK +#line 2335 "lex.yy.c" +case YY_STATE_EOF(INITIAL): +	yyterminate(); + +	case YY_END_OF_BUFFER: +		{ +		/* Amount of text matched not including the EOB char. */ +		int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; + +		/* Undo the effects of YY_DO_BEFORE_ACTION. */ +		*yy_cp = yyg->yy_hold_char; +		YY_RESTORE_YY_MORE_OFFSET + +		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) +			{ +			/* We're scanning a new file or input source.  It's +			 * possible that this happened because the user +			 * just pointed yyin at a new source and called +			 * yylex().  If so, then we have to assure +			 * consistency between YY_CURRENT_BUFFER and our +			 * globals.  Here is the right place to do so, because +			 * this is the first action (other than possibly a +			 * back-up) that will match for the new input source. +			 */ +			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +			YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; +			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; +			} + +		/* Note that here we test for yy_c_buf_p "<=" to the position +		 * of the first EOB in the buffer, since yy_c_buf_p will +		 * already have been incremented past the NUL character +		 * (since all states make transitions on EOB to the +		 * end-of-buffer state).  Contrast this with the test +		 * in input(). +		 */ +		if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) +			{ /* This was really a NUL. */ +			yy_state_type yy_next_state; + +			yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; + +			yy_current_state = yy_get_previous_state( yyscanner ); + +			/* Okay, we're now positioned to make the NUL +			 * transition.  We couldn't have +			 * yy_get_previous_state() go ahead and do it +			 * for us because it doesn't know how to deal +			 * with the possibility of jamming (and we don't +			 * want to build jamming into it because then it +			 * will run more slowly). +			 */ + +			yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); + +			yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; + +			if ( yy_next_state ) +				{ +				/* Consume the NUL. */ +				yy_cp = ++yyg->yy_c_buf_p; +				yy_current_state = yy_next_state; +				goto yy_match; +				} + +			else +				{ +				yy_cp = yyg->yy_c_buf_p; +				goto yy_find_action; +				} +			} + +		else switch ( yy_get_next_buffer( yyscanner ) ) +			{ +			case EOB_ACT_END_OF_FILE: +				{ +				yyg->yy_did_buffer_switch_on_eof = 0; + +				if ( yywrap(yyscanner ) ) +					{ +					/* Note: because we've taken care in +					 * yy_get_next_buffer() to have set up +					 * yytext, we can now set up +					 * yy_c_buf_p so that if some total +					 * hoser (like flex itself) wants to +					 * call the scanner after we return the +					 * YY_NULL, it'll still work - another +					 * YY_NULL will get returned. +					 */ +					yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; + +					yy_act = YY_STATE_EOF(YY_START); +					goto do_action; +					} + +				else +					{ +					if ( ! yyg->yy_did_buffer_switch_on_eof ) +						YY_NEW_FILE; +					} +				break; +				} + +			case EOB_ACT_CONTINUE_SCAN: +				yyg->yy_c_buf_p = +					yyg->yytext_ptr + yy_amount_of_matched_text; + +				yy_current_state = yy_get_previous_state( yyscanner ); + +				yy_cp = yyg->yy_c_buf_p; +				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; +				goto yy_match; + +			case EOB_ACT_LAST_MATCH: +				yyg->yy_c_buf_p = +				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; + +				yy_current_state = yy_get_previous_state( yyscanner ); + +				yy_cp = yyg->yy_c_buf_p; +				yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; +				goto yy_find_action; +			} +		break; +		} + +	default: +		YY_FATAL_ERROR( +			"fatal flex scanner internal error--no action found" ); +	} /* end of action switch */ +		} /* end of scanning one token */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + *	EOB_ACT_LAST_MATCH - + *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position + *	EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; +	register char *source = yyg->yytext_ptr; +	register int number_to_move, i; +	int ret_val; + +	if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) +		YY_FATAL_ERROR( +		"fatal flex scanner internal error--end of buffer missed" ); + +	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) +		{ /* Don't try to fill the buffer, so this is an EOF. */ +		if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) +			{ +			/* We matched a single character, the EOB, so +			 * treat this as a final EOF. +			 */ +			return EOB_ACT_END_OF_FILE; +			} + +		else +			{ +			/* We matched some text prior to the EOB, first +			 * process it. +			 */ +			return EOB_ACT_LAST_MATCH; +			} +		} + +	/* Try to read more data. */ + +	/* First move last chars to start of buffer. */ +	number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; + +	for ( i = 0; i < number_to_move; ++i ) +		*(dest++) = *(source++); + +	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) +		/* don't do the read, it's not guaranteed to return an EOF, +		 * just force an EOF +		 */ +		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; + +	else +		{ +			int num_to_read = +			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + +		while ( num_to_read <= 0 ) +			{ /* Not enough room in the buffer - grow it. */ + +			/* just a shorter name for the current buffer */ +			YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + +			int yy_c_buf_p_offset = +				(int) (yyg->yy_c_buf_p - b->yy_ch_buf); + +			if ( b->yy_is_our_buffer ) +				{ +				int new_size = b->yy_buf_size * 2; + +				if ( new_size <= 0 ) +					b->yy_buf_size += b->yy_buf_size / 8; +				else +					b->yy_buf_size *= 2; + +				b->yy_ch_buf = (char *) +					/* Include room in for 2 EOB chars. */ +					yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); +				} +			else +				/* Can't grow it, we don't own it. */ +				b->yy_ch_buf = 0; + +			if ( ! b->yy_ch_buf ) +				YY_FATAL_ERROR( +				"fatal error - scanner input buffer overflow" ); + +			yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + +			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - +						number_to_move - 1; + +			} + +		if ( num_to_read > YY_READ_BUF_SIZE ) +			num_to_read = YY_READ_BUF_SIZE; + +		/* Read in more data. */ +		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), +			yyg->yy_n_chars, (size_t) num_to_read ); + +		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; +		} + +	if ( yyg->yy_n_chars == 0 ) +		{ +		if ( number_to_move == YY_MORE_ADJ ) +			{ +			ret_val = EOB_ACT_END_OF_FILE; +			yyrestart(yyin  ,yyscanner); +			} + +		else +			{ +			ret_val = EOB_ACT_LAST_MATCH; +			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = +				YY_BUFFER_EOF_PENDING; +			} +		} + +	else +		ret_val = EOB_ACT_CONTINUE_SCAN; + +	if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { +		/* Extend the array by 50%, plus the number we really need. */ +		yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); +		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); +		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); +	} + +	yyg->yy_n_chars += number_to_move; +	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; +	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + +	yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + +	return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +    static yy_state_type yy_get_previous_state (yyscan_t yyscanner) +{ +	register yy_state_type yy_current_state; +	register char *yy_cp; +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +	yy_current_state = yyg->yy_start; + +	for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) +		{ +		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); +		if ( yy_accept[yy_current_state] ) +			{ +			yyg->yy_last_accepting_state = yy_current_state; +			yyg->yy_last_accepting_cpos = yy_cp; +			} +		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +			{ +			yy_current_state = (int) yy_def[yy_current_state]; +			if ( yy_current_state >= 645 ) +				yy_c = yy_meta[(unsigned int) yy_c]; +			} +		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +		} + +	return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + *	next_state = yy_try_NUL_trans( current_state ); + */ +    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner) +{ +	register int yy_is_jam; +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ +	register char *yy_cp = yyg->yy_c_buf_p; + +	register YY_CHAR yy_c = 1; +	if ( yy_accept[yy_current_state] ) +		{ +		yyg->yy_last_accepting_state = yy_current_state; +		yyg->yy_last_accepting_cpos = yy_cp; +		} +	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) +		{ +		yy_current_state = (int) yy_def[yy_current_state]; +		if ( yy_current_state >= 645 ) +			yy_c = yy_meta[(unsigned int) yy_c]; +		} +	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; +	yy_is_jam = (yy_current_state == 644); + +	return yy_is_jam ? 0 : yy_current_state; +} + +    static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner) +{ +	register char *yy_cp; +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +    yy_cp = yyg->yy_c_buf_p; + +	/* undo effects of setting up yytext */ +	*yy_cp = yyg->yy_hold_char; + +	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +		{ /* need to shift things up to make room */ +		/* +2 for EOB chars. */ +		register int number_to_move = yyg->yy_n_chars + 2; +		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ +					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; +		register char *source = +				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + +		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) +			*--dest = *--source; + +		yy_cp += (int) (dest - source); +		yy_bp += (int) (dest - source); +		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = +			yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + +		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) +			YY_FATAL_ERROR( "flex scanner push-back overflow" ); +		} + +	*--yy_cp = (char) c; + +	yyg->yytext_ptr = yy_bp; +	yyg->yy_hold_char = *yy_cp; +	yyg->yy_c_buf_p = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +    static int yyinput (yyscan_t yyscanner) +#else +    static int input  (yyscan_t yyscanner) +#endif + +{ +	int c; +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +	*yyg->yy_c_buf_p = yyg->yy_hold_char; + +	if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) +		{ +		/* yy_c_buf_p now points to the character we want to return. +		 * If this occurs *before* the EOB characters, then it's a +		 * valid NUL; if not, then we've hit the end of the buffer. +		 */ +		if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) +			/* This was really a NUL. */ +			*yyg->yy_c_buf_p = '\0'; + +		else +			{ /* need more input */ +			int offset = yyg->yy_c_buf_p - yyg->yytext_ptr; +			++yyg->yy_c_buf_p; + +			switch ( yy_get_next_buffer( yyscanner ) ) +				{ +				case EOB_ACT_LAST_MATCH: +					/* This happens because yy_g_n_b() +					 * sees that we've accumulated a +					 * token and flags that we need to +					 * try matching the token before +					 * proceeding.  But for input(), +					 * there's no matching to consider. +					 * So convert the EOB_ACT_LAST_MATCH +					 * to EOB_ACT_END_OF_FILE. +					 */ + +					/* Reset buffer status. */ +					yyrestart(yyin ,yyscanner); + +					/*FALLTHROUGH*/ + +				case EOB_ACT_END_OF_FILE: +					{ +					if ( yywrap(yyscanner ) ) +						return EOF; + +					if ( ! yyg->yy_did_buffer_switch_on_eof ) +						YY_NEW_FILE; +#ifdef __cplusplus +					return yyinput(yyscanner); +#else +					return input(yyscanner); +#endif +					} + +				case EOB_ACT_CONTINUE_SCAN: +					yyg->yy_c_buf_p = yyg->yytext_ptr + offset; +					break; +				} +			} +		} + +	c = *(unsigned char *) yyg->yy_c_buf_p;	/* cast for 8-bit char's */ +	*yyg->yy_c_buf_p = '\0';	/* preserve yytext */ +	yyg->yy_hold_char = *++yyg->yy_c_buf_p; + +	return c; +} +#endif	/* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * @param yyscanner The scanner object. + * @note This function does not reset the start condition to @c INITIAL . + */ +    void yyrestart  (FILE * input_file , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +	if ( ! YY_CURRENT_BUFFER ){ +        yyensure_buffer_stack (yyscanner); +		YY_CURRENT_BUFFER_LVALUE = +            yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); +	} + +	yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); +	yy_load_buffer_state(yyscanner ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * @param yyscanner The scanner object. + */ +    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +	/* TODO. We should be able to replace this entire function body +	 * with +	 *		yypop_buffer_state(); +	 *		yypush_buffer_state(new_buffer); +     */ +	yyensure_buffer_stack (yyscanner); +	if ( YY_CURRENT_BUFFER == new_buffer ) +		return; + +	if ( YY_CURRENT_BUFFER ) +		{ +		/* Flush out information for old buffer. */ +		*yyg->yy_c_buf_p = yyg->yy_hold_char; +		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; +		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; +		} + +	YY_CURRENT_BUFFER_LVALUE = new_buffer; +	yy_load_buffer_state(yyscanner ); + +	/* We don't actually know whether we did this switch during +	 * EOF (yywrap()) processing, but the only time this flag +	 * is looked at is after yywrap() is called, so it's safe +	 * to go ahead and always set it. +	 */ +	yyg->yy_did_buffer_switch_on_eof = 1; +} + +static void yy_load_buffer_state  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +	yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; +	yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; +	yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; +	yyg->yy_hold_char = *yyg->yy_c_buf_p; +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * @param yyscanner The scanner object. + * @return the allocated buffer state. + */ +    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner) +{ +	YY_BUFFER_STATE b; +     +	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); +	if ( ! b ) +		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + +	b->yy_buf_size = size; + +	/* yy_ch_buf has to be 2 characters longer than the size given because +	 * we need to put in 2 end-of-buffer characters. +	 */ +	b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ,yyscanner ); +	if ( ! b->yy_ch_buf ) +		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + +	b->yy_is_our_buffer = 1; + +	yy_init_buffer(b,file ,yyscanner); + +	return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * @param yyscanner The scanner object. + */ +    void yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +	if ( ! b ) +		return; + +	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ +		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + +	if ( b->yy_is_our_buffer ) +		yyfree((void *) b->yy_ch_buf ,yyscanner ); + +	yyfree((void *) b ,yyscanner ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ +    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner) + +{ +	int oerrno = errno; +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +	yy_flush_buffer(b ,yyscanner); + +	b->yy_input_file = file; +	b->yy_fill_buffer = 1; + +    /* If b is the current buffer, then yy_init_buffer was _probably_ +     * called from yyrestart() or through yy_get_next_buffer. +     * In that case, we don't want to reset the lineno or column. +     */ +    if (b != YY_CURRENT_BUFFER){ +        b->yy_bs_lineno = 1; +        b->yy_bs_column = 0; +    } + +        b->yy_is_interactive = 0; +     +	errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * @param yyscanner The scanner object. + */ +    void yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +	if ( ! b ) +		return; + +	b->yy_n_chars = 0; + +	/* We always need two end-of-buffer characters.  The first causes +	 * a transition to the end-of-buffer state.  The second causes +	 * a jam in that state. +	 */ +	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; +	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + +	b->yy_buf_pos = &b->yy_ch_buf[0]; + +	b->yy_at_bol = 1; +	b->yy_buffer_status = YY_BUFFER_NEW; + +	if ( b == YY_CURRENT_BUFFER ) +		yy_load_buffer_state(yyscanner ); +} + +/** Pushes the new state onto the stack. The new state becomes + *  the current state. This function will allocate the stack + *  if necessary. + *  @param new_buffer The new state. + *  @param yyscanner The scanner object. + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +	if (new_buffer == NULL) +		return; + +	yyensure_buffer_stack(yyscanner); + +	/* This block is copied from yy_switch_to_buffer. */ +	if ( YY_CURRENT_BUFFER ) +		{ +		/* Flush out information for old buffer. */ +		*yyg->yy_c_buf_p = yyg->yy_hold_char; +		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; +		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; +		} + +	/* Only push if top exists. Otherwise, replace top. */ +	if (YY_CURRENT_BUFFER) +		yyg->yy_buffer_stack_top++; +	YY_CURRENT_BUFFER_LVALUE = new_buffer; + +	/* copied from yy_switch_to_buffer. */ +	yy_load_buffer_state(yyscanner ); +	yyg->yy_did_buffer_switch_on_eof = 1; +} + +/** Removes and deletes the top of the stack, if present. + *  The next element becomes the new top. + *  @param yyscanner The scanner object. + */ +void yypop_buffer_state (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +	if (!YY_CURRENT_BUFFER) +		return; + +	yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); +	YY_CURRENT_BUFFER_LVALUE = NULL; +	if (yyg->yy_buffer_stack_top > 0) +		--yyg->yy_buffer_stack_top; + +	if (YY_CURRENT_BUFFER) { +		yy_load_buffer_state(yyscanner ); +		yyg->yy_did_buffer_switch_on_eof = 1; +	} +} + +/* Allocates the stack if it does not exist. + *  Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (yyscan_t yyscanner) +{ +	int num_to_alloc; +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +	if (!yyg->yy_buffer_stack) { + +		/* First allocation is just for 2 elements, since we don't know if this +		 * scanner will even need a stack. We use 2 instead of 1 to avoid an +		 * immediate realloc on the next call. +         */ +		num_to_alloc = 1; +		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc +								(num_to_alloc * sizeof(struct yy_buffer_state*) +								, yyscanner); +		if ( ! yyg->yy_buffer_stack ) +			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); +								   +		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); +				 +		yyg->yy_buffer_stack_max = num_to_alloc; +		yyg->yy_buffer_stack_top = 0; +		return; +	} + +	if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ + +		/* Increase the buffer to prepare for a possible push. */ +		int grow_size = 8 /* arbitrary grow size */; + +		num_to_alloc = yyg->yy_buffer_stack_max + grow_size; +		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc +								(yyg->yy_buffer_stack, +								num_to_alloc * sizeof(struct yy_buffer_state*) +								, yyscanner); +		if ( ! yyg->yy_buffer_stack ) +			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + +		/* zero only the new slots.*/ +		memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); +		yyg->yy_buffer_stack_max = num_to_alloc; +	} +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object.  + */ +YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner) +{ +	YY_BUFFER_STATE b; +     +	if ( size < 2 || +	     base[size-2] != YY_END_OF_BUFFER_CHAR || +	     base[size-1] != YY_END_OF_BUFFER_CHAR ) +		/* They forgot to leave room for the EOB's. */ +		return 0; + +	b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); +	if ( ! b ) +		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + +	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */ +	b->yy_buf_pos = b->yy_ch_buf = base; +	b->yy_is_our_buffer = 0; +	b->yy_input_file = 0; +	b->yy_n_chars = b->yy_buf_size; +	b->yy_is_interactive = 0; +	b->yy_at_bol = 1; +	b->yy_fill_buffer = 0; +	b->yy_buffer_status = YY_BUFFER_NEW; + +	yy_switch_to_buffer(b ,yyscanner ); + +	return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + *       yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr , yyscan_t yyscanner) +{ +     +	return yy_scan_bytes(yystr,strlen(yystr) ,yyscanner); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * @param yyscanner The scanner object. + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes  (yyconst char * yybytes, int  _yybytes_len , yyscan_t yyscanner) +{ +	YY_BUFFER_STATE b; +	char *buf; +	yy_size_t n; +	int i; +     +	/* Get memory for full buffer, including space for trailing EOB's. */ +	n = _yybytes_len + 2; +	buf = (char *) yyalloc(n ,yyscanner ); +	if ( ! buf ) +		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + +	for ( i = 0; i < _yybytes_len; ++i ) +		buf[i] = yybytes[i]; + +	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + +	b = yy_scan_buffer(buf,n ,yyscanner); +	if ( ! b ) +		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + +	/* It's okay to grow etc. this buffer, and we should throw it +	 * away when we're done. +	 */ +	b->yy_is_our_buffer = 1; + +	return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) +{ +    	(void) fprintf( stderr, "%s\n", msg ); +	exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ +	do \ +		{ \ +		/* Undo effects of setting up yytext. */ \ +        int yyless_macro_arg = (n); \ +        YY_LESS_LINENO(yyless_macro_arg);\ +		yytext[yyleng] = yyg->yy_hold_char; \ +		yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ +		yyg->yy_hold_char = *yyg->yy_c_buf_p; \ +		*yyg->yy_c_buf_p = '\0'; \ +		yyleng = yyless_macro_arg; \ +		} \ +	while ( 0 ) + +/* Accessor  methods (get/set functions) to struct members. */ + +/** Get the user-defined data for this scanner. + * @param yyscanner The scanner object. + */ +YY_EXTRA_TYPE yyget_extra  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yyextra; +} + +/** Get the current line number. + * @param yyscanner The scanner object. + */ +int yyget_lineno  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +     +        if (! YY_CURRENT_BUFFER) +            return 0; +     +    return yylineno; +} + +/** Get the current column number. + * @param yyscanner The scanner object. + */ +int yyget_column  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +     +        if (! YY_CURRENT_BUFFER) +            return 0; +     +    return yycolumn; +} + +/** Get the input stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_in  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yyin; +} + +/** Get the output stream. + * @param yyscanner The scanner object. + */ +FILE *yyget_out  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yyout; +} + +/** Get the length of the current token. + * @param yyscanner The scanner object. + */ +int yyget_leng  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yyleng; +} + +/** Get the current token. + * @param yyscanner The scanner object. + */ + +char *yyget_text  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yytext; +} + +/** Set the user-defined data. This data is never touched by the scanner. + * @param user_defined The data to be associated with this scanner. + * @param yyscanner The scanner object. + */ +void yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    yyextra = user_defined ; +} + +/** Set the current line number. + * @param line_number + * @param yyscanner The scanner object. + */ +void yyset_lineno (int  line_number , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +        /* lineno is only valid if an input buffer exists. */ +        if (! YY_CURRENT_BUFFER ) +           yy_fatal_error( "yyset_lineno called with no buffer" , yyscanner);  +     +    yylineno = line_number; +} + +/** Set the current column. + * @param line_number + * @param yyscanner The scanner object. + */ +void yyset_column (int  column_no , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +        /* column is only valid if an input buffer exists. */ +        if (! YY_CURRENT_BUFFER ) +           yy_fatal_error( "yyset_column called with no buffer" , yyscanner);  +     +    yycolumn = column_no; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * @param yyscanner The scanner object. + * @see yy_switch_to_buffer + */ +void yyset_in (FILE *  in_str , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    yyin = in_str ; +} + +void yyset_out (FILE *  out_str , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    yyout = out_str ; +} + +int yyget_debug  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yy_flex_debug; +} + +void yyset_debug (int  bdebug , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    yy_flex_debug = bdebug ; +} + +/* Accessor methods for yylval and yylloc */ + +YYSTYPE * yyget_lval  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yylval; +} + +void yyset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    yylval = yylval_param; +} + +YYLTYPE *yyget_lloc  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    return yylloc; +} +     +void yyset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    yylloc = yylloc_param; +} +     +/* User-visible API */ + +/* yylex_init is special because it creates the scanner itself, so it is + * the ONLY reentrant function that doesn't take the scanner as the last argument. + * That's why we explicitly handle the declaration, instead of using our macros. + */ + +int yylex_init(yyscan_t* ptr_yy_globals) + +{ +    if (ptr_yy_globals == NULL){ +        errno = EINVAL; +        return 1; +    } + +    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); + +    if (*ptr_yy_globals == NULL){ +        errno = ENOMEM; +        return 1; +    } + +    /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ +    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); + +    return yy_init_globals ( *ptr_yy_globals ); +} + +/* yylex_init_extra has the same functionality as yylex_init, but follows the + * convention of taking the scanner as the last argument. Note however, that + * this is a *pointer* to a scanner, as it will be allocated by this call (and + * is the reason, too, why this function also must handle its own declaration). + * The user defined value in the first argument will be available to yyalloc in + * the yyextra field. + */ + +int yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) + +{ +    struct yyguts_t dummy_yyguts; + +    yyset_extra (yy_user_defined, &dummy_yyguts); + +    if (ptr_yy_globals == NULL){ +        errno = EINVAL; +        return 1; +    } +	 +    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); +	 +    if (*ptr_yy_globals == NULL){ +        errno = ENOMEM; +        return 1; +    } +     +    /* By setting to 0xAA, we expose bugs in +    yy_init_globals. Leave at 0x00 for releases. */ +    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); +     +    yyset_extra (yy_user_defined, *ptr_yy_globals); +     +    return yy_init_globals ( *ptr_yy_globals ); +} + +static int yy_init_globals (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; +    /* Initialization is the same as for the non-reentrant scanner. +     * This function is called from yylex_destroy(), so don't allocate here. +     */ + +    yyg->yy_buffer_stack = 0; +    yyg->yy_buffer_stack_top = 0; +    yyg->yy_buffer_stack_max = 0; +    yyg->yy_c_buf_p = (char *) 0; +    yyg->yy_init = 0; +    yyg->yy_start = 0; + +    yyg->yy_start_stack_ptr = 0; +    yyg->yy_start_stack_depth = 0; +    yyg->yy_start_stack =  NULL; + +/* Defined in main.c */ +#ifdef YY_STDINIT +    yyin = stdin; +    yyout = stdout; +#else +    yyin = (FILE *) 0; +    yyout = (FILE *) 0; +#endif + +    /* For future reference: Set errno on error, since we are called by +     * yylex_init() +     */ +    return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy  (yyscan_t yyscanner) +{ +    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; + +    /* Pop the buffer stack, destroying each element. */ +	while(YY_CURRENT_BUFFER){ +		yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); +		YY_CURRENT_BUFFER_LVALUE = NULL; +		yypop_buffer_state(yyscanner); +	} + +	/* Destroy the stack itself. */ +	yyfree(yyg->yy_buffer_stack ,yyscanner); +	yyg->yy_buffer_stack = NULL; + +    /* Destroy the start condition stack. */ +        yyfree(yyg->yy_start_stack ,yyscanner ); +        yyg->yy_start_stack = NULL; + +    /* Reset the globals. This is important in a non-reentrant scanner so the next time +     * yylex() is called, initialization will occur. */ +    yy_init_globals( yyscanner); + +    /* Destroy the main struct (reentrant only). */ +    yyfree ( yyscanner , yyscanner ); +    yyscanner = NULL; +    return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) +{ +	register int i; +	for ( i = 0; i < n; ++i ) +		s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) +{ +	register int n; +	for ( n = 0; s[n]; ++n ) +		; + +	return n; +} +#endif + +void *yyalloc (yy_size_t  size , yyscan_t yyscanner) +{ +	return (void *) malloc( size ); +} + +void *yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner) +{ +	/* The cast to (char *) in the following accommodates both +	 * implementations that use char* generic pointers, and those +	 * that use void* generic pointers.  It works with the latter +	 * because both ANSI C and C++ allow castless assignment from +	 * any pointer type to void*, and deal with argument conversions +	 * as though doing an assignment. +	 */ +	return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr , yyscan_t yyscanner) +{ +	free( (char *) ptr );	/* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 464 "program_lexer.l" + + + +void +_mesa_program_lexer_ctor(void **scanner, struct asm_parser_state *state, +			 const char *string, size_t len) +{ +   yylex_init_extra(state,scanner); +   yy_scan_bytes(string,len,*scanner); +} + +void +_mesa_program_lexer_dtor(void *scanner) +{ +   /* FINISHME: It's not clear to me whether or not the buffer state returned +    * FINISHME: by yy_scan_bytes in _mesa_program_lexer_ctor needs to be +    * FINISHME: explicitly destroyed here or not. +    */ +   yylex_destroy(scanner); +} + diff --git a/src/mesa/shader/prog_parameter_layout.c b/src/mesa/shader/prog_parameter_layout.c new file mode 100644 index 0000000000..f374636f11 --- /dev/null +++ b/src/mesa/shader/prog_parameter_layout.c @@ -0,0 +1,205 @@ +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * \file prog_parameter_layout.c + * \brief Helper functions to layout storage for program parameters + * + * \author Ian Romanick <ian.d.romanick@intel.com> + */ + +#include "main/mtypes.h" +#include "prog_parameter.h" +#include "prog_parameter_layout.h" +#include "prog_instruction.h" +#include "program_parser.h" + +unsigned +_mesa_combine_swizzles(unsigned base, unsigned applied) +{ +   unsigned swiz = 0; +   unsigned i; + +   for (i = 0; i < 4; i++) { +      const unsigned s = GET_SWZ(applied, i); + +      swiz |= ((s <= SWIZZLE_W) ? GET_SWZ(base, s) : s) << (i * 3); +   } + +   return swiz; +} + + +/** + * Copy indirect access array from one parameter list to another + * + * \param src   Parameter array copied from + * \param dst   Parameter array copied to + * \param first Index of first element in \c src to copy + * \param count Number of elements to copy + * + * \return + * The location in \c dst of the first element copied from \c src on + * success.  -1 on failure. + * + * \warning + * This function assumes that there is already enough space available in + * \c dst to hold all of the elements that will be copied over. + */ +static int +copy_indirect_accessed_array(struct gl_program_parameter_list *src, +			     struct gl_program_parameter_list *dst, +			     unsigned first, unsigned count) +{ +   const int base = dst->NumParameters; +   unsigned i; +   unsigned j; + + +   for (i = first; i < (first + count); i++) { +      struct gl_program_parameter *curr = & src->Parameters[i]; + + +      if (curr->Type == PROGRAM_CONSTANT) { +	 j = dst->NumParameters; +      } else { +	 for (j = 0; j < dst->NumParameters; j++) { +	    if (memcmp(dst->Parameters[j].StateIndexes, curr->StateIndexes,  +		       sizeof(curr->StateIndexes)) == 0) { +	       return -1; +	    } +	 } +      } + +      assert(j == dst->NumParameters); + +      memcpy(& dst->Parameters[j], curr, +	     sizeof(dst->Parameters[j])); +      memcpy(dst->ParameterValues[j], src->ParameterValues[i], +	     sizeof(GLfloat) * 4); +      curr->Name = NULL; + +      dst->NumParameters++; +   } + +   return base; +} + + +int +_mesa_layout_parameters(struct asm_parser_state *state) +{ +   struct gl_program_parameter_list *layout; +   struct asm_instruction *inst; +   unsigned i; + + +   layout = +      _mesa_new_parameter_list_sized(state->prog->Parameters->NumParameters); + + +   /* PASS 1:  Move any parameters that are accessed indirectly from the +    * original parameter list to the new parameter list. +    */ +   for (inst = state->inst_head; inst != NULL; inst = inst->next) { +      for (i = 0; i < 3; i++) { +	 if (inst->SrcReg[i].Base.RelAddr) { +	    /* Only attempt to add the to the new parameter list once. +	     */ +	    if (!inst->SrcReg[i].Symbol->pass1_done) { +	       const int new_begin = +		  copy_indirect_accessed_array(state->prog->Parameters, layout,  +		      inst->SrcReg[i].Symbol->param_binding_begin, +		      inst->SrcReg[i].Symbol->param_binding_length); + +	       if (new_begin < 0) { +		  return 0; +	       } + +	       inst->SrcReg[i].Symbol->param_binding_begin = new_begin; +	       inst->SrcReg[i].Symbol->pass1_done = 1; +	    } + +	    /* Previously the Index was just the offset from the parameter +	     * array.  Now that the base of the parameter array is known, the +	     * index can be updated to its actual value. +	     */ +	    inst->Base.SrcReg[i] = inst->SrcReg[i].Base; +	    inst->Base.SrcReg[i].Index += +	       inst->SrcReg[i].Symbol->param_binding_begin; +	 } +      } +   } + + +   /* PASS 2:  Move any parameters that are not accessed indirectly from the +    * original parameter list to the new parameter list. +    */ +   for (inst = state->inst_head; inst != NULL; inst = inst->next) { +      for (i = 0; i < 3; i++) { +	 const struct gl_program_parameter *p; +	 const int idx = inst->SrcReg[i].Base.Index; +	 unsigned swizzle = SWIZZLE_NOOP; + + +	 /* All relative addressed operands were processed on the first +	  * pass.  Just skip them here. +	  */ +	 if (inst->SrcReg[i].Base.RelAddr) { +	    continue; +	 } + + +	 inst->Base.SrcReg[i] = inst->SrcReg[i].Base; +	 p = & state->prog->Parameters->Parameters[idx]; + +	 switch (inst->SrcReg[i].Base.File) { +	 case PROGRAM_CONSTANT: { +	    const float *const v = +	       state->prog->Parameters->ParameterValues[idx]; + +	    inst->Base.SrcReg[i].Index = +	       _mesa_add_unnamed_constant(layout, v, p->Size, & swizzle); + +	    inst->Base.SrcReg[i].Swizzle =  +	       _mesa_combine_swizzles(inst->Base.SrcReg[i].Swizzle, swizzle); +	    break; +	 } + +	 case PROGRAM_STATE_VAR: +	    inst->Base.SrcReg[i].Index = +	       _mesa_add_state_reference(layout, p->StateIndexes); +	    break; + +	 default: +	    break; +	 } +      } +   } + + +   _mesa_free_parameter_list(state->prog->Parameters); +   state->prog->Parameters = layout; + +   return 1; +} diff --git a/src/mesa/shader/prog_parameter_layout.h b/src/mesa/shader/prog_parameter_layout.h new file mode 100644 index 0000000000..1686170bab --- /dev/null +++ b/src/mesa/shader/prog_parameter_layout.h @@ -0,0 +1,41 @@ +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * \file prog_parameter_layout.h + * \brief Helper functions to layout storage for program parameters + * + * \author Ian Romanick <ian.d.romanick@intel.com> + */ + +#pragma once + +#ifndef PROG_PARAMETER_LAYOUT_H +#define PROG_PARAMETER_LAYOUT_H + +extern unsigned _mesa_combine_swizzles(unsigned base, unsigned applied); + +struct asm_parser_state; +extern int _mesa_layout_parameters(struct asm_parser_state *state); + +#endif /* PROG_PARAMETER_LAYOUT_H */ diff --git a/src/mesa/shader/program_lexer.l b/src/mesa/shader/program_lexer.l new file mode 100644 index 0000000000..2d20772631 --- /dev/null +++ b/src/mesa/shader/program_lexer.l @@ -0,0 +1,482 @@ +%{ +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include "main/glheader.h" +#include "prog_instruction.h" + +#include "program_parser.h" +#include "program_parse.tab.h" + +#define require_ARB_vp (yyextra->mode == ARB_vertex) +#define require_ARB_fp (yyextra->mode == ARB_fragment) + +#define return_token_or_IDENTIFIER(condition, token)	\ +   do {							\ +      if (condition) {					\ +	 return token;					\ +      } else {						\ +	 yylval->string = strdup(yytext);		\ +	 return IDENTIFIER;				\ +      }							\ +   } while (0) + +#define return_token_or_DOT(condition, token)		\ +   do {							\ +      if (condition) {					\ +	 return token;					\ +      } else {						\ +	 yyless(1);					\ +	 return DOT;					\ +      }							\ +   } while (0) + + +#define return_opcode(condition, token, opcode, sat)	\ +   do {							\ +      if (condition) {					\ +	 yylval->temp_inst.Opcode = OPCODE_ ## opcode;	\ +	 yylval->temp_inst.SaturateMode = SATURATE_ ## sat; \ +	 return token;					\ +      } else {						\ +	 yylval->string = strdup(yytext);		\ +	 return IDENTIFIER;				\ +      }							\ +   } while (0) + +#define SWIZZLE_INVAL  MAKE_SWIZZLE4(SWIZZLE_NIL, SWIZZLE_NIL, \ +				     SWIZZLE_NIL, SWIZZLE_NIL) + +static unsigned +mask_from_char(char c) +{ +   switch (c) { +   case 'x': +   case 'r': +      return WRITEMASK_X; +   case 'y': +   case 'g': +      return WRITEMASK_Y; +   case 'z': +   case 'b': +      return WRITEMASK_Z; +   case 'w': +   case 'a': +      return WRITEMASK_W; +   } + +   return 0; +} + +static unsigned +swiz_from_char(char c) +{ +   switch (c) { +   case 'x': +   case 'r': +      return SWIZZLE_X; +   case 'y': +   case 'g': +      return SWIZZLE_Y; +   case 'z': +   case 'b': +      return SWIZZLE_Z; +   case 'w': +   case 'a': +      return SWIZZLE_W; +   } + +   return 0; +} + +#define YY_USER_ACTION							\ +   do {									\ +      yylloc->first_column = yylloc->last_column;			\ +      yylloc->last_column += yyleng;					\ +      if ((yylloc->first_line == 1)					\ +	  && (yylloc->first_column == 1)) {				\ +	 yylloc->position = 1;						\ +      } else {								\ +	 yylloc->position += yylloc->last_column - yylloc->first_column; \ +      }									\ +   } while(0); + +#define YY_EXTRA_TYPE struct asm_parser_state * +%} + +num    [0-9]+ +exp    [Ee][-+]?[0-9]+ +frac   "."[0-9]+ +dot    "."[ \t]* + +%option bison-bridge bison-locations reentrant noyywrap +%% + +"!!ARBvp1.0"              { return ARBvp_10; } +"!!ARBfp1.0"              { return ARBfp_10; } +ADDRESS                   { +   yylval->integer = at_address; +   return_token_or_IDENTIFIER(require_ARB_vp, ADDRESS); +} +ALIAS                     { return ALIAS; } +ATTRIB                    { return ATTRIB; } +END                       { return END; } +OPTION                    { return OPTION; } +OUTPUT                    { return OUTPUT; } +PARAM                     { return PARAM; } +TEMP                      { yylval->integer = at_temp; return TEMP; } + +ABS       { return_opcode(             1, VECTOR_OP, ABS, OFF); } +ABS_SAT   { return_opcode(require_ARB_fp, VECTOR_OP, ABS, ZERO_ONE); } +ADD       { return_opcode(             1, BIN_OP, ADD, OFF); } +ADD_SAT   { return_opcode(require_ARB_fp, BIN_OP, ADD, ZERO_ONE); } +ARL       { return_opcode(require_ARB_vp, ARL, ARL, OFF); } + +CMP       { return_opcode(require_ARB_fp, TRI_OP, CMP, OFF); } +CMP_SAT   { return_opcode(require_ARB_fp, TRI_OP, CMP, ZERO_ONE); } +COS       { return_opcode(require_ARB_fp, SCALAR_OP, COS, OFF); } +COS_SAT   { return_opcode(require_ARB_fp, SCALAR_OP, COS, ZERO_ONE); } + +DP3       { return_opcode(             1, BIN_OP, DP3, OFF); } +DP3_SAT   { return_opcode(require_ARB_fp, BIN_OP, DP3, ZERO_ONE); } +DP4       { return_opcode(             1, BIN_OP, DP4, OFF); } +DP4_SAT   { return_opcode(require_ARB_fp, BIN_OP, DP4, ZERO_ONE); } +DPH       { return_opcode(             1, BIN_OP, DPH, OFF); } +DPH_SAT   { return_opcode(require_ARB_fp, BIN_OP, DPH, ZERO_ONE); } +DST       { return_opcode(             1, BIN_OP, DST, OFF); } +DST_SAT   { return_opcode(require_ARB_fp, BIN_OP, DST, ZERO_ONE); } + +EX2       { return_opcode(             1, SCALAR_OP, EX2, OFF); } +EX2_SAT   { return_opcode(require_ARB_fp, SCALAR_OP, EX2, ZERO_ONE); } +EXP       { return_opcode(require_ARB_vp, SCALAR_OP, EXP, OFF); } + +FLR       { return_opcode(             1, VECTOR_OP, FLR, OFF); } +FLR_SAT   { return_opcode(require_ARB_fp, VECTOR_OP, FLR, ZERO_ONE); } +FRC       { return_opcode(             1, VECTOR_OP, FRC, OFF); } +FRC_SAT   { return_opcode(require_ARB_fp, VECTOR_OP, FRC, ZERO_ONE); } + +KIL       { return_opcode(require_ARB_fp, KIL, KIL, OFF); } + +LIT       { return_opcode(             1, VECTOR_OP, LIT, OFF); } +LIT_SAT   { return_opcode(require_ARB_fp, VECTOR_OP, LIT, ZERO_ONE); } +LG2       { return_opcode(             1, SCALAR_OP, LG2, OFF); } +LG2_SAT   { return_opcode(require_ARB_fp, SCALAR_OP, LG2, ZERO_ONE); } +LOG       { return_opcode(require_ARB_vp, SCALAR_OP, LOG, OFF); } +LRP       { return_opcode(require_ARB_fp, TRI_OP, LRP, OFF); } +LRP_SAT   { return_opcode(require_ARB_fp, TRI_OP, LRP, ZERO_ONE); } + +MAD       { return_opcode(             1, TRI_OP, MAD, OFF); } +MAD_SAT   { return_opcode(require_ARB_fp, TRI_OP, MAD, ZERO_ONE); } +MAX       { return_opcode(             1, BIN_OP, MAX, OFF); } +MAX_SAT   { return_opcode(require_ARB_fp, BIN_OP, MAX, ZERO_ONE); } +MIN       { return_opcode(             1, BIN_OP, MIN, OFF); } +MIN_SAT   { return_opcode(require_ARB_fp, BIN_OP, MIN, ZERO_ONE); } +MOV       { return_opcode(             1, VECTOR_OP, MOV, OFF); } +MOV_SAT   { return_opcode(require_ARB_fp, VECTOR_OP, MOV, ZERO_ONE); } +MUL       { return_opcode(             1, BIN_OP, MUL, OFF); } +MUL_SAT   { return_opcode(require_ARB_fp, BIN_OP, MUL, ZERO_ONE); } + +POW       { return_opcode(             1, BINSC_OP, POW, OFF); } +POW_SAT   { return_opcode(require_ARB_fp, BINSC_OP, POW, ZERO_ONE); } + +RCP       { return_opcode(             1, SCALAR_OP, RCP, OFF); } +RCP_SAT   { return_opcode(require_ARB_fp, SCALAR_OP, RCP, ZERO_ONE); } +RSQ       { return_opcode(             1, SCALAR_OP, RSQ, OFF); } +RSQ_SAT   { return_opcode(require_ARB_fp, SCALAR_OP, RSQ, ZERO_ONE); } + +SCS       { return_opcode(require_ARB_fp, SCALAR_OP, SCS, OFF); } +SCS_SAT   { return_opcode(require_ARB_fp, SCALAR_OP, SCS, ZERO_ONE); } +SGE       { return_opcode(             1, BIN_OP, SGE, OFF); } +SGE_SAT   { return_opcode(require_ARB_fp, BIN_OP, SGE, ZERO_ONE); } +SIN       { return_opcode(require_ARB_fp, SCALAR_OP, SIN, OFF); } +SIN_SAT   { return_opcode(require_ARB_fp, SCALAR_OP, SIN, ZERO_ONE); } +SLT       { return_opcode(             1, BIN_OP, SLT, OFF); } +SLT_SAT   { return_opcode(require_ARB_fp, BIN_OP, SLT, ZERO_ONE); } +SUB       { return_opcode(             1, BIN_OP, SUB, OFF); } +SUB_SAT   { return_opcode(require_ARB_fp, BIN_OP, SUB, ZERO_ONE); } +SWZ       { return_opcode(             1, SWZ, SWZ, OFF); } +SWZ_SAT   { return_opcode(require_ARB_fp, SWZ, SWZ, ZERO_ONE); } + +TEX       { return_opcode(require_ARB_fp, SAMPLE_OP, TEX, OFF); } +TEX_SAT   { return_opcode(require_ARB_fp, SAMPLE_OP, TEX, ZERO_ONE); } +TXB       { return_opcode(require_ARB_fp, SAMPLE_OP, TXB, OFF); } +TXB_SAT   { return_opcode(require_ARB_fp, SAMPLE_OP, TXB, ZERO_ONE); } +TXP       { return_opcode(require_ARB_fp, SAMPLE_OP, TXP, OFF); } +TXP_SAT   { return_opcode(require_ARB_fp, SAMPLE_OP, TXP, ZERO_ONE); } + +XPD       { return_opcode(             1, BIN_OP, XPD, OFF); } +XPD_SAT   { return_opcode(require_ARB_fp, BIN_OP, XPD, ZERO_ONE); } + +vertex                    { return_token_or_IDENTIFIER(require_ARB_vp, VERTEX); } +fragment                  { return_token_or_IDENTIFIER(require_ARB_fp, FRAGMENT); } +program                   { return PROGRAM; } +state                     { return STATE; } +result                    { return RESULT; } + +{dot}ambient              { return AMBIENT; } +{dot}attenuation          { return_token_or_DOT(require_ARB_vp, ATTENUATION); } +{dot}back                 { return BACK; } +{dot}clip                 { return_token_or_DOT(require_ARB_vp, CLIP); } +{dot}color                { return COLOR; } +{dot}depth                { return_token_or_DOT(require_ARB_fp, DEPTH); } +{dot}diffuse              { return DIFFUSE; } +{dot}direction            { return DIRECTION; } +{dot}emission             { return EMISSION; } +{dot}env                  { return ENV; } +{dot}eye                  { return EYE; } +{dot}fogcoord             { return FOGCOORD; } +{dot}fog                  { return FOG; } +{dot}front                { return FRONT; } +{dot}half                 { return HALF; } +{dot}inverse              { return INVERSE; } +{dot}invtrans             { return INVTRANS; } +{dot}light                { return LIGHT; } +{dot}lightmodel           { return LIGHTMODEL; } +{dot}lightprod            { return LIGHTPROD; } +{dot}local                { return LOCAL; } +{dot}material             { return MATERIAL; } +{dot}program              { return MAT_PROGRAM; } +{dot}matrix               { return MATRIX; } +{dot}matrixindex          { return_token_or_DOT(require_ARB_vp, MATRIXINDEX); } +{dot}modelview            { return MODELVIEW; } +{dot}mvp                  { return MVP; } +{dot}normal               { return_token_or_DOT(require_ARB_vp, NORMAL); } +{dot}object               { return OBJECT; } +{dot}palette              { return PALETTE; } +{dot}params               { return PARAMS; } +{dot}plane                { return PLANE; } +{dot}point                { return_token_or_DOT(require_ARB_vp, POINT); } +{dot}pointsize            { return_token_or_DOT(require_ARB_vp, POINTSIZE); } +{dot}position             { return POSITION; } +{dot}primary              { return PRIMARY; } +{dot}projection           { return PROJECTION; } +{dot}range                { return_token_or_DOT(require_ARB_fp, RANGE); } +{dot}row                  { return ROW; } +{dot}scenecolor           { return SCENECOLOR; } +{dot}secondary            { return SECONDARY; } +{dot}shininess            { return SHININESS; } +{dot}size                 { return_token_or_DOT(require_ARB_vp, SIZE); } +{dot}specular             { return SPECULAR; } +{dot}spot                 { return SPOT; } +{dot}texcoord             { return TEXCOORD; } +{dot}texenv               { return_token_or_DOT(require_ARB_fp, TEXENV); } +{dot}texgen               { return_token_or_DOT(require_ARB_vp, TEXGEN); } +{dot}q                    { return_token_or_DOT(require_ARB_vp, TEXGEN_Q); } +{dot}s                    { return_token_or_DOT(require_ARB_vp, TEXGEN_S); } +{dot}t                    { return_token_or_DOT(require_ARB_vp, TEXGEN_T); } +{dot}texture              { return TEXTURE; } +{dot}transpose            { return TRANSPOSE; } +{dot}attrib               { return_token_or_DOT(require_ARB_vp, VTXATTRIB); } +{dot}weight               { return_token_or_DOT(require_ARB_vp, WEIGHT); } + +texture                   { return_token_or_IDENTIFIER(require_ARB_fp, TEXTURE_UNIT); } +1D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_1D); } +2D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_2D); } +3D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); } +CUBE                      { return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); } +RECT                      { return_token_or_IDENTIFIER(require_ARB_fp, TEX_RECT); } + +[_a-zA-Z$][_a-zA-Z0-9$]*  { +   yylval->string = strdup(yytext); +   return IDENTIFIER; +} + +".."                      { return DOT_DOT; } + +{num}                     { +   yylval->integer = strtol(yytext, NULL, 10); +   return INTEGER; +} +{num}?{frac}{exp}?        { +   yylval->real = strtod(yytext, NULL); +   return REAL; +} +{num}"."/[^.]             { +   yylval->real = strtod(yytext, NULL); +   return REAL; +} +{num}{exp}                { +   yylval->real = strtod(yytext, NULL); +   return REAL; +} +{num}"."{exp}             { +   yylval->real = strtod(yytext, NULL); +   return REAL; +} + +".xyzw"                   { +   yylval->swiz_mask.swizzle = SWIZZLE_NOOP; +   yylval->swiz_mask.mask = WRITEMASK_XYZW; +   return MASK4; +} + +".xy"[zw]                 { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XY +      | mask_from_char(yytext[3]); +   return MASK3; +} +".xzw"                    { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XZW; +   return MASK3; +} +".yzw"                    { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_YZW; +   return MASK3; +} + +".x"[yzw]                 { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_X +      | mask_from_char(yytext[2]); +   return MASK2; +} +".y"[zw]                  { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_Y +      | mask_from_char(yytext[2]); +   return MASK2; +} +".zw"                     { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_ZW; +   return MASK2; +} + +"."[xyzw]                 { +   const unsigned s = swiz_from_char(yytext[1]); +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s); +   yylval->swiz_mask.mask = mask_from_char(yytext[1]); +   return MASK1;  +} + +"."[xyzw]{4}              { +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]), +					    swiz_from_char(yytext[2]), +					    swiz_from_char(yytext[3]), +					    swiz_from_char(yytext[4])); +   yylval->swiz_mask.mask = 0; +   return SWIZZLE; +} + +".rgba"                   { +   yylval->swiz_mask.swizzle = SWIZZLE_NOOP; +   yylval->swiz_mask.mask = WRITEMASK_XYZW; +   return_token_or_DOT(require_ARB_fp, MASK4); +} + +".rg"[ba]                 { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XY +      | mask_from_char(yytext[3]); +   return_token_or_DOT(require_ARB_fp, MASK3); +} +".rba"                    { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_XZW; +   return_token_or_DOT(require_ARB_fp, MASK3); +} +".gba"                    { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_YZW; +   return_token_or_DOT(require_ARB_fp, MASK3); +} + +".r"[gba]                 { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_X +      | mask_from_char(yytext[2]); +   return_token_or_DOT(require_ARB_fp, MASK2); +} +".g"[ba]                  { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_Y +      | mask_from_char(yytext[2]); +   return_token_or_DOT(require_ARB_fp, MASK2); +} +".ba"                     { +   yylval->swiz_mask.swizzle = SWIZZLE_INVAL; +   yylval->swiz_mask.mask = WRITEMASK_ZW; +   return_token_or_DOT(require_ARB_fp, MASK2); +} + +"."[gba]                  { +   const unsigned s = swiz_from_char(yytext[1]); +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s); +   yylval->swiz_mask.mask = mask_from_char(yytext[1]); +   return_token_or_DOT(require_ARB_fp, MASK1); +} + + +".r"                      { +   if (require_ARB_vp) { +      return TEXGEN_R; +   } else { +      yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, +						SWIZZLE_X, SWIZZLE_X); +      yylval->swiz_mask.mask = WRITEMASK_X; +      return MASK1; +   } +} + +"."[rgba]{4}              { +   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]), +					    swiz_from_char(yytext[2]), +					    swiz_from_char(yytext[3]), +					    swiz_from_char(yytext[4])); +   yylval->swiz_mask.mask = 0; +   return_token_or_DOT(require_ARB_fp, SWIZZLE); +} + +"."                       { return DOT; } + +\n                        { +   yylloc->first_line++; +   yylloc->first_column = 1; +   yylloc->last_line++; +   yylloc->last_column = 1; +   yylloc->position++; +} +[ \t]+                    /* eat whitespace */ ; +#.*$                      /* eat comments */ ; +.                         { return yytext[0]; } +%% + +void +_mesa_program_lexer_ctor(void **scanner, struct asm_parser_state *state, +			 const char *string, size_t len) +{ +   yylex_init_extra(state, scanner); +   yy_scan_bytes(string, len, *scanner); +} + +void +_mesa_program_lexer_dtor(void *scanner) +{ +   /* FINISHME: It's not clear to me whether or not the buffer state returned +    * FINISHME: by yy_scan_bytes in _mesa_program_lexer_ctor needs to be +    * FINISHME: explicitly destroyed here or not. +    */ +   yylex_destroy(scanner); +} diff --git a/src/mesa/shader/program_parse.tab.c b/src/mesa/shader/program_parse.tab.c new file mode 100644 index 0000000000..090c399f44 --- /dev/null +++ b/src/mesa/shader/program_parse.tab.c @@ -0,0 +1,4915 @@ + +/* A Bison parser, made by GNU Bison 2.4.1.  */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C +    +      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +   Free Software Foundation, Inc. +    +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. +    +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU General Public License for more details. +    +   You should have received a copy of the GNU General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ + +/* As a special exception, you may create a larger work that contains +   part or all of the Bison parser skeleton and distribute that work +   under terms of your choice, so long as that work isn't itself a +   parser generator using the skeleton or a modified version thereof +   as a parser skeleton.  Alternatively, if you modify or redistribute +   the parser skeleton itself, you may (at your option) remove this +   special exception, which will cause the skeleton and the resulting +   Bison output files to be licensed under the GNU General Public +   License without this special exception. +    +   This special exception was added by the Free Software Foundation in +   version 2.2 of Bison.  */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by +   simplifying the original so-called "semantic" parser.  */ + +/* All symbols defined below should begin with yy or YY, to avoid +   infringing on user name space.  This should be done even for local +   variables, as they might otherwise be expanded by user macros. +   There are some unavoidable exceptions within include files to +   define necessary library symbols; they are noted "INFRINGES ON +   USER NAME SPACE" below.  */ + +/* Identify Bison output.  */ +#define YYBISON 1 + +/* Bison version.  */ +#define YYBISON_VERSION "2.4.1" + +/* Skeleton name.  */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers.  */ +#define YYPURE 1 + +/* Push parsers.  */ +#define YYPUSH 0 + +/* Pull parsers.  */ +#define YYPULL 1 + +/* Using locations.  */ +#define YYLSP_NEEDED 1 + + + +/* Copy the first part of user declarations.  */ + +/* Line 189 of yacc.c  */ +#line 1 "program_parse.y" + +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "main/mtypes.h" +#include "prog_parameter.h" +#include "prog_parameter_layout.h" +#include "prog_statevars.h" +#include "prog_instruction.h" + +#include "symbol_table.h" +#include "program_parser.h" + +extern void *yy_scan_string(char *); +extern void yy_delete_buffer(void *); + +static struct asm_symbol *declare_variable(struct asm_parser_state *state, +    char *name, enum asm_type t, struct YYLTYPE *locp); + +static int initialize_symbol_from_state(struct gl_program *prog, +    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]); + +static int initialize_symbol_from_param(struct gl_program *prog, +    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]); + +static int initialize_symbol_from_const(struct gl_program *prog, +    struct asm_symbol *param_var, const struct asm_vector *vec); + +static int yyparse(struct asm_parser_state *state); + +static void yyerror(struct YYLTYPE *locp, struct asm_parser_state *state, +    const char *s); + +static int validate_inputs(struct YYLTYPE *locp, +    struct asm_parser_state *state); + +static void init_dst_reg(struct prog_dst_register *r); + +static void init_src_reg(struct asm_src_register *r); + +static struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op, +    const struct prog_dst_register *dst, const struct asm_src_register *src0, +    const struct asm_src_register *src1, const struct asm_src_register *src2); + +#ifndef FALSE +#define FALSE 0 +#define TRUE (!FALSE) +#endif + +#define YYLLOC_DEFAULT(Current, Rhs, N)					\ +   do {									\ +      if (YYID(N)) {							\ +	 (Current).first_line = YYRHSLOC(Rhs, 1).first_line;		\ +	 (Current).first_column = YYRHSLOC(Rhs, 1).first_column;	\ +	 (Current).position = YYRHSLOC(Rhs, 1).position;		\ +	 (Current).last_line = YYRHSLOC(Rhs, N).last_line;		\ +	 (Current).last_column = YYRHSLOC(Rhs, N).last_column;		\ +      } else {								\ +	 (Current).first_line = YYRHSLOC(Rhs, 0).last_line;		\ +	 (Current).last_line = (Current).first_line;			\ +	 (Current).first_column = YYRHSLOC(Rhs, 0).last_column;		\ +	 (Current).last_column = (Current).first_column;		\ +	 (Current).position = YYRHSLOC(Rhs, 0).position			\ +	    + (Current).first_column;					\ +      }									\ +   } while(YYID(0)) + +#define YYLEX_PARAM state->scanner + + +/* Line 189 of yacc.c  */ +#line 167 "program_parse.tab.c" + +/* Enabling traces.  */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages.  */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* Enabling the token table.  */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens.  */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE +   /* Put the tokens into the symbol table, so that GDB and other debuggers +      know about them.  */ +   enum yytokentype { +     ARBvp_10 = 258, +     ARBfp_10 = 259, +     ADDRESS = 260, +     ALIAS = 261, +     ATTRIB = 262, +     OPTION = 263, +     OUTPUT = 264, +     PARAM = 265, +     TEMP = 266, +     END = 267, +     BIN_OP = 268, +     BINSC_OP = 269, +     SAMPLE_OP = 270, +     SCALAR_OP = 271, +     TRI_OP = 272, +     VECTOR_OP = 273, +     ARL = 274, +     KIL = 275, +     SWZ = 276, +     INTEGER = 277, +     REAL = 278, +     AMBIENT = 279, +     ATTENUATION = 280, +     BACK = 281, +     CLIP = 282, +     COLOR = 283, +     DEPTH = 284, +     DIFFUSE = 285, +     DIRECTION = 286, +     EMISSION = 287, +     ENV = 288, +     EYE = 289, +     FOG = 290, +     FOGCOORD = 291, +     FRAGMENT = 292, +     FRONT = 293, +     HALF = 294, +     INVERSE = 295, +     INVTRANS = 296, +     LIGHT = 297, +     LIGHTMODEL = 298, +     LIGHTPROD = 299, +     LOCAL = 300, +     MATERIAL = 301, +     MAT_PROGRAM = 302, +     MATRIX = 303, +     MATRIXINDEX = 304, +     MODELVIEW = 305, +     MVP = 306, +     NORMAL = 307, +     OBJECT = 308, +     PALETTE = 309, +     PARAMS = 310, +     PLANE = 311, +     POINT = 312, +     POINTSIZE = 313, +     POSITION = 314, +     PRIMARY = 315, +     PROGRAM = 316, +     PROJECTION = 317, +     RANGE = 318, +     RESULT = 319, +     ROW = 320, +     SCENECOLOR = 321, +     SECONDARY = 322, +     SHININESS = 323, +     SIZE = 324, +     SPECULAR = 325, +     SPOT = 326, +     STATE = 327, +     TEXCOORD = 328, +     TEXENV = 329, +     TEXGEN = 330, +     TEXGEN_Q = 331, +     TEXGEN_R = 332, +     TEXGEN_S = 333, +     TEXGEN_T = 334, +     TEXTURE = 335, +     TRANSPOSE = 336, +     TEXTURE_UNIT = 337, +     TEX_1D = 338, +     TEX_2D = 339, +     TEX_3D = 340, +     TEX_CUBE = 341, +     TEX_RECT = 342, +     VERTEX = 343, +     VTXATTRIB = 344, +     WEIGHT = 345, +     IDENTIFIER = 346, +     MASK4 = 347, +     MASK3 = 348, +     MASK2 = 349, +     MASK1 = 350, +     SWIZZLE = 351, +     DOT_DOT = 352, +     DOT = 353 +   }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 214 of yacc.c  */ +#line 100 "program_parse.y" + +   struct asm_instruction *inst; +   struct asm_symbol *sym; +   struct asm_symbol temp_sym; +   struct asm_swizzle_mask swiz_mask; +   struct asm_src_register src_reg; +   struct prog_dst_register dst_reg; +   struct prog_instruction temp_inst; +   char *string; +   unsigned result; +   unsigned attrib; +   int integer; +   float real; +   unsigned state[5]; +   int negate; +   struct asm_vector vector; +   gl_inst_opcode opcode; + + + +/* Line 214 of yacc.c  */ +#line 322 "program_parse.tab.c" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED +typedef struct YYLTYPE +{ +  int first_line; +  int first_column; +  int last_line; +  int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + + +/* Copy the second part of user declarations.  */ + +/* Line 264 of yacc.c  */ +#line 233 "program_parse.y" + +extern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, +    void *yyscanner); + + +/* Line 264 of yacc.c  */ +#line 353 "program_parse.tab.c" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +#  define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +#  define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +#  define YYSIZE_T size_t +# else +#  define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +#  if ENABLE_NLS +#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */ +#   define YY_(msgid) dgettext ("bison-runtime", msgid) +#  endif +# endif +# ifndef YY_ +#  define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E.  */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions.  */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) +    int yyi; +#endif +{ +  return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols.  */ + +# ifdef YYSTACK_USE_ALLOCA +#  if YYSTACK_USE_ALLOCA +#   ifdef __GNUC__ +#    define YYSTACK_ALLOC __builtin_alloca +#   elif defined __BUILTIN_VA_ARG_INCR +#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */ +#   elif defined _AIX +#    define YYSTACK_ALLOC __alloca +#   elif defined _MSC_VER +#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */ +#    define alloca _alloca +#   else +#    define YYSTACK_ALLOC alloca +#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +#     ifndef _STDLIB_H +#      define _STDLIB_H 1 +#     endif +#    endif +#   endif +#  endif +# endif + +# ifdef YYSTACK_ALLOC +   /* Pacify GCC's `empty if-body' warning.  */ +#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +#  ifndef YYSTACK_ALLOC_MAXIMUM +    /* The OS might guarantee only one guard page at the bottom of the stack, +       and a page size can be as small as 4096 bytes.  So we cannot safely +       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number +       to allow for a few compiler-allocated temporary stack slots.  */ +#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +#  endif +# else +#  define YYSTACK_ALLOC YYMALLOC +#  define YYSTACK_FREE YYFREE +#  ifndef YYSTACK_ALLOC_MAXIMUM +#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +#  endif +#  if (defined __cplusplus && ! defined _STDLIB_H \ +       && ! ((defined YYMALLOC || defined malloc) \ +	     && (defined YYFREE || defined free))) +#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +#   ifndef _STDLIB_H +#    define _STDLIB_H 1 +#   endif +#  endif +#  ifndef YYMALLOC +#   define YYMALLOC malloc +#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +#   endif +#  endif +#  ifndef YYFREE +#   define YYFREE free +#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +#   endif +#  endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ +     && (! defined __cplusplus \ +	 || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ +	     && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member.  */ +union yyalloc +{ +  yytype_int16 yyss_alloc; +  YYSTYPE yyvs_alloc; +  YYLTYPE yyls_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next.  */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with +   N elements.  */ +# define YYSTACK_BYTES(N) \ +     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ +      + 2 * YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO.  The source and destination do +   not overlap.  */ +# ifndef YYCOPY +#  if defined __GNUC__ && 1 < __GNUC__ +#   define YYCOPY(To, From, Count) \ +      __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +#  else +#   define YYCOPY(To, From, Count)		\ +      do					\ +	{					\ +	  YYSIZE_T yyi;				\ +	  for (yyi = 0; yyi < (Count); yyi++)	\ +	    (To)[yyi] = (From)[yyi];		\ +	}					\ +      while (YYID (0)) +#  endif +# endif + +/* Relocate STACK from its old location to the new one.  The +   local variables YYSIZE and YYSTACKSIZE give the old and new number of +   elements in the stack, and YYPTR gives the new location of the +   stack.  Advance YYPTR to a properly aligned location for the next +   stack.  */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\ +    do									\ +      {									\ +	YYSIZE_T yynewbytes;						\ +	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\ +	Stack = &yyptr->Stack_alloc;					\ +	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ +	yyptr += yynewbytes / sizeof (*yyptr);				\ +      }									\ +    while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state.  */ +#define YYFINAL  5 +/* YYLAST -- Last index in YYTABLE.  */ +#define YYLAST   335 + +/* YYNTOKENS -- Number of terminals.  */ +#define YYNTOKENS  108 +/* YYNNTS -- Number of nonterminals.  */ +#define YYNNTS  133 +/* YYNRULES -- Number of rules.  */ +#define YYNRULES  255 +/* YYNRULES -- Number of states.  */ +#define YYNSTATES  424 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */ +#define YYUNDEFTOK  2 +#define YYMAXUTOK   353 + +#define YYTRANSLATE(YYX)						\ +  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */ +static const yytype_uint8 yytranslate[] = +{ +       0,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,   103,   100,   104,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,    99, +       2,   105,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,   101,     2,   102,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,   106,     2,   107,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     2,     2,     2,     2,     2,     1,     2,     3,     4, +       5,     6,     7,     8,     9,    10,    11,    12,    13,    14, +      15,    16,    17,    18,    19,    20,    21,    22,    23,    24, +      25,    26,    27,    28,    29,    30,    31,    32,    33,    34, +      35,    36,    37,    38,    39,    40,    41,    42,    43,    44, +      45,    46,    47,    48,    49,    50,    51,    52,    53,    54, +      55,    56,    57,    58,    59,    60,    61,    62,    63,    64, +      65,    66,    67,    68,    69,    70,    71,    72,    73,    74, +      75,    76,    77,    78,    79,    80,    81,    82,    83,    84, +      85,    86,    87,    88,    89,    90,    91,    92,    93,    94, +      95,    96,    97,    98 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in +   YYRHS.  */ +static const yytype_uint16 yyprhs[] = +{ +       0,     0,     3,     8,    10,    12,    15,    16,    20,    23, +      24,    27,    30,    32,    34,    36,    38,    40,    42,    44, +      46,    48,    50,    52,    57,    62,    67,    74,    81,    90, +      99,   102,   105,   107,   109,   111,   113,   115,   122,   126, +     130,   133,   136,   144,   147,   149,   151,   153,   155,   160, +     162,   164,   166,   168,   170,   172,   174,   178,   179,   182, +     185,   187,   189,   191,   193,   195,   197,   199,   201,   203, +     204,   206,   208,   210,   212,   213,   215,   217,   219,   221, +     223,   225,   230,   233,   236,   238,   241,   243,   246,   248, +     251,   256,   261,   263,   264,   268,   270,   272,   275,   277, +     280,   282,   284,   288,   295,   296,   298,   301,   306,   308, +     312,   314,   316,   318,   320,   322,   324,   326,   328,   330, +     332,   335,   338,   341,   344,   347,   350,   353,   356,   359, +     362,   365,   369,   371,   373,   375,   381,   383,   385,   387, +     390,   392,   394,   397,   399,   402,   409,   411,   415,   417, +     419,   421,   423,   425,   430,   432,   434,   436,   438,   440, +     442,   445,   447,   449,   455,   457,   460,   462,   464,   470, +     473,   474,   481,   485,   486,   488,   490,   492,   494,   496, +     499,   501,   503,   506,   511,   516,   517,   519,   521,   523, +     525,   527,   529,   531,   533,   539,   541,   545,   551,   557, +     559,   563,   569,   571,   573,   575,   577,   579,   581,   583, +     585,   587,   591,   597,   605,   615,   618,   621,   623,   625, +     626,   627,   631,   632,   636,   640,   642,   647,   650,   653, +     656,   659,   663,   666,   670,   671,   673,   675,   676,   678, +     680,   681,   683,   685,   686,   688,   690,   691,   695,   696, +     700,   701,   705,   707,   709,   711 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS.  */ +static const yytype_int16 yyrhs[] = +{ +     109,     0,    -1,   110,   111,   113,    12,    -1,     3,    -1, +       4,    -1,   111,   112,    -1,    -1,     8,    91,    99,    -1, +     113,   114,    -1,    -1,   115,    99,    -1,   151,    99,    -1, +     116,    -1,   117,    -1,   118,    -1,   119,    -1,   120,    -1, +     121,    -1,   122,    -1,   123,    -1,   128,    -1,   124,    -1, +     125,    -1,    19,   132,   100,   129,    -1,    18,   131,   100, +     130,    -1,    16,   131,   100,   129,    -1,    14,   131,   100, +     129,   100,   129,    -1,    13,   131,   100,   130,   100,   130, +      -1,    17,   131,   100,   130,   100,   130,   100,   130,    -1, +      15,   131,   100,   130,   100,   126,   100,   127,    -1,    20, +     130,    -1,    82,   235,    -1,    83,    -1,    84,    -1,    85, +      -1,    86,    -1,    87,    -1,    21,   131,   100,   136,   100, +     133,    -1,   221,   136,   148,    -1,   221,   136,   149,    -1, +     137,   150,    -1,   145,   147,    -1,   134,   100,   134,   100, +     134,   100,   134,    -1,   221,   135,    -1,    22,    -1,    91, +      -1,    91,    -1,   153,    -1,   138,   101,   139,   102,    -1, +     167,    -1,   228,    -1,    91,    -1,    91,    -1,   140,    -1, +     141,    -1,    22,    -1,   145,   146,   142,    -1,    -1,   103, +     143,    -1,   104,   144,    -1,    22,    -1,    22,    -1,    91, +      -1,    95,    -1,    95,    -1,    95,    -1,    95,    -1,    92, +      -1,    96,    -1,    -1,    92,    -1,    93,    -1,    94,    -1, +      95,    -1,    -1,   152,    -1,   159,    -1,   222,    -1,   224, +      -1,   227,    -1,   240,    -1,     7,    91,   105,   153,    -1, +      88,   154,    -1,    37,   158,    -1,    59,    -1,    90,   156, +      -1,    52,    -1,    28,   233,    -1,    36,    -1,    73,   234, +      -1,    49,   101,   157,   102,    -1,    89,   101,   155,   102, +      -1,    22,    -1,    -1,   101,   157,   102,    -1,    22,    -1, +      59,    -1,    28,   233,    -1,    36,    -1,    73,   234,    -1, +     160,    -1,   161,    -1,    10,    91,   163,    -1,    10,    91, +     101,   162,   102,   164,    -1,    -1,    22,    -1,   105,   166, +      -1,   105,   106,   165,   107,    -1,   168,    -1,   165,   100, +     168,    -1,   170,    -1,   205,    -1,   215,    -1,   170,    -1, +     205,    -1,   216,    -1,   169,    -1,   206,    -1,   215,    -1, +     170,    -1,    72,   194,    -1,    72,   171,    -1,    72,   173, +      -1,    72,   176,    -1,    72,   178,    -1,    72,   184,    -1, +      72,   180,    -1,    72,   187,    -1,    72,   189,    -1,    72, +     191,    -1,    72,   193,    -1,    46,   232,   172,    -1,   182, +      -1,    32,    -1,    68,    -1,    42,   101,   183,   102,   174, +      -1,   182,    -1,    59,    -1,    25,    -1,    71,   175,    -1, +      39,    -1,    31,    -1,    43,   177,    -1,    24,    -1,   232, +      66,    -1,    44,   101,   183,   102,   232,   179,    -1,   182, +      -1,    74,   236,   181,    -1,    28,    -1,    24,    -1,    30, +      -1,    70,    -1,    22,    -1,    75,   234,   185,   186,    -1, +      34,    -1,    53,    -1,    78,    -1,    79,    -1,    77,    -1, +      76,    -1,    35,   188,    -1,    28,    -1,    55,    -1,    27, +     101,   190,   102,    56,    -1,    22,    -1,    57,   192,    -1, +      69,    -1,    25,    -1,   196,    65,   101,   199,   102,    -1, +     196,   195,    -1,    -1,    65,   101,   199,    97,   199,   102, +      -1,    48,   200,   197,    -1,    -1,   198,    -1,    40,    -1, +      81,    -1,    41,    -1,    22,    -1,    50,   201,    -1,    62, +      -1,    51,    -1,    80,   234,    -1,    54,   101,   203,   102, +      -1,    47,   101,   204,   102,    -1,    -1,   202,    -1,    22, +      -1,    22,    -1,    22,    -1,   209,    -1,   212,    -1,   207, +      -1,   210,    -1,    61,    33,   101,   208,   102,    -1,   213, +      -1,   213,    97,   213,    -1,    61,    33,   101,   213,   102, +      -1,    61,    45,   101,   211,   102,    -1,   214,    -1,   214, +      97,   214,    -1,    61,    45,   101,   214,   102,    -1,    22, +      -1,    22,    -1,   217,    -1,   219,    -1,   218,    -1,   219, +      -1,   220,    -1,    23,    -1,    22,    -1,   106,   220,   107, +      -1,   106,   220,   100,   220,   107,    -1,   106,   220,   100, +     220,   100,   220,   107,    -1,   106,   220,   100,   220,   100, +     220,   100,   220,   107,    -1,   221,    23,    -1,   221,    22, +      -1,   103,    -1,   104,    -1,    -1,    -1,    11,   223,   226, +      -1,    -1,     5,   225,   226,    -1,   226,   100,    91,    -1, +      91,    -1,     9,    91,   105,   228,    -1,    64,    59,    -1, +      64,    36,    -1,    64,   229,    -1,    64,    58,    -1,    64, +      73,   234,    -1,    64,    29,    -1,    28,   230,   231,    -1, +      -1,    38,    -1,    26,    -1,    -1,    60,    -1,    67,    -1, +      -1,    38,    -1,    26,    -1,    -1,    60,    -1,    67,    -1, +      -1,   101,   237,   102,    -1,    -1,   101,   238,   102,    -1, +      -1,   101,   239,   102,    -1,    22,    -1,    22,    -1,    22, +      -1,     6,    91,   105,    91,    -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */ +static const yytype_uint16 yyrline[] = +{ +       0,   240,   240,   243,   251,   260,   261,   264,   282,   283, +     286,   301,   304,   305,   308,   309,   310,   311,   312,   313, +     314,   317,   318,   321,   327,   334,   341,   349,   356,   364, +     375,   381,   387,   388,   389,   390,   391,   394,   406,   419, +     432,   454,   463,   472,   479,   488,   516,   558,   569,   590, +     598,   604,   628,   645,   645,   647,   654,   666,   667,   668, +     671,   683,   695,   713,   724,   736,   738,   739,   740,   741, +     744,   744,   744,   744,   745,   748,   749,   750,   751,   752, +     753,   756,   774,   778,   784,   788,   792,   796,   800,   804, +     808,   812,   818,   829,   829,   830,   832,   836,   840,   844, +     850,   850,   852,   868,   891,   894,   905,   911,   917,   918, +     925,   931,   937,   945,   951,   957,   965,   971,   977,   985, +     986,   989,   990,   991,   992,   993,   994,   995,   996,   997, +     998,  1001,  1010,  1014,  1018,  1024,  1033,  1037,  1041,  1045, +    1049,  1055,  1061,  1068,  1073,  1081,  1091,  1093,  1101,  1107, +    1111,  1115,  1121,  1132,  1141,  1145,  1150,  1154,  1158,  1162, +    1168,  1175,  1179,  1185,  1193,  1204,  1211,  1215,  1221,  1231, +    1242,  1246,  1264,  1273,  1276,  1282,  1286,  1290,  1296,  1307, +    1312,  1317,  1322,  1327,  1331,  1339,  1342,  1347,  1360,  1368, +    1381,  1381,  1383,  1383,  1385,  1395,  1400,  1407,  1417,  1426, +    1431,  1438,  1448,  1458,  1470,  1470,  1471,  1471,  1473,  1480, +    1485,  1492,  1497,  1503,  1511,  1522,  1526,  1532,  1533,  1534, +    1537,  1537,  1540,  1540,  1543,  1549,  1557,  1570,  1579,  1588, +    1592,  1601,  1610,  1621,  1628,  1633,  1642,  1654,  1657,  1666, +    1677,  1678,  1679,  1682,  1683,  1684,  1687,  1688,  1691,  1692, +    1695,  1696,  1699,  1710,  1721,  1732 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. +   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */ +static const char *const yytname[] = +{ +  "$end", "error", "$undefined", "ARBvp_10", "ARBfp_10", "ADDRESS", +  "ALIAS", "ATTRIB", "OPTION", "OUTPUT", "PARAM", "TEMP", "END", "BIN_OP", +  "BINSC_OP", "SAMPLE_OP", "SCALAR_OP", "TRI_OP", "VECTOR_OP", "ARL", +  "KIL", "SWZ", "INTEGER", "REAL", "AMBIENT", "ATTENUATION", "BACK", +  "CLIP", "COLOR", "DEPTH", "DIFFUSE", "DIRECTION", "EMISSION", "ENV", +  "EYE", "FOG", "FOGCOORD", "FRAGMENT", "FRONT", "HALF", "INVERSE", +  "INVTRANS", "LIGHT", "LIGHTMODEL", "LIGHTPROD", "LOCAL", "MATERIAL", +  "MAT_PROGRAM", "MATRIX", "MATRIXINDEX", "MODELVIEW", "MVP", "NORMAL", +  "OBJECT", "PALETTE", "PARAMS", "PLANE", "POINT", "POINTSIZE", "POSITION", +  "PRIMARY", "PROGRAM", "PROJECTION", "RANGE", "RESULT", "ROW", +  "SCENECOLOR", "SECONDARY", "SHININESS", "SIZE", "SPECULAR", "SPOT", +  "STATE", "TEXCOORD", "TEXENV", "TEXGEN", "TEXGEN_Q", "TEXGEN_R", +  "TEXGEN_S", "TEXGEN_T", "TEXTURE", "TRANSPOSE", "TEXTURE_UNIT", "TEX_1D", +  "TEX_2D", "TEX_3D", "TEX_CUBE", "TEX_RECT", "VERTEX", "VTXATTRIB", +  "WEIGHT", "IDENTIFIER", "MASK4", "MASK3", "MASK2", "MASK1", "SWIZZLE", +  "DOT_DOT", "DOT", "';'", "','", "'['", "']'", "'+'", "'-'", "'='", "'{'", +  "'}'", "$accept", "program", "language", "optionSequence", "option", +  "statementSequence", "statement", "instruction", "ALU_instruction", +  "TexInstruction", "ARL_instruction", "VECTORop_instruction", +  "SCALARop_instruction", "BINSCop_instruction", "BINop_instruction", +  "TRIop_instruction", "SAMPLE_instruction", "KIL_instruction", +  "texImageUnit", "texTarget", "SWZ_instruction", "scalarSrcReg", +  "swizzleSrcReg", "maskedDstReg", "maskedAddrReg", "extendedSwizzle", +  "extSwizComp", "extSwizSel", "srcReg", "dstReg", "progParamArray", +  "progParamArrayMem", "progParamArrayAbs", "progParamArrayRel", +  "addrRegRelOffset", "addrRegPosOffset", "addrRegNegOffset", "addrReg", +  "addrComponent", "addrWriteMask", "scalarSuffix", "swizzleSuffix", +  "optionalMask", "namingStatement", "ATTRIB_statement", "attribBinding", +  "vtxAttribItem", "vtxAttribNum", "vtxOptWeightNum", "vtxWeightNum", +  "fragAttribItem", "PARAM_statement", "PARAM_singleStmt", +  "PARAM_multipleStmt", "optArraySize", "paramSingleInit", +  "paramMultipleInit", "paramMultInitList", "paramSingleItemDecl", +  "paramSingleItemUse", "paramMultipleItem", "stateMultipleItem", +  "stateSingleItem", "stateMaterialItem", "stateMatProperty", +  "stateLightItem", "stateLightProperty", "stateSpotProperty", +  "stateLightModelItem", "stateLModProperty", "stateLightProdItem", +  "stateLProdProperty", "stateTexEnvItem", "stateTexEnvProperty", +  "ambDiffSpecProperty", "stateLightNumber", "stateTexGenItem", +  "stateTexGenType", "stateTexGenCoord", "stateFogItem", +  "stateFogProperty", "stateClipPlaneItem", "stateClipPlaneNum", +  "statePointItem", "statePointProperty", "stateMatrixRow", +  "stateMatrixRows", "optMatrixRows", "stateMatrixItem", +  "stateOptMatModifier", "stateMatModifier", "stateMatrixRowNum", +  "stateMatrixName", "stateOptModMatNum", "stateModMatNum", +  "statePaletteMatNum", "stateProgramMatNum", "programSingleItem", +  "programMultipleItem", "progEnvParams", "progEnvParamNums", +  "progEnvParam", "progLocalParams", "progLocalParamNums", +  "progLocalParam", "progEnvParamNum", "progLocalParamNum", +  "paramConstDecl", "paramConstUse", "paramConstScalarDecl", +  "paramConstScalarUse", "paramConstVector", "signedFloatConstant", +  "optionalSign", "TEMP_statement", "@1", "ADDRESS_statement", "@2", +  "varNameList", "OUTPUT_statement", "resultBinding", "resultColBinding", +  "optResultFaceType", "optResultColorType", "optFaceType", "optColorType", +  "optTexCoordUnitNum", "optTexImageUnitNum", "optLegacyTexUnitNum", +  "texCoordUnitNum", "texImageUnitNum", "legacyTexUnitNum", +  "ALIAS_statement", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to +   token YYLEX-NUM.  */ +static const yytype_uint16 yytoknum[] = +{ +       0,   256,   257,   258,   259,   260,   261,   262,   263,   264, +     265,   266,   267,   268,   269,   270,   271,   272,   273,   274, +     275,   276,   277,   278,   279,   280,   281,   282,   283,   284, +     285,   286,   287,   288,   289,   290,   291,   292,   293,   294, +     295,   296,   297,   298,   299,   300,   301,   302,   303,   304, +     305,   306,   307,   308,   309,   310,   311,   312,   313,   314, +     315,   316,   317,   318,   319,   320,   321,   322,   323,   324, +     325,   326,   327,   328,   329,   330,   331,   332,   333,   334, +     335,   336,   337,   338,   339,   340,   341,   342,   343,   344, +     345,   346,   347,   348,   349,   350,   351,   352,   353,    59, +      44,    91,    93,    43,    45,    61,   123,   125 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */ +static const yytype_uint8 yyr1[] = +{ +       0,   108,   109,   110,   110,   111,   111,   112,   113,   113, +     114,   114,   115,   115,   116,   116,   116,   116,   116,   116, +     116,   117,   117,   118,   119,   120,   121,   122,   123,   124, +     125,   126,   127,   127,   127,   127,   127,   128,   129,   130, +     131,   132,   133,   134,   135,   135,   136,   136,   136,   136, +     137,   137,   138,   139,   139,   140,   141,   142,   142,   142, +     143,   144,   145,   146,   147,   148,   149,   149,   149,   149, +     150,   150,   150,   150,   150,   151,   151,   151,   151,   151, +     151,   152,   153,   153,   154,   154,   154,   154,   154,   154, +     154,   154,   155,   156,   156,   157,   158,   158,   158,   158, +     159,   159,   160,   161,   162,   162,   163,   164,   165,   165, +     166,   166,   166,   167,   167,   167,   168,   168,   168,   169, +     169,   170,   170,   170,   170,   170,   170,   170,   170,   170, +     170,   171,   172,   172,   172,   173,   174,   174,   174,   174, +     174,   175,   176,   177,   177,   178,   179,   180,   181,   182, +     182,   182,   183,   184,   185,   185,   186,   186,   186,   186, +     187,   188,   188,   189,   190,   191,   192,   192,   193,   194, +     195,   195,   196,   197,   197,   198,   198,   198,   199,   200, +     200,   200,   200,   200,   200,   201,   201,   202,   203,   204, +     205,   205,   206,   206,   207,   208,   208,   209,   210,   211, +     211,   212,   213,   214,   215,   215,   216,   216,   217,   218, +     218,   219,   219,   219,   219,   220,   220,   221,   221,   221, +     223,   222,   225,   224,   226,   226,   227,   228,   228,   228, +     228,   228,   228,   229,   230,   230,   230,   231,   231,   231, +     232,   232,   232,   233,   233,   233,   234,   234,   235,   235, +     236,   236,   237,   238,   239,   240 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */ +static const yytype_uint8 yyr2[] = +{ +       0,     2,     4,     1,     1,     2,     0,     3,     2,     0, +       2,     2,     1,     1,     1,     1,     1,     1,     1,     1, +       1,     1,     1,     4,     4,     4,     6,     6,     8,     8, +       2,     2,     1,     1,     1,     1,     1,     6,     3,     3, +       2,     2,     7,     2,     1,     1,     1,     1,     4,     1, +       1,     1,     1,     1,     1,     1,     3,     0,     2,     2, +       1,     1,     1,     1,     1,     1,     1,     1,     1,     0, +       1,     1,     1,     1,     0,     1,     1,     1,     1,     1, +       1,     4,     2,     2,     1,     2,     1,     2,     1,     2, +       4,     4,     1,     0,     3,     1,     1,     2,     1,     2, +       1,     1,     3,     6,     0,     1,     2,     4,     1,     3, +       1,     1,     1,     1,     1,     1,     1,     1,     1,     1, +       2,     2,     2,     2,     2,     2,     2,     2,     2,     2, +       2,     3,     1,     1,     1,     5,     1,     1,     1,     2, +       1,     1,     2,     1,     2,     6,     1,     3,     1,     1, +       1,     1,     1,     4,     1,     1,     1,     1,     1,     1, +       2,     1,     1,     5,     1,     2,     1,     1,     5,     2, +       0,     6,     3,     0,     1,     1,     1,     1,     1,     2, +       1,     1,     2,     4,     4,     0,     1,     1,     1,     1, +       1,     1,     1,     1,     5,     1,     3,     5,     5,     1, +       3,     5,     1,     1,     1,     1,     1,     1,     1,     1, +       1,     3,     5,     7,     9,     2,     2,     1,     1,     0, +       0,     3,     0,     3,     3,     1,     4,     2,     2,     2, +       2,     3,     2,     3,     0,     1,     1,     0,     1,     1, +       0,     1,     1,     0,     1,     1,     0,     3,     0,     3, +       0,     3,     1,     1,     1,     4 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state +   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero +   means the default is an error.  */ +static const yytype_uint8 yydefact[] = +{ +       0,     3,     4,     0,     6,     1,     9,     0,     5,     0, +       0,   222,     0,     0,     0,     0,   220,     2,     0,     0, +       0,     0,     0,     0,     0,   219,     0,     8,     0,    12, +      13,    14,    15,    16,    17,    18,    19,    21,    22,    20, +       0,    75,    76,   100,   101,    77,    78,    79,    80,     7, +       0,     0,     0,     0,     0,     0,     0,    51,     0,    74, +      50,     0,     0,     0,     0,     0,    62,     0,     0,   217, +     218,    30,     0,     0,    10,    11,   225,   223,     0,     0, +       0,   104,   219,   102,   221,   234,   232,   228,   230,   227, +     246,   229,   219,    70,    71,    72,    73,    40,   219,   219, +     219,   219,   219,   219,    64,    41,   210,   209,     0,     0, +       0,     0,    46,   219,    69,     0,    47,    49,   113,   114, +     190,   191,   115,   206,   207,     0,     0,   255,    81,   226, +     105,     0,   106,   110,   111,   112,   204,   205,   208,     0, +     236,   235,   237,     0,   231,     0,     0,     0,     0,    25, +       0,    24,    23,   243,    98,    96,   246,    83,     0,     0, +       0,     0,     0,   240,     0,   240,     0,     0,   250,   246, +     121,   122,   123,   124,   126,   125,   127,   128,   129,   130, +       0,   243,    88,     0,    86,    84,   246,     0,    93,    82, +       0,    67,    66,    68,    39,     0,     0,   224,     0,   216, +     215,   238,   239,   233,   252,     0,   219,   219,     0,     0, +     219,   244,   245,    97,    99,     0,     0,     0,   161,   162, +     160,     0,   143,   242,   241,   142,     0,     0,     0,     0, +     185,   181,     0,   180,   246,   173,   167,   166,   165,     0, +       0,     0,     0,    87,     0,    89,     0,     0,    85,   219, +     211,    55,     0,    53,    54,     0,   219,     0,   103,   247, +      27,    26,    65,    38,   248,     0,     0,   202,     0,   203, +       0,   164,     0,   152,     0,   144,     0,   149,   150,   133, +     134,   151,   131,   132,     0,   187,   179,   186,     0,   182, +     175,   177,   176,   172,   174,   254,     0,   148,   147,   154, +     155,     0,     0,    95,     0,    92,     0,     0,     0,    48, +      63,    57,    37,     0,     0,   219,     0,    31,     0,   219, +     197,   201,     0,     0,   240,   189,     0,   188,     0,   251, +     159,   158,   156,   157,   153,   178,     0,    90,    91,    94, +     219,   212,     0,     0,    56,   219,    44,    45,    43,     0, +       0,     0,   108,   116,   119,   117,   192,   193,   118,   253, +       0,    32,    33,    34,    35,    36,    29,    28,   163,   138, +     140,   137,     0,   135,   136,     0,   184,   183,   168,     0, +      60,    58,    61,    59,     0,     0,     0,   120,   170,   219, +     107,   249,   141,   139,   145,   146,   219,   213,   219,     0, +       0,     0,   169,   109,     0,     0,     0,   195,     0,   199, +       0,   214,   219,   194,     0,   198,     0,     0,    42,   196, +     200,     0,     0,   171 +}; + +/* YYDEFGOTO[NTERM-NUM].  */ +static const yytype_int16 yydefgoto[] = +{ +      -1,     3,     4,     6,     8,     9,    27,    28,    29,    30, +      31,    32,    33,    34,    35,    36,    37,    38,   265,   366, +      39,   146,    71,    58,    67,   312,   313,   348,   114,    59, +     115,   252,   253,   254,   344,   381,   383,    68,   311,   105, +     263,   194,    97,    40,    41,   116,   189,   306,   248,   304, +     157,    42,    43,    44,   131,    83,   258,   351,   132,   117, +     352,   353,   118,   170,   282,   171,   373,   393,   172,   225, +     173,   394,   174,   298,   283,   274,   175,   301,   334,   176, +     220,   177,   272,   178,   238,   179,   387,   402,   180,   293, +     294,   336,   235,   286,   287,   328,   326,   119,   355,   356, +     406,   120,   357,   408,   121,   268,   270,   358,   122,   136, +     123,   124,   138,    72,    45,    55,    46,    50,    77,    47, +      60,    91,   142,   203,   226,   213,   144,   317,   240,   205, +     360,   296,    48 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing +   STATE-NUM.  */ +#define YYPACT_NINF -371 +static const yytype_int16 yypact[] = +{ +     159,  -371,  -371,    34,  -371,  -371,    66,    11,  -371,   140, +     -22,  -371,    25,    37,    51,    53,  -371,  -371,   -28,   -28, +     -28,   -28,   -28,   -28,    74,   102,   -28,  -371,    80,  -371, +    -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +      82,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +     120,    -6,   107,   108,    91,   120,    61,  -371,    93,   105, +    -371,   114,   115,   116,   117,   118,  -371,   119,    87,  -371, +    -371,  -371,   -15,   121,  -371,  -371,  -371,   122,   129,   -17, +     160,   201,    -3,  -371,   122,    21,  -371,  -371,  -371,  -371, +     124,  -371,   102,  -371,  -371,  -371,  -371,  -371,   102,   102, +     102,   102,   102,   102,  -371,  -371,  -371,  -371,    68,    72, +       8,   -11,   126,   102,    99,   127,  -371,  -371,  -371,  -371, +    -371,  -371,  -371,  -371,  -371,   -15,   135,  -371,  -371,  -371, +    -371,   130,  -371,  -371,  -371,  -371,  -371,  -371,  -371,   185, +    -371,  -371,    48,   207,  -371,   136,   137,   -15,   138,  -371, +     139,  -371,  -371,    64,  -371,  -371,   124,  -371,   141,   142, +     143,     9,   144,    88,   145,    83,    86,    24,   146,   124, +    -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +     175,    64,  -371,   147,  -371,  -371,   124,   148,   150,  -371, +      73,  -371,  -371,  -371,  -371,   -10,   152,  -371,   151,  -371, +    -371,  -371,  -371,  -371,  -371,   153,   102,   102,   155,   171, +     102,  -371,  -371,  -371,  -371,   219,   232,   235,  -371,  -371, +    -371,   237,  -371,  -371,  -371,  -371,   194,   237,     0,   161, +     239,  -371,   163,  -371,   124,   -14,  -371,  -371,  -371,   243, +     238,    58,   166,  -371,   246,  -371,   247,   246,  -371,   102, +    -371,  -371,   168,  -371,  -371,   176,   102,   167,  -371,  -371, +    -371,  -371,  -371,  -371,   173,   172,   177,  -371,   174,  -371, +     178,  -371,   179,  -371,   180,  -371,   181,  -371,  -371,  -371, +    -371,  -371,  -371,  -371,   253,  -371,  -371,  -371,   256,  -371, +    -371,  -371,  -371,  -371,  -371,  -371,   182,  -371,  -371,  -371, +    -371,   125,   257,  -371,   183,  -371,   186,   187,    76,  -371, +    -371,   106,  -371,   190,    -7,    26,   265,  -371,   103,   102, +    -371,  -371,   236,    36,    83,  -371,   189,  -371,   191,  -371, +    -371,  -371,  -371,  -371,  -371,  -371,   192,  -371,  -371,  -371, +     102,  -371,   273,   274,  -371,   102,  -371,  -371,  -371,    90, +       8,    77,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +     195,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +    -371,  -371,   267,  -371,  -371,    15,  -371,  -371,  -371,    78, +    -371,  -371,  -371,  -371,   199,   200,   202,  -371,   240,    26, +    -371,  -371,  -371,  -371,  -371,  -371,   102,  -371,   102,   219, +     232,   203,  -371,  -371,   193,   206,   208,   205,   209,   215, +     257,  -371,   102,  -371,   219,  -371,   232,    41,  -371,  -371, +    -371,   257,   211,  -371 +}; + +/* YYPGOTO[NTERM-NUM].  */ +static const yytype_int16 yypgoto[] = +{ +    -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +    -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +    -371,   -94,   -88,   149,  -371,  -371,  -326,  -371,   -92,  -371, +    -371,  -371,  -371,  -371,  -371,  -371,  -371,   123,  -371,  -371, +    -371,  -371,  -371,  -371,  -371,   241,  -371,  -371,  -371,    70, +    -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +     -74,  -371,   -81,  -371,  -371,  -371,  -371,  -371,  -371,  -371, +    -371,  -371,  -371,  -371,  -295,    92,  -371,  -371,  -371,  -371, +    -371,  -371,  -371,  -371,  -371,  -371,  -371,  -371,   -29,  -371, +    -371,  -368,  -371,  -371,  -371,  -371,  -371,   242,  -371,  -371, +    -371,  -371,  -371,  -371,  -371,  -370,  -306,   244,  -371,  -371, +    -371,   -80,  -110,   -82,  -371,  -371,  -371,  -371,   268,  -371, +     245,  -371,  -371,  -371,  -160,   154,  -146,  -371,  -371,  -371, +    -371,  -371,  -371 +}; + +/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If +   positive, shift that token.  If negative, reduce the rule which +   number is the opposite.  If zero, do what YYDEFACT says. +   If YYTABLE_NINF, syntax error.  */ +#define YYTABLE_NINF -53 +static const yytype_int16 yytable[] = +{ +     139,   133,   137,   190,   145,   228,   149,   106,   107,   152, +     214,   148,   251,   150,   151,   346,   147,   181,   147,   384, +     108,   147,   108,   241,   277,   182,   290,   291,   374,   407, +     278,   139,   279,   196,     5,   160,    56,   218,   183,   277, +     245,   184,   417,   161,   419,   278,   109,   140,   185,   236, +     162,   163,   164,   422,   165,   208,   166,   110,   109,   141, +     277,   369,   186,    57,   219,   167,   278,   292,   280,   110, +     281,   111,   405,   111,     7,   370,   112,    49,   187,   188, +     395,    66,   168,   169,   347,   281,   418,   349,   289,    85, +      86,   113,   299,   237,   409,   371,   153,    87,   350,    78, +      69,    70,    10,   113,   154,   158,   281,   372,   201,   223, +     420,   300,   222,   261,   223,   202,    51,   159,   260,    88, +      89,   224,   266,   385,   211,   147,   224,   155,    52,    69, +      70,   212,   113,   229,    90,   386,   230,   231,   421,   308, +     232,   156,    53,   378,    54,    11,    12,    13,   233,    14, +      15,    16,    17,    18,    19,    20,    21,    22,    23,    24, +      25,    26,     1,     2,   375,    66,   234,   139,    61,    62, +      63,    64,    65,   249,   314,    73,   340,   389,   396,    74, +     250,    75,   104,   341,   390,   397,   361,   362,   363,   364, +     365,   191,    81,    92,   192,   193,    82,    93,    94,    95, +      96,   330,   331,   332,   333,    69,    70,   199,   200,   342, +     343,    76,    79,    80,    98,    99,   100,   101,   102,   103, +     127,   125,   126,   130,    56,   143,   197,   -52,   195,   204, +     379,   367,   198,   139,   354,   137,   206,   207,   209,   210, +     242,   267,   215,   216,   217,   221,   227,   239,   244,   246, +     262,   247,   256,   264,   269,   259,   257,   271,   139,   273, +     275,   285,   284,   314,   288,   295,   297,   302,   303,   305, +     309,   310,   318,   315,   316,   325,   320,   319,   327,   335, +     321,   322,   323,   324,   329,   337,   404,   359,   338,   339, +     345,   376,   368,   377,   378,   380,   382,   391,   392,   398, +     411,   399,   414,   400,   410,   401,   412,   139,   354,   137, +     413,   415,   416,   423,   139,   403,   314,   307,   255,   276, +     128,   388,     0,    84,   134,   129,   135,     0,     0,     0, +     314,     0,     0,     0,     0,   243 +}; + +static const yytype_int16 yycheck[] = +{ +      82,    82,    82,   113,    92,   165,   100,    22,    23,   103, +     156,    99,    22,   101,   102,    22,    98,    28,   100,   345, +      37,   103,    37,   169,    24,    36,    40,    41,   323,   399, +      30,   113,    32,   125,     0,    27,    64,    28,    49,    24, +     186,    52,   410,    35,   414,    30,    61,    26,    59,    25, +      42,    43,    44,   421,    46,   147,    48,    72,    61,    38, +      24,    25,    73,    91,    55,    57,    30,    81,    68,    72, +      70,    88,   398,    88,     8,    39,    91,    99,    89,    90, +     375,    91,    74,    75,    91,    70,   412,    61,   234,    28, +      29,   106,    34,    69,   400,    59,    28,    36,    72,   105, +     103,   104,    91,   106,    36,    33,    70,    71,    60,    26, +     416,    53,    24,   207,    26,    67,    91,    45,   206,    58, +      59,    38,   210,    33,    60,   207,    38,    59,    91,   103, +     104,    67,   106,    47,    73,    45,    50,    51,    97,   249, +      54,    73,    91,   102,    91,     5,     6,     7,    62,     9, +      10,    11,    12,    13,    14,    15,    16,    17,    18,    19, +      20,    21,     3,     4,   324,    91,    80,   249,    19,    20, +      21,    22,    23,   100,   256,    26,   100,   100,   100,    99, +     107,    99,    95,   107,   107,   107,    83,    84,    85,    86, +      87,    92,   101,   100,    95,    96,   105,    92,    93,    94, +      95,    76,    77,    78,    79,   103,   104,    22,    23,   103, +     104,    91,   105,   105,   100,   100,   100,   100,   100,   100, +      91,   100,   100,    22,    64,   101,    91,   101,   101,    22, +     340,   319,   102,   315,   315,   315,   100,   100,   100,   100, +      65,    22,   101,   101,   101,   101,   101,   101,   101,   101, +      95,   101,   100,    82,    22,   102,   105,    22,   340,    22, +      66,    22,   101,   345,   101,    22,    28,   101,    22,    22, +     102,    95,   100,   106,   101,    22,   102,   100,    22,    22, +     102,   102,   102,   102,   102,   102,   396,    22,   102,   102, +     100,   102,    56,   102,   102,    22,    22,   102,    31,   100, +     107,   101,    97,   101,   101,    65,   100,   389,   389,   389, +     102,   102,    97,   102,   396,   389,   398,   247,   195,   227, +      79,   350,    -1,    55,    82,    80,    82,    -1,    -1,    -1, +     412,    -1,    -1,    -1,    -1,   181 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing +   symbol of state STATE-NUM.  */ +static const yytype_uint8 yystos[] = +{ +       0,     3,     4,   109,   110,     0,   111,     8,   112,   113, +      91,     5,     6,     7,     9,    10,    11,    12,    13,    14, +      15,    16,    17,    18,    19,    20,    21,   114,   115,   116, +     117,   118,   119,   120,   121,   122,   123,   124,   125,   128, +     151,   152,   159,   160,   161,   222,   224,   227,   240,    99, +     225,    91,    91,    91,    91,   223,    64,    91,   131,   137, +     228,   131,   131,   131,   131,   131,    91,   132,   145,   103, +     104,   130,   221,   131,    99,    99,    91,   226,   105,   105, +     105,   101,   105,   163,   226,    28,    29,    36,    58,    59, +      73,   229,   100,    92,    93,    94,    95,   150,   100,   100, +     100,   100,   100,   100,    95,   147,    22,    23,    37,    61, +      72,    88,    91,   106,   136,   138,   153,   167,   170,   205, +     209,   212,   216,   218,   219,   100,   100,    91,   153,   228, +      22,   162,   166,   170,   205,   215,   217,   219,   220,   221, +      26,    38,   230,   101,   234,   130,   129,   221,   130,   129, +     130,   130,   129,    28,    36,    59,    73,   158,    33,    45, +      27,    35,    42,    43,    44,    46,    48,    57,    74,    75, +     171,   173,   176,   178,   180,   184,   187,   189,   191,   193, +     196,    28,    36,    49,    52,    59,    73,    89,    90,   154, +     220,    92,    95,    96,   149,   101,   136,    91,   102,    22, +      23,    60,    67,   231,    22,   237,   100,   100,   136,   100, +     100,    60,    67,   233,   234,   101,   101,   101,    28,    55, +     188,   101,    24,    26,    38,   177,   232,   101,   232,    47, +      50,    51,    54,    62,    80,   200,    25,    69,   192,   101, +     236,   234,    65,   233,   101,   234,   101,   101,   156,   100, +     107,    22,   139,   140,   141,   145,   100,   105,   164,   102, +     130,   129,    95,   148,    82,   126,   130,    22,   213,    22, +     214,    22,   190,    22,   183,    66,   183,    24,    30,    32, +      68,    70,   172,   182,   101,    22,   201,   202,   101,   234, +      40,    41,    81,   197,   198,    22,   239,    28,   181,    34, +      53,   185,   101,    22,   157,    22,   155,   157,   220,   102, +      95,   146,   133,   134,   221,   106,   101,   235,   100,   100, +     102,   102,   102,   102,   102,    22,   204,    22,   203,   102, +      76,    77,    78,    79,   186,    22,   199,   102,   102,   102, +     100,   107,   103,   104,   142,   100,    22,    91,   135,    61, +      72,   165,   168,   169,   170,   206,   207,   210,   215,    22, +     238,    83,    84,    85,    86,    87,   127,   130,    56,    25, +      39,    59,    71,   174,   182,   232,   102,   102,   102,   220, +      22,   143,    22,   144,   134,    33,    45,   194,   196,   100, +     107,   102,    31,   175,   179,   182,   100,   107,   100,   101, +     101,    65,   195,   168,   220,   134,   208,   213,   211,   214, +     101,   107,   100,   102,    97,   102,    97,   199,   134,   213, +     214,    97,   199,   102 +}; + +#define yyerrok		(yyerrstatus = 0) +#define yyclearin	(yychar = YYEMPTY) +#define YYEMPTY		(-2) +#define YYEOF		0 + +#define YYACCEPT	goto yyacceptlab +#define YYABORT		goto yyabortlab +#define YYERROR		goto yyerrorlab + + +/* Like YYERROR except do call yyerror.  This remains here temporarily +   to ease the transition to the new meaning of YYERROR, for GCC. +   Once GCC version 2 has supplanted version 1, this can go.  */ + +#define YYFAIL		goto yyerrlab + +#define YYRECOVERING()  (!!yyerrstatus) + +#define YYBACKUP(Token, Value)					\ +do								\ +  if (yychar == YYEMPTY && yylen == 1)				\ +    {								\ +      yychar = (Token);						\ +      yylval = (Value);						\ +      yytoken = YYTRANSLATE (yychar);				\ +      YYPOPSTACK (1);						\ +      goto yybackup;						\ +    }								\ +  else								\ +    {								\ +      yyerror (&yylloc, state, YY_("syntax error: cannot back up")); \ +      YYERROR;							\ +    }								\ +while (YYID (0)) + + +#define YYTERROR	1 +#define YYERRCODE	256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. +   If N is 0, then set CURRENT to the empty location which ends +   the previous symbol: RHS[0] (always defined).  */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N)				\ +    do									\ +      if (YYID (N))                                                    \ +	{								\ +	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\ +	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\ +	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\ +	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\ +	}								\ +      else								\ +	{								\ +	  (Current).first_line   = (Current).last_line   =		\ +	    YYRHSLOC (Rhs, 0).last_line;				\ +	  (Current).first_column = (Current).last_column =		\ +	    YYRHSLOC (Rhs, 0).last_column;				\ +	}								\ +    while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. +   This macro was not mandated originally: define only if we know +   we won't break user code: when these are the locations we know.  */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +#  define YY_LOCATION_PRINT(File, Loc)			\ +     fprintf (File, "%d.%d-%d.%d",			\ +	      (Loc).first_line, (Loc).first_column,	\ +	      (Loc).last_line,  (Loc).last_column) +# else +#  define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments.  */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, &yylloc, scanner) +#endif + +/* Enable debugging if requested.  */ +#if YYDEBUG + +# ifndef YYFPRINTF +#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +#  define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args)			\ +do {						\ +  if (yydebug)					\ +    YYFPRINTF Args;				\ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \ +do {									  \ +  if (yydebug)								  \ +    {									  \ +      YYFPRINTF (stderr, "%s ", Title);					  \ +      yy_symbol_print (stderr,						  \ +		  Type, Value, Location, state); \ +      YYFPRINTF (stderr, "\n");						  \ +    }									  \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT.  | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, struct asm_parser_state *state) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, state) +    FILE *yyoutput; +    int yytype; +    YYSTYPE const * const yyvaluep; +    YYLTYPE const * const yylocationp; +    struct asm_parser_state *state; +#endif +{ +  if (!yyvaluep) +    return; +  YYUSE (yylocationp); +  YYUSE (state); +# ifdef YYPRINT +  if (yytype < YYNTOKENS) +    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else +  YYUSE (yyoutput); +# endif +  switch (yytype) +    { +      default: +	break; +    } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT.  | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, struct asm_parser_state *state) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp, state) +    FILE *yyoutput; +    int yytype; +    YYSTYPE const * const yyvaluep; +    YYLTYPE const * const yylocationp; +    struct asm_parser_state *state; +#endif +{ +  if (yytype < YYNTOKENS) +    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +  else +    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + +  YY_LOCATION_PRINT (yyoutput, *yylocationp); +  YYFPRINTF (yyoutput, ": "); +  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, state); +  YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included).                                                   | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) +    yytype_int16 *yybottom; +    yytype_int16 *yytop; +#endif +{ +  YYFPRINTF (stderr, "Stack now"); +  for (; yybottom <= yytop; yybottom++) +    { +      int yybot = *yybottom; +      YYFPRINTF (stderr, " %d", yybot); +    } +  YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top)				\ +do {								\ +  if (yydebug)							\ +    yy_stack_print ((Bottom), (Top));				\ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced.  | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, struct asm_parser_state *state) +#else +static void +yy_reduce_print (yyvsp, yylsp, yyrule, state) +    YYSTYPE *yyvsp; +    YYLTYPE *yylsp; +    int yyrule; +    struct asm_parser_state *state; +#endif +{ +  int yynrhs = yyr2[yyrule]; +  int yyi; +  unsigned long int yylno = yyrline[yyrule]; +  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", +	     yyrule - 1, yylno); +  /* The symbols being reduced.  */ +  for (yyi = 0; yyi < yynrhs; yyi++) +    { +      YYFPRINTF (stderr, "   $%d = ", yyi + 1); +      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], +		       &(yyvsp[(yyi + 1) - (yynrhs)]) +		       , &(yylsp[(yyi + 1) - (yynrhs)])		       , state); +      YYFPRINTF (stderr, "\n"); +    } +} + +# define YY_REDUCE_PRINT(Rule)		\ +do {					\ +  if (yydebug)				\ +    yy_reduce_print (yyvsp, yylsp, Rule, state); \ +} while (YYID (0)) + +/* Nonzero means print parse trace.  It is left uninitialized so that +   multiple parsers can coexist.  */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks.  */ +#ifndef	YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only +   if the built-in stack extension method is used). + +   Do not make this value too large; the results are undefined if +   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) +   evaluated with infinite-precision integer arithmetic.  */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +#  if defined __GLIBC__ && defined _STRING_H +#   define yystrlen strlen +#  else +/* Return the length of YYSTR.  */ +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) +    const char *yystr; +#endif +{ +  YYSIZE_T yylen; +  for (yylen = 0; yystr[yylen]; yylen++) +    continue; +  return yylen; +} +#  endif +# endif + +# ifndef yystpcpy +#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +#   define yystpcpy stpcpy +#  else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in +   YYDEST.  */ +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) +    char *yydest; +    const char *yysrc; +#endif +{ +  char *yyd = yydest; +  const char *yys = yysrc; + +  while ((*yyd++ = *yys++) != '\0') +    continue; + +  return yyd - 1; +} +#  endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary +   quotes and backslashes, so that it's suitable for yyerror.  The +   heuristic is that double-quoting is unnecessary unless the string +   contains an apostrophe, a comma, or backslash (other than +   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is +   null, do not copy; instead, return the length of what the result +   would have been.  */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ +  if (*yystr == '"') +    { +      YYSIZE_T yyn = 0; +      char const *yyp = yystr; + +      for (;;) +	switch (*++yyp) +	  { +	  case '\'': +	  case ',': +	    goto do_not_strip_quotes; + +	  case '\\': +	    if (*++yyp != '\\') +	      goto do_not_strip_quotes; +	    /* Fall through.  */ +	  default: +	    if (yyres) +	      yyres[yyn] = *yyp; +	    yyn++; +	    break; + +	  case '"': +	    if (yyres) +	      yyres[yyn] = '\0'; +	    return yyn; +	  } +    do_not_strip_quotes: ; +    } + +  if (! yyres) +    return yystrlen (yystr); + +  return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token +   YYCHAR while in state YYSTATE.  Return the number of bytes copied, +   including the terminating null byte.  If YYRESULT is null, do not +   copy anything; just return the number of bytes that would be +   copied.  As a special case, return 0 if an ordinary "syntax error" +   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during +   size calculation.  */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ +  int yyn = yypact[yystate]; + +  if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) +    return 0; +  else +    { +      int yytype = YYTRANSLATE (yychar); +      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); +      YYSIZE_T yysize = yysize0; +      YYSIZE_T yysize1; +      int yysize_overflow = 0; +      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; +      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; +      int yyx; + +# if 0 +      /* This is so xgettext sees the translatable formats that are +	 constructed on the fly.  */ +      YY_("syntax error, unexpected %s"); +      YY_("syntax error, unexpected %s, expecting %s"); +      YY_("syntax error, unexpected %s, expecting %s or %s"); +      YY_("syntax error, unexpected %s, expecting %s or %s or %s"); +      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif +      char *yyfmt; +      char const *yyf; +      static char const yyunexpected[] = "syntax error, unexpected %s"; +      static char const yyexpecting[] = ", expecting %s"; +      static char const yyor[] = " or %s"; +      char yyformat[sizeof yyunexpected +		    + sizeof yyexpecting - 1 +		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) +		       * (sizeof yyor - 1))]; +      char const *yyprefix = yyexpecting; + +      /* Start YYX at -YYN if negative to avoid negative indexes in +	 YYCHECK.  */ +      int yyxbegin = yyn < 0 ? -yyn : 0; + +      /* Stay within bounds of both yycheck and yytname.  */ +      int yychecklim = YYLAST - yyn + 1; +      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; +      int yycount = 1; + +      yyarg[0] = yytname[yytype]; +      yyfmt = yystpcpy (yyformat, yyunexpected); + +      for (yyx = yyxbegin; yyx < yyxend; ++yyx) +	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) +	  { +	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) +	      { +		yycount = 1; +		yysize = yysize0; +		yyformat[sizeof yyunexpected - 1] = '\0'; +		break; +	      } +	    yyarg[yycount++] = yytname[yyx]; +	    yysize1 = yysize + yytnamerr (0, yytname[yyx]); +	    yysize_overflow |= (yysize1 < yysize); +	    yysize = yysize1; +	    yyfmt = yystpcpy (yyfmt, yyprefix); +	    yyprefix = yyor; +	  } + +      yyf = YY_(yyformat); +      yysize1 = yysize + yystrlen (yyf); +      yysize_overflow |= (yysize1 < yysize); +      yysize = yysize1; + +      if (yysize_overflow) +	return YYSIZE_MAXIMUM; + +      if (yyresult) +	{ +	  /* Avoid sprintf, as that infringes on the user's name space. +	     Don't have undefined behavior even if the translation +	     produced a string with the wrong number of "%s"s.  */ +	  char *yyp = yyresult; +	  int yyi = 0; +	  while ((*yyp = *yyf) != '\0') +	    { +	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) +		{ +		  yyp += yytnamerr (yyp, yyarg[yyi++]); +		  yyf += 2; +		} +	      else +		{ +		  yyp++; +		  yyf++; +		} +	    } +	} +      return yysize; +    } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol.  | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, struct asm_parser_state *state) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, yylocationp, state) +    const char *yymsg; +    int yytype; +    YYSTYPE *yyvaluep; +    YYLTYPE *yylocationp; +    struct asm_parser_state *state; +#endif +{ +  YYUSE (yyvaluep); +  YYUSE (yylocationp); +  YYUSE (state); + +  if (!yymsg) +    yymsg = "Deleting"; +  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + +  switch (yytype) +    { + +      default: +	break; +    } +} + +/* Prevent warnings from -Wmissing-prototypes.  */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (struct asm_parser_state *state); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + +/*-------------------------. +| yyparse or yypush_parse.  | +`-------------------------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) +    void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ +     || defined __cplusplus || defined _MSC_VER) +int +yyparse (struct asm_parser_state *state) +#else +int +yyparse (state) +    struct asm_parser_state *state; +#endif +#endif +{ +/* The lookahead symbol.  */ +int yychar; + +/* The semantic value of the lookahead symbol.  */ +YYSTYPE yylval; + +/* Location data for the lookahead symbol.  */ +YYLTYPE yylloc; + +    /* Number of syntax errors so far.  */ +    int yynerrs; + +    int yystate; +    /* Number of tokens to shift before error messages enabled.  */ +    int yyerrstatus; + +    /* The stacks and their tools: +       `yyss': related to states. +       `yyvs': related to semantic values. +       `yyls': related to locations. + +       Refer to the stacks thru separate pointers, to allow yyoverflow +       to reallocate them elsewhere.  */ + +    /* The state stack.  */ +    yytype_int16 yyssa[YYINITDEPTH]; +    yytype_int16 *yyss; +    yytype_int16 *yyssp; + +    /* The semantic value stack.  */ +    YYSTYPE yyvsa[YYINITDEPTH]; +    YYSTYPE *yyvs; +    YYSTYPE *yyvsp; + +    /* The location stack.  */ +    YYLTYPE yylsa[YYINITDEPTH]; +    YYLTYPE *yyls; +    YYLTYPE *yylsp; + +    /* The locations where the error started and ended.  */ +    YYLTYPE yyerror_range[2]; + +    YYSIZE_T yystacksize; + +  int yyn; +  int yyresult; +  /* Lookahead token as an internal (translated) token number.  */ +  int yytoken; +  /* The variables used to return semantic value and location from the +     action routines.  */ +  YYSTYPE yyval; +  YYLTYPE yyloc; + +#if YYERROR_VERBOSE +  /* Buffer for error messages, and its allocated size.  */ +  char yymsgbuf[128]; +  char *yymsg = yymsgbuf; +  YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) + +  /* The number of symbols on the RHS of the reduced rule. +     Keep to zero when no symbol should be popped.  */ +  int yylen = 0; + +  yytoken = 0; +  yyss = yyssa; +  yyvs = yyvsa; +  yyls = yylsa; +  yystacksize = YYINITDEPTH; + +  YYDPRINTF ((stderr, "Starting parse\n")); + +  yystate = 0; +  yyerrstatus = 0; +  yynerrs = 0; +  yychar = YYEMPTY; /* Cause a token to be read.  */ + +  /* Initialize stack pointers. +     Waste one element of value and location stack +     so that they stay on the same level as the state stack. +     The wasted elements are never initialized.  */ +  yyssp = yyss; +  yyvsp = yyvs; +  yylsp = yyls; + +#if YYLTYPE_IS_TRIVIAL +  /* Initialize the default location before parsing starts.  */ +  yylloc.first_line   = yylloc.last_line   = 1; +  yylloc.first_column = yylloc.last_column = 1; +#endif + +  goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate.  | +`------------------------------------------------------------*/ + yynewstate: +  /* In all cases, when you get here, the value and location stacks +     have just been pushed.  So pushing a state here evens the stacks.  */ +  yyssp++; + + yysetstate: +  *yyssp = yystate; + +  if (yyss + yystacksize - 1 <= yyssp) +    { +      /* Get the current used size of the three stacks, in elements.  */ +      YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow +      { +	/* Give user a chance to reallocate the stack.  Use copies of +	   these so that the &'s don't force the real ones into +	   memory.  */ +	YYSTYPE *yyvs1 = yyvs; +	yytype_int16 *yyss1 = yyss; +	YYLTYPE *yyls1 = yyls; + +	/* Each stack pointer address is followed by the size of the +	   data in use in that stack, in bytes.  This used to be a +	   conditional around just the two extra args, but that might +	   be undefined if yyoverflow is a macro.  */ +	yyoverflow (YY_("memory exhausted"), +		    &yyss1, yysize * sizeof (*yyssp), +		    &yyvs1, yysize * sizeof (*yyvsp), +		    &yyls1, yysize * sizeof (*yylsp), +		    &yystacksize); + +	yyls = yyls1; +	yyss = yyss1; +	yyvs = yyvs1; +      } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE +      goto yyexhaustedlab; +# else +      /* Extend the stack our own way.  */ +      if (YYMAXDEPTH <= yystacksize) +	goto yyexhaustedlab; +      yystacksize *= 2; +      if (YYMAXDEPTH < yystacksize) +	yystacksize = YYMAXDEPTH; + +      { +	yytype_int16 *yyss1 = yyss; +	union yyalloc *yyptr = +	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); +	if (! yyptr) +	  goto yyexhaustedlab; +	YYSTACK_RELOCATE (yyss_alloc, yyss); +	YYSTACK_RELOCATE (yyvs_alloc, yyvs); +	YYSTACK_RELOCATE (yyls_alloc, yyls); +#  undef YYSTACK_RELOCATE +	if (yyss1 != yyssa) +	  YYSTACK_FREE (yyss1); +      } +# endif +#endif /* no yyoverflow */ + +      yyssp = yyss + yysize - 1; +      yyvsp = yyvs + yysize - 1; +      yylsp = yyls + yysize - 1; + +      YYDPRINTF ((stderr, "Stack size increased to %lu\n", +		  (unsigned long int) yystacksize)); + +      if (yyss + yystacksize - 1 <= yyssp) +	YYABORT; +    } + +  YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + +  if (yystate == YYFINAL) +    YYACCEPT; + +  goto yybackup; + +/*-----------. +| yybackup.  | +`-----------*/ +yybackup: + +  /* Do appropriate processing given the current state.  Read a +     lookahead token if we need one and don't already have one.  */ + +  /* First try to decide what to do without reference to lookahead token.  */ +  yyn = yypact[yystate]; +  if (yyn == YYPACT_NINF) +    goto yydefault; + +  /* Not known => get a lookahead token if don't already have one.  */ + +  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */ +  if (yychar == YYEMPTY) +    { +      YYDPRINTF ((stderr, "Reading a token: ")); +      yychar = YYLEX; +    } + +  if (yychar <= YYEOF) +    { +      yychar = yytoken = YYEOF; +      YYDPRINTF ((stderr, "Now at end of input.\n")); +    } +  else +    { +      yytoken = YYTRANSLATE (yychar); +      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); +    } + +  /* If the proper action on seeing token YYTOKEN is to reduce or to +     detect an error, take that action.  */ +  yyn += yytoken; +  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) +    goto yydefault; +  yyn = yytable[yyn]; +  if (yyn <= 0) +    { +      if (yyn == 0 || yyn == YYTABLE_NINF) +	goto yyerrlab; +      yyn = -yyn; +      goto yyreduce; +    } + +  /* Count tokens shifted since error; after three, turn off error +     status.  */ +  if (yyerrstatus) +    yyerrstatus--; + +  /* Shift the lookahead token.  */ +  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + +  /* Discard the shifted token.  */ +  yychar = YYEMPTY; + +  yystate = yyn; +  *++yyvsp = yylval; +  *++yylsp = yylloc; +  goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state.  | +`-----------------------------------------------------------*/ +yydefault: +  yyn = yydefact[yystate]; +  if (yyn == 0) +    goto yyerrlab; +  goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction.  | +`-----------------------------*/ +yyreduce: +  /* yyn is the number of a rule to reduce with.  */ +  yylen = yyr2[yyn]; + +  /* If YYLEN is nonzero, implement the default value of the action: +     `$$ = $1'. + +     Otherwise, the following line sets YYVAL to garbage. +     This behavior is undocumented and Bison +     users should not rely upon it.  Assigning to YYVAL +     unconditionally makes the parser a bit smaller, and it avoids a +     GCC warning that YYVAL may be used uninitialized.  */ +  yyval = yyvsp[1-yylen]; + +  /* Default location.  */ +  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); +  YY_REDUCE_PRINT (yyn); +  switch (yyn) +    { +        case 3: + +/* Line 1455 of yacc.c  */ +#line 244 "program_parse.y" +    { +	   if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid fragment program header"); + +	   } +	   state->mode = ARB_vertex; +	;} +    break; + +  case 4: + +/* Line 1455 of yacc.c  */ +#line 252 "program_parse.y" +    { +	   if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid vertex program header"); +	   } +	   state->mode = ARB_fragment; +	;} +    break; + +  case 7: + +/* Line 1455 of yacc.c  */ +#line 265 "program_parse.y" +    { +	   int valid = 0; + +	   if (state->mode == ARB_vertex) { +	      valid = _mesa_ARBvp_parse_option(state, (yyvsp[(2) - (3)].string)); +	   } else if (state->mode == ARB_fragment) { +	      valid = _mesa_ARBfp_parse_option(state, (yyvsp[(2) - (3)].string)); +	   } + + +	   if (!valid) { +	      yyerror(& (yylsp[(2) - (3)]), state, "invalid option string"); +	      YYERROR; +	   } +	;} +    break; + +  case 10: + +/* Line 1455 of yacc.c  */ +#line 287 "program_parse.y" +    { +	   if ((yyvsp[(1) - (2)].inst) != NULL) { +	      if (state->inst_tail == NULL) { +		 state->inst_head = (yyvsp[(1) - (2)].inst); +	      } else { +		 state->inst_tail->next = (yyvsp[(1) - (2)].inst); +	      } + +	      state->inst_tail = (yyvsp[(1) - (2)].inst); +	      (yyvsp[(1) - (2)].inst)->next = NULL; + +	      state->prog->NumInstructions++; +	   } +	;} +    break; + +  case 23: + +/* Line 1455 of yacc.c  */ +#line 322 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor(OPCODE_ARL, & (yyvsp[(2) - (4)].dst_reg), & (yyvsp[(4) - (4)].src_reg), NULL, NULL); +	;} +    break; + +  case 24: + +/* Line 1455 of yacc.c  */ +#line 328 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (4)].temp_inst).Opcode, & (yyvsp[(2) - (4)].dst_reg), & (yyvsp[(4) - (4)].src_reg), NULL, NULL); +	   (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (4)].temp_inst).SaturateMode; +	;} +    break; + +  case 25: + +/* Line 1455 of yacc.c  */ +#line 335 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (4)].temp_inst).Opcode, & (yyvsp[(2) - (4)].dst_reg), & (yyvsp[(4) - (4)].src_reg), NULL, NULL); +	   (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (4)].temp_inst).SaturateMode; +	;} +    break; + +  case 26: + +/* Line 1455 of yacc.c  */ +#line 342 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (6)].temp_inst).Opcode, & (yyvsp[(2) - (6)].dst_reg), & (yyvsp[(4) - (6)].src_reg), & (yyvsp[(6) - (6)].src_reg), NULL); +	   (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (6)].temp_inst).SaturateMode; +	;} +    break; + +  case 27: + +/* Line 1455 of yacc.c  */ +#line 350 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (6)].temp_inst).Opcode, & (yyvsp[(2) - (6)].dst_reg), & (yyvsp[(4) - (6)].src_reg), & (yyvsp[(6) - (6)].src_reg), NULL); +	   (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (6)].temp_inst).SaturateMode; +	;} +    break; + +  case 28: + +/* Line 1455 of yacc.c  */ +#line 358 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (8)].temp_inst).Opcode, & (yyvsp[(2) - (8)].dst_reg), & (yyvsp[(4) - (8)].src_reg), & (yyvsp[(6) - (8)].src_reg), & (yyvsp[(8) - (8)].src_reg)); +	   (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (8)].temp_inst).SaturateMode; +	;} +    break; + +  case 29: + +/* Line 1455 of yacc.c  */ +#line 365 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor((yyvsp[(1) - (8)].temp_inst).Opcode, & (yyvsp[(2) - (8)].dst_reg), & (yyvsp[(4) - (8)].src_reg), NULL, NULL); +	   if ((yyval.inst) != NULL) { +	      (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (8)].temp_inst).SaturateMode; +	      (yyval.inst)->Base.TexSrcUnit = (yyvsp[(6) - (8)].integer); +	      (yyval.inst)->Base.TexSrcTarget = (yyvsp[(8) - (8)].integer); +	   } +	;} +    break; + +  case 30: + +/* Line 1455 of yacc.c  */ +#line 376 "program_parse.y" +    { +	   (yyval.inst) = asm_instruction_ctor(OPCODE_KIL, NULL, & (yyvsp[(2) - (2)].src_reg), NULL, NULL); +	;} +    break; + +  case 31: + +/* Line 1455 of yacc.c  */ +#line 382 "program_parse.y" +    { +	   (yyval.integer) = (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 32: + +/* Line 1455 of yacc.c  */ +#line 387 "program_parse.y" +    { (yyval.integer) = TEXTURE_1D_INDEX; ;} +    break; + +  case 33: + +/* Line 1455 of yacc.c  */ +#line 388 "program_parse.y" +    { (yyval.integer) = TEXTURE_2D_INDEX; ;} +    break; + +  case 34: + +/* Line 1455 of yacc.c  */ +#line 389 "program_parse.y" +    { (yyval.integer) = TEXTURE_3D_INDEX; ;} +    break; + +  case 35: + +/* Line 1455 of yacc.c  */ +#line 390 "program_parse.y" +    { (yyval.integer) = TEXTURE_CUBE_INDEX; ;} +    break; + +  case 36: + +/* Line 1455 of yacc.c  */ +#line 391 "program_parse.y" +    { (yyval.integer) = TEXTURE_RECT_INDEX; ;} +    break; + +  case 37: + +/* Line 1455 of yacc.c  */ +#line 395 "program_parse.y" +    { +	   /* FIXME: Is this correct?  Should the extenedSwizzle be applied +	    * FIXME: to the existing swizzle? +	    */ +	   (yyvsp[(4) - (6)].src_reg).Base.Swizzle = (yyvsp[(6) - (6)].swiz_mask).swizzle; + +	   (yyval.inst) = asm_instruction_ctor(OPCODE_SWZ, & (yyvsp[(2) - (6)].dst_reg), & (yyvsp[(4) - (6)].src_reg), NULL, NULL); +	   (yyval.inst)->Base.SaturateMode = (yyvsp[(1) - (6)].temp_inst).SaturateMode; +	;} +    break; + +  case 38: + +/* Line 1455 of yacc.c  */ +#line 407 "program_parse.y" +    { +	   (yyval.src_reg) = (yyvsp[(2) - (3)].src_reg); + +	   if ((yyvsp[(1) - (3)].negate)) { +	      (yyval.src_reg).Base.Negate = ~(yyval.src_reg).Base.Negate; +	   } + +	   (yyval.src_reg).Base.Swizzle = _mesa_combine_swizzles((yyval.src_reg).Base.Swizzle, +						    (yyvsp[(3) - (3)].swiz_mask).swizzle); +	;} +    break; + +  case 39: + +/* Line 1455 of yacc.c  */ +#line 420 "program_parse.y" +    { +	   (yyval.src_reg) = (yyvsp[(2) - (3)].src_reg); + +	   if ((yyvsp[(1) - (3)].negate)) { +	      (yyval.src_reg).Base.Negate = ~(yyval.src_reg).Base.Negate; +	   } + +	   (yyval.src_reg).Base.Swizzle = _mesa_combine_swizzles((yyval.src_reg).Base.Swizzle, +						    (yyvsp[(3) - (3)].swiz_mask).swizzle); +	;} +    break; + +  case 40: + +/* Line 1455 of yacc.c  */ +#line 433 "program_parse.y" +    { +	   (yyval.dst_reg) = (yyvsp[(1) - (2)].dst_reg); +	   (yyval.dst_reg).WriteMask = (yyvsp[(2) - (2)].swiz_mask).mask; + +	   if ((yyval.dst_reg).File == PROGRAM_OUTPUT) { +	      /* Technically speaking, this should check that it is in +	       * vertex program mode.  However, PositionInvariant can never be +	       * set in fragment program mode, so it is somewhat irrelevant. +	       */ +	      if (state->option.PositionInvariant +	       && ((yyval.dst_reg).Index == VERT_RESULT_HPOS)) { +		 yyerror(& (yylsp[(1) - (2)]), state, "position-invariant programs cannot " +			 "write position"); +		 YYERROR; +	      } + +	      state->prog->OutputsWritten |= (1U << (yyval.dst_reg).Index); +	   } +	;} +    break; + +  case 41: + +/* Line 1455 of yacc.c  */ +#line 455 "program_parse.y" +    { +	   init_dst_reg(& (yyval.dst_reg)); +	   (yyval.dst_reg).File = PROGRAM_ADDRESS; +	   (yyval.dst_reg).Index = 0; +	   (yyval.dst_reg).WriteMask = (yyvsp[(2) - (2)].swiz_mask).mask; +	;} +    break; + +  case 42: + +/* Line 1455 of yacc.c  */ +#line 464 "program_parse.y" +    { +	   (yyval.swiz_mask).swizzle = MAKE_SWIZZLE4((yyvsp[(1) - (7)].swiz_mask).swizzle, (yyvsp[(3) - (7)].swiz_mask).swizzle, +				      (yyvsp[(5) - (7)].swiz_mask).swizzle, (yyvsp[(7) - (7)].swiz_mask).swizzle); +	   (yyval.swiz_mask).mask = ((yyvsp[(1) - (7)].swiz_mask).mask) | ((yyvsp[(3) - (7)].swiz_mask).mask << 1) | ((yyvsp[(5) - (7)].swiz_mask).mask << 2) +	      | ((yyvsp[(7) - (7)].swiz_mask).mask << 3); +	;} +    break; + +  case 43: + +/* Line 1455 of yacc.c  */ +#line 473 "program_parse.y" +    { +	   (yyval.swiz_mask).swizzle = (yyvsp[(2) - (2)].integer); +	   (yyval.swiz_mask).mask = ((yyvsp[(1) - (2)].negate)) ? 1 : 0; +	;} +    break; + +  case 44: + +/* Line 1455 of yacc.c  */ +#line 480 "program_parse.y" +    { +	   if (((yyvsp[(1) - (1)].integer) != 0) && ((yyvsp[(1) - (1)].integer) != 1)) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid extended swizzle selector"); +	      YYERROR; +	   } + +	   (yyval.integer) = ((yyvsp[(1) - (1)].integer) == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE; +	;} +    break; + +  case 45: + +/* Line 1455 of yacc.c  */ +#line 489 "program_parse.y" +    { +	   if (strlen((yyvsp[(1) - (1)].string)) > 1) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid extended swizzle selector"); +	      YYERROR; +	   } + +	   switch ((yyvsp[(1) - (1)].string)[0]) { +	   case 'x': +	      (yyval.integer) = SWIZZLE_X; +	      break; +	   case 'y': +	      (yyval.integer) = SWIZZLE_Y; +	      break; +	   case 'z': +	      (yyval.integer) = SWIZZLE_Z; +	      break; +	   case 'w': +	      (yyval.integer) = SWIZZLE_W; +	      break; +	   default: +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid extended swizzle selector"); +	      YYERROR; +	      break; +	   } +	;} +    break; + +  case 46: + +/* Line 1455 of yacc.c  */ +#line 517 "program_parse.y" +    { +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string)); + +	   if (s == NULL) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type != at_param) && (s->type != at_temp) +		      && (s->type != at_attrib)) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type == at_param) && s->param_is_array) { +	      yyerror(& (yylsp[(1) - (1)]), state, "non-array access to array PARAM"); +	      YYERROR; +	   } + +	   init_src_reg(& (yyval.src_reg)); +	   switch (s->type) { +	   case at_temp: +	      (yyval.src_reg).Base.File = PROGRAM_TEMPORARY; +	      (yyval.src_reg).Base.Index = s->temp_binding; +	      break; +	   case at_param: +	      (yyval.src_reg).Base.File = s->param_binding_type; +	      (yyval.src_reg).Base.Index = s->param_binding_begin; +	      break; +	   case at_attrib: +	     (yyval.src_reg).Base.File = PROGRAM_INPUT; +	     (yyval.src_reg).Base.Index = s->attrib_binding; +	     state->prog->InputsRead |= (1U << (yyval.src_reg).Base.Index); + +	     if (!validate_inputs(& (yylsp[(1) - (1)]), state)) { +		YYERROR; +	     } +	     break; + +	   default: +	      YYERROR; +	      break; +	   } +	;} +    break; + +  case 47: + +/* Line 1455 of yacc.c  */ +#line 559 "program_parse.y" +    { +	   init_src_reg(& (yyval.src_reg)); +	   (yyval.src_reg).Base.File = PROGRAM_INPUT; +	   (yyval.src_reg).Base.Index = (yyvsp[(1) - (1)].attrib); +	   state->prog->InputsRead |= (1U << (yyval.src_reg).Base.Index); + +	   if (!validate_inputs(& (yylsp[(1) - (1)]), state)) { +	      YYERROR; +	   } +	;} +    break; + +  case 48: + +/* Line 1455 of yacc.c  */ +#line 570 "program_parse.y" +    { +	   if (! (yyvsp[(3) - (4)].src_reg).Base.RelAddr +	       && ((yyvsp[(3) - (4)].src_reg).Base.Index >= (yyvsp[(1) - (4)].sym)->param_binding_length)) { +	      yyerror(& (yylsp[(3) - (4)]), state, "out of bounds array access"); +	      YYERROR; +	   } + +	   init_src_reg(& (yyval.src_reg)); +	   (yyval.src_reg).Base.File = (yyvsp[(1) - (4)].sym)->param_binding_type; + +	   if ((yyvsp[(3) - (4)].src_reg).Base.RelAddr) { +	      (yyvsp[(1) - (4)].sym)->param_accessed_indirectly = 1; + +	      (yyval.src_reg).Base.RelAddr = 1; +	      (yyval.src_reg).Base.Index = (yyvsp[(3) - (4)].src_reg).Base.Index; +	      (yyval.src_reg).Symbol = (yyvsp[(1) - (4)].sym); +	   } else { +	      (yyval.src_reg).Base.Index = (yyvsp[(1) - (4)].sym)->param_binding_begin + (yyvsp[(3) - (4)].src_reg).Base.Index; +	   } +	;} +    break; + +  case 49: + +/* Line 1455 of yacc.c  */ +#line 591 "program_parse.y" +    { +	   init_src_reg(& (yyval.src_reg)); +	   (yyval.src_reg).Base.File = (yyvsp[(1) - (1)].temp_sym).param_binding_type; +	   (yyval.src_reg).Base.Index = (yyvsp[(1) - (1)].temp_sym).param_binding_begin; +	;} +    break; + +  case 50: + +/* Line 1455 of yacc.c  */ +#line 599 "program_parse.y" +    { +	   init_dst_reg(& (yyval.dst_reg)); +	   (yyval.dst_reg).File = PROGRAM_OUTPUT; +	   (yyval.dst_reg).Index = (yyvsp[(1) - (1)].result); +	;} +    break; + +  case 51: + +/* Line 1455 of yacc.c  */ +#line 605 "program_parse.y" +    { +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string)); + +	   if (s == NULL) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type != at_output) && (s->type != at_temp)) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid operand variable"); +	      YYERROR; +	   } + +	   init_dst_reg(& (yyval.dst_reg)); +	   if (s->type == at_temp) { +	      (yyval.dst_reg).File = PROGRAM_TEMPORARY; +	      (yyval.dst_reg).Index = s->temp_binding; +	   } else { +	      (yyval.dst_reg).File = s->param_binding_type; +	      (yyval.dst_reg).Index = s->param_binding_begin; +	   } +	;} +    break; + +  case 52: + +/* Line 1455 of yacc.c  */ +#line 629 "program_parse.y" +    { +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string)); + +	   if (s == NULL) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type != at_param) || !s->param_is_array) { +	      yyerror(& (yylsp[(1) - (1)]), state, "array access to non-PARAM variable"); +	      YYERROR; +	   } else { +	      (yyval.sym) = s; +	   } +	;} +    break; + +  case 55: + +/* Line 1455 of yacc.c  */ +#line 648 "program_parse.y" +    { +	   init_src_reg(& (yyval.src_reg)); +	   (yyval.src_reg).Base.Index = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 56: + +/* Line 1455 of yacc.c  */ +#line 655 "program_parse.y" +    { +	   /* FINISHME: Add support for multiple address registers. +	    */ +	   /* FINISHME: Add support for 4-component address registers. +	    */ +	   init_src_reg(& (yyval.src_reg)); +	   (yyval.src_reg).Base.RelAddr = 1; +	   (yyval.src_reg).Base.Index = (yyvsp[(3) - (3)].integer); +	;} +    break; + +  case 57: + +/* Line 1455 of yacc.c  */ +#line 666 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 58: + +/* Line 1455 of yacc.c  */ +#line 667 "program_parse.y" +    { (yyval.integer) = (yyvsp[(2) - (2)].integer); ;} +    break; + +  case 59: + +/* Line 1455 of yacc.c  */ +#line 668 "program_parse.y" +    { (yyval.integer) = -(yyvsp[(2) - (2)].integer); ;} +    break; + +  case 60: + +/* Line 1455 of yacc.c  */ +#line 672 "program_parse.y" +    { +	   if (((yyvsp[(1) - (1)].integer) < 0) || ((yyvsp[(1) - (1)].integer) > 63)) { +	      yyerror(& (yylsp[(1) - (1)]), state, +		      "relative address offset too large (positive)"); +	      YYERROR; +	   } else { +	      (yyval.integer) = (yyvsp[(1) - (1)].integer); +	   } +	;} +    break; + +  case 61: + +/* Line 1455 of yacc.c  */ +#line 684 "program_parse.y" +    { +	   if (((yyvsp[(1) - (1)].integer) < 0) || ((yyvsp[(1) - (1)].integer) > 64)) { +	      yyerror(& (yylsp[(1) - (1)]), state, +		      "relative address offset too large (negative)"); +	      YYERROR; +	   } else { +	      (yyval.integer) = (yyvsp[(1) - (1)].integer); +	   } +	;} +    break; + +  case 62: + +/* Line 1455 of yacc.c  */ +#line 696 "program_parse.y" +    { +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(1) - (1)].string)); + +	   if (s == NULL) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid array member"); +	      YYERROR; +	   } else if (s->type != at_address) { +	      yyerror(& (yylsp[(1) - (1)]), state, +		      "invalid variable for indexed array access"); +	      YYERROR; +	   } else { +	      (yyval.sym) = s; +	   } +	;} +    break; + +  case 63: + +/* Line 1455 of yacc.c  */ +#line 714 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].swiz_mask).mask != WRITEMASK_X) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid address component selector"); +	      YYERROR; +	   } else { +	      (yyval.swiz_mask) = (yyvsp[(1) - (1)].swiz_mask); +	   } +	;} +    break; + +  case 64: + +/* Line 1455 of yacc.c  */ +#line 725 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].swiz_mask).mask != WRITEMASK_X) { +	      yyerror(& (yylsp[(1) - (1)]), state, +		      "address register write mask must be \".x\""); +	      YYERROR; +	   } else { +	      (yyval.swiz_mask) = (yyvsp[(1) - (1)].swiz_mask); +	   } +	;} +    break; + +  case 69: + +/* Line 1455 of yacc.c  */ +#line 741 "program_parse.y" +    { (yyval.swiz_mask).swizzle = SWIZZLE_NOOP; (yyval.swiz_mask).mask = WRITEMASK_XYZW; ;} +    break; + +  case 74: + +/* Line 1455 of yacc.c  */ +#line 745 "program_parse.y" +    { (yyval.swiz_mask).swizzle = SWIZZLE_NOOP; (yyval.swiz_mask).mask = WRITEMASK_XYZW; ;} +    break; + +  case 81: + +/* Line 1455 of yacc.c  */ +#line 757 "program_parse.y" +    { +	   struct asm_symbol *const s = +	      declare_variable(state, (yyvsp[(2) - (4)].string), at_attrib, & (yylsp[(2) - (4)])); + +	   if (s == NULL) { +	      YYERROR; +	   } else { +	      s->attrib_binding = (yyvsp[(4) - (4)].attrib); +	      state->InputsBound |= (1U << s->attrib_binding); + +	      if (!validate_inputs(& (yylsp[(4) - (4)]), state)) { +		 YYERROR; +	      } +	   } +	;} +    break; + +  case 82: + +/* Line 1455 of yacc.c  */ +#line 775 "program_parse.y" +    { +	   (yyval.attrib) = (yyvsp[(2) - (2)].attrib); +	;} +    break; + +  case 83: + +/* Line 1455 of yacc.c  */ +#line 779 "program_parse.y" +    { +	   (yyval.attrib) = (yyvsp[(2) - (2)].attrib); +	;} +    break; + +  case 84: + +/* Line 1455 of yacc.c  */ +#line 785 "program_parse.y" +    { +	   (yyval.attrib) = VERT_ATTRIB_POS; +	;} +    break; + +  case 85: + +/* Line 1455 of yacc.c  */ +#line 789 "program_parse.y" +    { +	   (yyval.attrib) = VERT_ATTRIB_WEIGHT; +	;} +    break; + +  case 86: + +/* Line 1455 of yacc.c  */ +#line 793 "program_parse.y" +    { +	   (yyval.attrib) = VERT_ATTRIB_NORMAL; +	;} +    break; + +  case 87: + +/* Line 1455 of yacc.c  */ +#line 797 "program_parse.y" +    { +	   (yyval.attrib) = VERT_ATTRIB_COLOR0 + (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 88: + +/* Line 1455 of yacc.c  */ +#line 801 "program_parse.y" +    { +	   (yyval.attrib) = VERT_ATTRIB_FOG; +	;} +    break; + +  case 89: + +/* Line 1455 of yacc.c  */ +#line 805 "program_parse.y" +    { +	   (yyval.attrib) = VERT_ATTRIB_TEX0 + (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 90: + +/* Line 1455 of yacc.c  */ +#line 809 "program_parse.y" +    { +	   YYERROR; +	;} +    break; + +  case 91: + +/* Line 1455 of yacc.c  */ +#line 813 "program_parse.y" +    { +	   (yyval.attrib) = VERT_ATTRIB_GENERIC0 + (yyvsp[(3) - (4)].integer); +	;} +    break; + +  case 92: + +/* Line 1455 of yacc.c  */ +#line 819 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->limits->MaxAttribs) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid vertex attribute reference"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 96: + +/* Line 1455 of yacc.c  */ +#line 833 "program_parse.y" +    { +	   (yyval.attrib) = FRAG_ATTRIB_WPOS; +	;} +    break; + +  case 97: + +/* Line 1455 of yacc.c  */ +#line 837 "program_parse.y" +    { +	   (yyval.attrib) = FRAG_ATTRIB_COL0 + (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 98: + +/* Line 1455 of yacc.c  */ +#line 841 "program_parse.y" +    { +	   (yyval.attrib) = FRAG_ATTRIB_FOGC; +	;} +    break; + +  case 99: + +/* Line 1455 of yacc.c  */ +#line 845 "program_parse.y" +    { +	   (yyval.attrib) = FRAG_ATTRIB_TEX0 + (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 102: + +/* Line 1455 of yacc.c  */ +#line 853 "program_parse.y" +    { +	   struct asm_symbol *const s = +	      declare_variable(state, (yyvsp[(2) - (3)].string), at_param, & (yylsp[(2) - (3)])); + +	   if (s == NULL) { +	      YYERROR; +	   } else { +	      s->param_binding_type = (yyvsp[(3) - (3)].temp_sym).param_binding_type; +	      s->param_binding_begin = (yyvsp[(3) - (3)].temp_sym).param_binding_begin; +	      s->param_binding_length = (yyvsp[(3) - (3)].temp_sym).param_binding_length; +	      s->param_is_array = 0; +	   } +	;} +    break; + +  case 103: + +/* Line 1455 of yacc.c  */ +#line 869 "program_parse.y" +    { +	   if (((yyvsp[(4) - (6)].integer) != 0) && ((yyvsp[(4) - (6)].integer) != (yyvsp[(6) - (6)].temp_sym).param_binding_length)) { +	      yyerror(& (yylsp[(4) - (6)]), state,  +		      "parameter array size and number of bindings must match"); +	      YYERROR; +	   } else { +	      struct asm_symbol *const s = +		 declare_variable(state, (yyvsp[(2) - (6)].string), (yyvsp[(6) - (6)].temp_sym).type, & (yylsp[(2) - (6)])); + +	      if (s == NULL) { +		 YYERROR; +	      } else { +		 s->param_binding_type = (yyvsp[(6) - (6)].temp_sym).param_binding_type; +		 s->param_binding_begin = (yyvsp[(6) - (6)].temp_sym).param_binding_begin; +		 s->param_binding_length = (yyvsp[(6) - (6)].temp_sym).param_binding_length; +		 s->param_is_array = 1; +	      } +	   } +	;} +    break; + +  case 104: + +/* Line 1455 of yacc.c  */ +#line 891 "program_parse.y" +    { +	   (yyval.integer) = 0; +	;} +    break; + +  case 105: + +/* Line 1455 of yacc.c  */ +#line 895 "program_parse.y" +    { +	   if (((yyvsp[(1) - (1)].integer) < 1) || ((yyvsp[(1) - (1)].integer) >= state->limits->MaxParameters)) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid parameter array size"); +	      YYERROR; +	   } else { +	      (yyval.integer) = (yyvsp[(1) - (1)].integer); +	   } +	;} +    break; + +  case 106: + +/* Line 1455 of yacc.c  */ +#line 906 "program_parse.y" +    { +	   (yyval.temp_sym) = (yyvsp[(2) - (2)].temp_sym); +	;} +    break; + +  case 107: + +/* Line 1455 of yacc.c  */ +#line 912 "program_parse.y" +    { +	   (yyval.temp_sym) = (yyvsp[(3) - (4)].temp_sym); +	;} +    break; + +  case 109: + +/* Line 1455 of yacc.c  */ +#line 919 "program_parse.y" +    { +	   (yyvsp[(1) - (3)].temp_sym).param_binding_length += (yyvsp[(3) - (3)].temp_sym).param_binding_length; +	   (yyval.temp_sym) = (yyvsp[(1) - (3)].temp_sym); +	;} +    break; + +  case 110: + +/* Line 1455 of yacc.c  */ +#line 926 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_state(state->prog, & (yyval.temp_sym), (yyvsp[(1) - (1)].state)); +	;} +    break; + +  case 111: + +/* Line 1455 of yacc.c  */ +#line 932 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_param(state->prog, & (yyval.temp_sym), (yyvsp[(1) - (1)].state)); +	;} +    break; + +  case 112: + +/* Line 1455 of yacc.c  */ +#line 938 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_const(state->prog, & (yyval.temp_sym), & (yyvsp[(1) - (1)].vector)); +	;} +    break; + +  case 113: + +/* Line 1455 of yacc.c  */ +#line 946 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_state(state->prog, & (yyval.temp_sym), (yyvsp[(1) - (1)].state)); +	;} +    break; + +  case 114: + +/* Line 1455 of yacc.c  */ +#line 952 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_param(state->prog, & (yyval.temp_sym), (yyvsp[(1) - (1)].state)); +	;} +    break; + +  case 115: + +/* Line 1455 of yacc.c  */ +#line 958 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_const(state->prog, & (yyval.temp_sym), & (yyvsp[(1) - (1)].vector)); +	;} +    break; + +  case 116: + +/* Line 1455 of yacc.c  */ +#line 966 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_state(state->prog, & (yyval.temp_sym), (yyvsp[(1) - (1)].state)); +	;} +    break; + +  case 117: + +/* Line 1455 of yacc.c  */ +#line 972 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_param(state->prog, & (yyval.temp_sym), (yyvsp[(1) - (1)].state)); +	;} +    break; + +  case 118: + +/* Line 1455 of yacc.c  */ +#line 978 "program_parse.y" +    { +	   memset(& (yyval.temp_sym), 0, sizeof((yyval.temp_sym))); +	   (yyval.temp_sym).param_binding_begin = ~0; +	   initialize_symbol_from_const(state->prog, & (yyval.temp_sym), & (yyvsp[(1) - (1)].vector)); +	;} +    break; + +  case 119: + +/* Line 1455 of yacc.c  */ +#line 985 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(1) - (1)].state), sizeof((yyval.state))); ;} +    break; + +  case 120: + +/* Line 1455 of yacc.c  */ +#line 986 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 121: + +/* Line 1455 of yacc.c  */ +#line 989 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 122: + +/* Line 1455 of yacc.c  */ +#line 990 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 123: + +/* Line 1455 of yacc.c  */ +#line 991 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 124: + +/* Line 1455 of yacc.c  */ +#line 992 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 125: + +/* Line 1455 of yacc.c  */ +#line 993 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 126: + +/* Line 1455 of yacc.c  */ +#line 994 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 127: + +/* Line 1455 of yacc.c  */ +#line 995 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 128: + +/* Line 1455 of yacc.c  */ +#line 996 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 129: + +/* Line 1455 of yacc.c  */ +#line 997 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 130: + +/* Line 1455 of yacc.c  */ +#line 998 "program_parse.y" +    { memcpy((yyval.state), (yyvsp[(2) - (2)].state), sizeof((yyval.state))); ;} +    break; + +  case 131: + +/* Line 1455 of yacc.c  */ +#line 1002 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = STATE_MATERIAL; +	   (yyval.state)[1] = (yyvsp[(2) - (3)].integer); +	   (yyval.state)[2] = (yyvsp[(3) - (3)].integer); +	;} +    break; + +  case 132: + +/* Line 1455 of yacc.c  */ +#line 1011 "program_parse.y" +    { +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 133: + +/* Line 1455 of yacc.c  */ +#line 1015 "program_parse.y" +    { +	   (yyval.integer) = STATE_EMISSION; +	;} +    break; + +  case 134: + +/* Line 1455 of yacc.c  */ +#line 1019 "program_parse.y" +    { +	   (yyval.integer) = STATE_SHININESS; +	;} +    break; + +  case 135: + +/* Line 1455 of yacc.c  */ +#line 1025 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = STATE_LIGHT; +	   (yyval.state)[1] = (yyvsp[(3) - (5)].integer); +	   (yyval.state)[2] = (yyvsp[(5) - (5)].integer); +	;} +    break; + +  case 136: + +/* Line 1455 of yacc.c  */ +#line 1034 "program_parse.y" +    { +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 137: + +/* Line 1455 of yacc.c  */ +#line 1038 "program_parse.y" +    { +	   (yyval.integer) = STATE_POSITION; +	;} +    break; + +  case 138: + +/* Line 1455 of yacc.c  */ +#line 1042 "program_parse.y" +    { +	   (yyval.integer) = STATE_ATTENUATION; +	;} +    break; + +  case 139: + +/* Line 1455 of yacc.c  */ +#line 1046 "program_parse.y" +    { +	   (yyval.integer) = (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 140: + +/* Line 1455 of yacc.c  */ +#line 1050 "program_parse.y" +    { +	   (yyval.integer) = STATE_HALF_VECTOR; +	;} +    break; + +  case 141: + +/* Line 1455 of yacc.c  */ +#line 1056 "program_parse.y" +    { +	   (yyval.integer) = STATE_SPOT_DIRECTION; +	;} +    break; + +  case 142: + +/* Line 1455 of yacc.c  */ +#line 1062 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(2) - (2)].state)[0]; +	   (yyval.state)[1] = (yyvsp[(2) - (2)].state)[1]; +	;} +    break; + +  case 143: + +/* Line 1455 of yacc.c  */ +#line 1069 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = STATE_LIGHTMODEL_AMBIENT; +	;} +    break; + +  case 144: + +/* Line 1455 of yacc.c  */ +#line 1074 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = STATE_LIGHTMODEL_SCENECOLOR; +	   (yyval.state)[1] = (yyvsp[(1) - (2)].integer); +	;} +    break; + +  case 145: + +/* Line 1455 of yacc.c  */ +#line 1082 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = STATE_LIGHTPROD; +	   (yyval.state)[1] = (yyvsp[(3) - (6)].integer); +	   (yyval.state)[2] = (yyvsp[(5) - (6)].integer); +	   (yyval.state)[3] = (yyvsp[(6) - (6)].integer); +	;} +    break; + +  case 147: + +/* Line 1455 of yacc.c  */ +#line 1094 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = (yyvsp[(3) - (3)].integer); +	   (yyval.state)[1] = (yyvsp[(2) - (3)].integer); +	;} +    break; + +  case 148: + +/* Line 1455 of yacc.c  */ +#line 1102 "program_parse.y" +    { +	   (yyval.integer) = STATE_TEXENV_COLOR; +	;} +    break; + +  case 149: + +/* Line 1455 of yacc.c  */ +#line 1108 "program_parse.y" +    { +	   (yyval.integer) = STATE_AMBIENT; +	;} +    break; + +  case 150: + +/* Line 1455 of yacc.c  */ +#line 1112 "program_parse.y" +    { +	   (yyval.integer) = STATE_DIFFUSE; +	;} +    break; + +  case 151: + +/* Line 1455 of yacc.c  */ +#line 1116 "program_parse.y" +    { +	   (yyval.integer) = STATE_SPECULAR; +	;} +    break; + +  case 152: + +/* Line 1455 of yacc.c  */ +#line 1122 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->MaxLights) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid light selector"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 153: + +/* Line 1455 of yacc.c  */ +#line 1133 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = STATE_TEXGEN; +	   (yyval.state)[1] = (yyvsp[(2) - (4)].integer); +	   (yyval.state)[2] = (yyvsp[(3) - (4)].integer) + (yyvsp[(4) - (4)].integer); +	;} +    break; + +  case 154: + +/* Line 1455 of yacc.c  */ +#line 1142 "program_parse.y" +    { +	   (yyval.integer) = STATE_TEXGEN_EYE_S; +	;} +    break; + +  case 155: + +/* Line 1455 of yacc.c  */ +#line 1146 "program_parse.y" +    { +	   (yyval.integer) = STATE_TEXGEN_OBJECT_S; +	;} +    break; + +  case 156: + +/* Line 1455 of yacc.c  */ +#line 1151 "program_parse.y" +    { +	   (yyval.integer) = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S; +	;} +    break; + +  case 157: + +/* Line 1455 of yacc.c  */ +#line 1155 "program_parse.y" +    { +	   (yyval.integer) = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S; +	;} +    break; + +  case 158: + +/* Line 1455 of yacc.c  */ +#line 1159 "program_parse.y" +    { +	   (yyval.integer) = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S; +	;} +    break; + +  case 159: + +/* Line 1455 of yacc.c  */ +#line 1163 "program_parse.y" +    { +	   (yyval.integer) = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S; +	;} +    break; + +  case 160: + +/* Line 1455 of yacc.c  */ +#line 1169 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 161: + +/* Line 1455 of yacc.c  */ +#line 1176 "program_parse.y" +    { +	   (yyval.integer) = STATE_FOG_COLOR; +	;} +    break; + +  case 162: + +/* Line 1455 of yacc.c  */ +#line 1180 "program_parse.y" +    { +	   (yyval.integer) = STATE_FOG_PARAMS; +	;} +    break; + +  case 163: + +/* Line 1455 of yacc.c  */ +#line 1186 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = STATE_CLIPPLANE; +	   (yyval.state)[1] = (yyvsp[(3) - (5)].integer); +	;} +    break; + +  case 164: + +/* Line 1455 of yacc.c  */ +#line 1194 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->MaxClipPlanes) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid clip plane selector"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 165: + +/* Line 1455 of yacc.c  */ +#line 1205 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 166: + +/* Line 1455 of yacc.c  */ +#line 1212 "program_parse.y" +    { +	   (yyval.integer) = STATE_POINT_SIZE; +	;} +    break; + +  case 167: + +/* Line 1455 of yacc.c  */ +#line 1216 "program_parse.y" +    { +	   (yyval.integer) = STATE_POINT_ATTENUATION; +	;} +    break; + +  case 168: + +/* Line 1455 of yacc.c  */ +#line 1222 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(1) - (5)].state)[0]; +	   (yyval.state)[1] = (yyvsp[(1) - (5)].state)[1]; +	   (yyval.state)[2] = (yyvsp[(4) - (5)].integer); +	   (yyval.state)[3] = (yyvsp[(4) - (5)].integer); +	   (yyval.state)[4] = (yyvsp[(1) - (5)].state)[2]; +	;} +    break; + +  case 169: + +/* Line 1455 of yacc.c  */ +#line 1232 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(1) - (2)].state)[0]; +	   (yyval.state)[1] = (yyvsp[(1) - (2)].state)[1]; +	   (yyval.state)[2] = (yyvsp[(2) - (2)].state)[2]; +	   (yyval.state)[3] = (yyvsp[(2) - (2)].state)[3]; +	   (yyval.state)[4] = (yyvsp[(1) - (2)].state)[2]; +	;} +    break; + +  case 170: + +/* Line 1455 of yacc.c  */ +#line 1242 "program_parse.y" +    { +	   (yyval.state)[2] = 0; +	   (yyval.state)[3] = 3; +	;} +    break; + +  case 171: + +/* Line 1455 of yacc.c  */ +#line 1247 "program_parse.y" +    { +	   /* It seems logical that the matrix row range specifier would have +	    * to specify a range or more than one row (i.e., $5 > $3). +	    * However, the ARB_vertex_program spec says "a program will fail +	    * to load if <a> is greater than <b>."  This means that $3 == $5 +	    * is valid. +	    */ +	   if ((yyvsp[(3) - (6)].integer) > (yyvsp[(5) - (6)].integer)) { +	      yyerror(& (yylsp[(3) - (6)]), state, "invalid matrix row range"); +	      YYERROR; +	   } + +	   (yyval.state)[2] = (yyvsp[(3) - (6)].integer); +	   (yyval.state)[3] = (yyvsp[(5) - (6)].integer); +	;} +    break; + +  case 172: + +/* Line 1455 of yacc.c  */ +#line 1265 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(2) - (3)].state)[0]; +	   (yyval.state)[1] = (yyvsp[(2) - (3)].state)[1]; +	   (yyval.state)[2] = (yyvsp[(3) - (3)].integer); +	;} +    break; + +  case 173: + +/* Line 1455 of yacc.c  */ +#line 1273 "program_parse.y" +    { +	   (yyval.integer) = 0; +	;} +    break; + +  case 174: + +/* Line 1455 of yacc.c  */ +#line 1277 "program_parse.y" +    { +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 175: + +/* Line 1455 of yacc.c  */ +#line 1283 "program_parse.y" +    { +	   (yyval.integer) = STATE_MATRIX_INVERSE; +	;} +    break; + +  case 176: + +/* Line 1455 of yacc.c  */ +#line 1287 "program_parse.y" +    { +	   (yyval.integer) = STATE_MATRIX_TRANSPOSE; +	;} +    break; + +  case 177: + +/* Line 1455 of yacc.c  */ +#line 1291 "program_parse.y" +    { +	   (yyval.integer) = STATE_MATRIX_INVTRANS; +	;} +    break; + +  case 178: + +/* Line 1455 of yacc.c  */ +#line 1297 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) > 3) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid matrix row reference"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 179: + +/* Line 1455 of yacc.c  */ +#line 1308 "program_parse.y" +    { +	   (yyval.state)[0] = STATE_MODELVIEW_MATRIX; +	   (yyval.state)[1] = (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 180: + +/* Line 1455 of yacc.c  */ +#line 1313 "program_parse.y" +    { +	   (yyval.state)[0] = STATE_PROJECTION_MATRIX; +	   (yyval.state)[1] = 0; +	;} +    break; + +  case 181: + +/* Line 1455 of yacc.c  */ +#line 1318 "program_parse.y" +    { +	   (yyval.state)[0] = STATE_MVP_MATRIX; +	   (yyval.state)[1] = 0; +	;} +    break; + +  case 182: + +/* Line 1455 of yacc.c  */ +#line 1323 "program_parse.y" +    { +	   (yyval.state)[0] = STATE_TEXTURE_MATRIX; +	   (yyval.state)[1] = (yyvsp[(2) - (2)].integer); +	;} +    break; + +  case 183: + +/* Line 1455 of yacc.c  */ +#line 1328 "program_parse.y" +    { +	   YYERROR; +	;} +    break; + +  case 184: + +/* Line 1455 of yacc.c  */ +#line 1332 "program_parse.y" +    { +	   (yyval.state)[0] = STATE_PROGRAM_MATRIX; +	   (yyval.state)[1] = (yyvsp[(3) - (4)].integer); +	;} +    break; + +  case 185: + +/* Line 1455 of yacc.c  */ +#line 1339 "program_parse.y" +    { +	   (yyval.integer) = 0; +	;} +    break; + +  case 186: + +/* Line 1455 of yacc.c  */ +#line 1343 "program_parse.y" +    { +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 187: + +/* Line 1455 of yacc.c  */ +#line 1348 "program_parse.y" +    { +	   /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix +	    * zero is valid. +	    */ +	   if ((yyvsp[(1) - (1)].integer) != 0) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid modelview matrix index"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 188: + +/* Line 1455 of yacc.c  */ +#line 1361 "program_parse.y" +    { +	   /* Since GL_ARB_matrix_palette isn't supported, just let any value +	    * through here.  The error will be generated later. +	    */ +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 189: + +/* Line 1455 of yacc.c  */ +#line 1369 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->MaxProgramMatrices) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid program matrix selector"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 194: + +/* Line 1455 of yacc.c  */ +#line 1386 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = state->state_param_enum; +	   (yyval.state)[1] = STATE_ENV; +	   (yyval.state)[2] = (yyvsp[(4) - (5)].state)[0]; +	   (yyval.state)[3] = (yyvsp[(4) - (5)].state)[1]; +	;} +    break; + +  case 195: + +/* Line 1455 of yacc.c  */ +#line 1396 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(1) - (1)].integer); +	   (yyval.state)[1] = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 196: + +/* Line 1455 of yacc.c  */ +#line 1401 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(1) - (3)].integer); +	   (yyval.state)[1] = (yyvsp[(3) - (3)].integer); +	;} +    break; + +  case 197: + +/* Line 1455 of yacc.c  */ +#line 1408 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = state->state_param_enum; +	   (yyval.state)[1] = STATE_ENV; +	   (yyval.state)[2] = (yyvsp[(4) - (5)].integer); +	   (yyval.state)[3] = (yyvsp[(4) - (5)].integer); +	;} +    break; + +  case 198: + +/* Line 1455 of yacc.c  */ +#line 1418 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = state->state_param_enum; +	   (yyval.state)[1] = STATE_LOCAL; +	   (yyval.state)[2] = (yyvsp[(4) - (5)].state)[0]; +	   (yyval.state)[3] = (yyvsp[(4) - (5)].state)[1]; +	;} +    break; + +  case 199: + +/* Line 1455 of yacc.c  */ +#line 1427 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(1) - (1)].integer); +	   (yyval.state)[1] = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 200: + +/* Line 1455 of yacc.c  */ +#line 1432 "program_parse.y" +    { +	   (yyval.state)[0] = (yyvsp[(1) - (3)].integer); +	   (yyval.state)[1] = (yyvsp[(3) - (3)].integer); +	;} +    break; + +  case 201: + +/* Line 1455 of yacc.c  */ +#line 1439 "program_parse.y" +    { +	   memset((yyval.state), 0, sizeof((yyval.state))); +	   (yyval.state)[0] = state->state_param_enum; +	   (yyval.state)[1] = STATE_LOCAL; +	   (yyval.state)[2] = (yyvsp[(4) - (5)].integer); +	   (yyval.state)[3] = (yyvsp[(4) - (5)].integer); +	;} +    break; + +  case 202: + +/* Line 1455 of yacc.c  */ +#line 1449 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->limits->MaxEnvParams) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid environment parameter reference"); +	      YYERROR; +	   } +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 203: + +/* Line 1455 of yacc.c  */ +#line 1459 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->limits->MaxLocalParams) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid local parameter reference"); +	      YYERROR; +	   } +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 208: + +/* Line 1455 of yacc.c  */ +#line 1474 "program_parse.y" +    { +	   (yyval.vector).count = 1; +	   (yyval.vector).data[0] = (yyvsp[(1) - (1)].real); +	;} +    break; + +  case 209: + +/* Line 1455 of yacc.c  */ +#line 1481 "program_parse.y" +    { +	   (yyval.vector).count = 1; +	   (yyval.vector).data[0] = (yyvsp[(1) - (1)].real); +	;} +    break; + +  case 210: + +/* Line 1455 of yacc.c  */ +#line 1486 "program_parse.y" +    { +	   (yyval.vector).count = 1; +	   (yyval.vector).data[0] = (float) (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 211: + +/* Line 1455 of yacc.c  */ +#line 1493 "program_parse.y" +    { +	   (yyval.vector).count = 1; +	   (yyval.vector).data[0] = (yyvsp[(2) - (3)].real); +	;} +    break; + +  case 212: + +/* Line 1455 of yacc.c  */ +#line 1498 "program_parse.y" +    { +	   (yyval.vector).count = 2; +	   (yyval.vector).data[0] = (yyvsp[(2) - (5)].real); +	   (yyval.vector).data[1] = (yyvsp[(4) - (5)].real); +	;} +    break; + +  case 213: + +/* Line 1455 of yacc.c  */ +#line 1505 "program_parse.y" +    { +	   (yyval.vector).count = 3; +	   (yyval.vector).data[0] = (yyvsp[(2) - (7)].real); +	   (yyval.vector).data[1] = (yyvsp[(4) - (7)].real); +	   (yyval.vector).data[1] = (yyvsp[(6) - (7)].real); +	;} +    break; + +  case 214: + +/* Line 1455 of yacc.c  */ +#line 1513 "program_parse.y" +    { +	   (yyval.vector).count = 4; +	   (yyval.vector).data[0] = (yyvsp[(2) - (9)].real); +	   (yyval.vector).data[1] = (yyvsp[(4) - (9)].real); +	   (yyval.vector).data[1] = (yyvsp[(6) - (9)].real); +	   (yyval.vector).data[1] = (yyvsp[(8) - (9)].real); +	;} +    break; + +  case 215: + +/* Line 1455 of yacc.c  */ +#line 1523 "program_parse.y" +    { +	   (yyval.real) = ((yyvsp[(1) - (2)].negate)) ? -(yyvsp[(2) - (2)].real) : (yyvsp[(2) - (2)].real); +	;} +    break; + +  case 216: + +/* Line 1455 of yacc.c  */ +#line 1527 "program_parse.y" +    { +	   (yyval.real) = (float)(((yyvsp[(1) - (2)].negate)) ? -(yyvsp[(2) - (2)].integer) : (yyvsp[(2) - (2)].integer)); +	;} +    break; + +  case 217: + +/* Line 1455 of yacc.c  */ +#line 1532 "program_parse.y" +    { (yyval.negate) = FALSE; ;} +    break; + +  case 218: + +/* Line 1455 of yacc.c  */ +#line 1533 "program_parse.y" +    { (yyval.negate) = TRUE;  ;} +    break; + +  case 219: + +/* Line 1455 of yacc.c  */ +#line 1534 "program_parse.y" +    { (yyval.negate) = FALSE; ;} +    break; + +  case 220: + +/* Line 1455 of yacc.c  */ +#line 1537 "program_parse.y" +    { (yyval.integer) = (yyvsp[(1) - (1)].integer); ;} +    break; + +  case 222: + +/* Line 1455 of yacc.c  */ +#line 1540 "program_parse.y" +    { (yyval.integer) = (yyvsp[(1) - (1)].integer); ;} +    break; + +  case 224: + +/* Line 1455 of yacc.c  */ +#line 1544 "program_parse.y" +    { +	   if (!declare_variable(state, (yyvsp[(3) - (3)].string), (yyvsp[(0) - (3)].integer), & (yylsp[(3) - (3)]))) { +	      YYERROR; +	   } +	;} +    break; + +  case 225: + +/* Line 1455 of yacc.c  */ +#line 1550 "program_parse.y" +    { +	   if (!declare_variable(state, (yyvsp[(1) - (1)].string), (yyvsp[(0) - (1)].integer), & (yylsp[(1) - (1)]))) { +	      YYERROR; +	   } +	;} +    break; + +  case 226: + +/* Line 1455 of yacc.c  */ +#line 1558 "program_parse.y" +    { +	   struct asm_symbol *const s = +	      declare_variable(state, (yyvsp[(2) - (4)].string), at_output, & (yylsp[(2) - (4)])); + +	   if (s == NULL) { +	      YYERROR; +	   } else { +	      s->output_binding = (yyvsp[(4) - (4)].result); +	   } +	;} +    break; + +  case 227: + +/* Line 1455 of yacc.c  */ +#line 1571 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.result) = VERT_RESULT_HPOS; +	   } else { +	      yyerror(& (yylsp[(2) - (2)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 228: + +/* Line 1455 of yacc.c  */ +#line 1580 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.result) = VERT_RESULT_FOGC; +	   } else { +	      yyerror(& (yylsp[(2) - (2)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 229: + +/* Line 1455 of yacc.c  */ +#line 1589 "program_parse.y" +    { +	   (yyval.result) = (yyvsp[(2) - (2)].result); +	;} +    break; + +  case 230: + +/* Line 1455 of yacc.c  */ +#line 1593 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.result) = VERT_RESULT_PSIZ; +	   } else { +	      yyerror(& (yylsp[(2) - (2)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 231: + +/* Line 1455 of yacc.c  */ +#line 1602 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.result) = VERT_RESULT_TEX0 + (yyvsp[(3) - (3)].integer); +	   } else { +	      yyerror(& (yylsp[(2) - (3)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 232: + +/* Line 1455 of yacc.c  */ +#line 1611 "program_parse.y" +    { +	   if (state->mode == ARB_fragment) { +	      (yyval.result) = FRAG_RESULT_DEPTH; +	   } else { +	      yyerror(& (yylsp[(2) - (2)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 233: + +/* Line 1455 of yacc.c  */ +#line 1622 "program_parse.y" +    { +	   (yyval.result) = (yyvsp[(2) - (3)].integer) + (yyvsp[(3) - (3)].integer); +	;} +    break; + +  case 234: + +/* Line 1455 of yacc.c  */ +#line 1628 "program_parse.y" +    { +	   (yyval.integer) = (state->mode == ARB_vertex) +	      ? VERT_RESULT_COL0 +	      : FRAG_RESULT_COLOR; +	;} +    break; + +  case 235: + +/* Line 1455 of yacc.c  */ +#line 1634 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.integer) = VERT_RESULT_COL0; +	   } else { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 236: + +/* Line 1455 of yacc.c  */ +#line 1643 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.integer) = VERT_RESULT_BFC0; +	   } else { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 237: + +/* Line 1455 of yacc.c  */ +#line 1654 "program_parse.y" +    { +	   (yyval.integer) = 0;  +	;} +    break; + +  case 238: + +/* Line 1455 of yacc.c  */ +#line 1658 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.integer) = 0; +	   } else { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 239: + +/* Line 1455 of yacc.c  */ +#line 1667 "program_parse.y" +    { +	   if (state->mode == ARB_vertex) { +	      (yyval.integer) = 1; +	   } else { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid program result name"); +	      YYERROR; +	   } +	;} +    break; + +  case 240: + +/* Line 1455 of yacc.c  */ +#line 1677 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 241: + +/* Line 1455 of yacc.c  */ +#line 1678 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 242: + +/* Line 1455 of yacc.c  */ +#line 1679 "program_parse.y" +    { (yyval.integer) = 1; ;} +    break; + +  case 243: + +/* Line 1455 of yacc.c  */ +#line 1682 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 244: + +/* Line 1455 of yacc.c  */ +#line 1683 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 245: + +/* Line 1455 of yacc.c  */ +#line 1684 "program_parse.y" +    { (yyval.integer) = 1; ;} +    break; + +  case 246: + +/* Line 1455 of yacc.c  */ +#line 1687 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 247: + +/* Line 1455 of yacc.c  */ +#line 1688 "program_parse.y" +    { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;} +    break; + +  case 248: + +/* Line 1455 of yacc.c  */ +#line 1691 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 249: + +/* Line 1455 of yacc.c  */ +#line 1692 "program_parse.y" +    { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;} +    break; + +  case 250: + +/* Line 1455 of yacc.c  */ +#line 1695 "program_parse.y" +    { (yyval.integer) = 0; ;} +    break; + +  case 251: + +/* Line 1455 of yacc.c  */ +#line 1696 "program_parse.y" +    { (yyval.integer) = (yyvsp[(2) - (3)].integer); ;} +    break; + +  case 252: + +/* Line 1455 of yacc.c  */ +#line 1700 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->MaxTextureCoordUnits) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid texture coordinate unit selector"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 253: + +/* Line 1455 of yacc.c  */ +#line 1711 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->MaxTextureImageUnits) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid texture image unit selector"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 254: + +/* Line 1455 of yacc.c  */ +#line 1722 "program_parse.y" +    { +	   if ((yyvsp[(1) - (1)].integer) >= state->MaxTextureUnits) { +	      yyerror(& (yylsp[(1) - (1)]), state, "invalid texture unit selector"); +	      YYERROR; +	   } + +	   (yyval.integer) = (yyvsp[(1) - (1)].integer); +	;} +    break; + +  case 255: + +/* Line 1455 of yacc.c  */ +#line 1733 "program_parse.y" +    { +	   struct asm_symbol *exist = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(2) - (4)].string)); +	   struct asm_symbol *target = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, (yyvsp[(4) - (4)].string)); + + +	   if (exist != NULL) { +	      yyerror(& (yylsp[(2) - (4)]), state, "redeclared identifier"); +	      YYERROR; +	   } else if (target == NULL) { +	      yyerror(& (yylsp[(4) - (4)]), state, +		      "undefined variable binding in ALIAS statement"); +	      YYERROR; +	   } else { +	      _mesa_symbol_table_add_symbol(state->st, 0, (yyvsp[(2) - (4)].string), target); +	   } +	;} +    break; + + + +/* Line 1455 of yacc.c  */ +#line 4318 "program_parse.tab.c" +      default: break; +    } +  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + +  YYPOPSTACK (yylen); +  yylen = 0; +  YY_STACK_PRINT (yyss, yyssp); + +  *++yyvsp = yyval; +  *++yylsp = yyloc; + +  /* Now `shift' the result of the reduction.  Determine what state +     that goes to, based on the state we popped back to and the rule +     number reduced by.  */ + +  yyn = yyr1[yyn]; + +  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; +  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) +    yystate = yytable[yystate]; +  else +    yystate = yydefgoto[yyn - YYNTOKENS]; + +  goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: +  /* If not already recovering from an error, report this error.  */ +  if (!yyerrstatus) +    { +      ++yynerrs; +#if ! YYERROR_VERBOSE +      yyerror (&yylloc, state, YY_("syntax error")); +#else +      { +	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); +	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) +	  { +	    YYSIZE_T yyalloc = 2 * yysize; +	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) +	      yyalloc = YYSTACK_ALLOC_MAXIMUM; +	    if (yymsg != yymsgbuf) +	      YYSTACK_FREE (yymsg); +	    yymsg = (char *) YYSTACK_ALLOC (yyalloc); +	    if (yymsg) +	      yymsg_alloc = yyalloc; +	    else +	      { +		yymsg = yymsgbuf; +		yymsg_alloc = sizeof yymsgbuf; +	      } +	  } + +	if (0 < yysize && yysize <= yymsg_alloc) +	  { +	    (void) yysyntax_error (yymsg, yystate, yychar); +	    yyerror (&yylloc, state, yymsg); +	  } +	else +	  { +	    yyerror (&yylloc, state, YY_("syntax error")); +	    if (yysize != 0) +	      goto yyexhaustedlab; +	  } +      } +#endif +    } + +  yyerror_range[0] = yylloc; + +  if (yyerrstatus == 3) +    { +      /* If just tried and failed to reuse lookahead token after an +	 error, discard it.  */ + +      if (yychar <= YYEOF) +	{ +	  /* Return failure if at end of input.  */ +	  if (yychar == YYEOF) +	    YYABORT; +	} +      else +	{ +	  yydestruct ("Error: discarding", +		      yytoken, &yylval, &yylloc, state); +	  yychar = YYEMPTY; +	} +    } + +  /* Else will try to reuse lookahead token after shifting the error +     token.  */ +  goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR.  | +`---------------------------------------------------*/ +yyerrorlab: + +  /* Pacify compilers like GCC when the user code never invokes +     YYERROR and the label yyerrorlab therefore never appears in user +     code.  */ +  if (/*CONSTCOND*/ 0) +     goto yyerrorlab; + +  yyerror_range[0] = yylsp[1-yylen]; +  /* Do not reclaim the symbols of the rule which action triggered +     this YYERROR.  */ +  YYPOPSTACK (yylen); +  yylen = 0; +  YY_STACK_PRINT (yyss, yyssp); +  yystate = *yyssp; +  goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR.  | +`-------------------------------------------------------------*/ +yyerrlab1: +  yyerrstatus = 3;	/* Each real token shifted decrements this.  */ + +  for (;;) +    { +      yyn = yypact[yystate]; +      if (yyn != YYPACT_NINF) +	{ +	  yyn += YYTERROR; +	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) +	    { +	      yyn = yytable[yyn]; +	      if (0 < yyn) +		break; +	    } +	} + +      /* Pop the current state because it cannot handle the error token.  */ +      if (yyssp == yyss) +	YYABORT; + +      yyerror_range[0] = *yylsp; +      yydestruct ("Error: popping", +		  yystos[yystate], yyvsp, yylsp, state); +      YYPOPSTACK (1); +      yystate = *yyssp; +      YY_STACK_PRINT (yyss, yyssp); +    } + +  *++yyvsp = yylval; + +  yyerror_range[1] = yylloc; +  /* Using YYLLOC is tempting, but would change the location of +     the lookahead.  YYLOC is available though.  */ +  YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2); +  *++yylsp = yyloc; + +  /* Shift the error token.  */ +  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + +  yystate = yyn; +  goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here.  | +`-------------------------------------*/ +yyacceptlab: +  yyresult = 0; +  goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here.  | +`-----------------------------------*/ +yyabortlab: +  yyresult = 1; +  goto yyreturn; + +#if !defined(yyoverflow) || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here.  | +`-------------------------------------------------*/ +yyexhaustedlab: +  yyerror (&yylloc, state, YY_("memory exhausted")); +  yyresult = 2; +  /* Fall through.  */ +#endif + +yyreturn: +  if (yychar != YYEMPTY) +     yydestruct ("Cleanup: discarding lookahead", +		 yytoken, &yylval, &yylloc, state); +  /* Do not reclaim the symbols of the rule which action triggered +     this YYABORT or YYACCEPT.  */ +  YYPOPSTACK (yylen); +  YY_STACK_PRINT (yyss, yyssp); +  while (yyssp != yyss) +    { +      yydestruct ("Cleanup: popping", +		  yystos[*yyssp], yyvsp, yylsp, state); +      YYPOPSTACK (1); +    } +#ifndef yyoverflow +  if (yyss != yyssa) +    YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE +  if (yymsg != yymsgbuf) +    YYSTACK_FREE (yymsg); +#endif +  /* Make sure YYID is used.  */ +  return YYID (yyresult); +} + + + +/* Line 1675 of yacc.c  */ +#line 1753 "program_parse.y" + + +struct asm_instruction * +asm_instruction_ctor(gl_inst_opcode op, +		     const struct prog_dst_register *dst, +		     const struct asm_src_register *src0, +		     const struct asm_src_register *src1, +		     const struct asm_src_register *src2) +{ +   struct asm_instruction *inst = calloc(1, sizeof(struct asm_instruction)); + +   if (inst) { +      _mesa_init_instructions(inst, 1); +      inst->Base.Opcode = op; +      inst->Base.DstReg = *dst; + +      inst->Base.SrcReg[0] = src0->Base; +      inst->SrcReg[0] = *src0; + +      if (src1 != NULL) { +	 inst->Base.SrcReg[1] = src1->Base; +	 inst->SrcReg[1] = *src1; +      } + +      if (src2 != NULL) { +	 inst->Base.SrcReg[2] = src2->Base; +	 inst->SrcReg[2] = *src2; +      } +   } + +   return inst; +} + + +void +init_dst_reg(struct prog_dst_register *r) +{ +   memset(r, 0, sizeof(*r)); +   r->File = PROGRAM_UNDEFINED; +   r->WriteMask = WRITEMASK_XYZW; +   r->CondMask = COND_TR; +   r->CondSwizzle = SWIZZLE_NOOP; +} + + +void +init_src_reg(struct asm_src_register *r) +{ +   memset(r, 0, sizeof(*r)); +   r->Base.File = PROGRAM_UNDEFINED; +   r->Base.Swizzle = SWIZZLE_NOOP; +   r->Symbol = NULL; +} + + +/** + * Validate the set of inputs used by a program + * + * Validates that legal sets of inputs are used by the program.  In this case + * "used" included both reading the input or binding the input to a name using + * the \c ATTRIB command. + * + * \return + * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise. + */ +int +validate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state) +{ +   const int inputs = state->prog->InputsRead | state->InputsBound; + +   if (((inputs & 0x0ffff) & (inputs >> 16)) != 0) { +      yyerror(locp, state, "illegal use of generic attribute and name attribute"); +      return 0; +   } + +   return 1; +} + + +struct asm_symbol * +declare_variable(struct asm_parser_state *state, char *name, enum asm_type t, +		 struct YYLTYPE *locp) +{ +   struct asm_symbol *s = NULL; +   struct asm_symbol *exist = (struct asm_symbol *) +      _mesa_symbol_table_find_symbol(state->st, 0, name); + + +   if (exist != NULL) { +      yyerror(locp, state, "redeclared identifier"); +   } else { +      s = calloc(1, sizeof(struct asm_symbol)); +      s->name = name; +      s->type = t; + +      switch (t) { +      case at_temp: +	 if (state->prog->NumTemporaries >= state->limits->MaxTemps) { +	    yyerror(locp, state, "too many temporaries declared"); +	    free(s); +	    return NULL; +	 } + +	 s->temp_binding = state->prog->NumTemporaries; +	 state->prog->NumTemporaries++; +	 break; + +      case at_address: +	 if (state->prog->NumAddressRegs >= state->limits->MaxAddressRegs) { +	    yyerror(locp, state, "too many address registers declared"); +	    free(s); +	    return NULL; +	 } + +	 /* FINISHME: Add support for multiple address registers. +	  */ +	 state->prog->NumAddressRegs++; +	 break; + +      default: +	 break; +      } + +      _mesa_symbol_table_add_symbol(state->st, 0, s->name, s); +   } + +   return s; +} + + +int add_state_reference(struct gl_program_parameter_list *param_list, +			const gl_state_index tokens[STATE_LENGTH]) +{ +   const GLuint size = 4; /* XXX fix */ +   char *name; +   GLint index; + +   name = _mesa_program_state_string(tokens); +   index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name, +                               size, GL_NONE, +                               NULL, (gl_state_index *) tokens, 0x0); +   param_list->StateFlags |= _mesa_program_state_flags(tokens); + +   /* free name string here since we duplicated it in add_parameter() */ +   _mesa_free(name); + +   return index; +} + + +int +initialize_symbol_from_state(struct gl_program *prog, +			     struct asm_symbol *param_var,  +			     const gl_state_index tokens[STATE_LENGTH]) +{ +   int idx = -1; +   gl_state_index state_tokens[STATE_LENGTH]; + + +   memcpy(state_tokens, tokens, sizeof(state_tokens)); + +   param_var->type = at_param; + +   /* If we are adding a STATE_MATRIX that has multiple rows, we need to +    * unroll it and call add_state_reference() for each row +    */ +   if ((state_tokens[0] == STATE_MODELVIEW_MATRIX || +	state_tokens[0] == STATE_PROJECTION_MATRIX || +	state_tokens[0] == STATE_MVP_MATRIX || +	state_tokens[0] == STATE_TEXTURE_MATRIX || +	state_tokens[0] == STATE_PROGRAM_MATRIX) +       && (state_tokens[2] != state_tokens[3])) { +      int row; +      const int first_row = state_tokens[2]; +      const int last_row = state_tokens[3]; + +      for (row = first_row; row <= last_row; row++) { +	 state_tokens[2] = state_tokens[3] = row; + +	 idx = add_state_reference(prog->Parameters, state_tokens); +	 if (param_var->param_binding_begin == ~0U) +	    param_var->param_binding_begin = idx; +	 param_var->param_binding_length++; +      } +   } +   else { +      idx = add_state_reference(prog->Parameters, state_tokens); +      if (param_var->param_binding_begin == ~0U) +	 param_var->param_binding_begin = idx; +      param_var->param_binding_length++; +   } + +   return idx; +} + + +int +initialize_symbol_from_param(struct gl_program *prog, +			     struct asm_symbol *param_var,  +			     const gl_state_index tokens[STATE_LENGTH]) +{ +   int idx = -1; +   gl_state_index state_tokens[STATE_LENGTH]; + + +   memcpy(state_tokens, tokens, sizeof(state_tokens)); + +   assert((state_tokens[0] == STATE_VERTEX_PROGRAM) +	  || (state_tokens[0] == STATE_FRAGMENT_PROGRAM)); +   assert((state_tokens[1] == STATE_ENV) +	  || (state_tokens[1] == STATE_LOCAL)); + +   param_var->type = at_param; + +   /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements, +    * we need to unroll it and call add_state_reference() for each row +    */ +   if (state_tokens[2] != state_tokens[3]) { +      int row; +      const int first_row = state_tokens[2]; +      const int last_row = state_tokens[3]; + +      for (row = first_row; row <= last_row; row++) { +	 state_tokens[2] = state_tokens[3] = row; + +	 idx = add_state_reference(prog->Parameters, state_tokens); +	 if (param_var->param_binding_begin == ~0U) +	    param_var->param_binding_begin = idx; +	 param_var->param_binding_length++; +      } +   } +   else { +      idx = add_state_reference(prog->Parameters, state_tokens); +      if (param_var->param_binding_begin == ~0U) +	 param_var->param_binding_begin = idx; +      param_var->param_binding_length++; +   } + +   return idx; +} + + +int +initialize_symbol_from_const(struct gl_program *prog, +			     struct asm_symbol *param_var,  +			     const struct asm_vector *vec) +{ +   const int idx = _mesa_add_parameter(prog->Parameters, PROGRAM_CONSTANT, +				       NULL, vec->count, GL_NONE, vec->data, +				       NULL, 0x0); + +   param_var->type = at_param; + +   if (param_var->param_binding_begin == ~0U) +      param_var->param_binding_begin = idx; +   param_var->param_binding_length++; + +   return idx; +} + + +void +yyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s) +{ +   (void) state; + +   fprintf(stderr, "line %u, char %u: error: %s\n", locp->first_line, +	   locp->first_column, s); +} + +GLboolean +_mesa_parse_arb_program(GLcontext *ctx, GLenum target, const GLubyte *str, +			GLsizei len, struct asm_parser_state *state) +{ +   struct gl_program_constants limits; +   struct asm_instruction *inst; +   unsigned i; +   GLubyte *strz; + +   state->prog->Target = target; +   state->prog->Parameters = _mesa_new_parameter_list(); + +   /* Make a copy of the program string and force it to be NUL-terminated. +    */ +   strz = (GLubyte *) _mesa_malloc(len + 1); +   if (strz == NULL) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); +      return GL_FALSE; +   } +   _mesa_memcpy (strz, str, len); +   strz[len] = '\0'; + +   state->prog->String = strz; + +   state->st = _mesa_symbol_table_ctor(); + +   /* All of these limits should come from ctx. +    */ +   limits.MaxInstructions = 128; +   limits.MaxAluInstructions = 128; +   limits.MaxTexInstructions = 128; +   limits.MaxTexIndirections = 128;  +   limits.MaxAttribs = 16; +   limits.MaxTemps = 128; +   limits.MaxAddressRegs = 1; +   limits.MaxParameters = 128; +   limits.MaxLocalParams = 256; +   limits.MaxEnvParams = 128; +   limits.MaxNativeInstructions = 128; +   limits.MaxNativeAluInstructions = 128; +   limits.MaxNativeTexInstructions = 128; +   limits.MaxNativeTexIndirections = 128; +   limits.MaxNativeAttribs = 16; +   limits.MaxNativeTemps = 128; +   limits.MaxNativeAddressRegs = 1; +   limits.MaxNativeParameters = 128; +   limits.MaxUniformComponents = 0; + +   state->limits = & limits; + +   state->MaxTextureImageUnits = 16; +   state->MaxTextureCoordUnits = 8; +   state->MaxTextureUnits = 8; +   state->MaxClipPlanes = 6; +   state->MaxLights = 8; +   state->MaxProgramMatrices = 8; + +   state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB) +      ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM; + +   _mesa_set_program_error(ctx, -1, NULL); + +   _mesa_program_lexer_ctor(& state->scanner, state, (const char *) str, len); +   yyparse(state); +   _mesa_program_lexer_dtor(state->scanner); + + +   if (! _mesa_layout_parameters(state)) { +      fprintf(stderr, "error: layout\n"); +      return GL_FALSE; +   } + + +    +   /* Add one instruction to store the "END" instruction. +    */ +   state->prog->Instructions = +      _mesa_alloc_instructions(state->prog->NumInstructions + 1); +   inst = state->inst_head; +   for (i = 0; i < state->prog->NumInstructions; i++) { +      struct asm_instruction *const temp = inst->next; + +      state->prog->Instructions[i] = inst->Base; +      _mesa_free(inst); + +      inst = temp; +   } + +   /* Finally, tag on an OPCODE_END instruction */ +   { +      const GLuint numInst = state->prog->NumInstructions; +      _mesa_init_instructions(state->prog->Instructions + numInst, 1); +      state->prog->Instructions[numInst].Opcode = OPCODE_END; +   } +   state->prog->NumInstructions++; + +   /* +    * Initialize native counts to logical counts.  The device driver may +    * change them if program is translated into a hardware program. +    */ +   state->prog->NumNativeInstructions = state->prog->NumInstructions; +   state->prog->NumNativeTemporaries = state->prog->NumTemporaries; +   state->prog->NumNativeParameters = state->prog->NumParameters; +   state->prog->NumNativeAttributes = state->prog->NumAttributes; +   state->prog->NumNativeAddressRegs = state->prog->NumAddressRegs; + +   return GL_TRUE; +} + diff --git a/src/mesa/shader/program_parse.tab.h b/src/mesa/shader/program_parse.tab.h new file mode 100644 index 0000000000..007b06fcc1 --- /dev/null +++ b/src/mesa/shader/program_parse.tab.h @@ -0,0 +1,193 @@ + +/* A Bison parser, made by GNU Bison 2.4.1.  */ + +/* Skeleton interface for Bison's Yacc-like parsers in C +    +      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 +   Free Software Foundation, Inc. +    +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. +    +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU General Public License for more details. +    +   You should have received a copy of the GNU General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ + +/* As a special exception, you may create a larger work that contains +   part or all of the Bison parser skeleton and distribute that work +   under terms of your choice, so long as that work isn't itself a +   parser generator using the skeleton or a modified version thereof +   as a parser skeleton.  Alternatively, if you modify or redistribute +   the parser skeleton itself, you may (at your option) remove this +   special exception, which will cause the skeleton and the resulting +   Bison output files to be licensed under the GNU General Public +   License without this special exception. +    +   This special exception was added by the Free Software Foundation in +   version 2.2 of Bison.  */ + + +/* Tokens.  */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE +   /* Put the tokens into the symbol table, so that GDB and other debuggers +      know about them.  */ +   enum yytokentype { +     ARBvp_10 = 258, +     ARBfp_10 = 259, +     ADDRESS = 260, +     ALIAS = 261, +     ATTRIB = 262, +     OPTION = 263, +     OUTPUT = 264, +     PARAM = 265, +     TEMP = 266, +     END = 267, +     BIN_OP = 268, +     BINSC_OP = 269, +     SAMPLE_OP = 270, +     SCALAR_OP = 271, +     TRI_OP = 272, +     VECTOR_OP = 273, +     ARL = 274, +     KIL = 275, +     SWZ = 276, +     INTEGER = 277, +     REAL = 278, +     AMBIENT = 279, +     ATTENUATION = 280, +     BACK = 281, +     CLIP = 282, +     COLOR = 283, +     DEPTH = 284, +     DIFFUSE = 285, +     DIRECTION = 286, +     EMISSION = 287, +     ENV = 288, +     EYE = 289, +     FOG = 290, +     FOGCOORD = 291, +     FRAGMENT = 292, +     FRONT = 293, +     HALF = 294, +     INVERSE = 295, +     INVTRANS = 296, +     LIGHT = 297, +     LIGHTMODEL = 298, +     LIGHTPROD = 299, +     LOCAL = 300, +     MATERIAL = 301, +     MAT_PROGRAM = 302, +     MATRIX = 303, +     MATRIXINDEX = 304, +     MODELVIEW = 305, +     MVP = 306, +     NORMAL = 307, +     OBJECT = 308, +     PALETTE = 309, +     PARAMS = 310, +     PLANE = 311, +     POINT = 312, +     POINTSIZE = 313, +     POSITION = 314, +     PRIMARY = 315, +     PROGRAM = 316, +     PROJECTION = 317, +     RANGE = 318, +     RESULT = 319, +     ROW = 320, +     SCENECOLOR = 321, +     SECONDARY = 322, +     SHININESS = 323, +     SIZE = 324, +     SPECULAR = 325, +     SPOT = 326, +     STATE = 327, +     TEXCOORD = 328, +     TEXENV = 329, +     TEXGEN = 330, +     TEXGEN_Q = 331, +     TEXGEN_R = 332, +     TEXGEN_S = 333, +     TEXGEN_T = 334, +     TEXTURE = 335, +     TRANSPOSE = 336, +     TEXTURE_UNIT = 337, +     TEX_1D = 338, +     TEX_2D = 339, +     TEX_3D = 340, +     TEX_CUBE = 341, +     TEX_RECT = 342, +     VERTEX = 343, +     VTXATTRIB = 344, +     WEIGHT = 345, +     IDENTIFIER = 346, +     MASK4 = 347, +     MASK3 = 348, +     MASK2 = 349, +     MASK1 = 350, +     SWIZZLE = 351, +     DOT_DOT = 352, +     DOT = 353 +   }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +typedef union YYSTYPE +{ + +/* Line 1676 of yacc.c  */ +#line 100 "program_parse.y" + +   struct asm_instruction *inst; +   struct asm_symbol *sym; +   struct asm_symbol temp_sym; +   struct asm_swizzle_mask swiz_mask; +   struct asm_src_register src_reg; +   struct prog_dst_register dst_reg; +   struct prog_instruction temp_inst; +   char *string; +   unsigned result; +   unsigned attrib; +   int integer; +   float real; +   unsigned state[5]; +   int negate; +   struct asm_vector vector; +   gl_inst_opcode opcode; + + + +/* Line 1676 of yacc.c  */ +#line 171 "program_parse.tab.h" +} YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + + + +#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED +typedef struct YYLTYPE +{ +  int first_line; +  int first_column; +  int last_line; +  int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + + + diff --git a/src/mesa/shader/program_parse.y b/src/mesa/shader/program_parse.y new file mode 100644 index 0000000000..39e3ee1f1e --- /dev/null +++ b/src/mesa/shader/program_parse.y @@ -0,0 +1,2130 @@ +%{ +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "main/mtypes.h" +#include "prog_parameter.h" +#include "prog_parameter_layout.h" +#include "prog_statevars.h" +#include "prog_instruction.h" + +#include "symbol_table.h" +#include "program_parser.h" + +extern void *yy_scan_string(char *); +extern void yy_delete_buffer(void *); + +static struct asm_symbol *declare_variable(struct asm_parser_state *state, +    char *name, enum asm_type t, struct YYLTYPE *locp); + +static int initialize_symbol_from_state(struct gl_program *prog, +    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]); + +static int initialize_symbol_from_param(struct gl_program *prog, +    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]); + +static int initialize_symbol_from_const(struct gl_program *prog, +    struct asm_symbol *param_var, const struct asm_vector *vec); + +static int yyparse(struct asm_parser_state *state); + +static void yyerror(struct YYLTYPE *locp, struct asm_parser_state *state, +    const char *s); + +static int validate_inputs(struct YYLTYPE *locp, +    struct asm_parser_state *state); + +static void init_dst_reg(struct prog_dst_register *r); + +static void init_src_reg(struct asm_src_register *r); + +static struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op, +    const struct prog_dst_register *dst, const struct asm_src_register *src0, +    const struct asm_src_register *src1, const struct asm_src_register *src2); + +#ifndef FALSE +#define FALSE 0 +#define TRUE (!FALSE) +#endif + +#define YYLLOC_DEFAULT(Current, Rhs, N)					\ +   do {									\ +      if (YYID(N)) {							\ +	 (Current).first_line = YYRHSLOC(Rhs, 1).first_line;		\ +	 (Current).first_column = YYRHSLOC(Rhs, 1).first_column;	\ +	 (Current).position = YYRHSLOC(Rhs, 1).position;		\ +	 (Current).last_line = YYRHSLOC(Rhs, N).last_line;		\ +	 (Current).last_column = YYRHSLOC(Rhs, N).last_column;		\ +      } else {								\ +	 (Current).first_line = YYRHSLOC(Rhs, 0).last_line;		\ +	 (Current).last_line = (Current).first_line;			\ +	 (Current).first_column = YYRHSLOC(Rhs, 0).last_column;		\ +	 (Current).last_column = (Current).first_column;		\ +	 (Current).position = YYRHSLOC(Rhs, 0).position			\ +	    + (Current).first_column;					\ +      }									\ +   } while(YYID(0)) + +#define YYLEX_PARAM state->scanner +%} + +%pure-parser +%locations +%parse-param { struct asm_parser_state *state } +%error-verbose +%lex-param { void *scanner } + +%union { +   struct asm_instruction *inst; +   struct asm_symbol *sym; +   struct asm_symbol temp_sym; +   struct asm_swizzle_mask swiz_mask; +   struct asm_src_register src_reg; +   struct prog_dst_register dst_reg; +   struct prog_instruction temp_inst; +   char *string; +   unsigned result; +   unsigned attrib; +   int integer; +   float real; +   unsigned state[5]; +   int negate; +   struct asm_vector vector; +   gl_inst_opcode opcode; +} + +%token ARBvp_10 ARBfp_10 + +/* Tokens for assembler pseudo-ops */ +%token <integer> ADDRESS +%token ALIAS ATTRIB +%token OPTION OUTPUT +%token PARAM +%token <integer> TEMP +%token END + + /* Tokens for instructions */ +%token <temp_inst> BIN_OP BINSC_OP SAMPLE_OP SCALAR_OP TRI_OP VECTOR_OP +%token <temp_inst> ARL KIL SWZ + +%token <integer> INTEGER +%token <real> REAL + +%token AMBIENT ATTENUATION +%token BACK +%token CLIP COLOR +%token DEPTH DIFFUSE DIRECTION +%token EMISSION ENV EYE +%token FOG FOGCOORD FRAGMENT FRONT +%token HALF +%token INVERSE INVTRANS +%token LIGHT LIGHTMODEL LIGHTPROD LOCAL +%token MATERIAL MAT_PROGRAM MATRIX MATRIXINDEX MODELVIEW MVP +%token NORMAL +%token OBJECT +%token PALETTE PARAMS PLANE POINT POINTSIZE POSITION PRIMARY PROGRAM PROJECTION +%token RANGE RESULT ROW +%token SCENECOLOR SECONDARY SHININESS SIZE SPECULAR SPOT STATE +%token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE +%token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT +%token VERTEX VTXATTRIB +%token WEIGHT + +%token <string> IDENTIFIER +%token <swiz_mask> MASK4 MASK3 MASK2 MASK1 SWIZZLE +%token DOT_DOT +%token DOT + +%type <inst> instruction ALU_instruction TexInstruction +%type <inst> ARL_instruction VECTORop_instruction +%type <inst> SCALARop_instruction BINSCop_instruction BINop_instruction +%type <inst> TRIop_instruction SWZ_instruction SAMPLE_instruction +%type <inst> KIL_instruction + +%type <dst_reg> dstReg maskedDstReg maskedAddrReg +%type <src_reg> srcReg scalarSrcReg swizzleSrcReg +%type <swiz_mask> scalarSuffix swizzleSuffix extendedSwizzle extSwizComp +%type <swiz_mask> optionalMask +%type <integer> extSwizSel + +%type <sym> progParamArray +%type <integer> addrRegRelOffset addrRegPosOffset addrRegNegOffset +%type <src_reg> progParamArrayMem progParamArrayAbs progParamArrayRel +%type <sym> addrReg +%type <swiz_mask> addrComponent addrWriteMask + +%type <result> resultBinding resultColBinding +%type <integer> optFaceType optColorType +%type <integer> optResultFaceType optResultColorType + +%type <integer> optTexImageUnitNum texImageUnitNum +%type <integer> optTexCoordUnitNum texCoordUnitNum +%type <integer> optLegacyTexUnitNum legacyTexUnitNum +%type <integer> texImageUnit texTarget +%type <integer> vtxAttribNum + +%type <attrib> attribBinding vtxAttribItem fragAttribItem + +%type <temp_sym> paramSingleInit paramSingleItemDecl +%type <integer> optArraySize + +%type <state> stateSingleItem stateMultipleItem +%type <state> stateMaterialItem +%type <state> stateLightItem stateLightModelItem stateLightProdItem +%type <state> stateTexGenItem stateFogItem stateClipPlaneItem statePointItem +%type <state> stateMatrixItem stateMatrixRow stateMatrixRows +%type <state> stateTexEnvItem + +%type <state> stateLModProperty +%type <state> stateMatrixName optMatrixRows + +%type <integer> stateMatProperty +%type <integer> stateLightProperty stateSpotProperty +%type <integer> stateLightNumber stateLProdProperty +%type <integer> stateTexGenType stateTexGenCoord +%type <integer> stateTexEnvProperty +%type <integer> stateFogProperty +%type <integer> stateClipPlaneNum +%type <integer> statePointProperty + +%type <integer> stateOptMatModifier stateMatModifier stateMatrixRowNum +%type <integer> stateOptModMatNum stateModMatNum statePaletteMatNum  +%type <integer> stateProgramMatNum + +%type <integer> ambDiffSpecProperty + +%type <state> programSingleItem progEnvParam progLocalParam +%type <state> programMultipleItem progEnvParams progLocalParams + +%type <temp_sym> paramMultipleInit paramMultInitList paramMultipleItem +%type <temp_sym> paramSingleItemUse + +%type <integer> progEnvParamNum progLocalParamNum +%type <state> progEnvParamNums progLocalParamNums + +%type <vector> paramConstDecl paramConstUse +%type <vector> paramConstScalarDecl paramConstScalarUse paramConstVector +%type <real> signedFloatConstant +%type <negate> optionalSign + +%{ +extern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param, +    void *yyscanner); +%} + +%% + +program: language optionSequence statementSequence END +	; + +language: ARBvp_10 +	{ +	   if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) { +	      yyerror(& @1, state, "invalid fragment program header"); + +	   } +	   state->mode = ARB_vertex; +	} +	| ARBfp_10 +	{ +	   if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) { +	      yyerror(& @1, state, "invalid vertex program header"); +	   } +	   state->mode = ARB_fragment; +	} +	; + +optionSequence: optionSequence option +	| +	; + +option: OPTION IDENTIFIER ';' +	{ +	   int valid = 0; + +	   if (state->mode == ARB_vertex) { +	      valid = _mesa_ARBvp_parse_option(state, $2); +	   } else if (state->mode == ARB_fragment) { +	      valid = _mesa_ARBfp_parse_option(state, $2); +	   } + + +	   if (!valid) { +	      yyerror(& @2, state, "invalid option string"); +	      YYERROR; +	   } +	} +	; + +statementSequence: statementSequence statement +	| +	; + +statement: instruction ';' +	{ +	   if ($1 != NULL) { +	      if (state->inst_tail == NULL) { +		 state->inst_head = $1; +	      } else { +		 state->inst_tail->next = $1; +	      } + +	      state->inst_tail = $1; +	      $1->next = NULL; + +	      state->prog->NumInstructions++; +	   } +	} +	| namingStatement ';' +	; + +instruction: ALU_instruction +	| TexInstruction +	; + +ALU_instruction: ARL_instruction +	| VECTORop_instruction +	| SCALARop_instruction +	| BINSCop_instruction +	| BINop_instruction +	| TRIop_instruction +	| SWZ_instruction +	; + +TexInstruction: SAMPLE_instruction +	| KIL_instruction +	; + +ARL_instruction: ARL maskedAddrReg ',' scalarSrcReg +	{ +	   $$ = asm_instruction_ctor(OPCODE_ARL, & $2, & $4, NULL, NULL); +	} +	; + +VECTORop_instruction: VECTOR_OP maskedDstReg ',' swizzleSrcReg +	{ +	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL); +	   $$->Base.SaturateMode = $1.SaturateMode; +	} +	; + +SCALARop_instruction: SCALAR_OP maskedDstReg ',' scalarSrcReg +	{ +	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL); +	   $$->Base.SaturateMode = $1.SaturateMode; +	} +	; + +BINSCop_instruction: BINSC_OP maskedDstReg ',' scalarSrcReg ',' scalarSrcReg +	{ +	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, NULL); +	   $$->Base.SaturateMode = $1.SaturateMode; +	} +	; + + +BINop_instruction: BIN_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg +	{ +	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, NULL); +	   $$->Base.SaturateMode = $1.SaturateMode; +	} +	; + +TRIop_instruction: TRI_OP maskedDstReg ',' +                   swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg +	{ +	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, & $6, & $8); +	   $$->Base.SaturateMode = $1.SaturateMode; +	} +	; + +SAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget +	{ +	   $$ = asm_instruction_ctor($1.Opcode, & $2, & $4, NULL, NULL); +	   if ($$ != NULL) { +	      $$->Base.SaturateMode = $1.SaturateMode; +	      $$->Base.TexSrcUnit = $6; +	      $$->Base.TexSrcTarget = $8; +	   } +	} +	; + +KIL_instruction: KIL swizzleSrcReg +	{ +	   $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL); +	} +	; + +texImageUnit: TEXTURE_UNIT optTexImageUnitNum +	{ +	   $$ = $2; +	} +	; + +texTarget: TEX_1D  { $$ = TEXTURE_1D_INDEX; } +	| TEX_2D   { $$ = TEXTURE_2D_INDEX; } +	| TEX_3D   { $$ = TEXTURE_3D_INDEX; } +	| TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; } +	| TEX_RECT { $$ = TEXTURE_RECT_INDEX; } +	; + +SWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle +	{ +	   /* FIXME: Is this correct?  Should the extenedSwizzle be applied +	    * FIXME: to the existing swizzle? +	    */ +	   $4.Base.Swizzle = $6.swizzle; + +	   $$ = asm_instruction_ctor(OPCODE_SWZ, & $2, & $4, NULL, NULL); +	   $$->Base.SaturateMode = $1.SaturateMode; +	} +	; + +scalarSrcReg: optionalSign srcReg scalarSuffix +	{ +	   $$ = $2; + +	   if ($1) { +	      $$.Base.Negate = ~$$.Base.Negate; +	   } + +	   $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, +						    $3.swizzle); +	} +	; + +swizzleSrcReg: optionalSign srcReg swizzleSuffix +	{ +	   $$ = $2; + +	   if ($1) { +	      $$.Base.Negate = ~$$.Base.Negate; +	   } + +	   $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle, +						    $3.swizzle); +	} +	; + +maskedDstReg: dstReg optionalMask +	{ +	   $$ = $1; +	   $$.WriteMask = $2.mask; + +	   if ($$.File == PROGRAM_OUTPUT) { +	      /* Technically speaking, this should check that it is in +	       * vertex program mode.  However, PositionInvariant can never be +	       * set in fragment program mode, so it is somewhat irrelevant. +	       */ +	      if (state->option.PositionInvariant +	       && ($$.Index == VERT_RESULT_HPOS)) { +		 yyerror(& @1, state, "position-invariant programs cannot " +			 "write position"); +		 YYERROR; +	      } + +	      state->prog->OutputsWritten |= (1U << $$.Index); +	   } +	} +	; + +maskedAddrReg: addrReg addrWriteMask +	{ +	   init_dst_reg(& $$); +	   $$.File = PROGRAM_ADDRESS; +	   $$.Index = 0; +	   $$.WriteMask = $2.mask; +	} +	; + +extendedSwizzle: extSwizComp ',' extSwizComp ',' extSwizComp ',' extSwizComp +	{ +	   $$.swizzle = MAKE_SWIZZLE4($1.swizzle, $3.swizzle, +				      $5.swizzle, $7.swizzle); +	   $$.mask = ($1.mask) | ($3.mask << 1) | ($5.mask << 2) +	      | ($7.mask << 3); +	} +	; + +extSwizComp: optionalSign extSwizSel +	{ +	   $$.swizzle = $2; +	   $$.mask = ($1) ? 1 : 0; +	} +	; + +extSwizSel: INTEGER +	{ +	   if (($1 != 0) && ($1 != 1)) { +	      yyerror(& @1, state, "invalid extended swizzle selector"); +	      YYERROR; +	   } + +	   $$ = ($1 == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE; +	} +	| IDENTIFIER +	{ +	   if (strlen($1) > 1) { +	      yyerror(& @1, state, "invalid extended swizzle selector"); +	      YYERROR; +	   } + +	   switch ($1[0]) { +	   case 'x': +	      $$ = SWIZZLE_X; +	      break; +	   case 'y': +	      $$ = SWIZZLE_Y; +	      break; +	   case 'z': +	      $$ = SWIZZLE_Z; +	      break; +	   case 'w': +	      $$ = SWIZZLE_W; +	      break; +	   default: +	      yyerror(& @1, state, "invalid extended swizzle selector"); +	      YYERROR; +	      break; +	   } +	} +	; + +srcReg: IDENTIFIER /* temporaryReg | progParamSingle */ +	{ +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, $1); + +	   if (s == NULL) { +	      yyerror(& @1, state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type != at_param) && (s->type != at_temp) +		      && (s->type != at_attrib)) { +	      yyerror(& @1, state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type == at_param) && s->param_is_array) { +	      yyerror(& @1, state, "non-array access to array PARAM"); +	      YYERROR; +	   } + +	   init_src_reg(& $$); +	   switch (s->type) { +	   case at_temp: +	      $$.Base.File = PROGRAM_TEMPORARY; +	      $$.Base.Index = s->temp_binding; +	      break; +	   case at_param: +	      $$.Base.File = s->param_binding_type; +	      $$.Base.Index = s->param_binding_begin; +	      break; +	   case at_attrib: +	     $$.Base.File = PROGRAM_INPUT; +	     $$.Base.Index = s->attrib_binding; +	     state->prog->InputsRead |= (1U << $$.Base.Index); + +	     if (!validate_inputs(& @1, state)) { +		YYERROR; +	     } +	     break; + +	   default: +	      YYERROR; +	      break; +	   } +	} +	| attribBinding +	{ +	   init_src_reg(& $$); +	   $$.Base.File = PROGRAM_INPUT; +	   $$.Base.Index = $1; +	   state->prog->InputsRead |= (1U << $$.Base.Index); + +	   if (!validate_inputs(& @1, state)) { +	      YYERROR; +	   } +	} +	| progParamArray '[' progParamArrayMem ']' +	{ +	   if (! $3.Base.RelAddr +	       && ($3.Base.Index >= $1->param_binding_length)) { +	      yyerror(& @3, state, "out of bounds array access"); +	      YYERROR; +	   } + +	   init_src_reg(& $$); +	   $$.Base.File = $1->param_binding_type; + +	   if ($3.Base.RelAddr) { +	      $1->param_accessed_indirectly = 1; + +	      $$.Base.RelAddr = 1; +	      $$.Base.Index = $3.Base.Index; +	      $$.Symbol = $1; +	   } else { +	      $$.Base.Index = $1->param_binding_begin + $3.Base.Index; +	   } +	} +	| paramSingleItemUse +	{ +	   init_src_reg(& $$); +	   $$.Base.File = $1.param_binding_type; +	   $$.Base.Index = $1.param_binding_begin; +	} +	; + +dstReg: resultBinding +	{ +	   init_dst_reg(& $$); +	   $$.File = PROGRAM_OUTPUT; +	   $$.Index = $1; +	} +	| IDENTIFIER /* temporaryReg | vertexResultReg */ +	{ +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, $1); + +	   if (s == NULL) { +	      yyerror(& @1, state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type != at_output) && (s->type != at_temp)) { +	      yyerror(& @1, state, "invalid operand variable"); +	      YYERROR; +	   } + +	   init_dst_reg(& $$); +	   if (s->type == at_temp) { +	      $$.File = PROGRAM_TEMPORARY; +	      $$.Index = s->temp_binding; +	   } else { +	      $$.File = s->param_binding_type; +	      $$.Index = s->param_binding_begin; +	   } +	} +	; + +progParamArray: IDENTIFIER +	{ +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, $1); + +	   if (s == NULL) { +	      yyerror(& @1, state, "invalid operand variable"); +	      YYERROR; +	   } else if ((s->type != at_param) || !s->param_is_array) { +	      yyerror(& @1, state, "array access to non-PARAM variable"); +	      YYERROR; +	   } else { +	      $$ = s; +	   } +	} +	; + +progParamArrayMem: progParamArrayAbs | progParamArrayRel; + +progParamArrayAbs: INTEGER +	{ +	   init_src_reg(& $$); +	   $$.Base.Index = $1; +	} +	; + +progParamArrayRel: addrReg addrComponent addrRegRelOffset +	{ +	   /* FINISHME: Add support for multiple address registers. +	    */ +	   /* FINISHME: Add support for 4-component address registers. +	    */ +	   init_src_reg(& $$); +	   $$.Base.RelAddr = 1; +	   $$.Base.Index = $3; +	} +	; + +addrRegRelOffset:              { $$ = 0; } +	| '+' addrRegPosOffset { $$ = $2; } +	| '-' addrRegNegOffset { $$ = -$2; } +	; + +addrRegPosOffset: INTEGER +	{ +	   if (($1 < 0) || ($1 > 63)) { +	      yyerror(& @1, state, +		      "relative address offset too large (positive)"); +	      YYERROR; +	   } else { +	      $$ = $1; +	   } +	} +	; + +addrRegNegOffset: INTEGER +	{ +	   if (($1 < 0) || ($1 > 64)) { +	      yyerror(& @1, state, +		      "relative address offset too large (negative)"); +	      YYERROR; +	   } else { +	      $$ = $1; +	   } +	} +	; + +addrReg: IDENTIFIER +	{ +	   struct asm_symbol *const s = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, $1); + +	   if (s == NULL) { +	      yyerror(& @1, state, "invalid array member"); +	      YYERROR; +	   } else if (s->type != at_address) { +	      yyerror(& @1, state, +		      "invalid variable for indexed array access"); +	      YYERROR; +	   } else { +	      $$ = s; +	   } +	} +	; + +addrComponent: MASK1 +	{ +	   if ($1.mask != WRITEMASK_X) { +	      yyerror(& @1, state, "invalid address component selector"); +	      YYERROR; +	   } else { +	      $$ = $1; +	   } +	} +	; + +addrWriteMask: MASK1 +	{ +	   if ($1.mask != WRITEMASK_X) { +	      yyerror(& @1, state, +		      "address register write mask must be \".x\""); +	      YYERROR; +	   } else { +	      $$ = $1; +	   } +	} +	; + +scalarSuffix: MASK1; + +swizzleSuffix: MASK1 +	| MASK4 +	| SWIZZLE +	|              { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } +	; + +optionalMask: MASK4 | MASK3 | MASK2 | MASK1  +	|              { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; } +	; + +namingStatement: ATTRIB_statement +	| PARAM_statement +	| TEMP_statement +	| ADDRESS_statement +	| OUTPUT_statement +	| ALIAS_statement +	; + +ATTRIB_statement: ATTRIB IDENTIFIER '=' attribBinding +	{ +	   struct asm_symbol *const s = +	      declare_variable(state, $2, at_attrib, & @2); + +	   if (s == NULL) { +	      YYERROR; +	   } else { +	      s->attrib_binding = $4; +	      state->InputsBound |= (1U << s->attrib_binding); + +	      if (!validate_inputs(& @4, state)) { +		 YYERROR; +	      } +	   } +	} +	; + +attribBinding: VERTEX vtxAttribItem +	{ +	   $$ = $2; +	} +	| FRAGMENT fragAttribItem +	{ +	   $$ = $2; +	} +	; + +vtxAttribItem: POSITION +	{ +	   $$ = VERT_ATTRIB_POS; +	} +	| WEIGHT vtxOptWeightNum +	{ +	   $$ = VERT_ATTRIB_WEIGHT; +	} +	| NORMAL +	{ +	   $$ = VERT_ATTRIB_NORMAL; +	} +	| COLOR optColorType +	{ +	   $$ = VERT_ATTRIB_COLOR0 + $2; +	} +	| FOGCOORD +	{ +	   $$ = VERT_ATTRIB_FOG; +	} +	| TEXCOORD optTexCoordUnitNum +	{ +	   $$ = VERT_ATTRIB_TEX0 + $2; +	} +	| MATRIXINDEX '[' vtxWeightNum ']' +	{ +	   YYERROR; +	} +	| VTXATTRIB '[' vtxAttribNum ']' +	{ +	   $$ = VERT_ATTRIB_GENERIC0 + $3; +	} +	; + +vtxAttribNum: INTEGER +	{ +	   if ($1 >= state->limits->MaxAttribs) { +	      yyerror(& @1, state, "invalid vertex attribute reference"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + +vtxOptWeightNum:  | '[' vtxWeightNum ']'; +vtxWeightNum: INTEGER; + +fragAttribItem: POSITION +	{ +	   $$ = FRAG_ATTRIB_WPOS; +	} +	| COLOR optColorType +	{ +	   $$ = FRAG_ATTRIB_COL0 + $2; +	} +	| FOGCOORD +	{ +	   $$ = FRAG_ATTRIB_FOGC; +	} +	| TEXCOORD optTexCoordUnitNum +	{ +	   $$ = FRAG_ATTRIB_TEX0 + $2; +	} +	; + +PARAM_statement: PARAM_singleStmt | PARAM_multipleStmt; + +PARAM_singleStmt: PARAM IDENTIFIER paramSingleInit +	{ +	   struct asm_symbol *const s = +	      declare_variable(state, $2, at_param, & @2); + +	   if (s == NULL) { +	      YYERROR; +	   } else { +	      s->param_binding_type = $3.param_binding_type; +	      s->param_binding_begin = $3.param_binding_begin; +	      s->param_binding_length = $3.param_binding_length; +	      s->param_is_array = 0; +	   } +	} +	; + +PARAM_multipleStmt: PARAM IDENTIFIER '[' optArraySize ']' paramMultipleInit +	{ +	   if (($4 != 0) && ($4 != $6.param_binding_length)) { +	      yyerror(& @4, state,  +		      "parameter array size and number of bindings must match"); +	      YYERROR; +	   } else { +	      struct asm_symbol *const s = +		 declare_variable(state, $2, $6.type, & @2); + +	      if (s == NULL) { +		 YYERROR; +	      } else { +		 s->param_binding_type = $6.param_binding_type; +		 s->param_binding_begin = $6.param_binding_begin; +		 s->param_binding_length = $6.param_binding_length; +		 s->param_is_array = 1; +	      } +	   } +	} +	; + +optArraySize: +	{ +	   $$ = 0; +	} +	| INTEGER +        { +	   if (($1 < 1) || ($1 >= state->limits->MaxParameters)) { +	      yyerror(& @1, state, "invalid parameter array size"); +	      YYERROR; +	   } else { +	      $$ = $1; +	   } +	} +	; + +paramSingleInit: '=' paramSingleItemDecl +	{ +	   $$ = $2; +	} +	; + +paramMultipleInit: '=' '{' paramMultInitList '}' +	{ +	   $$ = $3; +	} +	; + +paramMultInitList: paramMultipleItem +	| paramMultInitList ',' paramMultipleItem +	{ +	   $1.param_binding_length += $3.param_binding_length; +	   $$ = $1; +	} +	; + +paramSingleItemDecl: stateSingleItem +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_state(state->prog, & $$, $1); +	} +	| programSingleItem +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_param(state->prog, & $$, $1); +	} +	| paramConstDecl +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_const(state->prog, & $$, & $1); +	} +	; + +paramSingleItemUse: stateSingleItem +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_state(state->prog, & $$, $1); +	} +	| programSingleItem +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_param(state->prog, & $$, $1); +	} +	| paramConstUse +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_const(state->prog, & $$, & $1); +	} +	; + +paramMultipleItem: stateMultipleItem +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_state(state->prog, & $$, $1); +	} +	| programMultipleItem +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_param(state->prog, & $$, $1); +	} +	| paramConstDecl +	{ +	   memset(& $$, 0, sizeof($$)); +	   $$.param_binding_begin = ~0; +	   initialize_symbol_from_const(state->prog, & $$, & $1); +	} +	; + +stateMultipleItem: stateSingleItem        { memcpy($$, $1, sizeof($$)); } +	| STATE stateMatrixRows           { memcpy($$, $2, sizeof($$)); } +	; + +stateSingleItem: STATE stateMaterialItem  { memcpy($$, $2, sizeof($$)); } +	| STATE stateLightItem            { memcpy($$, $2, sizeof($$)); } +	| STATE stateLightModelItem       { memcpy($$, $2, sizeof($$)); } +	| STATE stateLightProdItem        { memcpy($$, $2, sizeof($$)); } +	| STATE stateTexGenItem           { memcpy($$, $2, sizeof($$)); } +	| STATE stateTexEnvItem           { memcpy($$, $2, sizeof($$)); } +	| STATE stateFogItem              { memcpy($$, $2, sizeof($$)); } +	| STATE stateClipPlaneItem        { memcpy($$, $2, sizeof($$)); } +	| STATE statePointItem            { memcpy($$, $2, sizeof($$)); } +	| STATE stateMatrixRow            { memcpy($$, $2, sizeof($$)); } +	; + +stateMaterialItem: MATERIAL optFaceType stateMatProperty +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = STATE_MATERIAL; +	   $$[1] = $2; +	   $$[2] = $3; +	} +	; + +stateMatProperty: ambDiffSpecProperty +	{ +	   $$ = $1; +	} +	| EMISSION +	{ +	   $$ = STATE_EMISSION; +	} +	| SHININESS +	{ +	   $$ = STATE_SHININESS; +	} +	; + +stateLightItem: LIGHT '[' stateLightNumber ']' stateLightProperty +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = STATE_LIGHT; +	   $$[1] = $3; +	   $$[2] = $5; +	} +	; + +stateLightProperty: ambDiffSpecProperty +	{ +	   $$ = $1; +	} +	| POSITION +	{ +	   $$ = STATE_POSITION; +	} +	| ATTENUATION +	{ +	   $$ = STATE_ATTENUATION; +	} +	| SPOT stateSpotProperty +	{ +	   $$ = $2; +	} +	| HALF +	{ +	   $$ = STATE_HALF_VECTOR; +	} +	; + +stateSpotProperty: DIRECTION +	{ +	   $$ = STATE_SPOT_DIRECTION; +	} +	; + +stateLightModelItem: LIGHTMODEL stateLModProperty +	{ +	   $$[0] = $2[0]; +	   $$[1] = $2[1]; +	} +	; + +stateLModProperty: AMBIENT +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = STATE_LIGHTMODEL_AMBIENT; +	} +	| optFaceType SCENECOLOR +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = STATE_LIGHTMODEL_SCENECOLOR; +	   $$[1] = $1; +	} +	; + +stateLightProdItem: LIGHTPROD '[' stateLightNumber ']' optFaceType stateLProdProperty +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = STATE_LIGHTPROD; +	   $$[1] = $3; +	   $$[2] = $5; +	   $$[3] = $6; +	} +	; + +stateLProdProperty: ambDiffSpecProperty; + +stateTexEnvItem: TEXENV optLegacyTexUnitNum stateTexEnvProperty +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = $3; +	   $$[1] = $2; +	} +	; + +stateTexEnvProperty: COLOR +	{ +	   $$ = STATE_TEXENV_COLOR; +	} +	; + +ambDiffSpecProperty: AMBIENT +	{ +	   $$ = STATE_AMBIENT; +	} +	| DIFFUSE +	{ +	   $$ = STATE_DIFFUSE; +	} +	| SPECULAR +	{ +	   $$ = STATE_SPECULAR; +	} +	; + +stateLightNumber: INTEGER +	{ +	   if ($1 >= state->MaxLights) { +	      yyerror(& @1, state, "invalid light selector"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + +stateTexGenItem: TEXGEN optTexCoordUnitNum stateTexGenType stateTexGenCoord +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = STATE_TEXGEN; +	   $$[1] = $2; +	   $$[2] = $3 + $4; +	} +	; + +stateTexGenType: EYE +	{ +	   $$ = STATE_TEXGEN_EYE_S; +	} +	| OBJECT +	{ +	   $$ = STATE_TEXGEN_OBJECT_S; +	} +	; +stateTexGenCoord: TEXGEN_S +	{ +	   $$ = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S; +	} +	| TEXGEN_T +	{ +	   $$ = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S; +	} +	| TEXGEN_R +	{ +	   $$ = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S; +	} +	| TEXGEN_Q +	{ +	   $$ = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S; +	} +	; + +stateFogItem: FOG stateFogProperty +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = $2; +	} +	; + +stateFogProperty: COLOR +	{ +	   $$ = STATE_FOG_COLOR; +	} +	| PARAMS +	{ +	   $$ = STATE_FOG_PARAMS; +	} +	; + +stateClipPlaneItem: CLIP '[' stateClipPlaneNum ']' PLANE +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = STATE_CLIPPLANE; +	   $$[1] = $3; +	} +	; + +stateClipPlaneNum: INTEGER +	{ +	   if ($1 >= state->MaxClipPlanes) { +	      yyerror(& @1, state, "invalid clip plane selector"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + +statePointItem: POINT statePointProperty +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = $2; +	} +	; + +statePointProperty: SIZE +	{ +	   $$ = STATE_POINT_SIZE; +	} +	| ATTENUATION +	{ +	   $$ = STATE_POINT_ATTENUATION; +	} +	; + +stateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']' +	{ +	   $$[0] = $1[0]; +	   $$[1] = $1[1]; +	   $$[2] = $4; +	   $$[3] = $4; +	   $$[4] = $1[2]; +	} +	; + +stateMatrixRows: stateMatrixItem optMatrixRows +	{ +	   $$[0] = $1[0]; +	   $$[1] = $1[1]; +	   $$[2] = $2[2]; +	   $$[3] = $2[3]; +	   $$[4] = $1[2]; +	} +	; + +optMatrixRows: +	{ +	   $$[2] = 0; +	   $$[3] = 3; +	} +	| ROW '[' stateMatrixRowNum DOT_DOT stateMatrixRowNum ']' +	{ +	   /* It seems logical that the matrix row range specifier would have +	    * to specify a range or more than one row (i.e., $5 > $3). +	    * However, the ARB_vertex_program spec says "a program will fail +	    * to load if <a> is greater than <b>."  This means that $3 == $5 +	    * is valid. +	    */ +	   if ($3 > $5) { +	      yyerror(& @3, state, "invalid matrix row range"); +	      YYERROR; +	   } + +	   $$[2] = $3; +	   $$[3] = $5; +	} +	; + +stateMatrixItem: MATRIX stateMatrixName stateOptMatModifier +	{ +	   $$[0] = $2[0]; +	   $$[1] = $2[1]; +	   $$[2] = $3; +	} +	; + +stateOptMatModifier:  +	{ +	   $$ = 0; +	} +	| stateMatModifier +	{ +	   $$ = $1; +	} +	; + +stateMatModifier: INVERSE  +	{ +	   $$ = STATE_MATRIX_INVERSE; +	} +	| TRANSPOSE  +	{ +	   $$ = STATE_MATRIX_TRANSPOSE; +	} +	| INVTRANS +	{ +	   $$ = STATE_MATRIX_INVTRANS; +	} +	; + +stateMatrixRowNum: INTEGER +	{ +	   if ($1 > 3) { +	      yyerror(& @1, state, "invalid matrix row reference"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + +stateMatrixName: MODELVIEW stateOptModMatNum +	{ +	   $$[0] = STATE_MODELVIEW_MATRIX; +	   $$[1] = $2; +	} +	| PROJECTION +	{ +	   $$[0] = STATE_PROJECTION_MATRIX; +	   $$[1] = 0; +	} +	| MVP +	{ +	   $$[0] = STATE_MVP_MATRIX; +	   $$[1] = 0; +	} +	| TEXTURE optTexCoordUnitNum +	{ +	   $$[0] = STATE_TEXTURE_MATRIX; +	   $$[1] = $2; +	} +	| PALETTE '[' statePaletteMatNum ']' +	{ +	   YYERROR; +	} +	| MAT_PROGRAM '[' stateProgramMatNum ']' +	{ +	   $$[0] = STATE_PROGRAM_MATRIX; +	   $$[1] = $3; +	} +	; + +stateOptModMatNum: +	{ +	   $$ = 0; +	} +	| stateModMatNum +	{ +	   $$ = $1; +	} +	; +stateModMatNum: INTEGER +	{ +	   /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix +	    * zero is valid. +	    */ +	   if ($1 != 0) { +	      yyerror(& @1, state, "invalid modelview matrix index"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; +statePaletteMatNum: INTEGER +	{ +	   /* Since GL_ARB_matrix_palette isn't supported, just let any value +	    * through here.  The error will be generated later. +	    */ +	   $$ = $1; +	} +	; +stateProgramMatNum: INTEGER +	{ +	   if ($1 >= state->MaxProgramMatrices) { +	      yyerror(& @1, state, "invalid program matrix selector"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + + + +programSingleItem: progEnvParam | progLocalParam; + +programMultipleItem: progEnvParams | progLocalParams; + +progEnvParams: PROGRAM ENV '[' progEnvParamNums ']' +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = state->state_param_enum; +	   $$[1] = STATE_ENV; +	   $$[2] = $4[0]; +	   $$[3] = $4[1]; +	} +	; + +progEnvParamNums: progEnvParamNum +	{ +	   $$[0] = $1; +	   $$[1] = $1; +	} +	| progEnvParamNum DOT_DOT progEnvParamNum +	{ +	   $$[0] = $1; +	   $$[1] = $3; +	} +	; + +progEnvParam: PROGRAM ENV '[' progEnvParamNum ']' +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = state->state_param_enum; +	   $$[1] = STATE_ENV; +	   $$[2] = $4; +	   $$[3] = $4; +	} +	; + +progLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']' +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = state->state_param_enum; +	   $$[1] = STATE_LOCAL; +	   $$[2] = $4[0]; +	   $$[3] = $4[1]; +	} + +progLocalParamNums: progLocalParamNum +	{ +	   $$[0] = $1; +	   $$[1] = $1; +	} +	| progLocalParamNum DOT_DOT progLocalParamNum +	{ +	   $$[0] = $1; +	   $$[1] = $3; +	} +	; + +progLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']' +	{ +	   memset($$, 0, sizeof($$)); +	   $$[0] = state->state_param_enum; +	   $$[1] = STATE_LOCAL; +	   $$[2] = $4; +	   $$[3] = $4; +	} +	; + +progEnvParamNum: INTEGER +	{ +	   if ($1 >= state->limits->MaxEnvParams) { +	      yyerror(& @1, state, "invalid environment parameter reference"); +	      YYERROR; +	   } +	   $$ = $1; +	} +	; + +progLocalParamNum: INTEGER +	{ +	   if ($1 >= state->limits->MaxLocalParams) { +	      yyerror(& @1, state, "invalid local parameter reference"); +	      YYERROR; +	   } +	   $$ = $1; +	} +	; + + + +paramConstDecl: paramConstScalarDecl | paramConstVector; +paramConstUse: paramConstScalarUse | paramConstVector; + +paramConstScalarDecl: signedFloatConstant +	{ +	   $$.count = 1; +	   $$.data[0] = $1; +	} +	; + +paramConstScalarUse: REAL +	{ +	   $$.count = 1; +	   $$.data[0] = $1; +	} +	| INTEGER +	{ +	   $$.count = 1; +	   $$.data[0] = (float) $1; +	} +	; + +paramConstVector: '{' signedFloatConstant '}' +	{ +	   $$.count = 1; +	   $$.data[0] = $2; +	} +	| '{' signedFloatConstant ',' signedFloatConstant '}' +	{ +	   $$.count = 2; +	   $$.data[0] = $2; +	   $$.data[1] = $4; +	} +	| '{' signedFloatConstant ',' signedFloatConstant ',' +              signedFloatConstant '}' +	{ +	   $$.count = 3; +	   $$.data[0] = $2; +	   $$.data[1] = $4; +	   $$.data[1] = $6; +	} +	| '{' signedFloatConstant ',' signedFloatConstant ',' +              signedFloatConstant ',' signedFloatConstant '}' +	{ +	   $$.count = 4; +	   $$.data[0] = $2; +	   $$.data[1] = $4; +	   $$.data[1] = $6; +	   $$.data[1] = $8; +	} +	; + +signedFloatConstant: optionalSign REAL +	{ +	   $$ = ($1) ? -$2 : $2; +	} +	| optionalSign INTEGER +	{ +	   $$ = (float)(($1) ? -$2 : $2); +	} +	; + +optionalSign: '+'        { $$ = FALSE; } +	| '-'            { $$ = TRUE;  } +	|                { $$ = FALSE; } +	; + +TEMP_statement: TEMP { $<integer>$ = $1; } varNameList +	; + +ADDRESS_statement: ADDRESS { $<integer>$ = $1; } varNameList +	; + +varNameList: varNameList ',' IDENTIFIER +	{ +	   if (!declare_variable(state, $3, $<integer>0, & @3)) { +	      YYERROR; +	   } +	} +	| IDENTIFIER +	{ +	   if (!declare_variable(state, $1, $<integer>0, & @1)) { +	      YYERROR; +	   } +	} +	; + +OUTPUT_statement: OUTPUT IDENTIFIER '=' resultBinding +	{ +	   struct asm_symbol *const s = +	      declare_variable(state, $2, at_output, & @2); + +	   if (s == NULL) { +	      YYERROR; +	   } else { +	      s->output_binding = $4; +	   } +	} +	; + +resultBinding: RESULT POSITION +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = VERT_RESULT_HPOS; +	   } else { +	      yyerror(& @2, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	| RESULT FOGCOORD +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = VERT_RESULT_FOGC; +	   } else { +	      yyerror(& @2, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	| RESULT resultColBinding +	{ +	   $$ = $2; +	} +	| RESULT POINTSIZE +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = VERT_RESULT_PSIZ; +	   } else { +	      yyerror(& @2, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	| RESULT TEXCOORD optTexCoordUnitNum +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = VERT_RESULT_TEX0 + $3; +	   } else { +	      yyerror(& @2, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	| RESULT DEPTH +	{ +	   if (state->mode == ARB_fragment) { +	      $$ = FRAG_RESULT_DEPTH; +	   } else { +	      yyerror(& @2, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	; + +resultColBinding: COLOR optResultFaceType optResultColorType +	{ +	   $$ = $2 + $3; +	} +	; + +optResultFaceType: +	{ +	   $$ = (state->mode == ARB_vertex) +	      ? VERT_RESULT_COL0 +	      : FRAG_RESULT_COLOR; +	} +	| FRONT +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = VERT_RESULT_COL0; +	   } else { +	      yyerror(& @1, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	| BACK +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = VERT_RESULT_BFC0; +	   } else { +	      yyerror(& @1, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	; + +optResultColorType: +	{ +	   $$ = 0;  +	} +	| PRIMARY +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = 0; +	   } else { +	      yyerror(& @1, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	| SECONDARY +	{ +	   if (state->mode == ARB_vertex) { +	      $$ = 1; +	   } else { +	      yyerror(& @1, state, "invalid program result name"); +	      YYERROR; +	   } +	} +	; + +optFaceType:    { $$ = 0; } +	| FRONT	{ $$ = 0; } +	| BACK  { $$ = 1; } +	; + +optColorType:       { $$ = 0; } +	| PRIMARY   { $$ = 0; } +	| SECONDARY { $$ = 1; } +	; + +optTexCoordUnitNum:                { $$ = 0; } +	| '[' texCoordUnitNum ']'  { $$ = $2; } +	; + +optTexImageUnitNum:                { $$ = 0; } +	| '[' texImageUnitNum ']'  { $$ = $2; } +	; + +optLegacyTexUnitNum:               { $$ = 0; } +	| '[' legacyTexUnitNum ']' { $$ = $2; } +	; + +texCoordUnitNum: INTEGER +	{ +	   if ($1 >= state->MaxTextureCoordUnits) { +	      yyerror(& @1, state, "invalid texture coordinate unit selector"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + +texImageUnitNum: INTEGER +	{ +	   if ($1 >= state->MaxTextureImageUnits) { +	      yyerror(& @1, state, "invalid texture image unit selector"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + +legacyTexUnitNum: INTEGER +	{ +	   if ($1 >= state->MaxTextureUnits) { +	      yyerror(& @1, state, "invalid texture unit selector"); +	      YYERROR; +	   } + +	   $$ = $1; +	} +	; + +ALIAS_statement: ALIAS IDENTIFIER '=' IDENTIFIER +	{ +	   struct asm_symbol *exist = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, $2); +	   struct asm_symbol *target = (struct asm_symbol *) +	      _mesa_symbol_table_find_symbol(state->st, 0, $4); + + +	   if (exist != NULL) { +	      yyerror(& @2, state, "redeclared identifier"); +	      YYERROR; +	   } else if (target == NULL) { +	      yyerror(& @4, state, +		      "undefined variable binding in ALIAS statement"); +	      YYERROR; +	   } else { +	      _mesa_symbol_table_add_symbol(state->st, 0, $2, target); +	   } +	} +	; + +%% + +struct asm_instruction * +asm_instruction_ctor(gl_inst_opcode op, +		     const struct prog_dst_register *dst, +		     const struct asm_src_register *src0, +		     const struct asm_src_register *src1, +		     const struct asm_src_register *src2) +{ +   struct asm_instruction *inst = calloc(1, sizeof(struct asm_instruction)); + +   if (inst) { +      _mesa_init_instructions(inst, 1); +      inst->Base.Opcode = op; +      inst->Base.DstReg = *dst; + +      inst->Base.SrcReg[0] = src0->Base; +      inst->SrcReg[0] = *src0; + +      if (src1 != NULL) { +	 inst->Base.SrcReg[1] = src1->Base; +	 inst->SrcReg[1] = *src1; +      } + +      if (src2 != NULL) { +	 inst->Base.SrcReg[2] = src2->Base; +	 inst->SrcReg[2] = *src2; +      } +   } + +   return inst; +} + + +void +init_dst_reg(struct prog_dst_register *r) +{ +   memset(r, 0, sizeof(*r)); +   r->File = PROGRAM_UNDEFINED; +   r->WriteMask = WRITEMASK_XYZW; +   r->CondMask = COND_TR; +   r->CondSwizzle = SWIZZLE_NOOP; +} + + +void +init_src_reg(struct asm_src_register *r) +{ +   memset(r, 0, sizeof(*r)); +   r->Base.File = PROGRAM_UNDEFINED; +   r->Base.Swizzle = SWIZZLE_NOOP; +   r->Symbol = NULL; +} + + +/** + * Validate the set of inputs used by a program + * + * Validates that legal sets of inputs are used by the program.  In this case + * "used" included both reading the input or binding the input to a name using + * the \c ATTRIB command. + * + * \return + * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise. + */ +int +validate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state) +{ +   const int inputs = state->prog->InputsRead | state->InputsBound; + +   if (((inputs & 0x0ffff) & (inputs >> 16)) != 0) { +      yyerror(locp, state, "illegal use of generic attribute and name attribute"); +      return 0; +   } + +   return 1; +} + + +struct asm_symbol * +declare_variable(struct asm_parser_state *state, char *name, enum asm_type t, +		 struct YYLTYPE *locp) +{ +   struct asm_symbol *s = NULL; +   struct asm_symbol *exist = (struct asm_symbol *) +      _mesa_symbol_table_find_symbol(state->st, 0, name); + + +   if (exist != NULL) { +      yyerror(locp, state, "redeclared identifier"); +   } else { +      s = calloc(1, sizeof(struct asm_symbol)); +      s->name = name; +      s->type = t; + +      switch (t) { +      case at_temp: +	 if (state->prog->NumTemporaries >= state->limits->MaxTemps) { +	    yyerror(locp, state, "too many temporaries declared"); +	    free(s); +	    return NULL; +	 } + +	 s->temp_binding = state->prog->NumTemporaries; +	 state->prog->NumTemporaries++; +	 break; + +      case at_address: +	 if (state->prog->NumAddressRegs >= state->limits->MaxAddressRegs) { +	    yyerror(locp, state, "too many address registers declared"); +	    free(s); +	    return NULL; +	 } + +	 /* FINISHME: Add support for multiple address registers. +	  */ +	 state->prog->NumAddressRegs++; +	 break; + +      default: +	 break; +      } + +      _mesa_symbol_table_add_symbol(state->st, 0, s->name, s); +   } + +   return s; +} + + +int add_state_reference(struct gl_program_parameter_list *param_list, +			const gl_state_index tokens[STATE_LENGTH]) +{ +   const GLuint size = 4; /* XXX fix */ +   char *name; +   GLint index; + +   name = _mesa_program_state_string(tokens); +   index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name, +                               size, GL_NONE, +                               NULL, (gl_state_index *) tokens, 0x0); +   param_list->StateFlags |= _mesa_program_state_flags(tokens); + +   /* free name string here since we duplicated it in add_parameter() */ +   _mesa_free(name); + +   return index; +} + + +int +initialize_symbol_from_state(struct gl_program *prog, +			     struct asm_symbol *param_var,  +			     const gl_state_index tokens[STATE_LENGTH]) +{ +   int idx = -1; +   gl_state_index state_tokens[STATE_LENGTH]; + + +   memcpy(state_tokens, tokens, sizeof(state_tokens)); + +   param_var->type = at_param; + +   /* If we are adding a STATE_MATRIX that has multiple rows, we need to +    * unroll it and call add_state_reference() for each row +    */ +   if ((state_tokens[0] == STATE_MODELVIEW_MATRIX || +	state_tokens[0] == STATE_PROJECTION_MATRIX || +	state_tokens[0] == STATE_MVP_MATRIX || +	state_tokens[0] == STATE_TEXTURE_MATRIX || +	state_tokens[0] == STATE_PROGRAM_MATRIX) +       && (state_tokens[2] != state_tokens[3])) { +      int row; +      const int first_row = state_tokens[2]; +      const int last_row = state_tokens[3]; + +      for (row = first_row; row <= last_row; row++) { +	 state_tokens[2] = state_tokens[3] = row; + +	 idx = add_state_reference(prog->Parameters, state_tokens); +	 if (param_var->param_binding_begin == ~0U) +	    param_var->param_binding_begin = idx; +	 param_var->param_binding_length++; +      } +   } +   else { +      idx = add_state_reference(prog->Parameters, state_tokens); +      if (param_var->param_binding_begin == ~0U) +	 param_var->param_binding_begin = idx; +      param_var->param_binding_length++; +   } + +   return idx; +} + + +int +initialize_symbol_from_param(struct gl_program *prog, +			     struct asm_symbol *param_var,  +			     const gl_state_index tokens[STATE_LENGTH]) +{ +   int idx = -1; +   gl_state_index state_tokens[STATE_LENGTH]; + + +   memcpy(state_tokens, tokens, sizeof(state_tokens)); + +   assert((state_tokens[0] == STATE_VERTEX_PROGRAM) +	  || (state_tokens[0] == STATE_FRAGMENT_PROGRAM)); +   assert((state_tokens[1] == STATE_ENV) +	  || (state_tokens[1] == STATE_LOCAL)); + +   param_var->type = at_param; + +   /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements, +    * we need to unroll it and call add_state_reference() for each row +    */ +   if (state_tokens[2] != state_tokens[3]) { +      int row; +      const int first_row = state_tokens[2]; +      const int last_row = state_tokens[3]; + +      for (row = first_row; row <= last_row; row++) { +	 state_tokens[2] = state_tokens[3] = row; + +	 idx = add_state_reference(prog->Parameters, state_tokens); +	 if (param_var->param_binding_begin == ~0U) +	    param_var->param_binding_begin = idx; +	 param_var->param_binding_length++; +      } +   } +   else { +      idx = add_state_reference(prog->Parameters, state_tokens); +      if (param_var->param_binding_begin == ~0U) +	 param_var->param_binding_begin = idx; +      param_var->param_binding_length++; +   } + +   return idx; +} + + +int +initialize_symbol_from_const(struct gl_program *prog, +			     struct asm_symbol *param_var,  +			     const struct asm_vector *vec) +{ +   const int idx = _mesa_add_parameter(prog->Parameters, PROGRAM_CONSTANT, +				       NULL, vec->count, GL_NONE, vec->data, +				       NULL, 0x0); + +   param_var->type = at_param; + +   if (param_var->param_binding_begin == ~0U) +      param_var->param_binding_begin = idx; +   param_var->param_binding_length++; + +   return idx; +} + + +void +yyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s) +{ +   (void) state; + +   fprintf(stderr, "line %u, char %u: error: %s\n", locp->first_line, +	   locp->first_column, s); +} + +GLboolean +_mesa_parse_arb_program(GLcontext *ctx, GLenum target, const GLubyte *str, +			GLsizei len, struct asm_parser_state *state) +{ +   struct gl_program_constants limits; +   struct asm_instruction *inst; +   unsigned i; +   GLubyte *strz; + +   state->prog->Target = target; +   state->prog->Parameters = _mesa_new_parameter_list(); + +   /* Make a copy of the program string and force it to be NUL-terminated. +    */ +   strz = (GLubyte *) _mesa_malloc(len + 1); +   if (strz == NULL) { +      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); +      return GL_FALSE; +   } +   _mesa_memcpy (strz, str, len); +   strz[len] = '\0'; + +   state->prog->String = strz; + +   state->st = _mesa_symbol_table_ctor(); + +   /* All of these limits should come from ctx. +    */ +   limits.MaxInstructions = 128; +   limits.MaxAluInstructions = 128; +   limits.MaxTexInstructions = 128; +   limits.MaxTexIndirections = 128;  +   limits.MaxAttribs = 16; +   limits.MaxTemps = 128; +   limits.MaxAddressRegs = 1; +   limits.MaxParameters = 128; +   limits.MaxLocalParams = 256; +   limits.MaxEnvParams = 128; +   limits.MaxNativeInstructions = 128; +   limits.MaxNativeAluInstructions = 128; +   limits.MaxNativeTexInstructions = 128; +   limits.MaxNativeTexIndirections = 128; +   limits.MaxNativeAttribs = 16; +   limits.MaxNativeTemps = 128; +   limits.MaxNativeAddressRegs = 1; +   limits.MaxNativeParameters = 128; +   limits.MaxUniformComponents = 0; + +   state->limits = & limits; + +   state->MaxTextureImageUnits = 16; +   state->MaxTextureCoordUnits = 8; +   state->MaxTextureUnits = 8; +   state->MaxClipPlanes = 6; +   state->MaxLights = 8; +   state->MaxProgramMatrices = 8; + +   state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB) +      ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM; + +   _mesa_set_program_error(ctx, -1, NULL); + +   _mesa_program_lexer_ctor(& state->scanner, state, (const char *) str, len); +   yyparse(state); +   _mesa_program_lexer_dtor(state->scanner); + + +   if (! _mesa_layout_parameters(state)) { +      fprintf(stderr, "error: layout\n"); +      return GL_FALSE; +   } + + +    +   /* Add one instruction to store the "END" instruction. +    */ +   state->prog->Instructions = +      _mesa_alloc_instructions(state->prog->NumInstructions + 1); +   inst = state->inst_head; +   for (i = 0; i < state->prog->NumInstructions; i++) { +      struct asm_instruction *const temp = inst->next; + +      state->prog->Instructions[i] = inst->Base; +      _mesa_free(inst); + +      inst = temp; +   } + +   /* Finally, tag on an OPCODE_END instruction */ +   { +      const GLuint numInst = state->prog->NumInstructions; +      _mesa_init_instructions(state->prog->Instructions + numInst, 1); +      state->prog->Instructions[numInst].Opcode = OPCODE_END; +   } +   state->prog->NumInstructions++; + +   /* +    * Initialize native counts to logical counts.  The device driver may +    * change them if program is translated into a hardware program. +    */ +   state->prog->NumNativeInstructions = state->prog->NumInstructions; +   state->prog->NumNativeTemporaries = state->prog->NumTemporaries; +   state->prog->NumNativeParameters = state->prog->NumParameters; +   state->prog->NumNativeAttributes = state->prog->NumAttributes; +   state->prog->NumNativeAddressRegs = state->prog->NumAddressRegs; + +   return GL_TRUE; +} diff --git a/src/mesa/shader/program_parse_extra.c b/src/mesa/shader/program_parse_extra.c new file mode 100644 index 0000000000..b365267d4d --- /dev/null +++ b/src/mesa/shader/program_parse_extra.c @@ -0,0 +1,109 @@ +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#include <string.h> +#include "main/mtypes.h" +#include "prog_instruction.h" +#include "program_parser.h" + + +/** + * Extra assembly-level parser routines + * + * \author Ian Romanick <ian.d.romanick@intel.com> + */ + +int +_mesa_ARBvp_parse_option(struct asm_parser_state *state, const char *option) +{ +   if (strcmp(option, "ARB_position_invariant") == 0) { +      state->option.PositionInvariant = 1; +      return 1; +   } + +   return 0; +} + + +int +_mesa_ARBfp_parse_option(struct asm_parser_state *state, const char *option) +{ +   /* All of the options currently supported start with "ARB_".  The code is +    * currently structured with nested if-statements because eventually options +    * that start with "NV_" will be supported.  This structure will result in +    * less churn when those options are added. +    */ +   if (strncmp(option, "ARB_", 4) == 0) { +      /* Advance the pointer past the "ARB_" prefix. +       */ +      option += 4; + + +      if (strncmp(option, "fog_", 4) == 0) { +	 option += 4; + +	 if (state->option.Fog == OPTION_NONE) { +	    if (strcmp(option, "exp") == 0) { +	       state->option.Fog = OPTION_FOG_EXP; +	       return 1; +	    } else if (strcmp(option, "exp2") == 0) { +	       state->option.Fog = OPTION_FOG_EXP2; +	       return 1; +	    } else if (strcmp(option, "linear") == 0) { +	       state->option.Fog = OPTION_FOG_LINEAR; +	       return 1; +	    } +	 } + +	 return 0; +      } else if (strncmp(option, "precision_hint_", 15) == 0) { +	 option += 15; + +	 if (state->option.PrecisionHint == OPTION_NONE) { +	    if (strcmp(option, "nicest") == 0) { +	       state->option.PrecisionHint = OPTION_NICEST; +	       return 1; +	    } else if (strcmp(option, "fastest") == 0) { +	       state->option.PrecisionHint = OPTION_FASTEST; +	       return 1; +	    } +	 } + +	 return 0; +      } else if (strcmp(option, "draw_buffers") == 0) { +	 /* FINISHME: This should validate that the driver support the +	  * FINISHME: GL_ARB_draw_buffers extension. +	  */ +	 state->option.DrawBuffers = 1; +	 return 1; +      } else if (strcmp(option, "fragment_program_shadow") == 0) { +	 /* FINISHME: This should validate that the driver support the +	  * FINISHME: GL_ARB_fragment_program_shadow extension. +	  */ +	 state->option.Shadow = 1; +	 return 1; +      } +   } + +   return 0; +} diff --git a/src/mesa/shader/program_parser.h b/src/mesa/shader/program_parser.h new file mode 100644 index 0000000000..20190470ea --- /dev/null +++ b/src/mesa/shader/program_parser.h @@ -0,0 +1,256 @@ +/* + * Copyright © 2009 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#pragma once + +#include "main/config.h" + +enum asm_type { +   at_none, +   at_address, +   at_attrib, +   at_param, +   at_temp, +   at_output, +}; + +struct asm_symbol { +   const char *name; +   enum asm_type type; +   unsigned attrib_binding; +   unsigned output_binding;   /**< Output / result register number. */ + +   /** +    * One of PROGRAM_STATE_VAR, PROGRAM_LOCAL_PARAM, or PROGRAM_ENV_PARAM. +    */ +   unsigned param_binding_type; + +   /**  +    * Offset into the program_parameter_list where the tokens representing our +    * bound state (or constants) start. +    */ +   unsigned param_binding_begin; + +   /* This is how many entries in the the program_parameter_list we take up +    * with our state tokens or constants. Note that this is _not_ the same as +    * the number of param registers we eventually use. +    */ +   unsigned param_binding_length; + +   /** +    * Index of the temp register assigned to this variable. +    */ +   unsigned temp_binding; + +   /** +    * Flag whether or not a PARAM is an array +    */ +   unsigned param_is_array:1; + + +   /** +    * Flag whether or not a PARAM array is accessed indirectly +    */ +   unsigned param_accessed_indirectly:1; + + +   /** +    * \brief Is first pass of parameter layout done with this variable? +    * +    * The parameter layout routine operates in two passes.  This flag tracks +    * whether or not the first pass has handled this variable. +    * +    * \sa _mesa_layout_parameters +    */ +   unsigned pass1_done:1; +}; + + +struct asm_vector { +   unsigned count; +   float    data[4]; +}; + + +struct asm_swizzle_mask { +   unsigned swizzle:12; +   unsigned mask:4; +}; + + +struct asm_src_register { +   struct prog_src_register Base; + +   /** +    * Symbol associated with indirect access to parameter arrays. +    * +    * If \c Base::RelAddr is 1, this will point to the symbol for the parameter +    * that is being dereferenced.  Further, \c Base::Index will be the offset +    * from the address register being used. +    */ +   struct asm_symbol *Symbol; +}; + + +struct asm_instruction { +   struct prog_instruction Base; +   struct asm_instruction *next; +   struct asm_src_register SrcReg[3]; +}; + + +struct asm_parser_state { +   struct gl_program *prog; + +   /** +    * Per-program target limits +    */ +   struct gl_program_constants *limits; + +   struct _mesa_symbol_table *st; + +   /** +    * State for the lexer. +    */ +   void *scanner; + +   /** +    * Linked list of instructions generated during parsing. +    */ +   /*@{*/ +   struct asm_instruction *inst_head; +   struct asm_instruction *inst_tail; +   /*@}*/ + + +   /** +    * Selected limits copied from gl_constants +    * +    * These are limits from the GL context, but various bits in the program +    * must be validated against these values. +    */ +   /*@{*/ +   unsigned MaxTextureCoordUnits; +   unsigned MaxTextureImageUnits; +   unsigned MaxTextureUnits; +   unsigned MaxClipPlanes; +   unsigned MaxLights; +   unsigned MaxProgramMatrices; +   /*@}*/ + +   /** +    * Value to use in state vector accessors for environment and local +    * parameters +    */ +   unsigned state_param_enum; + + +   /** +    * Input attributes bound to specific names +    * +    * This is only needed so that errors can be properly produced when +    * multiple ATTRIB statements bind illegal combinations of vertex +    * attributes. +    */ +   unsigned InputsBound; + +   enum { +      invalid_mode = 0, +      ARB_vertex, +      ARB_fragment +   } mode; + +   struct { +      unsigned PositionInvariant:1; +      unsigned Fog:2; +      unsigned PrecisionHint:2; +      unsigned DrawBuffers:1; +      unsigned Shadow:1; +   } option; + +   struct { +      unsigned TexturesUsed[MAX_TEXTURE_IMAGE_UNITS]; +      unsigned ShadowSamplers; +      unsigned UsesKill:1; +   } fragment; +}; + +#define OPTION_NONE        0 +#define OPTION_FOG_EXP     1 +#define OPTION_FOG_EXP2    2 +#define OPTION_FOG_LINEAR  3 +#define OPTION_NICEST      1 +#define OPTION_FASTEST     2 + +typedef struct YYLTYPE { +   int first_line; +   int first_column; +   int last_line; +   int last_column; +   int position; +} YYLTYPE; + +#define YYLTYPE_IS_DECLARED 1 +#define YYLTYPE_IS_TRIVIAL 1 + + +#ifndef MTYPES_H +struct __GLcontextRec; +typedef struct __GLcontextRec GLcontext; +#endif + +extern GLboolean _mesa_parse_arb_program(GLcontext *ctx, GLenum target, +    const GLubyte *str, GLsizei len, struct asm_parser_state *state); + + + +/* From program_lexer.l. */ +extern void _mesa_program_lexer_dtor(void *scanner); + +extern void _mesa_program_lexer_ctor(void **scanner, +    struct asm_parser_state *state, const char *string, size_t len); + + +/** + *\name From program_parse_extra.c + */ +/*@{*/ + +/** + * Parses and processes an option string to an ARB vertex program + * + * \return + * Non-zero on success, zero on failure. + */ +extern int _mesa_ARBvp_parse_option(struct asm_parser_state *state, +    const char *option); + +/** + * Parses and processes an option string to an ARB fragment program + * + * \return + * Non-zero on success, zero on failure. + */ +extern int _mesa_ARBfp_parse_option(struct asm_parser_state *state, +    const char *option); + +/*@}*/ diff --git a/src/mesa/shader/symbol_table.c b/src/mesa/shader/symbol_table.c new file mode 100644 index 0000000000..b90c495cdb --- /dev/null +++ b/src/mesa/shader/symbol_table.c @@ -0,0 +1,334 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <assert.h> + +#include "symbol_table.h" +#include "hash_table.h" + +struct symbol { +    /** +     * Link to the next symbol in the table with the same name +     * +     * The linked list of symbols with the same name is ordered by scope +     * from inner-most to outer-most. +     */ +    struct symbol *next_with_same_name; + + +    /** +     * Link to the next symbol in the table with the same scope +     * +     * The linked list of symbols with the same scope is unordered.  Symbols +     * in this list my have unique names. +     */ +    struct symbol *next_with_same_scope; + + +    /** +     * Header information for the list of symbols with the same name. +     */ +    struct symbol_header *hdr; + + +    /** +     * Name space of the symbol +     * +     * Name space are arbitrary user assigned integers.  No two symbols can +     * exist in the same name space at the same scope level. +     */ +    int name_space; + +     +    /** +     * Arbitrary user supplied data. +     */ +    void *data; +}; + + +/** + */ +struct symbol_header { +    /** Symbol name. */ +    const char *name; + +    /** Linked list of symbols with the same name. */ +    struct symbol *symbols; +}; + + +/** + * Element of the scope stack. + */ +struct scope_level { +    /** Link to next (inner) scope level. */ +    struct scope_level *next; +     +    /** Linked list of symbols with the same scope. */ +    struct symbol *symbols; +}; + + +/** + * + */ +struct _mesa_symbol_table { +    /** Hash table containing all symbols in the symbol table. */ +    struct hash_table *ht; + +    /** Top of scope stack. */ +    struct scope_level *current_scope; +}; + + +struct _mesa_symbol_table_iterator { +    /** +     * Name space of symbols returned by this iterator. +     */ +    int name_space; + + +    /** +     * Currently iterated symbol +     * +     * The next call to \c _mesa_symbol_table_iterator_get will return this +     * value.  It will also update this value to the value that should be +     * returned by the next call. +     */ +    struct symbol *curr; +}; + + +static void +check_symbol_table(struct _mesa_symbol_table *table) +{ +#if 1 +    struct scope_level *scope; + +    for (scope = table->current_scope; scope != NULL; scope = scope->next) { +        struct symbol *sym; + +        for (sym = scope->symbols +             ; sym != NULL +             ; sym = sym->next_with_same_name) { +            const struct symbol_header *const hdr = sym->hdr; +            struct symbol *sym2; + +            for (sym2 = hdr->symbols +                 ; sym2 != NULL +                 ; sym2 = sym2->next_with_same_name) { +                assert(sym2->hdr == hdr); +            } +        } +    } +#endif +} + +void +_mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table) +{ +    struct scope_level *const scope = table->current_scope; +    struct symbol *sym = scope->symbols; + +    table->current_scope = scope->next; + +    free(scope); + +    while (sym != NULL) { +        struct symbol *const next = sym->next_with_same_scope; +        struct symbol_header *const hdr = sym->hdr; + +        assert(hdr->symbols == sym); + +        hdr->symbols = sym->next_with_same_name; + +        free(sym); + +        sym = next; +    } + +    check_symbol_table(table); +} + + +void +_mesa_symbol_table_push_scope(struct _mesa_symbol_table *table) +{ +    struct scope_level *const scope = calloc(1, sizeof(*scope)); +     +    scope->next = table->current_scope; +    table->current_scope = scope; +} + + +static struct symbol_header * +find_symbol(struct _mesa_symbol_table *table, const char *name) +{ +    return (struct symbol_header *) hash_table_find(table->ht, name); +} + + +struct _mesa_symbol_table_iterator * +_mesa_symbol_table_iterator_ctor(struct _mesa_symbol_table *table, +                                 int name_space, const char *name) +{ +    struct _mesa_symbol_table_iterator *iter = calloc(1, sizeof(*iter)); +    struct symbol_header *const hdr = find_symbol(table, name); +     +    iter->name_space = name_space; + +    if (hdr != NULL) { +        struct symbol *sym; + +        for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { +            assert(sym->hdr == hdr); + +            if ((name_space == -1) || (sym->name_space == name_space)) { +                iter->curr = sym; +                break; +            } +        } +    } + +    return iter; +} + + +void +_mesa_symbol_table_iterator_dtor(struct _mesa_symbol_table_iterator *iter) +{ +    free(iter); +} + + +void * +_mesa_symbol_table_iterator_get(struct _mesa_symbol_table_iterator *iter) +{ +    return (iter->curr == NULL) ? NULL : iter->curr->data; +} + + +int +_mesa_symbol_table_iterator_next(struct _mesa_symbol_table_iterator *iter) +{ +    struct symbol_header *hdr; + +    if (iter->curr == NULL) { +        return 0; +    } + +    hdr = iter->curr->hdr; +    iter->curr = iter->curr->next_with_same_name; + +    while (iter->curr != NULL) { +        assert(iter->curr->hdr == hdr); + +        if ((iter->name_space == -1) +            || (iter->curr->name_space == iter->name_space)) { +            return 1; +        } + +        iter->curr = iter->curr->next_with_same_name; +    } + +    return 0; +} + + +void * +_mesa_symbol_table_find_symbol(struct _mesa_symbol_table *table, +                               int name_space, const char *name) +{ +    struct symbol_header *const hdr = find_symbol(table, name); + +    if (hdr != NULL) { +        struct symbol *sym; + + +        for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { +            assert(sym->hdr == hdr); + +            if ((name_space == -1) || (sym->name_space == name_space)) { +                return sym->data; +            } +        } +    } + +    return NULL; +} + + +int +_mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table, +                              int name_space, const char *name, +                              void *declaration) +{ +    check_symbol_table(table); + +    struct symbol_header *hdr = find_symbol(table, name); +    struct symbol *sym; + +    check_symbol_table(table); + +    if (hdr == NULL) { +        hdr = calloc(1, sizeof(*hdr)); +        hdr->name = name; + +        hash_table_insert(table->ht, hdr, name); +    } + +    check_symbol_table(table); + +    sym = calloc(1, sizeof(*sym)); +    sym->next_with_same_name = hdr->symbols; +    sym->next_with_same_scope = table->current_scope->symbols; +    sym->hdr = hdr; +    sym->name_space = name_space; +    sym->data = declaration; + +    assert(sym->hdr == hdr); + +    hdr->symbols = sym; +    table->current_scope->symbols = sym; + +    check_symbol_table(table); +    return 0; +} + + +struct _mesa_symbol_table * +_mesa_symbol_table_ctor(void) +{ +    struct _mesa_symbol_table *table = calloc(1, sizeof(*table)); + +    table->ht = hash_table_ctor(32, hash_table_string_hash, +                                hash_table_string_compare); + +    _mesa_symbol_table_push_scope(table); + +    return table; +} diff --git a/src/mesa/shader/symbol_table.h b/src/mesa/shader/symbol_table.h new file mode 100644 index 0000000000..c543615761 --- /dev/null +++ b/src/mesa/shader/symbol_table.h @@ -0,0 +1,54 @@ +/* + * Copyright © 2008 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ +#ifndef MESA_SYMBOL_TABLE_H +#define MESA_SYMBOL_TABLE_H + +struct _mesa_symbol_table; +struct _mesa_symbol_table_iterator; + +extern void _mesa_symbol_table_push_scope(struct _mesa_symbol_table *table); + +extern void _mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table); + +extern int _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *symtab, +    int name_space, const char *name, void *declaration); + +extern void *_mesa_symbol_table_find_symbol( +    struct _mesa_symbol_table *symtab, int name_space, const char *name); + +extern struct _mesa_symbol_table *_mesa_symbol_table_ctor(void); + + +extern struct _mesa_symbol_table_iterator *_mesa_symbol_table_iterator_ctor( +    struct _mesa_symbol_table *table, int name_space, const char *name); + +extern void _mesa_symbol_table_iterator_dtor( +    struct _mesa_symbol_table_iterator *); + +extern void *_mesa_symbol_table_iterator_get( +    struct _mesa_symbol_table_iterator *iter); + +extern int _mesa_symbol_table_iterator_next( +    struct _mesa_symbol_table_iterator *iter); + +#endif /* MESA_SYMBOL_TABLE_H */ diff --git a/src/mesa/sources.mak b/src/mesa/sources.mak index b4b36368cf..f07f96d69e 100644 --- a/src/mesa/sources.mak +++ b/src/mesa/sources.mak @@ -218,21 +218,27 @@ SHADER_SOURCES = \  	shader/arbprogram.c \  	shader/atifragshader.c \  	shader/grammar/grammar_mesa.c \ +	shader/hash_table.c \ +	shader/lex.yy.c \  	shader/nvfragparse.c \  	shader/nvprogram.c \  	shader/nvvertparse.c \  	shader/program.c \ +	shader/program_parse.tab.c \ +	shader/program_parse_extra.c \  	shader/prog_cache.c \  	shader/prog_execute.c \  	shader/prog_instruction.c \  	shader/prog_noise.c \  	shader/prog_optimize.c \  	shader/prog_parameter.c \ +	shader/prog_parameter_layout.c \  	shader/prog_print.c \  	shader/prog_statevars.c \  	shader/prog_uniform.c \  	shader/programopt.c \ -	shader/shader_api.c \ +	shader/symbol_table.c \ +	shader/shader_api.c  SLANG_SOURCES =	\  	shader/slang/slang_builtin.c	\  | 
