Я пробовал что-то подобное в моем файле Bison...
ReturnS: RETURN expression {printf(";")}
... но точка с запятой печатается ПОСЛЕ следующей лексемы после этого правила, а не сразу после выражения. Это правило было введено, так как мы должны преобразовать входной файл в с-образную форму, а исходный язык не требует точки с запятой после выражения в операторе возврата, но C требует, поэтому я подумал, что добавлю его. вручную на вывод с помощью printf. Похоже, это не работает, так как добавляется точка с запятой, но по какой-то причине она добавляется после анализа следующего токена (вне правила ReturnS), а не сразу, когда правило выражения возвращается к ReturnS.
Это правило также приводит к тому же результату:
loop_for: FOR var_name COLONEQUALS expression TO {printf("%s<=", $<chartype>2);} expression STEP {printf("%s+=", $<chartype>2);} expression {printf(")\n");} Code ENDFOR
Помимо того, что первые два printf работают неправильно (я отправлю еще один вопрос по этому поводу), последний printf фактически вызывается ПОСЛЕ того, как первый токен/литерал правила «Code» был проанализирован, что приводит к чему-то вроде этого:
for (i=0; i<=5; i+=1
a)
=a+1;
вместо
for (i=0; i<=5; i+=1)
a=a+1;
Любые идеи, что я делаю неправильно?