Я пытаюсь создать язык сценариев, используя Bison и C, и мне интересно, правильно ли я строю AST. Вот дерево, я пытаюсь создать:Создание АСТ в Bison
+
└─ Steps
└─ Step 1
└─ Step 2
...
└─ Step n
Если это не ясно, я хочу иметь узел, содержащий п шагов. Грамматика я прямо сейчас выглядит следующим образом:
Steps: { $$ = create_steps(); }
| Steps Step
;
Step:
IDENTIFIER StepBody { $$ = create_step($1); }
Где StepBody разбирается в узел, как я ожидаю, что это будет. В моем коде я создаю связанный список для шагов, чтобы войти в create_steps();
, но это не похоже на лучший способ сделать это.
Я думаю, что у меня должна быть функция create_steps(node *inner_node);
, которая выводит все функции обработки Step
и добавляет их в массив, но я не понимаю, как я мог это достичь.
Первоначально я имел Steps
установки, как это в Bison:
Steps:
| Steps Step { $$ = create_steps($Step); }
;
, но, конечно, что называется create_steps
каждый раз, когда Step
был найден, который не то, что я иду. Кроме того, я получил предупреждение о «пустом правиле для типичного нетерминала и никакого действия», которое, вероятно, не очень хорошо.
Это означает, что вход «Шаги» имеет нулевые шаги. Чтобы это разрешить, сохраните производство epsilon и создайте пустой список. –