Одной из проблем является ваша команда компиляции:
gcc -o $@ s1.tab.c lex.yy.c
Полагаю, вы скопировали это из какого-то файла Makefile или чего-то еще, но она определенно не будет работать как команда оболочки.В bash (или любой другой оболочке) $@
означает «аргументы скрипта оболочки», и, поскольку вы работаете в консоли, а не в скрипте оболочки, наиболее вероятно, что аргументов нет и $@
пустой.Таким образом, после подстановки эта команда будет читать:
gcc -o s1.tab.c lex.yy.c
То есть она просит компилятор скомпилировать файл, сгенерированный с помощью flex, и поместить полученный исполняемый файл в s1.tab.c
, переписав файл, сгенерированный bison.Поскольку компилируется только сканер, yylval
не найден (он был бы определен в анализаторе).С другой стороны, тот факт, что анализатор никогда не компилировался, избавляет вас от другой проблемы, с которой вы могли бы столкнуться в противном случае: оба ваших файла содержат определение main()
.Но исполняемый файл может иметь только одно определение main()
.(Действительно, он может иметь только одно определение любого внешнего символа, но main()
особенно важен.)
Наконец, как показано, ваш гибкий файл s1.l не будет давать правильных результатов, поскольку второй и четвертыйперед строками (%{
и %}
) ставятся пробелы.Эти маркеры должны появляться в начале строки без дополнительных завершающих символов.Текст в прологе, которому предшествует пробел, дословно копируется в сгенерированный синтаксический анализатор, и gcc, безусловно, выдаст синтаксическую ошибку при чтении %{
.Поэтому я полагаю, что файлы, показанные в вашем вопросе, не совсем соответствуют файлам, которые вы используете.