バイソンパーサーで繰り返しコードを短くしようとしています。ルールの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 番目のスニペットのコードを実現する方法があるかどうか知りたいですか?