PARSE.H 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. /****************************************************************************
  2. * parse.h
  3. *
  4. * This header file is included by all all language parsing C modules in
  5. * POV-Ray.
  6. *
  7. * from Persistence of Vision(tm) Ray Tracer
  8. * Copyright 1996,1999 Persistence of Vision Team
  9. *---------------------------------------------------------------------------
  10. * NOTICE: This source code file is provided so that users may experiment
  11. * with enhancements to POV-Ray and to port the software to platforms other
  12. * than those supported by the POV-Ray Team. There are strict rules under
  13. * which you are permitted to use this file. The rules are in the file
  14. * named POVLEGAL.DOC which should be distributed with this file.
  15. * If POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  16. * Team Coordinator by email to team-coord@povray.org or visit us on the web at
  17. * http://www.povray.org. The latest version of POV-Ray may be found at this site.
  18. *
  19. * This program is based on the popular DKB raytracer version 2.12.
  20. * DKBTrace was originally written by David K. Buck.
  21. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  22. *
  23. *****************************************************************************/
  24. #ifndef PARSE_H
  25. #define PARSE_H
  26. /*****************************************************************************
  27. * Global preprocessor defines
  28. ******************************************************************************/
  29. #define MAX_STRING_INDEX 127
  30. /* Here we create our own little language for doing the parsing. It
  31. makes the code easier to read. */
  32. #define EXPECT { int Exit_Flag; Exit_Flag = FALSE; \
  33. while (!Exit_Flag) {Get_Token(); switch (Token.Token_Id) {
  34. #define CASE(x) case x:
  35. #define CASE2(x, y) case x: case y:
  36. #define CASE3(x, y, z) case x: case y: case z:
  37. #define CASE4(w, x, y, z) case w: case x: case y: case z:
  38. #define CASE5(v, w, x, y, z) case v: case w: case x: case y: case z:
  39. #define CASE6(u, v, w, x, y, z) case u: case v: case w: case x: case y: case z:
  40. #define END_CASE break;
  41. #define EXIT Exit_Flag = TRUE;
  42. #define OTHERWISE default:
  43. #define END_EXPECT } } }
  44. #define GET(x) Get_Token(); if (Token.Token_Id != x) Parse_Error (x);
  45. #define ALLOW(x) Get_Token(); if (Token.Token_Id != x) Unget_Token();
  46. #define UNGET Unget_Token();
  47. #define CASE_FLOAT CASE2 (LEFT_PAREN_TOKEN, FLOAT_FUNCT_TOKEN)\
  48. CASE2 (PLUS_TOKEN, DASH_TOKEN) UNGET
  49. #define CASE_VECTOR CASE2 (VECTOR_FUNCT_TOKEN,LEFT_ANGLE_TOKEN) \
  50. CASE4 (U_TOKEN,V_TOKEN,UV_ID_TOKEN,VECTOR_4D_ID_TOKEN) CASE_FLOAT
  51. #define CASE_EXPRESS CASE_VECTOR
  52. #define CASE_COLOUR CASE3 (COLOUR_TOKEN,COLOUR_KEY_TOKEN,COLOUR_ID_TOKEN) UNGET
  53. #define MAX_BRACES 200
  54. /* Token Definitions for Parser */
  55. enum TOKEN_IDS
  56. {
  57. ABS_TOKEN = 0,
  58. ATAN2_TOKEN,
  59. CEIL_TOKEN,
  60. CLOCK_TOKEN,
  61. COS_TOKEN,
  62. DEGREES_TOKEN,
  63. DIV_TOKEN,
  64. EXP_TOKEN,
  65. FLOAT_ID_TOKEN,
  66. FLOAT_TOKEN,
  67. FLOOR_TOKEN,
  68. INT_TOKEN,
  69. LOG_TOKEN,
  70. MAX_TOKEN,
  71. MIN_TOKEN,
  72. MOD_TOKEN,
  73. PI_TOKEN,
  74. POW_TOKEN,
  75. RADIANS_TOKEN,
  76. SIN_TOKEN,
  77. SQRT_TOKEN,
  78. VDOT_TOKEN,
  79. VLENGTH_TOKEN,
  80. VERSION_TOKEN,
  81. ON_TOKEN,
  82. OFF_TOKEN,
  83. TRUE_TOKEN,
  84. FALSE_TOKEN,
  85. YES_TOKEN,
  86. NO_TOKEN,
  87. ACOS_TOKEN,
  88. ASIN_TOKEN,
  89. TAN_TOKEN,
  90. ASC_TOKEN,
  91. STRLEN_TOKEN,
  92. VAL_TOKEN,
  93. FILE_EXISTS_TOKEN,
  94. STRCMP_TOKEN,
  95. SEED_TOKEN,
  96. RAND_TOKEN,
  97. CLOCK_DELTA_TOKEN,
  98. DIMENSIONS_TOKEN,
  99. DIMENSION_SIZE_TOKEN,
  100. DEFINED_TOKEN,
  101. FLOAT_FUNCT_TOKEN,
  102. /*WARNING: All new functions returning a float value must be placed
  103. before FLOAT_FUNCT_TOKEN or the parser won't work right. */
  104. VAXIS_ROTATE_TOKEN,
  105. VCROSS_TOKEN,
  106. VECTOR_ID_TOKEN,
  107. VNORMALIZE_TOKEN,
  108. VROTATE_TOKEN,
  109. X_TOKEN,
  110. Y_TOKEN,
  111. Z_TOKEN,
  112. VECTOR_FUNCT_TOKEN,
  113. /*WARNING: All new functions returning a vector value must be placed
  114. before VECTOR_FUNCT_TOKEN or the parser won't work right. */
  115. ALPHA_TOKEN,
  116. BLUE_TOKEN,
  117. FILTER_TOKEN,
  118. TRANSMIT_TOKEN,
  119. GREEN_TOKEN,
  120. RED_TOKEN,
  121. RGBF_TOKEN,
  122. RGBFT_TOKEN,
  123. RGBT_TOKEN,
  124. RGB_TOKEN,
  125. COLOUR_KEY_TOKEN,
  126. /*WARNING: All new keywords which may preceed a COLOUR must be placed
  127. before COLOUR_KEY_TOKEN or the parser won't work right. */
  128. COLOR_TOKEN,
  129. COLOUR_TOKEN,
  130. COLOUR_ID_TOKEN,
  131. /*Note:Not 100% sure about the above tokens. May move them up later. */
  132. ADAPTIVE_TOKEN,
  133. AGATE_TOKEN,
  134. ALL_TOKEN,
  135. AMBIENT_TOKEN,
  136. AMPERSAND_TOKEN,
  137. AREA_LIGHT_TOKEN,
  138. AT_TOKEN,
  139. BACK_QUOTE_TOKEN,
  140. BACK_SLASH_TOKEN,
  141. BAR_TOKEN,
  142. BICUBIC_PATCH_TOKEN,
  143. BLOB_TOKEN,
  144. BOUNDED_BY_TOKEN,
  145. BOX_TOKEN,
  146. BOZO_TOKEN,
  147. BRICK_TOKEN,
  148. BRILLIANCE_TOKEN,
  149. BUMPS_TOKEN,
  150. BUMP_MAP_TOKEN,
  151. BUMP_SIZE_TOKEN,
  152. CAMERA_ID_TOKEN,
  153. CAMERA_TOKEN,
  154. CHECKER_TOKEN,
  155. CLIPPED_BY_TOKEN,
  156. COLON_TOKEN,
  157. COLOR_MAP_TOKEN,
  158. COLOUR_MAP_ID_TOKEN,
  159. COLOUR_MAP_TOKEN,
  160. COMMA_TOKEN,
  161. COMPONENT_TOKEN,
  162. COMPOSITE_TOKEN,
  163. CONE_TOKEN,
  164. CRAND_TOKEN,
  165. CUBIC_TOKEN,
  166. CYLINDER_TOKEN,
  167. DASH_TOKEN,
  168. DECLARE_TOKEN,
  169. DEFAULT_TOKEN,
  170. DENTS_TOKEN,
  171. DIFFERENCE_TOKEN,
  172. DIFFUSE_TOKEN,
  173. DIRECTION_TOKEN,
  174. DISC_TOKEN,
  175. DISTANCE_TOKEN,
  176. DOLLAR_TOKEN,
  177. END_OF_FILE_TOKEN,
  178. EQUALS_TOKEN,
  179. EXCLAMATION_TOKEN,
  180. FALLOFF_TOKEN,
  181. FINISH_ID_TOKEN,
  182. FINISH_TOKEN,
  183. FLATNESS_TOKEN,
  184. FOG_TOKEN,
  185. FREQUENCY_TOKEN,
  186. GIF_TOKEN,
  187. GRADIENT_TOKEN,
  188. GRANITE_TOKEN,
  189. HASH_TOKEN,
  190. HAT_TOKEN,
  191. HEIGHT_FIELD_TOKEN,
  192. HEXAGON_TOKEN,
  193. IDENTIFIER_TOKEN,
  194. IFF_TOKEN,
  195. IMAGE_MAP_TOKEN,
  196. INCLUDE_TOKEN,
  197. INTERPOLATE_TOKEN,
  198. INTERSECTION_TOKEN,
  199. INVERSE_TOKEN,
  200. IOR_TOKEN,
  201. JITTER_TOKEN,
  202. LAMBDA_TOKEN,
  203. LEFT_ANGLE_TOKEN,
  204. LEFT_CURLY_TOKEN,
  205. LEFT_PAREN_TOKEN,
  206. LEFT_SQUARE_TOKEN,
  207. LEOPARD_TOKEN,
  208. LIGHT_SOURCE_TOKEN,
  209. LOCATION_TOKEN,
  210. LOOKS_LIKE_TOKEN,
  211. LOOK_AT_TOKEN,
  212. MANDEL_TOKEN,
  213. MAP_TYPE_TOKEN,
  214. MARBLE_TOKEN,
  215. MATERIAL_MAP_TOKEN,
  216. MAX_INTERSECTIONS,
  217. MAX_TRACE_LEVEL_TOKEN,
  218. MERGE_TOKEN,
  219. METALLIC_TOKEN,
  220. MORTAR_TOKEN,
  221. NO_SHADOW_TOKEN,
  222. OBJECT_ID_TOKEN,
  223. OBJECT_TOKEN,
  224. OCTAVES_TOKEN,
  225. OMEGA_TOKEN,
  226. ONCE_TOKEN,
  227. ONION_TOKEN,
  228. PERCENT_TOKEN,
  229. PHASE_TOKEN,
  230. PHONG_SIZE_TOKEN,
  231. PHONG_TOKEN,
  232. PIGMENT_ID_TOKEN,
  233. PIGMENT_TOKEN,
  234. PLANE_TOKEN,
  235. PLUS_TOKEN,
  236. POINT_AT_TOKEN,
  237. POLY_TOKEN,
  238. POT_TOKEN,
  239. QUADRIC_TOKEN,
  240. QUARTIC_TOKEN,
  241. QUESTION_TOKEN,
  242. QUICK_COLOR_TOKEN,
  243. QUICK_COLOUR_TOKEN,
  244. RADIAL_TOKEN,
  245. RADIUS_TOKEN,
  246. BRICK_SIZE_TOKEN,
  247. REFLECTION_TOKEN,
  248. REFRACTION_TOKEN,
  249. RIGHT_ANGLE_TOKEN,
  250. RIGHT_CURLY_TOKEN,
  251. RIGHT_PAREN_TOKEN,
  252. RIGHT_SQUARE_TOKEN,
  253. RIGHT_TOKEN,
  254. RIPPLES_TOKEN,
  255. ROTATE_TOKEN,
  256. ROUGHNESS_TOKEN,
  257. SCALE_TOKEN,
  258. SEMI_COLON_TOKEN,
  259. SINGLE_QUOTE_TOKEN,
  260. SKY_TOKEN,
  261. SLASH_TOKEN,
  262. SMOOTH_TOKEN,
  263. SMOOTH_TRIANGLE_TOKEN,
  264. SPECULAR_TOKEN,
  265. SPHERE_TOKEN,
  266. SPOTLIGHT_TOKEN,
  267. SPOTTED_TOKEN,
  268. STAR_TOKEN,
  269. STRING_LITERAL_TOKEN,
  270. STURM_TOKEN,
  271. TEXTURE_ID_TOKEN,
  272. TEXTURE_TOKEN,
  273. TGA_TOKEN,
  274. THRESHOLD_TOKEN,
  275. TIGHTNESS_TOKEN,
  276. TILDE_TOKEN,
  277. TILE2_TOKEN,
  278. TILES_TOKEN,
  279. TNORMAL_ID_TOKEN,
  280. TNORMAL_TOKEN,
  281. TORUS_TOKEN,
  282. TRACK_TOKEN,
  283. TRANSFORM_ID_TOKEN,
  284. TRANSFORM_TOKEN,
  285. TRANSLATE_TOKEN,
  286. TRIANGLE_TOKEN,
  287. TURBULENCE_TOKEN,
  288. TYPE_TOKEN,
  289. UNION_TOKEN,
  290. UP_TOKEN,
  291. USE_COLOR_TOKEN,
  292. USE_COLOUR_TOKEN,
  293. USE_INDEX_TOKEN,
  294. U_STEPS_TOKEN,
  295. V_STEPS_TOKEN,
  296. WATER_LEVEL_TOKEN,
  297. WAVES_TOKEN,
  298. WOOD_TOKEN,
  299. WRINKLES_TOKEN,
  300. BACKGROUND_TOKEN,
  301. OPEN_TOKEN,
  302. AGATE_TURB_TOKEN,
  303. IRID_TOKEN,
  304. THICKNESS_TOKEN,
  305. IRID_WAVELENGTH_TOKEN,
  306. CRACKLE_TOKEN,
  307. ADC_BAILOUT_TOKEN,
  308. FILL_LIGHT_TOKEN,
  309. NUMBER_OF_WAVES_TOKEN,
  310. FOG_TYPE_TOKEN,
  311. FOG_ALT_TOKEN,
  312. FOG_OFFSET_TOKEN,
  313. TEXT_TOKEN,
  314. TTF_TOKEN,
  315. REL_GE_TOKEN,
  316. REL_LE_TOKEN,
  317. REL_NE_TOKEN,
  318. APERTURE_TOKEN,
  319. BLUR_SAMPLES_TOKEN,
  320. FOCAL_POINT_TOKEN,
  321. QUILTED_TOKEN,
  322. CONTROL0_TOKEN,
  323. CONTROL1_TOKEN,
  324. RAINBOW_TOKEN,
  325. SKYSPHERE_TOKEN,
  326. ANGLE_TOKEN,
  327. WIDTH_TOKEN,
  328. ARC_ANGLE_TOKEN,
  329. PERSPECTIVE_TOKEN,
  330. ORTHOGRAPHIC_TOKEN,
  331. FISHEYE_TOKEN,
  332. ULTRA_WIDE_ANGLE_TOKEN,
  333. OMNIMAX_TOKEN,
  334. PANORAMIC_TOKEN,
  335. LATHE_TOKEN,
  336. LINEAR_SPLINE_TOKEN,
  337. QUADRATIC_SPLINE_TOKEN,
  338. CUBIC_SPLINE_TOKEN,
  339. BEZIER_SPLINE_TOKEN,
  340. POLYGON_TOKEN,
  341. PRISM_TOKEN,
  342. LINEAR_SWEEP_TOKEN,
  343. CONIC_SWEEP_TOKEN,
  344. SOR_TOKEN,
  345. SPIRAL1_TOKEN,
  346. SPIRAL2_TOKEN,
  347. STRENGTH_TOKEN,
  348. HIERARCHY_TOKEN,
  349. RAMP_WAVE_TOKEN,
  350. TRIANGLE_WAVE_TOKEN,
  351. SINE_WAVE_TOKEN,
  352. SCALLOP_WAVE_TOKEN,
  353. PIGMENT_MAP_TOKEN,
  354. NORMAL_MAP_TOKEN,
  355. SLOPE_MAP_TOKEN,
  356. TEXTURE_MAP_TOKEN,
  357. PIGMENT_MAP_ID_TOKEN,
  358. NORMAL_MAP_ID_TOKEN,
  359. SLOPE_MAP_ID_TOKEN,
  360. TEXTURE_MAP_ID_TOKEN,
  361. SUPERELLIPSOID_TOKEN,
  362. QUATERNION_TOKEN,
  363. CUBE_TOKEN,
  364. MAX_ITERATION_TOKEN,
  365. HYPERCOMPLEX_TOKEN,
  366. RAINBOW_ID_TOKEN,
  367. FOG_ID_TOKEN,
  368. SKYSPHERE_ID_TOKEN,
  369. FADE_POWER_TOKEN,
  370. FADE_DISTANCE_TOKEN,
  371. TURB_DEPTH_TOKEN,
  372. PPM_TOKEN,
  373. PGM_TOKEN,
  374. AVERAGE_TOKEN,
  375. MESH_TOKEN,
  376. WARP_TOKEN,
  377. OFFSET_TOKEN,
  378. REPEAT_TOKEN,
  379. BLACK_HOLE_TOKEN,
  380. FLIP_TOKEN,
  381. AMBIENT_LIGHT_TOKEN,
  382. IF_TOKEN,
  383. ELSE_TOKEN,
  384. END_TOKEN,
  385. SWITCH_TOKEN,
  386. CASE_TOKEN,
  387. RANGE_TOKEN,
  388. WHILE_TOKEN,
  389. BREAK_TOKEN,
  390. FALLOFF_ANGLE_TOKEN,
  391. CAUSTICS_TOKEN,
  392. JULIA_FRACTAL_TOKEN,
  393. SQR_TOKEN,
  394. RECIPROCAL_TOKEN,
  395. STR_TOKEN,
  396. CONCAT_TOKEN,
  397. CHR_TOKEN,
  398. SUBSTR_TOKEN,
  399. STRING_ID_TOKEN,
  400. WARNING_TOKEN,
  401. ERROR_TOKEN,
  402. RENDER_TOKEN,
  403. STATISTICS_TOKEN,
  404. DEBUG_TOKEN,
  405. VARIANCE_TOKEN,
  406. CONFIDENCE_TOKEN,
  407. RADIOSITY_TOKEN,
  408. BRIGHTNESS_TOKEN,
  409. COUNT_TOKEN,
  410. DISTANCE_MAXIMUM_TOKEN,
  411. ERROR_BOUND_TOKEN,
  412. GRAY_THRESHOLD_TOKEN,
  413. LOW_ERROR_FACTOR_TOKEN,
  414. MINIMUM_REUSE_TOKEN,
  415. NEAREST_COUNT_TOKEN,
  416. RECURSION_LIMIT_TOKEN,
  417. HF_GRAY_16_TOKEN,
  418. GLOBAL_SETTINGS_TOKEN,
  419. ECCENTRICITY_TOKEN,
  420. HOLLOW_TOKEN,
  421. MEDIA_ATTENUATION_TOKEN,
  422. MEDIA_INTERACTION_TOKEN,
  423. MATRIX_TOKEN,
  424. PERIOD_TOKEN,
  425. SYS_TOKEN,
  426. STRUPR_TOKEN,
  427. STRLWR_TOKEN,
  428. U_TOKEN,
  429. V_TOKEN,
  430. IFDEF_TOKEN,
  431. PNG_TOKEN,
  432. PRECISION_TOKEN,
  433. SLICE_TOKEN,
  434. ASSUMED_GAMMA_TOKEN,
  435. ATAN_TOKEN,
  436. COSH_TOKEN,
  437. SINH_TOKEN,
  438. TANH_TOKEN,
  439. ATANH_TOKEN,
  440. ACOSH_TOKEN,
  441. ASINH_TOKEN,
  442. PWR_TOKEN,
  443. T_TOKEN,
  444. IFNDEF_TOKEN,
  445. /* Media stuff. */
  446. MEDIA_TOKEN,
  447. MEDIA_ID_TOKEN,
  448. DENSITY_ID_TOKEN,
  449. DENSITY_TOKEN,
  450. DENSITY_FILE_TOKEN,
  451. RATIO_TOKEN,
  452. SCATTERING_TOKEN,
  453. EMISSION_TOKEN,
  454. ABSORPTION_TOKEN,
  455. SAMPLES_TOKEN,
  456. INTERVALS_TOKEN,
  457. INTERIOR_TOKEN,
  458. INTERIOR_ID_TOKEN,
  459. LOCAL_TOKEN,
  460. UNDEF_TOKEN,
  461. MACRO_TOKEN,
  462. MACRO_ID_TOKEN,
  463. PARAMETER_ID_TOKEN,
  464. ARRAY_TOKEN,
  465. ARRAY_ID_TOKEN,
  466. EMPTY_ARRAY_TOKEN,
  467. FILE_ID_TOKEN,
  468. FOPEN_TOKEN,
  469. FCLOSE_TOKEN,
  470. WRITE_TOKEN,
  471. READ_TOKEN,
  472. APPEND_TOKEN,
  473. PLANAR_TOKEN,
  474. SPHERICAL_TOKEN,
  475. BOXED_TOKEN,
  476. CYLINDRICAL_TOKEN,
  477. CUBIC_WAVE_TOKEN,
  478. POLY_WAVE_TOKEN,
  479. DENSITY_MAP_TOKEN,
  480. DENSITY_MAP_ID_TOKEN,
  481. REFLECTION_EXPONENT_TOKEN,
  482. DF3_TOKEN,
  483. EXTINCTION_TOKEN,
  484. MATERIAL_TOKEN,
  485. MATERIAL_ID_TOKEN,
  486. UV_ID_TOKEN,
  487. VECTOR_4D_ID_TOKEN,
  488. LAST_TOKEN
  489. };
  490. /*****************************************************************************
  491. * Global typedefs
  492. ******************************************************************************/
  493. /*****************************************************************************
  494. * Global variables
  495. ******************************************************************************/
  496. extern short Not_In_Default;
  497. extern short Ok_To_Declare;
  498. extern short LValue_Ok;
  499. /*****************************************************************************
  500. * Global functions
  501. ******************************************************************************/
  502. void Parse_Error (TOKEN Token_Id);
  503. void Parse_Error_Str (char *str);
  504. void Parse_Begin (void);
  505. void Parse_End (void);
  506. void Parse_Comma (void);
  507. void Parse_Semi_Colon (void);
  508. void Destroy_Frame (void);
  509. void Parse (void);
  510. void MAError (char *str, size_t size);
  511. void Warn_State (TOKEN Token_Id, TOKEN Type);
  512. void Warn (DBL Level, char *str);
  513. void Only_In (char *s1,char *s2);
  514. void Not_With (char *s1,char *s2);
  515. void Warn_Compat (int f);
  516. void Link_Textures (TEXTURE **Old_Texture, TEXTURE *New_Texture);
  517. void Parse_Object_Mods (OBJECT *Object);
  518. OBJECT *Parse_Object (void);
  519. void Parse_Default (void);
  520. void Parse_Declare (void);
  521. void Parse_Matrix (MATRIX Matrix);
  522. void Destroy_Ident_Data (void *Data, int Type);
  523. int Parse_RValue (int Previous, int *NumberPtr, void **DataPtr, int ParFlag, int SemiFlag);
  524. char *Get_Token_String (TOKEN Token_Id);
  525. void Test_Redefine(TOKEN Previous, TOKEN *NumberPtr, void *Data);
  526. #endif