我知道如何让YACC生成一个抽象语法树(AST),但是你怎么才能得到它呢?我的意思是,你怎么才能从YACC中获得根节点的值呢?
Yacc每次只返回一个节点,而且它总是你之前在reduced production中想要返回的任何内容,或者从终端符号中想要返回的任何内容。把根规则或顶级规则中想要返回的任何内容保存下来(在你附加的C reduction代码中),以任何你喜欢的方式保存。
(抱歉,你说你知道这个,但是有些人可能不知道。)
toprule: expression_list { some_global = whatever_you_were_going_to_return };
换句话说,你可以用 { globalsym = e; }
来代替 { $$ = e; }
。 - DigitalRoss%parse-param {AstNode **pproot}
%parse-param {char **errmsg}
res = yyparse(&pAst, &errmsg);
AST节点在yyparse()函数内部被分配和链接成树形结构(您需要编写逻辑),根节点的地址通过pAst指针返回。
虽然不如解析器直接返回AST那样优雅,但我想到的最好方法是使用一个全局数据结构(例如向量或链表),如果需要线程安全,则使用线程安全的插入方法,并且让顶层yacc规则将其结果(即$$
)添加到该数据结构中。然后,您可以在其他函数中访问此结果。当然,如果您只打算输出一个单独的AST,那么只需要一个指向该AST的全局指针,而不是一个充满它们的数据结构。