if - while -for реализация для бизона - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над переводчиком, но не могу реализовать if, while, for на нем в зубрах.
Я написал этот код для if в зубрах:

if_block:
    IF '(' rule ')' '{' smt '}'
    | IF '(' rule ')' '{' smt '}' ELSE '{' smt '}'
    | IF '(' rule ')' '{' smt '}' elif_block ELSE '{' smt '}'
    ;
elif_block:
    ELIF '(' rule ')' '{' smt '}'
    | ELIF '(' rule ')' '{' smt '}' elif_block
    ;
rule:
    exp EQUAL_T exp                     { $<int_val>$ = check($<data_val>1 ,$<data_val>3); }
    ;  

Но когда rule = 1 или rule = 0, smt запускается и я получаю неправильный ответ.
Пожалуйста, помогите мне, что мне делать? Пожалуйста, дайте мне код для if и while цикла ...

1 Ответ

0 голосов
/ 08 мая 2018

В цикле код должен выполняться несколько раз (обычно).Таким образом, он не может быть выполнен так, как он анализируется, поскольку он анализируется только один раз.

Аналогично, в условных выражениях цель (и) выполняются один или ноль раз, но анализируются ровно один раз.Тот, который выполняется ноль раз, явно не может быть выполнен, поскольку он анализируется;это будет слишком много выполнений, как вы заметили.

Таким образом, вы должны записать результат анализа, в виде синтаксического дерева, в виде трехадресного кода или каким-либо другим способом, а затем выполнить программутолько после того, как он был полностью проанализирован.

...