gpt4 book ai didi

parsing - 如何解析依赖 parent 信息的子节点?

转载 作者:行者123 更新时间:2023-12-04 05:22:46 25 4
gpt4 key购买 nike

如果我像这样在 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 设施可以帮助我处理这个问题,或者我应该改变我的解析风格以避免这种尴尬的情况?

最佳答案

有一个bison功能,但作为 manual说,小心使用它:

$N with N zero or negative is allowed for reference to tokens and groupings on the stack before those that match the current rule. This is a very risky practice, and to use it reliably you must be certain of the context in which the rule is applied. Here is a case in which you can use this reliably:


 foo:      expr bar '+' expr  { ... }
| expr bar '-' expr { ... }
;

bar: /* empty */
{ previous_expr = $0; }
;

As long as bar is used only in the fashion shown here, $0 always refers to the expr which precedes bar in the definition of foo.



更清楚地说,您可以使用中间规则操作(在 Module 中)将模块名称推送到名称堆栈(必须是解析上下文的一部分)。然后,您将在规则末尾弹出堆栈。

有关中间规则操作的更多信息和示例,请参阅 manual .

关于parsing - 如何解析依赖 parent 信息的子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13532818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com