私は自分の小さな言語をやっていて、ブロックを作ろうとしていますが、現在のブロックを追跡する方法にかなりこだわっています(変数がどのブロックで作成されたかを知る必要があるためなど-何とか何とか)。
私の文法ファイルは次のようになります (簡単にするために、コード全体ではありません)。
%{
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
使用できません。のようにdecl_expr
、その時点では NULL であるためです。
だから私の質問は次のとおりです。コードの後半で値を(それが指している場所などに)取得するにはどうすればよいnodest
ですか?
または、それが本当に不可能な場合は、どうすればこれを実現できるかについてのメモ/ヒントを教えていただけますか?