我正在做我自己的小语言,我正在尝试制作块,但我非常坚持如何跟踪当前块(因为我需要知道变量是在哪个块中创建的,所以 -等等等等)。
我的语法文件看起来像这样(为简单起见,它不是整个代码):
%{
struct Node *nodest = NULL;
struct Node *currentblock = NULL;
%}
%start source
%%
source
: stmts { nodest = block($1); currentblock = nodest; }
;
stmts
: stmt
| stmts stmt
;
stmt
: expr_stmt
| iter_stmt
| select_stmt
| comp_stmt
;
expr_stmt
: ';'
| expr ';'
;
expr
: binary_expr
| assign_expr
| call_expr
| decl_expr
| init_expr
| VAR_IDENT
| INTEGER
| '(' expr ')'
;
comp_stmt
: '{' '}'
| '{' stmts '}' { $$ = block($2); currentblock = $$; }
;
decl_expr
: type VAR_IDENT { $$ = declaration($1, $2, currentblock) }
;
/* ... */
type
: TYPE_INT
;
这显然是行不通的,因为nodest
(作为一个包含所有其他节点的块节点)实际上在创建 AST 的最后阶段被赋予了一些值,所以在其余时间它是 NULL,所以currentblock
不能使用像 in decl_expr
,因为它当时是 NULL 。
nodest
所以我的问题是:我怎样才能在代码中获得稍后的值(指向它指向的位置或其他) ?
或者,如果这不是真的可能,您能否给我一些说明/提示我如何才能做到这一点?