如果我像这样在 Yacc/Bison 中编写语法文件:
Module
:ModuleName "=" Functions
{ $$ = Builder::concat($1, $2, ","); }
Functions
:Functions Function
{ $$ = Builder::concat($1, $2, ","); }
| Function
{ $$ = $1; }
Function
: DEF ID ARGS BODY
{
/** Lacks module name to do name mangling for the function **/
/** How can I obtain the "parent" node's module name here ?? **/
module_name = ; //????
$$ = Builder::def_function(module_name, $ID, $ARGS, $BODY);
}
这个解析器应该解析这样的代码:
main_module:
def funA (a,b,c) { ... }
在我的 AST 中,名称“funA”应重命名为main_module.funA
. Function
但是在解析器处理节点时我无法获取模块的信息!
是否有任何 Yacc/Bison 设施可以帮助我处理这个问题,或者我应该改变我的解析风格以避免这种尴尬的情况?