我正在与野牛一起工作,目前遇到了一个问题,并且对所有这些工作方式非常陌生,我需要能够判断一个特定的产品是否是 > 或 + 或 >= 但我不知道最好的方法存储和检索此值,这是以下代码:
%union
{
char* text;
TYPE_INFO typeInfo;
};
N_ARITHLOGIC_EXPR : N_UN_OP N_EXPR
{
if($2.type == FUNCTION){
yyerror("Arg 1 cannot be function");
}
$$.type = BOOL;
$$.numParams = NOT_APPLICABLE;
$$.returnType = NOT_APPLICABLE;
}
| N_BIN_OP N_EXPR N_EXPR
{
if(T_LT || T_GT || T_LE || T_GE || T_EQ || T_NE || T_NOT){
if(!(($2.type == INT && $3.type == INT) || ($2.type == STR && $3.type == STR))){
yyerror("Arg n must be integer or string");
}
else{
$$.type = BOOL;
$$.numParams = NOT_APPLICABLE;
$$.returnType = NOT_APPLICABLE;
}
}
else if(T_AND || T_OR){
if(($2.type == INT && $3.type == FUNCTION) || ($2.type == STR && $3.type == FUNCTION) || ($2.type == BOOL && $3.type == FUNCTION) || ($2.type == FUNCTION && $3.type == FUNCTION)){
yyerror("Arg n cannot be a function");
}
else{
$$.type = BOOL;
$$.numParams = NOT_APPLICABLE;
$$.returnType = NOT_APPLICABLE;
}
}
else if (T_ADD || T_SUB || T_MULT || T_DIV){
if(!($2.type == INT && $3.type == INT)){
yyerror("Arg n must be integer");
}
else{
$$.type = INT;
$$.numParams = NOT_APPLICABLE;
$$.returnType = NOT_APPLICABLE;
}
}
}
;
if 语句显然现在不起作用,但我只需要能够查看它是有理运算符还是算术运算符等。
稍后我还需要能够使用一种产品,因此请说以下内容:
N_PROGN_OR_USERFUNCTCALL : N_FUNCT_NAME N_ACTUAL_PARAMS
{
}
| T_LPAREN N_LAMBDA_EXPR T_RPAREN N_ACTUAL_PARAMS
{
}
;
N_FUNCT_NAME : T_PROGN
{
//Change type of N_PROGN_OR_USERFUNCTCALL based off of the function return type of T_PROGN
}
根据 T_PROGN 的返回类型,我需要能够更改 N_PROGN_OR_USERFUNCTCALL 的类型,最好的方法是什么?谢谢!