📄 executor.cpp
字号:
}
}
//if it starts with a numeric, get the next token
numeric_val = atol(token);
fpos = ftell(fp);
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
// if next is a '.' then get fractional part of a float and
// return a float value
if(strcmp(token,".")==0)
{
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
*fres = (float)(numeric_val) +
(float)(atol(token)/pow10(strlen(token)));
safe_free(token);
return(SY_FLOAT_TYPE);
}
else
{
//if token is not a '.' then push back input and return integer value.
fseek(fp,fpos,SEEK_SET);
*ires = numeric_val;
safe_free(token);
return(SY_INT_TYPE);
}
}
int evaluate_logic_expression(FILE *fp)
{
int value;
struct PEND_OP *list;
struct PEND_OP *tmp;
value = evaluate_bool2(fp);
list = evaluate_bool1(fp);
while(list)
{
if(list->bval == 1 || value == 1)
value = 1;
else
value = 0;
tmp = list;
list = list->next;
safe_free(tmp);
}
return(value);
}
struct PEND_OP *evaluate_bool1(FILE *fp)
{
char *token;
long fpos;
int value;
struct PEND_OP *tail;
struct PEND_OP *curr;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"||")==0)
{
value = evaluate_bool2(fp);
tail = evaluate_bool1(fp);
curr = (struct PEND_OP *)safe_alloc(1,sizeof(struct PEND_OP));
curr->next = tail;
curr->op_type = OR_OP;
curr->val_type = SY_BOOLEAN_TYPE;
curr->bval = value;
safe_free(token);
return(curr);
}
//produce an empty bool1
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(NULL);
}
int evaluate_bool2(FILE *fp)
{
int value;
struct PEND_OP *list;
struct PEND_OP *tmp;
value = evaluate_bool4(fp);
list = evaluate_bool3(fp);
while(list)
{
if(list->bval == 1 && value == 1)
value = 1;
else
value = 0;
tmp = list;
list = list->next;
safe_free(tmp);
}
return(value);
}
struct PEND_OP *evaluate_bool3(FILE *fp)
{
char *token;
long fpos;
int value;
struct PEND_OP *tail;
struct PEND_OP *curr;
fpos = ftell(fp);
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
token = get_next_token(fp,token);
if(strcmp(token,"&&")==0)
{
value = evaluate_bool4(fp);
tail = evaluate_bool3(fp);
curr = (struct PEND_OP *)safe_alloc(1,sizeof(struct PEND_OP));
curr->next = tail;
curr->op_type = AND_OP;
curr->val_type = SY_BOOLEAN_TYPE;
curr->bval = value;
safe_free(token);
return(curr);
}
//produce an empty bool3
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(NULL);
}
int evaluate_bool4(FILE *fp)
{
char *token;
long fpos;
int val1_type;
int val2_type;
long ival1;
long ival2;
float fval1;
float fval2;
char *sval1;
char *sval2;
int ret_val;
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
ret_val = 0;
fpos = ftell(fp);
//determine if this is a relational based production
//or if it is a bool4::bool5 production
if(parse_expr(fp))
{
token = get_next_token(fp,token);
if(strcmp(token,"<")==0 || strcmp(token,">")==0 ||
strcmp(token,"<=")==0 || strcmp(token,">=")==0 ||
strcmp(token,"==")==0 || strcmp(token,"!=")==0)
{
if(parse_expr(fp))
{
ret_val = 1;
}
}
}
//reset input pointer
fseek(fp,fpos,SEEK_SET);
if(ret_val)
{
//expr op expr based evaluation
//get first expression value and type
val1_type = evaluate_expression(fp,&ival1,&fval1,&sval1);
//re-read the relational operator
memset(token,'\0',strlen(token));
token = get_next_token(fp,token);
//get second expression value and type
val2_type = evaluate_expression(fp,&ival2,&fval2,&sval2);
//calculate resulting boolean value
if(val1_type == SY_STRING_TYPE && val2_type == SY_STRING_TYPE)
{
//handle all string comparisons
ret_val = strcmp(sval1,sval2);
if(strcmp(token,"==")==0)
{
safe_free(token);
if(ret_val == 0)
return(1);
else
return(0);
}
if(strcmp(token,"!=")==0)
{
safe_free(token);
if(ret_val == 0)
return(0);
else
return(1);
}
if(strcmp(token,"<")==0)
{
safe_free(token);
if(ret_val < 0)
return(1);
else
return(0);
}
if(strcmp(token,">")==0)
{
safe_free(token);
if(ret_val > 0)
return(1);
else
return(0);
}
if(strcmp(token,"<=")==0)
{
safe_free(token);
if(ret_val <= 0)
return(1);
else
return(0);
}
if(strcmp(token,">=")==0)
{
safe_free(token);
if(ret_val >= 0)
return(1);
else
return(0);
}
safe_free(token);
return(0);
//no drop through allowed...
}
if(val1_type == SY_STRING_TYPE || val2_type == SY_STRING_TYPE)
{
//invalid type matching
info_message("Cannot compare string and numeric.\n");
safe_free(token);
return(0);
//no drop through allowed...
}
//valid math comparisons follow
if(val1_type == SY_INT_TYPE)
{
if(val2_type == SY_INT_TYPE)
{
//int int
if(strcmp(token,"==")==0)
{
safe_free(token);
if(ival1 == ival2)
return(1);
else
return(0);
}
if(strcmp(token,"!=")==0)
{
safe_free(token);
if(ival1 != ival2)
return(1);
else
return(0);
}
if(strcmp(token,"<")==0)
{
safe_free(token);
if(ival1 < ival2)
return(1);
else
return(0);
}
if(strcmp(token,">")==0)
{
safe_free(token);
if(ival1 > ival2)
return(1);
else
return(0);
}
if(strcmp(token,"<=")==0)
{
safe_free(token);
if(ival1 <= ival2)
return(1);
else
return(0);
}
if(strcmp(token,">=")==0)
{
safe_free(token);
if(ival1 >= ival2)
return(1);
else
return(0);
}
safe_free(token);
return(0);
//no drop through allowed...
}
else
{
//int float
if(strcmp(token,"==")==0)
{
safe_free(token);
if(ival1 == fval2)
return(1);
else
return(0);
}
if(strcmp(token,"!=")==0)
{
safe_free(token);
if(ival1 != fval2)
return(1);
else
return(0);
}
if(strcmp(token,"<")==0)
{
safe_free(token);
if(ival1 < fval2)
return(1);
else
return(0);
}
if(strcmp(token,">")==0)
{
safe_free(token);
if(ival1 > fval2)
return(1);
else
return(0);
}
if(strcmp(token,"<=")==0)
{
safe_free(token);
if(ival1 <= fval2)
return(1);
else
return(0);
}
if(strcmp(token,">=")==0)
{
safe_free(token);
if(ival1 >= fval2)
return(1);
else
return(0);
}
safe_free(token);
return(0);
//no drop through allowed...
}
}
else
{
if(val2_type == SY_INT_TYPE)
{
//float int
if(strcmp(token,"==")==0)
{
safe_free(token);
if(fval1 == ival2)
return(1);
else
return(0);
}
if(strcmp(token,"!=")==0)
{
safe_free(token);
if(fval1 != ival2)
return(1);
else
return(0);
}
if(strcmp(token,"<")==0)
{
safe_free(token);
if(fval1 < ival2)
return(1);
else
return(0);
}
if(strcmp(token,">")==0)
{
safe_free(token);
if(fval1 > ival2)
return(1);
else
return(0);
}
if(strcmp(token,"<=")==0)
{
safe_free(token);
if(fval1 <= ival2)
return(1);
else
return(0);
}
if(strcmp(token,">=")==0)
{
safe_free(token);
if(fval1 >= ival2)
return(1);
else
return(0);
}
safe_free(token);
return(0);
//no drop through allowed...
}
else
{
//float float
if(strcmp(token,"==")==0)
{
safe_free(token);
if(fval1 == fval2)
return(1);
else
return(0);
}
if(strcmp(token,"!=")==0)
{
safe_free(token);
if(fval1 != fval2)
return(1);
else
return(0);
}
if(strcmp(token,"<")==0)
{
safe_free(token);
if(fval1 < fval2)
return(1);
else
return(0);
}
if(strcmp(token,">")==0)
{
safe_free(token);
if(fval1 > fval2)
return(1);
else
return(0);
}
if(strcmp(token,"<=")==0)
{
safe_free(token);
if(fval1 <= fval2)
return(1);
else
return(0);
}
if(strcmp(token,">=")==0)
{
safe_free(token);
if(fval1 >= fval2)
return(1);
else
return(0);
}
safe_free(token);
return(0);
//no drop through allowed...
}
}
}
else
{
//bool5 based evaluation
safe_free(token);
return(evaluate_bool5(fp));
}
}
int evaluate_bool5(FILE *fp)
{
int value;
char *token;
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
long fpos;
fpos = ftell(fp);
token = get_next_token(fp,token);
if(strcmp(token,"!")==0)
{
safe_free(token);
value = evaluate_bool6(fp);
if(value)
return(0);
else
return(1);
}
else
{
fseek(fp,fpos,SEEK_SET);
safe_free(token);
return(evaluate_bool6(fp));
}
}
int evaluate_bool6(FILE *fp)
{
int value;
char *token;
token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
//read and discard '('
token = get_next_token(fp,token);
memset(token,'\0',strlen(token));
value = evaluate_logic_expression(fp);
//read ')'
token = get_next_token(fp,token);
safe_free(token);
return(value);
}
int function_wrapper(FILE *fp, long *ival, float *fval, char **sval)
//int function_wrapper(HANDLE fp, long *ival, float *fval, char **sval)
{
char *token;
char *fname;
long fpos;
int val_type;
int rtype;
int argcount;
long intval;
float floatval;
char *stringval;
struct ARGUMENT *arghead;
struct ARGUMENT *argtail;
struct ARGUMENT *curr;
struct ARGUMENT *retval;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -