Как с помощью flex создать файл на языке Си?

Модератор: Модераторы разделов

Ответить
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Как с помощью flex создать файл на языке Си?

Сообщение жучара »

Друзья! Вот конфигурационный файл для flex:

Shell

$ cat exampleA.l
%%
%%
$
А вот так создаётcя файл *.c (будто бы):

Shell

$ flex exampleA.l
$
$ ls
$ exampleA.l lex.yy.c
$
Только созданный файл lex.yy.c на самом деле *.i. (Когда мы даём команду gcc *.c, сперва файл, который *.c, обрабатывается препроцессором, результат- файл *.i- если ничего нового не придумано.) Так вот lex.yy.c это и есть файл *.i.

И хоть ты как заменяйся расширение (можно использовать опции --outfile и/или --header-file ), содержание он всё рано будет *i. И это мешает (как именно- отдельный разговор.) Спасибо, кто откликнется. Debian 11.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как с помощью flex создать файл на языке Си?

Сообщение Bizdelnick »

Странные Вы вещи пишете. Препроцессор на выходе выдаёт код на C, только с раскрытыми макросами. Если Вам кажется, что в его выводе есть что-то другое, Вы заблуждаетесь. Можно сколько угодно подавать уже препроцессированный код на вход препроцессору снова, ошибок не будет. Но в приведённом Вами примере flex, наоборот, должен создать код с кучей макросов. Так что это Вы видите в файле что-то, чего там нет (кстати, что именно?).
жучара писал(а):
17.10.2022 14:30
И это мешает (как именно- отдельный разговор.)
Вы опять излагаете свои домыслы вместо реальной проблемы. Рассказывайте, чем это якобы мешает.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как с помощью flex создать файл на языке Си?

Сообщение жучара »

Bizdelnick писал:
17.10.2022 14:54
Вы опять излагаете свои домыслы вместо реальной проблемы. Рассказывайте, чем это якобы мешает.
Странно. Я считал, что мы друг другу доверяем.

...Итак, посмотрим, как gcc указывает на ошибки, в файле *.c, созданым flex. Для этого маленькую ошибку создадим специально. Конфигурационный файл flex. В нём написана чушь, чтобы только воспроизвелась ошибка:

Shell

$ cat exampleA.l
%%
W: Q
%%
$
Теперь создадим файл на языке Cи:

Shell

$ flex exampleA.l
$
$ ls
exampleA.l lex.yy.c
$
То есть видим, что получился файл lex.yy.c, скомпилим его. А функция main(), нужно вам сказать уже где-то в библиотеке libfl.a есть. Нужно эту библиотеку добавить:

Shell

$ gcc -o exampleA lex.yy.c -lfl
exampleA.l: In function ‘yylex’:
exampleA.l:2:1: error: ‘Q’ undeclared (first use in this function)
2 | W: Q
| ^
exampleA.l:2:1: note: each undeclared identifier is reported only once for each function it appears in
exampleA.l:2:2: error: expected ‘;’ before ‘break’
2 | W: Q
| ^
| ;
$
Вот такая выходит ошибка, но вопрос- а она где проявляется? А она проявляется в файле exampleA.l в функции yylex (). Несмешные шутки какие-то, exampleA.l что, заголовочный файл какой-то или что? Он конфигурационный файл для flex. Хорошо, удалим exampleA.l. (чтобы не было непоняток, изначально он был, но я его руками удалил и теперь его нет. Но могу восстановить.)

Shell

$ rm exampleA.l
$ ls
lex.yy.c
$ gcc -o exampleA lex.yy.c -lfl
exampleA.l: In function ‘yylex’:
exampleA.l:2:1: error: ‘Q’ undeclared (first use in this function)
exampleA.l:2:1: note: each undeclared identifier is reported only once for each function it appears in
exampleA.l:2:2: error: expected ‘;’ before ‘break’
$
То есть оно упорно лезет в файл exampleA.l, которого уже нет и в нём умудряется найти функцию yylex(), которой, соответственно, тоже нет и в ней найти ошибку. Что ж такое? А я вот выяснил, что именно так будет себя gcc, обрабатывая файл с расширением *.i, и не просто с расширением, а именно созданный как *.i, то есть gcc с опцией -E

Вот собсно и всё. Зачем gcc лезет в несуществующий файл exampleA.l и как этого избежать.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как с помощью flex создать файл на языке Си?

Сообщение Bizdelnick »

gcc работает ровно так, как задумано: сообщает об ошибке и том месте, где она изначально появилась. Чтобы программист знал, где её надо исправлять. И для этого он берёт информацию об исходном файле, которая записана в lex.yy.c. А записал её туда flex именно для того, чтобы программист мог разобраться, откуда что взялось. Все порядочные генераторы кода так делают (препроцессор тоже, но отнюдь не только он один).
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как с помощью flex создать файл на языке Си?

Сообщение жучара »

Bizdelnick писал:
17.10.2022 23:28
gcc работает ровно так, как задумано: сообщает об ошибке и том месте, где она изначально появилась. Чтобы программист знал, где её надо исправлять. И для этого он берёт информацию об исходном файле, которая записана в lex.yy.c. А записал её туда flex именно для того, чтобы программист мог разобраться, откуда что взялось. Все порядочные генераторы кода так делают (препроцессор тоже, но отнюдь не только он один).
Написано, что ошибка в файле exampleA.l, а файла exampleA.l нет. Всё нормально и предсказуемо?
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20793
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как с помощью flex создать файл на языке Си?

Сообщение Bizdelnick »

жучара писал(а):
17.10.2022 23:33
Написано, что ошибка в файле exampleA.l, а файла exampleA.l нет. Всё нормально и предсказуемо?
Всё нормально, потому что ошибка действительно была изначально в нём. А что Вы его непредсказуемо удалили — то не вина компилятора или генератора.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Re: Как с помощью flex создать файл на языке Си?

Сообщение жучара »

Bizdelnick писал:
18.10.2022 00:25
жучара писал(а):
17.10.2022 23:33
Написано, что ошибка в файле exampleA.l, а файла exampleA.l нет. Всё нормально и предсказуемо?
Всё нормально, потому что ошибка действительно была изначально в нём. А что Вы его непредсказуемо удалили — то не вина компилятора или генератора.
ясно всё, ничё от вас не добиться. Ладно, может, другой кто подскажет.
Я просто читаю маны.
Спасибо сказали:
math
Сообщения: 276
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Как с помощью flex создать файл на языке Си?

Сообщение math »

Bizdelnick всё верно говорит. Если вы опишете, в чём всё-таки проблема, можно будет подумать как её решить.

То, что вы удалили *.l файл, компилятор знать никак не может, потому что его интересует только итоговый *.c файл и ничего кроме, и про всякие *.l файлы он знает только то, что записано про них в *.c, и ему всё равно есть у вас *.l файл или нет — он ему не нужен.
Спасибо сказали:
Аватара пользователя
Red Gremlin
Сообщения: 506
Статус: самоучка
ОС: Rosa 2016 Fresh

Re: Как с помощью flex создать файл на языке Си?

Сообщение Red Gremlin »

жучара писал(а):
17.10.2022 17:34
То есть оно упорно лезет в файл exampleA.l
Нет, оно туда не лезет. Эта информация задана в файле lex.yy.c с помощью директивы препроцессора #line. Зачем, уже пояснили.
"В мире есть случайность, есть предопределенность и есть то, что ты планируешь совершить."
Спасибо сказали:
Ответить