#include #include #include #include #include #include #include "cal_tab.h" #include "compiler.h" #include "eval.h" #define INTCONST 1 #define DBLCONST 2 #define HEXCONST 3 #define VARIABLE 4 #define OTHER 5 int yyparse(char *exp); void llinit(void); int gettoken(char *lltb, int lltbsiz); char yytext[256]=""; char lastVar[256]=""; int *errPtr; int result; int colCount=0; varType *varTable; char last_error_string[1024]; double globalregs[100]; //------------------------------------------------------------------------------ void *compileExpression(char *exp) { int errv=0; errPtr=&errv; llinit(); if (!yyparse(exp) && !*errPtr) { return (void*)result; } return 0; } //------------------------------------------------------------------------------ void setLastVar(void) { gettoken(lastVar, sizeof lastVar); } //------------------------------------------------------------------------------ int setVar(int varNum, double value) { int i=varNum; if (varNum < 0) { char *var=lastVar; if (!_strnicmp(var,"reg",3) && strlen(var) == 5 && isdigit(var[3]) && isdigit(var[4])) { int x=atoi(var+3); if (x < 0 || x > 99) x=0; i=EVAL_MAX_VARS+x; } else { for (i=0;i= EVAL_MAX_VARS+100) { return -1; } if (i >= EVAL_MAX_VARS && i < EVAL_MAX_VARS+100) { globalregs[i - EVAL_MAX_VARS]=value; } else if (!varTable[i].name[0]) { strncpy(varTable[i].name,lastVar,sizeof(varTable[i].name)); varTable[i].value = value; } return i; } //------------------------------------------------------------------------------ int getVar(int varNum) { if (varNum >= EVAL_MAX_VARS && varNum < EVAL_MAX_VARS+100) return createCompiledValue(0, globalregs + (varNum - EVAL_MAX_VARS)); if (varNum >= 0 && varNum < EVAL_MAX_VARS) return createCompiledValue(0, &(varTable[varNum].value)); return createCompiledValue(0, NULL); } #if 0 //------------------------------------------------------------------------------ double *getVarPtr(char *var) { int i; if (!_strnicmp(var,"reg",3) && strlen(var) == 5 && isdigit(var[3]) && isdigit(var[4])) { int x=atoi(var+3); if (x < 0 || x > 99) x=0; return globalregs + x; } for (i=0;i 99) x=0; return globalregs + x; } for (i=0;i= '0' && a <= '9') v+=a-'0'; else if (a >= 'A' && a <= 'F') v+=10+a-'A'; else if (a >= 'a' && a <= 'f') v+=10+a-'a'; else break; v<<=4; } return createCompiledValue((double)v, NULL); } return 0; } //------------------------------------------------------------------------------ int objectId(int nParams) { switch (nParams) { case 1: return FUNCTION1; case 2: return FUNCTION2; case 3: return FUNCTION3; } return IDENTIFIER; } //------------------------------------------------------------------------------ int lookup(int *typeOfObject) { int i; gettoken(yytext, sizeof yytext); if (!_strnicmp(yytext,"reg",3) && strlen(yytext) == 5 && isdigit(yytext[3]) && isdigit(yytext[4]) && (i=atoi(yytext+3))>=0 && i<100) { *typeOfObject=IDENTIFIER; return i+EVAL_MAX_VARS; } for (i=0;iname, yytext)) { *typeOfObject = objectId(f->nParams); return i; } } *typeOfObject = IDENTIFIER; setLastVar(); i = setVar(-1, 0); return i; } //--------------------------------------------------------------------------- void count(void) { gettoken(yytext, sizeof yytext); colCount+=strlen(yytext); } //--------------------------------------------------------------------------- int yyerror(char *txt) { *errPtr = colCount; return 0; }