0

我正在尝试缩短我的野牛解析器中的一些重复代码,这是其中一条规则的摘录:

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)

不幸的是,我收到一个编译错误,说 $$ 没有定义,这是有道理的,因为它是一个类似函数的宏。我想知道是否有办法实现第二个片段中的代码?

4

1 回答 1

0

这是因为这是$$Bison 识别和使用的特殊序列,它不在实际生成的 C 代码中。您必须将其作为参数传递给宏:

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