Это более или менее MCVE (Minimal, Complete, Verifiable Example) для распознавания и захвата части работы - это также усиливает уникальность. Он использует assert()
, чтобы гарантировать, что токены являются одиночными (не нулевыми) символами.
%{
#include <assert.h>
%}
%option noinput
%option nounput
%option noyywrap
ID0 [A]
ID1 [B]
ID2 [C]
ID3 [D]
ID4 [E]
%%
{ID0} { printf("{ID0}: %s\n", yytext); return 1; }
{ID1} { printf("{ID1}: %s\n", yytext); return 1; }
{ID2} { printf("{ID2}: %s\n", yytext); return 1; }
{ID3} { printf("{ID3}: %s\n", yytext); return 1; }
{ID4} { printf("{ID4}: %s\n", yytext); return 1; }
. { printf(" . : %s\n", yytext); }
%%
int main(void)
{
char token[512] = "";
char *ptr = token;
/* Efficiency and safety is not under discussion */
while (yylex())
{
assert(yytext[0] != '\0' && yytext[1] == '\0');
if (strchr(token, yytext[0]) == 0)
*ptr++ = yytext[0];
}
*ptr = '\0';
printf("Token sequence: [%s]\n", token);
return 0;
}
(я переименовал ID
к ID0
для лучшего соответствия имен.)
Пример выполнения (я использовал имя fx83.l
для источника и, следовательно, fx83
как название программы, генерируемого из источника) :
$ ./fx83 <<< "aBcDeAbCdEFf"
. : a
{ID1}: B
. : c
{ID3}: D
. : e
{ID0}: A
. : b
{ID2}: C
. : d
{ID4}: E
. : F
{ID0}: A
{ID1}: B
. : d
{ID2}: C
{ID3}: D
. : e
{ID4}: E
{ID4}: E
. : f
Token sequence: [BDACE]
$
(я не думаю, что это важно, но я использую flex 2.5.35 Apple(flex-31)
на MacOS Sierra 10.12.2 с GCC 6.2.0.)
Разве это не то, что означает 'yytext'? Конечно, в его нынешнем виде у вас есть только действия по умолчанию для шаблонов (и для моего образа мышления, 'ID' должен иметь числовой суффикс, но это проблема æsthetics), поэтому вам нужно будет сделать некоторую работу чтобы дать 'main()' возможность обрабатывать совпадающие символы. Наличие односимвольных классов символов, как показано, немного странно, хотя и не является формальным. Вы также должны использовать некоторое пространство. –
Да, существует yytext() в главном – tzavsk
'yytext()'? Функция? Я привык думать, что «yytext» является либо «char yytext [];», либо «char * yytext;», и я, кажется, помню, какой вариант был доступен, зависит от того, какой вариант Lex используется, и я не вспомните, что делает Flex. Вам нужно добавить что-то после каждого шаблона, чтобы вернуться к 'main()' - что-то вроде '{return 1; } 'для указания успешного соответствия. Все, что не соответствует, игнорируется, IIRC. –