0

私はバイソンで作業しており、現在問題に取り組んでおり、これらすべてがどのように機能するかについてはまったく新しいものです。特定のプロダクションが > または + または >= であるかどうかを判断できる必要がありますが、最善の方法を知りませんこの値を保存および取得します。これは次のコードです。

%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 ステートメントは明らかに機能しませんが、それが有理演算子なのか算術演算子なのかなどを確認できるようにする必要があります。

また、後で1つのプロダクションを使用できるようにする必要があるため、次のように言います。

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 の型を変更できるようにする必要があります。これについて最善の方法は何ですか? ありがとうございました!

4

1 に答える 1