我正在尝试缩短我的野牛解析器中的一些重复代码,这是其中一条规则的摘录:
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)
不幸的是,我收到一个编译错误,说 $$ 没有定义,这是有道理的,因为它是一个类似函数的宏。我想知道是否有办法实现第二个片段中的代码?