2015-10-06 3 views
0

Я пытаюсь создать язык сценариев, используя 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 был найден, который не то, что я иду. Кроме того, я получил предупреждение о «пустом правиле для типичного нетерминала и никакого действия», которое, вероятно, не очень хорошо.

ответ

1

Просто избавиться от пустого производства (& эпсилон;) в Steps:

Steps: Step   { $$ = create_steps($1); } 
     | Steps Step { $$ = create_steps($2); } 
     ; 

.. а затем Step прилагается к вашему растущему дереву. Вы даже можете перейти на растущее дерево таким образом:

Steps: Step   { $$ = create_steps(NIL, $1); } 
     | Steps Step { $$ = create_steps($1, $2); } 
     ; 

Это так часто при составлении (делать списки), что это происходит в большинстве грамматик.

+0

Это означает, что вход «Шаги» имеет нулевые шаги. Чтобы это разрешить, сохраните производство epsilon и создайте пустой список. –

Смежные вопросы