我正在尝试缩短我的野牛解析器中的一些重复代码,这里是其中一条规则的摘录:
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)
不幸的是,我得到一个编译错误,说没有定义$$,这是有道理的,因为它是一个类似函数的宏。我想知道是否有办法在第二个片段中实现代码?
答案 0 :(得分:0)
这是因为$$
是Bison识别和使用的特殊序列,它不在实际生成的C代码中。您必须将其作为参数传递给宏:
#define SETLOC(parent, node) parent->setloc((node).first_line, curr_filename)