0

バイソンパーサーで繰り返しコードを短くしようとしています。ルールの1つの抜粋を次に示します。

expression : OBJECTID ASSIGN expression { $$ = std::make_shared<Assign>($1, $3); $$->setloc(@3.first_line, curr_filename); }
            | expression '.' OBJECTID '(' method_expr_list ')' { $$ = std::make_shared<DynamicDispatch>($1, $3, $5); 
                                                                 $$->setloc(@1.first_line, curr_filename); }

私は次のようなことを考えていました:

expression : OBJECTID ASSIGN expression { $$ = std::make_shared<Assign>($1, $3); SETLOC(@1); }
            | expression '.' OBJECTID '(' method_expr_list ')' { $$ = std::make_shared<DynamicDispatch>($1, $3, $5); 
                                                                 SETLOC(@1); }

マクロを使用する以外にこれを達成する方法は考えられません。これは私が思いついたものです:

#define SETLOC(node) $$->setloc((node).first_line, curr_filename)

残念ながら、$$ が定義されていないというコンパイル エラーが発生します。これは、関数のようなマクロであるため、当然のことです。2 番目のスニペットのコードを実現する方法があるかどうか知りたいですか?

4

1 に答える 1

0

これは$$、Bison が認識して使用する特別なシーケンスであり、実際に生成された C コードには含まれていないためです。代わりに、引数としてマクロに渡す必要があります。

#define SETLOC(parent, node) parent->setloc((node).first_line, curr_filename)
于 2012-08-17T05:37:00.563 に答える