Как исправить нетерминал, становящийся нулевым от одного правила до другого - PullRequest
0 голосов
/ 21 мая 2019

Я пишу компилятор, и теперь я делаю 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);}
    ;
...