К сожалению, я не могу вспомнить синтаксис для bison / flex, но моя интуиция подсказывает мне, что приоритет не преобразуется правильно в код C.
Если это так, значит ли это, что $ 2 означает "для вывода этого выражения замените его в коде, сгенерированном для второго подвыражения на этом этапе раскрытия, без каких-либо знаний о правилах приоритета Си "?
Если так, ваш код создает что-то вродеprintf (... 1 + 2 * 2 + 1) ".Можете ли вы просмотреть источник производства и подтвердить?Если это так, то, вероятно, следует добавить несколько скобок вокруг $ 2 в расширении выражения '(' или округлить аргументы $ 1 и $ 3 в выражении '*'?