Флекс — разлика између измена

Садржај обрисан Садржај додат
мНема описа измене
м Бот: исправљена преусмерења; козметичке измене
Ред 6:
вебсајт = -{[http://flex.sourceforge.net/ flex.sf.net]}- |
}}
'''-{Flex}-''' (брзи генератор [[лексички анализатор|лексичког анализатора]]) је слободна верзија -{[[Lex |Lex-а]]}-. Обично се користи са слободним -{[[GNU bison|Bison]]}- генератором. -{Flex}- настао око 1987. године и првобитно је написан у -{[[C (вишезначна одредница)|C]]}--у, а његов аутор је -{[[Vern Paxson]]}-.
 
Опис -{flex}--а дат је у упуству за његово коришћење:
:"-{Flex}- је програмска алатка за генерисање скенера (читача): програма који препознају лексичке шаблоне у тексту. -{Flex}- чита дату улазну датотеку или стандардни улаз, уколико име улазне датотеке није задато, ради описа читача који ће да генерише. Описи су у облику регуларних израза и -{C}- кода, и зову се правила. -{Flex}- генерише као излаз -{С}- датотеку, -{'<code>lex.yy.c</code>'}-, која позива функцију -{'<code>yylex()</code>'}-. Ова -{С}- датотека је компајлирана и повезана (линкована) са -{'<code>-lfl</code>'}- датотеком да би било могуће извршавање програма. Када се покрене програм, он анализира дати улаз тражећи онај део улаза који одговара датом регуларном изразу. Када нађе тај део улаза, онда се извршава одговарајући део -{C}- кода..."
 
Лексички читач који одговара -{[[C++]]}- је -{flex}-++, и он је део -{flex}- пакета. -{Flex}-++ је доступан на јуникс системима базирани на бесплатној -{[[ГНУ|GNU]]}- лиценци. Он је такође доступан и нејуниксовским системима.
 
-{Flex}- заправо служи за читање знакова и прављење одговарајућих токена користећи [[детерминистички коначни аутомат]] (ДКА). ДКА је теоретска машина која прихвата [[регуларни изрази|регуларне изразе]].
 
== Пример лексичког анализатора ==
Ред 23:
Спољашње променљиве које се користе:
<source lang="c">
FILE *source /* изворна датотека */
int cur_line, cur_col, err_line, err_col /* за извештавање о грешки */
int num /* овде се уписује последњи прочитани број */
char id[] /* Овде се уписује последњи прочитани идентификатор */
Hashtab *keywords /* листа кључних речи */
</source>
 
Спољашње функције које се позивају:
<source lang="c">
error(const char msg[]) /* Извештава о грешки */
Hashtab *create_htab(int estimate) /* Креира претраживачку табелу */
int enter_htab(Hashtab *ht, char name[], void *data) /* Додаје променљиву претраживачкој табели */
Entry *find_htab(Hashtab *ht, char *s) /* Проналази променљиву у претраживачкој табели */
void *get_htab_data(Entry *entry) /* Враћа податак из претраживачке табеле */
FILE *fopen(char fn[], char mode[]) /* Отвара датотеку за читање */
fgetc(FILE *stream) /* Чита следећи знак из тока */
ungetc(int ch, FILE *stream) /* Враћа натраг прочитани знак у ток */
isdigit(int ch), isalpha(int ch), isalnum(int ch) /* Класификација знакова */
</source>
 
Спољашњи типови:
<source lang="c">
Symbol /* Набројиви тип свих симбола у PL/0 језику */
Hashtab /* Репрезентује претраживачку табелу */
Entry /* Репрезентује променљиву у претраживачкој табели */
</source>
 
Ред 162:
%}
 
cifra [0-9]
slovo [a-zA-Z]
 
%%
"+" { return PLUS; }
"-" { return MINUS; }
"*" { return PUTA; }
"/" { return PODELJENO; }
"(" { return OZAGRADA; }
")" { return ZZAGRADA; }
";" { return TACKA_ZAREZ; }
"," { return ZAREZ; }
"." { return TACKA; }
":=" { return JE; }
"=" { return JEDNAKO; }
"<>" { return NIJE_JEDNAKO; }
"<" { return MANJE; }
">" { return VECE; }
"<=" { return MANJE_JEDNAKO; }
">=" { return VECE_JEDNAKO; }
"begin" { return BEGINSYM; }
"call" { return CALLSYM; }
"const" { return CONSTSYM; }
"do" { return DOSYM; }
"end" { return ENDSYM; }
"if" { return IFSYM; }
"odd" { return ODDSYM; }
"procedure" { return PROCSYM; }
"then" { return THENSYM; }
"var" { return VARSYM; }
"while" { return WHILESYM; }
{letter}({letter}|{digit})* {
yylval.id = (char *)strdup(yytext);
return IDENTIFIKATOR; }
{digit}+ { yylval.num = atoi(yytext);
return BROJ; }
[ \t\n\r] /* preskoci beline */
. { printf("Unknown character [%c]\n",yytext[0]);
return NEPOZNATO; }
%%
Ред 211:
== Погледајте још ==
 
* [[Lex]]
* [[GNU bison|Bison (yacc) parser generator]]
* [http://www.gnu.org/software/flex/manual/ Flex Manual]
* [http://www.cs.wwc.edu/~aabyan/464/Book/index.html Compiler Construction using Flex and Bison] - Course by Anthony Aaby, a Romanian rebuild version of this book in pdf format may be downloaded from [http://cs.wwc.edu/~aabyan/Linux/fb2-press.pdf fb2-press.pdf] or [http://cs.wwc.edu/~aabyan/Linux/fb2-printing.pdf fb2-printing.pdf]
Преузето из „https://sr.wikipedia.org/wiki/Флекс