home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- * "Irit" - the 3d polygonal solid modeller. *
- * *
- * Written by: Gershon Elber Ver 0.2, Mar. 1990 *
- ******************************************************************************
- * General, local to module, definitions for the Input Parser module. *
- * Note this module actually consists of InptPrsr/InptEval/OverLoad modules.*
- *****************************************************************************/
-
- #ifndef INPT_PRSR_LH
- #define INPT_PRSR_LH
-
- /* #define DEBUG Print some intermediate results (InptPrsr/InptEval). */
-
- #define MAX_PARSER_STACK 200 /* Depth of expression nesting. */
-
- typedef enum {
- POLY_EXPR = 0x0001,
- NUMERIC_EXPR = 0x0002,
- VECTOR_EXPR = 0x0004,
- MATRIX_EXPR = 0x0008,
- CURVE_EXPR = 0x0010,
- SURFACE_EXPR = 0x0020,
- STRING_EXPR = 0x0040,
- OLST_EXPR = 0x0080,
- CTLPT_EXPR = 0x0100,
-
- NO_EXPR = 0x1000,
- POLY_CURVE_EXPR = POLY_EXPR | CURVE_EXPR,
- GEOM_EXPR = POLY_EXPR | CURVE_EXPR | SURFACE_EXPR,
- OLST_GEOM_EXPR = OLST_EXPR | GEOM_EXPR,
- ANY_EXPR = POLY_EXPR | NUMERIC_EXPR | VECTOR_EXPR |
- MATRIX_EXPR | CURVE_EXPR | SURFACE_EXPR |
- STRING_EXPR | OLST_EXPR | CTLPT_EXPR,
-
- ERROR_EXPR = 0x4000
- } IritExprType;
-
-
- extern InptPrsrEvalErrType IPGlblEvalError; /* Global used by EvalTree. */
-
- /*****************************************************************************
- * The expression parse tree node definition: *
- *****************************************************************************/
- typedef struct ParseTree {
- struct ParseTree *Right, *Left;
- int NodeKind;
- IritObjectType ObjType;
- union {
- RealType R;
- ObjectStruct *PObj;
- } U;
- } ParseTree;
-
- /* See Irit.h file for the different object possible: */
- #define IS_POLY_NODE(Node) ((Node)->ObjType == POLY_OBJ)
- #define IS_NUM_NODE(Node) ((Node)->ObjType == NUMERIC_OBJ)
- #define IS_VEC_NODE(Node) ((Node)->ObjType == VECTOR_OBJ)
- #define IS_CTLPT_NODE(Node) ((Node)->ObjType == CTLPT_OBJ)
- #define IS_MAT_NODE(Node) ((Node)->ObjType == MATRIX_OBJ)
- #define IS_STR_NODE(Node) ((Node)->ObjType == STRING_OBJ)
- #define IS_OLST_NODE(Node) ((Node)->ObjType == OBJ_LIST_OBJ)
- #define IS_CRV_NODE(Node) ((Node)->ObjType == CURVE_OBJ)
- #define IS_SRF_NODE(Node) ((Node)->ObjType == SURFACE_OBJ)
-
- /*****************************************************************************
- * The include file stack - nesting is allowed up to FILE_STACK_SIZE. *
- *****************************************************************************/
- typedef struct FileStackStruct {
- char Name[FILE_NAME_LEN];
- FILE *f;
- } FileStackStruct;
-
- #define FILE_STACK_SIZE 10
-
- /*****************************************************************************
- * Aliases are simple strings substitution - each entry holds alias Name and *
- * alias Value, which replaces Name. Name id not NULL if active. *
- *****************************************************************************/
- typedef struct OneAliasStruct {
- char *Name, *Value;
- } OneAliasStruct;
-
- #define NUM_OF_ALIASES 10
-
- typedef struct AliasesStruct {
- OneAliasStruct Aliases[NUM_OF_ALIASES];
- } AliasesStruct;
-
- /*****************************************************************************
- * Function entry table looks like this (for table see InptPrsr.c module): *
- *****************************************************************************/
- #define FUNC_NAME_LEN 11 /* 10 + NULL terminator. */
- #define FUNC_MAX_PARAM 4 /* Max. of all the function types below. */
- #define ANY_PARAM_NUM 127
-
- typedef struct FuncTableType {
- char FuncName[FUNC_NAME_LEN];
- int FuncToken;
- void (*Func)();
- ByteType NumOfParam;
- IritExprType ParamObjType[FUNC_MAX_PARAM];
- } FuncTableType;
-
- typedef struct NumFuncTableType {
- char FuncName[FUNC_NAME_LEN];
- int FuncToken;
- #ifdef __MSDOS__
- double cdecl (*Func)(); /* So we can use -pr option of Borland C++ 3.0. */
- #else
- double (*Func)();
- #endif /* __MSDOS__ */
- ByteType NumOfParam;
- IritExprType ParamObjType[FUNC_MAX_PARAM];
- } NumFuncTableType;
-
- typedef struct ObjFuncTableType {
- char FuncName[FUNC_NAME_LEN];
- int FuncToken;
- ObjectStruct *(*Func)();
- ByteType NumOfParam;
- IritExprType ParamObjType[FUNC_MAX_PARAM];
- } ObjFuncTableType;
-
- typedef struct GenFuncTableType {
- char FuncName[FUNC_NAME_LEN];
- int FuncToken;
- void (*Func)();
- ByteType NumOfParam;
- IritExprType ParamObjType[FUNC_MAX_PARAM];
- } GenFuncTableType;
-
- typedef struct ConstantTableType {
- char FuncName[FUNC_NAME_LEN];
- RealType Value;
- } ConstantTableType;
-
- /* The followings are defined in the InptEval.c module and are globals so */
- /* InptPrsr.c module will be able to access them... */
- extern NumFuncTableType NumFuncTable[];
- extern int NumFuncTableSize;
- extern ObjFuncTableType ObjFuncTable[];
- extern int ObjFuncTableSize;
- extern GenFuncTableType GenFuncTable[];
- extern int GenFuncTableSize;
- extern ConstantTableType ConstantTable[];
- extern int ConstantTableSize;
-
- /*****************************************************************************
- * Tokens used in the expression to tree conversion and tree definition. *
- *****************************************************************************/
-
- #define TOKENERROR 0
-
- /* Warning - changing the order of these constants, needs updating the order */
- /* of them, in the tables in the begining of InptPrsr.c & OverLoad.c modules.*/
-
- #define ARCCOS 100 /* Real value returned functions. */
- #define ARCSIN 101
- #define ARCTAN2 102
- #define ARCTAN 103
- #define COS 104
- #define EXP 105
- #define FABS 106
- #define LN 107
- #define LOG 108
- #define SIN 109
- #define SQRT 110
- #define TAN 111
- #define CPOLY 112
- #define AREA 113
- #define VOLUME 114
- #define TIME 115
-
- #define NUM_FUNC 100
- #define NUM_FUNC_OFFSET 100
- #define IS_NUM_FUNCTION(Token) (Token >= 100 && Token < 200)
-
- #define VECTOR 200 /* Object returned Functions. */
- #define CTLPT 201
- #define ROTX 202
- #define ROTY 203
- #define ROTZ 204
- #define TRANS 205
- #define SCALE 206
- #define BOX 207
- #define GBOX 208
- #define CONE 209
- #define CONE2 210
- #define CYLIN 211
- #define SPHERE 212
- #define TORUS 213
- #define CIRCPOLY 214
- #define POLY 215
- #define CROSSEC 216
- #define SURFREV 217
- #define EXTRUDE 218
- #define LIST 219
- #define LOAD 220
- #define CONVEX 221
- #define SBEZIER 222
- #define CBEZIER 223
- #define SBSPLINE 224
- #define CBSPLINE 225
- #define SEVAL 226
- #define CEVAL 227
- #define STANGENT 228
- #define CTANGENT 229
- #define SNORMAL 230
- #define SDIVIDE 231
- #define CDIVIDE 232
- #define SREGION 233
- #define CREGION 234
- #define SREFINE 235
- #define CREFINE 236
- #define SRAISE 237
- #define CRAISE 238
- #define CSURFACE 239
- #define CMESH 240
- #define NTH 241
- #define GPOLYGON 242
- #define GPOLYLINE 243
- #define CIRCLE 244
- #define ARC 245
- #define RULEDSRF 246
- #define BOOLSUM 247
- #define SFROMCRVS 248
- #define SWEEPSRF 249
- #define OFFSET 250
- #define CEDITPT 251
- #define SEDITPT 252
- #define MERGEPOLY 253
-
- #define OBJ_FUNC 200
- #define OBJ_FUNC_OFFSET 200
- #define IS_OBJ_FUNCTION(Token) (Token >= 200 && Token < 300)
-
- #define EXIT 300 /* General Functions/No value returned functions. */
- #define VIEW 301
- #define DIR 302
- #define CHDIR 303
- #define NORMAL 304
- #define INCLUDE 305
- #define SAVE 306
- #define FREEOBJ 307
- #define INTERACT 308
- #define PAUSE 309
- #define IFCOND 310
- #define FORLOOP 311
- #define PRHELP 312
- #define VARLIST 313
- #define ALIAS 314
- #define BEEP 315
- #define EDIT 316
- #define SYSTEM 317
- #define LOGFILE 318
- #define COLOR 319
- #define SNOC 320
- #define ATTRIB 321
- #define CLOSED 322
-
- #define COMMENT 399
-
- #define GEN_FUNC 300
- #define GEN_FUNC_OFFSET 300
- #define IS_GEN_FUNCTION(Token) (Token >= 300 && Token < 400)
-
- #define IS_FUNCTION(Token) (Token >= 100 && Token < 400)
- #define IS_NO_PARAM_FUNC(Token) (Token == EXIT || Token == SYSTEM || \
- Token == VARLIST)
-
- #define PLUS 400 /* Operators. */
- #define MINUS 401
- #define MULT 402
- #define DIV 403
- #define POWER 404
- #define UNARMINUS 405
- #define EQUAL 406
- #define COMMA 407
- #define COLON 408
- #define SEMICOLON 409
-
- #define OPENPARA 430 /* Paranthesis. */
- #define CLOSPARA 431
-
- #define NUMBER 450 /* Numeric Data. */
- #define PARAMETER 451 /* Point on new/old object. */
- #define STRING 452 /* Sequence of characters within double quotes. */
-
- #define TOKENSTART 490
- #define TOKENEND 491
-
- #define OPERATORS 400
- #define OPERATORS_OFFSET 400
-
- /*****************************************************************************
- * The local function (static) prototypes: *
- * Note that if DEBUG is defined for the preprocessor, few more function *
- * become available: *
- * Also note that some of the routines are defined globals as both the *
- * InptPrsr.c and InptEval.c modules needs them. *
- *****************************************************************************/
- /* Main parser routine (operator preceedence): Input stream to bin-tree. */
- ParseTree *MyExprMalloc(void);
- void MyExprFree(ParseTree *Ptr);
- void UpdateCharError(char *StrMsg, int Token);
- void AliasEdit(char *Name, char *Value);
- void AliasExpand(char *Line);
- void FileInclude(char *FileName);
- IritExprType InptPrsrTypeCheck(ParseTree *Root, int Level); /* Type check. */
- ParseTree *InptPrsrEvalTree(ParseTree *Root, int Level); /* Evaluate tree. */
- void InptPrsrFreeTree(ParseTree *Root); /* Free all tree. */
- void InptPrsrPrintTree(ParseTree *Root, char *str); /* print it... */
- ParseTree *InptPrsrCopyTree(ParseTree *Root); /* Copy it. */
-
- #endif /* INPT_PRSR_LH */
-