netch80: (finch)
[personal profile] netch80
Раз в пятый, наверно, пытаюсь сделать что-то лёгкое пробное на bison+flex и обламываюсь на чудовищно путаной и неудобной реализации. Прямой рукописный парсер оказалось сделать легче.
Вот сейчас что-то такое написал, что flex сгенерировал файл со строками:

#line 346 "lexer.h"
#undef yyIN_HEADER
#endif /* yyHEADER_H */
UFFER_STATE yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );


Кто такой UFFER_STATE и на ком он стоял?

(UPDATE: это получилось, если задать %option header-file, но не задать %option outfile. Но нигде не описано, что нельзя задавать только первый из них!)

bison не может в h-файле описать yylval. byacc не может описать в h-файле ничего, кроме кодов лексем - остальное, мол, описывайте сами.

Обоим bison и flex нельзя задать включаемые в этот h-файл строки, отчего, в частности, YYSTYPE или контекстный параметр парсеру надо или описывать одинаково в нескольких местах, или передавать void* и конвертить его в каждом месте использования. Причём они сами не включают нужное в выходные *.h, отчего их надо подключать только со своими источниками определений.

В доке flex сказано "читаем из yyin типа FILE*, вариантов нет", но чуть позже оказывается, что можно переопределить YY_INPUT. Извините, это была секция не туториала-букваря. Спасибо, что в нормальных stdio есть funopen() и fopencookie(), но кто кроме дедов об этом помнит?

Дефолтов для yywrap, yyerror не предлагается, хотя можно было уже давно придумать несколько типичных вариантов.

Bison с pure scanner передаёт параметр-куку всем функциям, кроме yylex(), которому она нужна больше остальных.

За один вечер можно наматериться на неделю.

UPD: победил. Но количество хаков, потребовавшихся, чтобы обойти недоработки и свернуть их с жесточайшего legacy, не радует.
(will be screened)
(will be screened if not validated)
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

netch80: (Default)
netch80

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 3rd, 2026 11:30 pm
Powered by Dreamwidth Studios