0

次のようなステートメントを解析するためにJflex、byacc、Javaを使用しています

where expr,expr having expr

そして文法は次のようになります

%token WHERE HAVING COMMA
%%

stmt : whereclause havingclause

whereclause : WHERE conditionlist { move tmpList to whereClause};
havingclause : HAVING conditionlist { move tmpList to havingClause};

conditionlist : condition | condition COMMA conditionlist;

condition : expr { tmpList.add($1); 
                  /How do I know this is being executed for whereclause or havingclause /};

expr : ....

条件がwhereclauseまたはhavingclauseの一部であるかどうかを区別できないため、条件を一時リストに保存してから、正しい句に移動しています。これを行う正しい方法は何ですか?

4

1 に答える 1

1

最も一般的には、ルール アクションでデータ構造を構築し、それらへのポインターを割り当ててから$$、上位レベルのルールでそれらを読み取ります。何かのようなもの:

%token WHERE HAVING COMMA
%union {
    class List *listptr;
    class Expr *exprptr;
}
%type<listptr> whereclasue havingclause conditionlist
%type<exprptr> condition expr
%destructor { delete $$; } <listptr>
%destructor { delete $$; } <exprptr>
%%

stmt : whereclause havingclause { do something with $1 and $2... }

whereclause : WHERE conditionlist { $$ = $2; };
havingclause : HAVING conditionlist { $$ = $2 };

conditionlist : condition { $$ = new List($1); }
              | condition COMMA conditionlist { $$ = $2->prepend($1); };

condition : expr { $$ = $1; }

expr : ....

%destructorアクションは bison 拡張であり、構文エラーが発生した場合のメモリ リークを回避するために必要であることに注意してください。

于 2012-07-06T23:53:13.907 に答える