2012-08-16 48 views
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) 

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

+0

,如果你这样做'#定义印记使用'SIGIL-> setloc(...)'会发生什么$$'和? – 2012-08-17 05:06:56

回答

0

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

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