Я пишу компилятор, и теперь я делаю AST.По-видимому, в одном правиле нетерминал превращает NULL в правило.Я не могу найти проблему здесь.
Я пробовал отладку с printf, но я все еще не вижу проблемы.Когда я добавляю один if ($$)
в правило initval
, он печатается так, что $$
не является пустым.Однако, когда я помещаю if ($2)
в правило initarray
, оно не печатается.То же самое происходит в правиле массива.
array: ':' initarray {$$ = $2;}
| %empty {$$ = NULL;}
;
initarray: initarray initval {$$ = insert_node($1, $2);}
| %empty { $$ = NULL; }
;
initval: LIT_INTEGER {$$ = make_new_node(AST_symbol, $1);}
| LIT_FLOAT {$$ = make_new_node(AST_symbol, $1);}
| LIT_CHAR {$$ = make_new_node(AST_symbol, $1);}
;