Ключевые слова: %option reentrant
или %option c++
.
Например, сканер ncr2a
:
/** ncr2a_lex.l: Replace all NCRs by corresponding printable ASCII characters. */
%%
&#(1([01][0-9]|2[0-6])|3[2-9]|[4-9][0-9]); { /* accept 32..126 */
/** `+2` skips '&#', `atoi()` ignores ';' at the end */
fputc(atoi(yytext + 2), yyout); /* non-recursive version */
}
Код сканера можно оставить без изменений.
Вот программа, которая его использует:
/** ncr2a.c */
#include "ncr2a_lex.h"
typedef struct {
int i,j; /** put here whatever you need to keep extra state */
} State;
int main () {
yyscan_t scanner;
State my_custom_data = {0,0};
yylex_init(&scanner);
yyset_extra(&my_custom_data, scanner);
yylex(scanner);
yylex_destroy(scanner);
return 0;
}
Для сборки ncr2a
исполняемый файл:
flex -R -oncr2a_lex.c --header-file=ncr2a_lex.h ncr2a_lex.l
cc -c -o ncr2a_lex.o ncr2a_lex.c
cc -o ncr2a ncr2a_lex.o ncr2a.c -lfl
Пример
$ echo 'three colons :::' | ./ncr2a
three colons :::
В этом примере используется ввод / вывод stdin / stdout, и он вызывает yylex()
один раз.
Для чтения из файла:
yyin = fopen("input.txt", "r" );
@ Ответ Локи Астари показывает, как читать из строки (buffer = yy_scan_string(text, scanner); yy_switch_to_buffer(buffer, scanner)
)
.
Чтобы вызвать yylex()
один раз для каждого токена, добавьте return
в определения правил, которые дают полный токен в файле *.l
.