/****************************************************************************
*                   parse.h
*
*  This header file is included by all all language parsing C modules in 
*  POV-Ray.     
*
*  from Persistence of Vision Raytracer
*  Copyright 1993 Persistence of Vision Team
*---------------------------------------------------------------------------
*  NOTICE: This source code file is provided so that users may experiment
*  with enhancements to POV-Ray and to port the software to platforms other 
*  than those supported by the POV-Ray Team.  There are strict rules under
*  which you are permitted to use this file.  The rules are in the file
*  named POVLEGAL.DOC which should be distributed with this file. If 
*  POVLEGAL.DOC is not available or for more info please contact the POV-Ray
*  Team Coordinator by leaving a message in CompuServe's Graphics Developer's
*  Forum.  The latest version of POV-Ray may be found there as well.
*
* This program is based on the popular DKB raytracer version 2.12.
* DKBTrace was originally written by David K. Buck.
* DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
*
*****************************************************************************/

/* Here we create our own little language for doing the parsing.  It
makes the code easier to read. */

#define EXPECT { int Exit_Flag; Exit_Flag = FALSE; \
 while (!Exit_Flag) {Get_Token();  switch (Token.Token_Id) {
#define CASE(x) case x:
#define CASE2(x, y) case x: case y:
#define CASE3(x, y, z) case x: case y: case z:
#define CASE4(w, x, y, z) case w: case x: case y: case z:
#define CASE5(v, w, x, y, z) case v: case w: case x: case y: case z:
#define CASE6(u, v, w, x, y, z) case u: case v: case w: case x: case y: case z:
#define END_CASE break;
#define EXIT Exit_Flag = TRUE;
#define OTHERWISE default:
#define END_EXPECT } } }
#define GET(x) Get_Token(); if (Token.Token_Id != x) Parse_Error (x);
#define UNGET Unget_Token();
#define CASE_VECTOR CASE3 (LEFT_PAREN_TOKEN, VECTOR_ID_TOKEN, FLOAT_ID_TOKEN)\
 CASE5 (CLOCK_TOKEN, LEFT_ANGLE_TOKEN, PLUS_TOKEN, DASH_TOKEN, FLOAT_TOKEN)\
 CASE4 (X_TOKEN, Y_TOKEN, Z_TOKEN, VERSION_TOKEN) UNGET
#define CASE_FLOAT CASE3 (LEFT_PAREN_TOKEN, FLOAT_ID_TOKEN, CLOCK_TOKEN)\
 CASE4 (PLUS_TOKEN, DASH_TOKEN, FLOAT_TOKEN, VERSION_TOKEN) UNGET

#define MAX_BRACES 200

#define CASEID(x,y) case x:Token.Token_Id=y;break;

/* Token Definitions for Parser */
                               
#define ADAPTIVE_TOKEN            0
#define AGATE_TOKEN               1
#define ALL_TOKEN                 2
#define ALPHA_TOKEN               3
#define AMBIENT_TOKEN             4
#define AMPERSAND_TOKEN           5
#define AREA_LIGHT_TOKEN          6
#define AT_TOKEN                  7
#define BACK_QUOTE_TOKEN          8
#define BACK_SLASH_TOKEN          9
#define BAR_TOKEN                10
#define BICUBIC_PATCH_TOKEN      11
#define BLOB_TOKEN               12
#define BLUE_TOKEN               13
#define BOUNDED_BY_TOKEN         14
#define BOX_TOKEN                15
#define BOZO_TOKEN               16
#define BRICK_TOKEN              17
#define BRILLIANCE_TOKEN         18
#define BUMPS_TOKEN              19
#define BUMPY1_TOKEN             20
#define BUMPY2_TOKEN             21
#define BUMPY3_TOKEN             22
#define BUMP_MAP_TOKEN           23
#define BUMP_SIZE_TOKEN          24
#define CAMERA_ID_TOKEN          25
#define CAMERA_TOKEN             26
#define CHECKER_TOKEN            27
#define CLIPPED_BY_TOKEN         28
#define CLOCK_TOKEN              29
#define COLON_TOKEN              30
#define COLOR_MAP_TOKEN          31
#define COLOR_TOKEN              32
#define COLOUR_ID_TOKEN          33
#define COLOUR_MAP_ID_TOKEN      34
#define COLOUR_MAP_TOKEN         35
#define COLOUR_TOKEN             36
#define COMMA_TOKEN              37
#define COMPONENT_TOKEN          38
#define COMPOSITE_TOKEN          39
#define CONE_TOKEN               40
#define CRAND_TOKEN              41
#define CUBIC_TOKEN              42
#define CYLINDER_TOKEN           43
#define DASH_TOKEN               44
#define DECLARE_TOKEN            45
#define DEFAULT_TOKEN            46
#define DENTS_TOKEN              47
#define DIFFERENCE_TOKEN         48
#define DIFFUSE_TOKEN            49
#define DIRECTION_TOKEN          50
#define DISC_TOKEN               51
#define DISTANCE_TOKEN           52
#define DOLLAR_TOKEN             53
#define DUMP_TOKEN               54
#define END_OF_FILE_TOKEN        55
#define EQUALS_TOKEN             56
#define EXCLAMATION_TOKEN        57
#define FALLOFF_TOKEN            58
#define FINISH_ID_TOKEN          59
#define FINISH_TOKEN             60
#define FLATNESS_TOKEN           61
#define FLOAT_ID_TOKEN           62
#define FLOAT_TOKEN              63
#define FOG_TOKEN                64
#define FREQUENCY_TOKEN          65
#define GIF_TOKEN                66
#define GRADIENT_TOKEN           67
#define GRANITE_TOKEN            68
#define GREEN_TOKEN              69
#define HASH_TOKEN               70
#define HAT_TOKEN                71
#define HEIGHT_FIELD_TOKEN       72
#define HEXAGON_TOKEN            73
#define IDENTIFIER_TOKEN         74
#define IFF_TOKEN                75
#define IMAGE_MAP_TOKEN          76
#define INCLUDE_TOKEN            77
#define INTERPOLATE_TOKEN        78
#define INTERSECTION_TOKEN       79
#define INVERSE_TOKEN            80
#define IOR_TOKEN                81
#define JITTER_TOKEN             82
#define LAMBDA_TOKEN             83
#define LEFT_ANGLE_TOKEN         84
#define LEFT_CURLY_TOKEN         85
#define LEFT_PAREN_TOKEN         86
#define LEFT_SQUARE_TOKEN        87
#define LEOPARD_TOKEN            88
#define LIGHT_SOURCE_TOKEN       89
#define LOCATION_TOKEN           90
#define LOOKS_LIKE_TOKEN         91
#define LOOK_AT_TOKEN            92
#define MANDEL_TOKEN             93 
#define MAP_TYPE_TOKEN           94
#define MARBLE_TOKEN             95
#define MATERIAL_MAP_TOKEN       96
#define MAX_INTERSECTIONS        97
#define MAX_TRACE_LEVEL_TOKEN    98
#define MERGE_TOKEN              99
#define METALLIC_TOKEN          100
#define MORTAR_TOKEN            101
#define NO_SHADOW_TOKEN         102
#define OBJECT_ID_TOKEN         103
#define OBJECT_TOKEN            104
#define OCTAVES_TOKEN           105 
#define OMEGA_TOKEN             106
#define ONCE_TOKEN              107
#define ONION_TOKEN             108
#define PAINTED1_TOKEN          109
#define PAINTED2_TOKEN          110
#define PAINTED3_TOKEN          111
#define PERCENT_TOKEN           112
#define PHASE_TOKEN             113
#define PHONG_SIZE_TOKEN        114
#define PHONG_TOKEN             115
#define PIGMENT_ID_TOKEN        116
#define PIGMENT_TOKEN           117
#define PLANE_TOKEN             118
#define PLUS_TOKEN              119
#define POINT_AT_TOKEN          120
#define POLY_TOKEN              121
#define POT_TOKEN               122
#define QUADRIC_TOKEN           123
#define QUARTIC_TOKEN           124
#define QUESTION_TOKEN          125
#define QUICK_COLOR_TOKEN       126
#define QUICK_COLOUR_TOKEN      127
#define RADIAL_TOKEN            128
#define RADIUS_TOKEN            129
#define RAW_TOKEN               130
#define RED_TOKEN               131
#define REFLECTION_TOKEN        132
#define REFRACTION_TOKEN        133
#define RGBF_TOKEN              134
#define RGB_TOKEN               135
#define RIGHT_ANGLE_TOKEN       136
#define RIGHT_CURLY_TOKEN       137
#define RIGHT_PAREN_TOKEN       138
#define RIGHT_SQUARE_TOKEN      139
#define RIGHT_TOKEN             140
#define RIPPLES_TOKEN           141
#define ROTATE_TOKEN            142
#define ROUGHNESS_TOKEN         143
#define SCALE_TOKEN             144
#define SEMI_COLON_TOKEN        145
#define SINGLE_QUOTE_TOKEN      146
#define SKY_TOKEN               147
#define SLASH_TOKEN             148
#define SMOOTH_TOKEN            149
#define SMOOTH_TRIANGLE_TOKEN   150
#define SPECULAR_TOKEN          151
#define SPHERE_TOKEN            152
#define SPOTLIGHT_TOKEN         153
#define SPOTTED_TOKEN           154
#define STAR_TOKEN              155
#define STRING_TOKEN            156
#define STURM_TOKEN             157
#define TEXTURE_ID_TOKEN        158
#define TEXTURE_TOKEN           159
#define TGA_TOKEN               160
#define THRESHOLD_TOKEN         161
#define TIGHTNESS_TOKEN         162
#define TILDE_TOKEN             163
#define TILE2_TOKEN             164
#define TILES_TOKEN             165
#define TNORMAL_ID_TOKEN        166
#define TNORMAL_TOKEN           167
#define TORUS_TOKEN             168
#define TRACK_TOKEN             169
#define TRANSFORM_ID_TOKEN      170
#define TRANSFORM_TOKEN         171
#define TRANSLATE_TOKEN         172
#define TRIANGLE_TOKEN          173
#define TURBULENCE_TOKEN        174
#define TYPE_TOKEN              175
#define UNION_TOKEN             176
#define UP_TOKEN                177
#define USE_COLOR_TOKEN         178
#define USE_COLOUR_TOKEN        179
#define USE_INDEX_TOKEN         180
#define U_STEPS_TOKEN           181
#define VECTOR_ID_TOKEN         182
#define VERSION_TOKEN           183
#define V_STEPS_TOKEN           184
#define WATER_LEVEL_TOKEN       185
#define WAVES_TOKEN             186
#define WOOD_TOKEN              187
#define WRINKLES_TOKEN          188
#define X_TOKEN                 189
#define Y_TOKEN                 190
#define Z_TOKEN                 191
#define BACKGROUND_TOKEN        192
#define OPEN_TOKEN              193
#define FILTER_TOKEN            194
#define AGATE_TURB_TOKEN        195
#define LAST_TOKEN              196
