home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch5_5 / pov.y < prev    next >
Text File  |  1995-03-04  |  23KB  |  619 lines

  1. %{
  2.  
  3. #include <iostream.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6.  
  7. #include "global.h"
  8.  
  9. //      DECLARATIONS
  10.  
  11. texture *deftexture;
  12. declarations<object> odecls;
  13. declarations<texture> tdecls;
  14. declarations<pigment> pdecls;
  15. declarations<normal> ndecls;
  16. declarations<finish> fdecls;
  17. declarations<color> cdecls;
  18. declarations<colormap> cmdecls;
  19. declarations<vector> vdecls;
  20. declarations<camera> camdecls;
  21.  
  22. int max_intersections=64;
  23. double version=2.2;
  24. double clock=0.;
  25. intensity background=intensity(0.,0.,0.);
  26.  
  27. %}
  28.  
  29. %start  items
  30.  
  31. %union {
  32.         int ival;
  33.         double dval;
  34.         char* sval;
  35.         vector* vval;
  36.         object* oval;
  37.         color* cval;
  38.         list<object*>* olval;
  39.         texture* tval;
  40.         pigment* pval;
  41.         normal* nval;
  42.         finish* fval;
  43.         camera* camval;
  44.         colormap* cmval;
  45.         lightsource *lval;
  46. }
  47.  
  48. /*
  49. *       KEYWORD TOKENS
  50. */
  51. %token  <ival> ADAPTIVE
  52. %token  <ival> AGATE
  53. %token  <ival> AGATE_TURB
  54. %token  <ival> ALL
  55. %token  <ival> ALPHA
  56. %token  <ival> AMBIENT
  57. %token  <ival> AREA_LIGHT
  58. %token  <ival> BACKGROUND
  59. %token  <ival> BICUBIC_PATCH
  60. %token  <ival> BLOB
  61. %token  <ival> BLUE
  62. %token  <ival> BOUNDED_BY
  63. %token  <ival> BOX
  64. %token  <ival> BOZO
  65. %token  <ival> BRICK
  66. %token  <ival> BRILLIANCE
  67. %token  <ival> BUMPS
  68. %token  <ival> BUMPY1
  69. %token  <ival> BUMPY2
  70. %token  <ival> BUMPY3
  71. %token  <ival> BUMP_MAP
  72. %token  <ival> BUMP_SIZE
  73. %token  <ival> CAMERA_ID
  74. %token  <ival> CAMERA
  75. %token  <ival> CHECKER
  76. %token  <ival> CLIPPED_BY
  77. %token  <ival> CLOCK
  78. %token  <ival> COLOR_ID
  79. %token  <ival> COLOR_MAP_ID
  80. %token  <ival> COLOR_MAP
  81. %token  <ival> COLOR
  82. %token  <ival> COMPONENT
  83. %token  <ival> COMPOSITE
  84. %token  <ival> CONE
  85. %token  <ival> CRAND
  86. %token  <ival> CUBIC
  87. %token  <ival> CYLINDER
  88. %token  <ival> DECLARE
  89. %token  <ival> DEFAULT
  90. %token  <ival> DENTS
  91. %token  <ival> DIFFERENCE
  92. %token  <ival> DIFFUSE
  93. %token  <ival> DIRECTION
  94. %token  <ival> DISC
  95. %token  <ival> DISTANCE
  96. %token  <ival> DUMP
  97. %token  <ival> END_OF_FILE
  98. %token  <ival> FALLOFF
  99. %token  <ival> FILTER
  100. %token  <ival> FINISH_ID
  101. %token  <ival> FINISH
  102. %token  <ival> FLATNESS
  103. %token  <ival> FLOAT_ID
  104. %token  <ival> FLOAT
  105. %token  <ival> FOG
  106. %token  <ival> FREQUENCY
  107. %token  <ival> GIF
  108. %token  <ival> GRADIENT
  109. %token  <ival> GRANITE
  110. %token  <ival> GREEN
  111. %token  <ival> HEIGHT_FIELD
  112. %token  <ival> HEXAGON
  113. %token  <ival> IFF
  114. %token  <ival> IMAGE_MAP
  115. %token  <ival> INCLUDE
  116. %token  <ival> INTERPOLATE
  117. %token  <ival> INTERSECTION
  118. %token  <ival> INVERSE
  119. %token  <ival> IOR
  120. %token  <ival> JITTER
  121. %token  <ival> LAMBDA
  122. %token  <ival> LEOPARD
  123. %token  <ival> LIGHT_SOURCE
  124. %token  <ival> LOCATION
  125. %token  <ival> LOOKS_LIKE
  126. %token  <ival> LOOK_AT
  127. %token  <ival> MANDEL
  128. %token  <ival> MAP_TYPE
  129. %token  <ival> MARBLE
  130. %token  <ival> MATERIAL_MAP
  131. %token  <ival> MAX_INTERSECTIONS
  132. %token  <ival> MAX_TRACE_LEVEL
  133. %token  <ival> MERGE
  134. %token  <ival> METALLIC
  135. %token  <ival> MORTAR
  136. %token  <ival> NO_SHADOW
  137. %token  <ival> OBJECT_ID
  138. %token  <ival> OBJECT
  139. %token  <ival> OCTAVES
  140. %token  <ival> OMEGA
  141. %token  <ival> ONCE
  142. %token  <ival> ONION
  143. %token  <ival> OPEN
  144. %token  <ival> PAINTED1
  145. %token  <ival> PAINTED2
  146. %token  <ival> PAINTED3
  147. %token  <ival> PHASE
  148. %token  <ival> PHONG_SIZE
  149. %token  <ival> PHONG
  150. %token  <ival> PIGMENT_ID
  151. %token  <ival> PIGMENT
  152. %token  <ival> PLANE
  153. %token  <ival> POINT_AT
  154. %token  <ival> POLY
  155. %token  <ival> POT
  156. %token  <ival> QUADRIC
  157. %token  <ival> QUARTIC
  158. %token  <ival> QUICK_COLOR
  159. %token  <ival> RADIAL
  160. %token  <ival> RADIUS
  161. %token  <ival> RAW
  162. %token  <ival> RED
  163. %token  <ival> REFLECTION
  164. %token  <ival> REFRACTION
  165. %token  <ival> RGBF
  166. %token  <ival> RGB
  167. %token  <ival> RIGHT
  168. %token  <ival> RIPPLES
  169. %token  <ival> ROTATE
  170. %token  <ival> ROUGHNESS
  171. %token  <ival> SCALE
  172. %token  <ival> SKY
  173. %token  <ival> SMOOTH
  174. %token  <ival> SMOOTH_TRIANGLE
  175. %token  <ival> SPECULAR
  176. %token  <ival> SPHERE
  177. %token  <ival> SPOTLIGHT
  178. %token  <ival> SPOTTED
  179. %token  <ival> STRING
  180. %token  <ival> STURM
  181. %token  <ival> TEXTURE_ID
  182. %token  <ival> TEXTURE
  183. %token  <ival> TGA
  184. %token  <ival> THRESHOLD
  185. %token  <ival> TIGHTNESS
  186. %token  <ival> TILE2
  187. %token  <ival> TILES
  188. %token  <ival> TNORMAL_ID
  189. %token  <ival> NORMAL
  190. %token  <ival> TORUS
  191. %token  <ival> TRACK
  192. %token  <ival> TRANSFORM_ID
  193. %token  <ival> TRANSFORM
  194. %token  <ival> TRANSLATE
  195. %token  <ival> TRIANGLE
  196. %token  <ival> TURBULENCE
  197. %token  <ival> TYPE
  198. %token  <ival> UNION
  199. %token  <ival> UP
  200. %token  <ival> USE_COLOR
  201. %token  <ival> USE_INDEX
  202. %token  <ival> U_STEPS
  203. %token  <ival> VECTOR_ID
  204. %token  <ival> VERSION
  205. %token  <ival> V_STEPS
  206. %token  <ival> WATER_LEVEL
  207. %token  <ival> WAVES
  208. %token  <ival> WOOD
  209. %token  <ival> WRINKLES
  210. %token  <ival> X
  211. %token  <ival> Y
  212. %token  <ival> Z
  213. /*
  214. *       OTHER TOKENS
  215. */
  216. %token  <dval> LITERAL
  217. %token  <sval> IDENTIFIER
  218. /*
  219. *       NONTERMINALS
  220. */
  221. %type   <vval> expr
  222. %type   <oval> object objopts
  223. %type   <olval> objects moreobjects
  224. %type   <cval> color colorvalues
  225. %type   <tval> texture textureitems
  226. %type   <pval> pigment pigmentitems pigmentpatt
  227. %type   <nval> normal normalitems normalpatt
  228. %type   <fval> finish finishitems
  229. %type   <camval> camera cameraitems
  230. %type   <cmval> colormap colormapitems
  231. %type   <sval> identifier
  232. %type   <lval> lightsource lightsrcitems lightsrctype spotlight
  233. %type   <vval> tightness
  234.  
  235.  
  236. %left   '+' '-'
  237. %left   '*' '/'
  238. %left   UMINUS
  239.  
  240. %%
  241. /*
  242. *       SCENE FILE ITEMS AT TOP LEVEL
  243. */
  244. items   :       /* empty */
  245.                         {deftexture=new texture;}
  246.         |       items item
  247.         ;
  248.  
  249. item    :       camera
  250.                         {actcamera=*$1; delete $1;}
  251.         |       object
  252.                         {{if(verbose) cout<<*$1;} objects+=$1;}
  253.         |       lightsource
  254.                         {lightsources+=$1;}
  255.         |       '#' DECLARE identifier '=' object
  256.                         {odecls+=new declaration<object>($3,$5);}
  257.         |       '#' DECLARE identifier '=' texture
  258.                         {tdecls+=new declaration<texture>($3,$5);}
  259.         |       '#' DECLARE identifier '=' pigment
  260.                         {pdecls+=new declaration<pigment>($3,$5);}
  261.         |       '#' DECLARE identifier '=' normal
  262.                         {ndecls+=new declaration<normal>($3,$5);}
  263.         |       '#' DECLARE identifier '=' finish
  264.                         {fdecls+=new declaration<finish>($3,$5);}
  265.         |       '#' DECLARE identifier '=' color
  266.                         {cdecls+=new declaration<color>($3,$5);}
  267.         |       '#' DECLARE identifier '=' colormap
  268.                         {cmdecls+=new declaration<colormap>($3,$5);}
  269.         |       '#' DECLARE identifier '=' expr
  270.                         {vdecls+=new declaration<vector>($3,$5);}
  271.         |       '#' DECLARE identifier '=' camera
  272.                         {camdecls+=new declaration<camera>($3,$5);}
  273.         |       '#' MAX_TRACE_LEVEL expr
  274.                         {lmax=(int)((double)*$3); delete $3;}
  275.         |       '#' MAX_INTERSECTIONS expr
  276.                         {max_intersections=(int)((double)*$3); delete $3;}
  277.         |       '#' VERSION expr
  278.                         {version=(double)*$3; delete $3;}
  279.         |       '#' DEFAULT '{' texture '}'
  280.                         {delete deftexture; deftexture=$4;}
  281.         |       '#' DEFAULT '{' pigment '}'
  282.                         {deftexture->setp(*$4); delete $4;}
  283.         |       '#' DEFAULT '{' normal '}'
  284.                         {deftexture->setn(*$4); delete $4;}
  285.         |       '#' DEFAULT '{' finish '}'
  286.                         {deftexture->setf(*$4); delete $4;}
  287.         |       BACKGROUND '{' color '}'
  288.                         {background=(intensity)(*$3); delete $3;}
  289.         ;
  290.  
  291. identifier      :       IDENTIFIER
  292.                                 {$$=new char[strlen($1)+1]; strcpy($$,$1);}
  293.                 ;
  294.  
  295. /*
  296. *       FLOAT AND VECTOR EXPRESSIONS UNIFIED IN ORDER TO GET LR(1) GRAMMAR
  297. */
  298. expr    :       LITERAL
  299.                         {$$=new vector($1,$1,$1);}
  300.         |       identifier
  301.                         {$$=new vector; *$$=*vdecls[$1]; delete $1;}
  302.         |       X
  303.                         {$$=new vector(1.,0.,0.);}
  304.         |       Y
  305.                         {$$=new vector(0.,1.,0.);}
  306.         |       Z
  307.                         {$$=new vector(0.,0.,1.);}
  308.         |       '<' expr ',' expr ',' expr '>'
  309.                         {$$=new vector((double)*$2,(double)*$4,(double)*$6);
  310.                          delete $2; delete $4; delete $6;}
  311.         |       expr '+' expr
  312.                         {$$=new vector; *$$=*$1+*$3; delete $1; delete $3;}
  313.         |       expr '-' expr
  314.                         {$$=new vector; *$$=*$1-*$3; delete $1; delete $3;}
  315.         |       expr '*' expr
  316.                         {$$=new vector; *$$=*$1*(*$3); delete $1; delete $3;}
  317.         |       expr '/' expr
  318.                         {$$=new vector; *$$=*$1/(*$3); delete $1; delete $3;}
  319.         |       '-' expr %prec UMINUS
  320.                         {$$=new vector; *$$=-*$2; delete $2;}
  321.         |       '(' expr ')'
  322.                         {$$=$2;}
  323.         ;
  324. /*
  325. *               CAMERA DEFINITION
  326. */
  327. camera          :       CAMERA '{' cameraitems '}'
  328.                                 {$$=$3;}
  329.                 ;
  330.  
  331. cameraitems     :       /* empty */
  332.                                 {$$=new camera;}
  333.                 |       cameraitems identifier
  334.                                 {$$=$1; *$$=actcamera /* *camdecls[$2] */ ; delete $2;}
  335.                 |       cameraitems LOCATION expr
  336.                                 {$$=$1; $$->setl(*$3); delete $3;}
  337.                 |       cameraitems SKY expr
  338.                                 {$$=$1; $$->sets(*$3); delete $3;}
  339.                 |       cameraitems DIRECTION expr
  340.                                 {$$=$1; $$->setd(*$3); delete $3;}
  341.                 |       cameraitems UP expr
  342.                                 {$$=$1; $$->setu(*$3); delete $3;}
  343.                 |       cameraitems RIGHT expr
  344.                                 {$$=$1; $$->setr(*$3); delete $3;}
  345.                 |       cameraitems LOOK_AT expr
  346.                                 {$$=$1; $$->seta(*$3); delete $3;}
  347.                 |       cameraitems TRANSLATE expr
  348.                                 {$$=$1; $$->traT(*$3); delete $3;}
  349.                 |       cameraitems ROTATE expr
  350.                                 {$$=$1; $$->rotT(*$3); delete $3;}
  351.                 |       cameraitems SCALE expr
  352.                                 {$$=$1; $$->scaT(*$3); delete $3;}
  353.                 ;
  354. /*
  355. *               LIGHTSOURCE
  356. */
  357. lightsource     :       LIGHT_SOURCE '{' expr color lightsrcitems '}'
  358.                                 {$$=$5; $$->setp(*$3); $$->setc(*$4);
  359.                                  delete $3; delete $4;}
  360.                 ;
  361.  
  362. lightsrcitems   :       /* empty */
  363.                                 {$$=new lightsource;}
  364.                 |       lightsrcitems lightsrctype
  365.                                 {$$=$2; *$$=*$1; delete $1;}
  366.                 |       lightsrcitems TRANSLATE expr
  367.                                 {$$=$1; $$->traT(*$3); delete $3;}
  368.                 |       lightsrcitems ROTATE expr
  369.                                 {$$=$1; $$->rotT(*$3); delete $3;}
  370.                 |       lightsrcitems SCALE expr
  371.                                 {$$=$1; $$->scaT(*$3); delete $3;}
  372.                 ;
  373.  
  374. lightsrctype    :       spotlight
  375.                                 {$$=$1;}
  376.                 ;
  377.  
  378. spotlight       :       SPOTLIGHT
  379.                         POINT_AT expr RADIUS expr FALLOFF expr tightness
  380.                                 {$$=new spotlight(*$3,(double)*$5,(double)*$7,
  381.                                                   (double)*$8);
  382.                                  delete $3; delete $5; delete $7; delete $8;}
  383.                 ;
  384.  
  385. tightness       :       /* empty */
  386.                                 {$$=new vector(10.,10.,10.);}
  387.                 |       TIGHTNESS expr
  388.                                 {$$=$2;}
  389.                 ;
  390. /*
  391. *               OBJECT GEOMETRY
  392. */
  393. object          :       OBJECT '{' identifier objopts '}'
  394.                                 {$$=odecls[$3]->copy(); *$$=*$4;
  395.                                  delete $3; delete $4;}
  396.                 |       SPHERE '{' expr ',' expr objopts '}'
  397.                                 {$$=new sphere(*$3,(double)*$5); *$$=*$6;
  398.                                  delete $3; delete $5; delete $6;}
  399.                 |       UNION '{' objects objopts '}'
  400.                                 {$$=new csguni($3); *$$=*$4; delete $4;}
  401.                 |       MERGE '{' objects objopts '}'
  402.                                 {$$=new csgmer($3); *$$=*$4; delete $4;}
  403.                 |       INTERSECTION '{' objects objopts '}'
  404.                                 {$$=new csgint($3); *$$=*$4; delete $4;}
  405.                 |       DIFFERENCE '{' objects objopts '}'
  406.                                 {$$=new csgdif($3); *$$=*$4; delete $4;}
  407.                 ;
  408.  
  409. objects         :       object object moreobjects
  410.                                 {$$=$3; *$$+=$2; *$$+=$1;}
  411.                 ;
  412.                 
  413. moreobjects     :       /* empty */
  414.                                 {$$=new list<object*>;}
  415.                 |       moreobjects object
  416.                                 {$$=$1; *$$+=$2;}
  417.                 ;
  418. /*
  419. *               OBJECT OPTIONS
  420. */
  421. objopts         :       /* empty */
  422.                                 {$$=new object; $$->sett(*deftexture);}
  423.                 |       objopts texture
  424.                                 {$$=$1; $$->sett(*$2); delete $2;}
  425.                 |       objopts pigment
  426.                                 {$$=$1; $$->setp(*$2); delete $2;}
  427.                 |       objopts normal
  428.                                 {$$=$1; $$->setn(*$2); delete $2;}
  429.                 |       objopts finish
  430.                                 {$$=$1; $$->setf(*$2); delete $2;}
  431.                 |       objopts TRANSLATE expr
  432.                                 {$$=$1; $$->traT(*$3); delete $3;}
  433.                 |       objopts ROTATE expr
  434.                                 {$$=$1; $$->rotT(*$3); delete $3;}
  435.                 |       objopts SCALE expr
  436.                                 {$$=$1; $$->scaT(*$3); delete $3;}
  437.                 ;
  438. /*
  439. *               TEXTURES
  440. */
  441. texture         :       TEXTURE '{' textureitems '}'
  442.                                 {$$=$3;}
  443.                 |       texture TEXTURE '{' textureitems '}'
  444.                                 {$$=$1; *$$+=$4;}
  445.                 ;
  446.  
  447. textureitems    :       /* empty */
  448.                                 {$$=new texture; *$$=*deftexture;}
  449.                 |       textureitems identifier
  450.                                 {delete $1; $$=tdecls[$2]->copy(); delete $2;}
  451.                 |       textureitems PIGMENT '{' pigmentitems '}'
  452.                                 {$$=$1; $$->setp(*$4); delete $4;}
  453.                 |       textureitems NORMAL '{' normalitems '}'
  454.                                 {$$=$1; $$->setn(*$4); delete $4;}
  455.                 |       textureitems FINISH '{' finishitems '}'
  456.                                 {$$=$1; $$->setf(*$4); delete $4;}
  457.                 |       textureitems TRANSLATE expr
  458.                                 {$$=$1; $$->traT(*$3); delete $3;}
  459.                 |       textureitems ROTATE expr
  460.                                 {$$=$1; $$->rotT(*$3); delete $3;}
  461.                 |       textureitems SCALE expr
  462.                                 {$$=$1; $$->scaT(*$3); delete $3;}
  463.                 ;
  464. /*
  465. *               PIGMENT
  466. */
  467. pigment         :       PIGMENT '{' pigmentitems '}'
  468.                                 {$$=$3;}
  469.                 ;
  470.  
  471. pigmentitems    :       /* empty */
  472.                                 {$$=deftexture->copyp();}
  473.                 |       pigmentitems identifier
  474.                                 {delete $1; $$=pdecls[$2]->copy(); delete $2;}
  475.                 |       pigmentitems pigmentpatt
  476.                                 {$$=$2; *$$|=*$1; delete $1;}
  477.                 |       pigmentitems TURBULENCE expr
  478.                                 {$$=$1; $$->sett(*$3); delete $3;}
  479.                 |       pigmentitems OCTAVES expr
  480.                                 {$$=$1;$$->seto((int)((double)*$3));delete $3;}
  481.                 |       pigmentitems OMEGA expr
  482.                                 {$$=$1; $$->setm((double)*$3); delete $3;}
  483.                 |       pigmentitems LAMBDA expr
  484.                                 {$$=$1; $$->setl((double)*$3); delete $3;}
  485.                 |       pigmentitems FREQUENCY expr
  486.                                 {$$=$1; $$->setf((double)*$3); delete $3;}
  487.                 |       pigmentitems PHASE expr
  488.                                 {$$=$1; $$->setp((double)*$3); delete $3;}
  489.                 |       pigmentitems TRANSLATE expr
  490.                                 {$$=$1; $$->traT(*$3); delete $3;}
  491.                 |       pigmentitems ROTATE expr
  492.                                 {$$=$1; $$->rotT(*$3); delete $3;}
  493.                 |       pigmentitems SCALE expr
  494.                                 {$$=$1; $$->scaT(*$3); delete $3;}
  495.                 ;
  496.  
  497. pigmentpatt     :       color
  498.                                 {$$=new solid(*$1); delete $1;}
  499.                 |       CHECKER
  500.                                 {$$=new checker;}
  501.                 |       CHECKER color
  502.                                 {$$=new checker(*$2); delete $2;}
  503.                 |       CHECKER color color
  504.                                 {$$=new checker(*$2,*$3);delete $2;delete $3;}
  505.                 ;
  506.  
  507. color           :       COLOR identifier
  508.                                 {$$=new color; *$$=*cdecls[$2]; delete $2;}
  509.                 |       COLOR RGB '<' expr ',' expr ',' expr '>'
  510.                                 {$$=new color((double)*$4,(double)*$6,
  511.                                               (double)*$8); 
  512.                                  delete $4; delete $6; delete $8;}
  513.                 |       COLOR RGBF '<' expr ',' expr ',' expr ',' expr '>'
  514.                                 {$$=new color((double)*$4,(double)*$6,
  515.                                               (double)*$8,(double)*$10); 
  516.                                  delete $4; delete $6; delete $8; delete $10;}
  517.                 |       COLOR colorvalues
  518.                                 {$$=$2;}
  519.                 ;
  520.  
  521. colorvalues     :       RED expr
  522.                                 {$$=new color;$$->setr((double)*$2);delete $2;}
  523.                 |       GREEN expr
  524.                                 {$$=new color;$$->setg((double)*$2);delete $2;}
  525.                 |       BLUE expr
  526.                                 {$$=new color;$$->setb((double)*$2);delete $2;}
  527.                 |       FILTER expr
  528.                                 {$$=new color;$$->setf((double)*$2);delete $2;}
  529.                 |       colorvalues RED expr
  530.                                 {$$=$1; $$->setr((double)*$3); delete $3;}
  531.                 |       colorvalues GREEN expr
  532.                                 {$$=$1; $$->setg((double)*$3); delete $3;}
  533.                 |       colorvalues BLUE expr
  534.                                 {$$=$1; $$->setb((double)*$3); delete $3;}
  535.                 |       colorvalues FILTER expr
  536.                                 {$$=$1; $$->setf((double)*$3); delete $3;}
  537.                 ;
  538.  
  539. colormap        :       COLOR_MAP '{' identifier colormapitems '}'
  540.                                 {$$=cmdecls[$3]->copy(); delete $3; delete $4;}
  541.                 |       COLOR_MAP '{' colormapitems '}'
  542.                                 {$$=$3;}
  543.                 ;
  544.  
  545. colormapitems   :       /* empty */
  546.                                 {$$=new colormap;}
  547.                 ;
  548. /*
  549. *               NORMAL
  550. */
  551. normal          :       NORMAL '{' normalitems '}'
  552.                                 {$$=$3;}
  553.                 ;
  554.  
  555. normalitems     :       /* empty */
  556.                                 {$$=deftexture->copyn();}
  557.                 |       normalitems identifier
  558.                                 {delete $1; $$=ndecls[$2]->copy(); delete $2;}
  559.                 |       normalitems normalpatt
  560.                                 {$$=$2; *$$|=*$1; delete $1;}
  561.                 |       normalitems TURBULENCE expr
  562.                                 {$$=$1; $$->sett(*$3); delete $3;}
  563.                 |       normalitems FREQUENCY expr
  564.                                 {$$=$1; $$->setf((double)*$3); delete $3;}
  565.                 |       normalitems PHASE expr
  566.                                 {$$=$1; $$->setp((double)*$3); delete $3;}
  567.                 |       normalitems TRANSLATE expr
  568.                                 {$$=$1; $$->traT(*$3); delete $3;}
  569.                 |       normalitems ROTATE expr
  570.                                 {$$=$1; $$->rotT(*$3); delete $3;}
  571.                 |       normalitems SCALE expr
  572.                                 {$$=$1; $$->scaT(*$3); delete $3;}
  573.                 ;
  574.  
  575. normalpatt      :       BUMPS expr
  576.                                 {$$=new bumps((double)*$2); delete $2;}
  577.                 |       DENTS expr
  578.                                 {$$=new dents((double)*$2); delete $2;}
  579.                 ;
  580. /*
  581. *               FINISH
  582. */
  583. finish          :       FINISH '{' finishitems '}'
  584.                                 {$$=$3;}
  585.                 ;
  586.  
  587. finishitems     :       /* empty */
  588.                                 {$$=deftexture->copyf();}
  589.                 |       finishitems identifier
  590.                                 {delete $1; $$=fdecls[$2]->copy(); delete $2;}
  591.                 |       finishitems DIFFUSE expr
  592.                                 {$$=$1; $$->setkd((double)*$3); delete $3;}
  593.                 |       finishitems BRILLIANCE expr
  594.                                 {$$=$1; $$->setkb((double)*$3); delete $3;}
  595.                 |       finishitems CRAND expr
  596.                                 {$$=$1; $$->setkc((double)*$3); delete $3;}
  597.                 |       finishitems AMBIENT expr
  598.                                 {$$=$1; $$->setka((double)*$3); delete $3;}
  599.                 |       finishitems REFLECTION expr
  600.                                 {$$=$1; $$->setkr((double)*$3); delete $3;}
  601.                 |       finishitems PHONG expr
  602.                                 {$$=$1; $$->setks((double)*$3); delete $3;}
  603.                 |       finishitems PHONG_SIZE expr
  604.                                 {$$=$1; $$->setkp((double)*$3); delete $3;}
  605.                 |       finishitems SPECULAR expr
  606.                                 {$$=$1; $$->setkh((double)*$3); delete $3;}
  607.                 |       finishitems ROUGHNESS expr
  608.                                 {$$=$1; $$->setkg((double)*$3); delete $3;}
  609.                 |       finishitems METALLIC
  610.                                 {$$=$1; $$->setkm(1);}
  611.                 |       finishitems REFRACTION expr
  612.                                 {$$=$1; $$->setkt((double)*$3); delete $3;}
  613.                 |       finishitems IOR expr
  614.                                 {$$=$1; $$->setki((double)*$3); delete $3;}
  615.                 ;
  616. %%
  617.  
  618. void yyerror(char* s) {cout<<s<<"\n";}
  619.