Flex (генератор лексических анализаторов)

Flex (генератор лексических анализаторов)
Flex
Тип

генератор лексических анализаторов

Написана на

Си

Операционная система

Unix-like

Аппаратная платформа

кроссплатформенное ПО

Последняя версия

2.5.37 (4 августа 2012)

Лицензия

BSD

Сайт

flex.sourceforge.net

Flex (Fast Lexical Analyzer) — генератор лексических анализаторов. Заменяет Lex в системах на базе пакетов GNU и имеет аналогичную функциональность. При этом Flex не является частью проекта GNU[1].

Использование

Lex — это инструмент для лексического анализа, который может использоваться для выделения из исходного текста определенных строк заранее заданным способом. Yacc — это инструмент для грамматического разбора; он читает текст и может использоваться для конвертирования последовательности слов в структурированный формат для дальнейшей обработки.

[2]

На входе получает текст в свободном формате и правила выделения лексем. На выходе даёт код анализатора, в виде функции на языке C[3].

Правила задаются в виде регулярных выражений слева и, обычно, кода на языке C справа. Правила содержат три секции, отделяющиеся строкой «%%»:
определения
%%
правила
%%
код пользователя

Определения содержат стартовые значения и определения, правила, непосредственно сами выражения и соответствующие им действия, пользовательский код просто включается в вывод flex. Некоторые секции могут отсутствовать.

Функция анализатора получает текст на входе и выполняет заданный код для каждой найденной лексемы. Например, данный код, для каждого вхождения username в тексте, выполнит код printf(«%s», getlogin()):

%%
 
username        printf( "%s", getlogin() );

Данная функция выведет в поток строку, возвращаемую функцией getlogin(). То есть, каждое вхождение username во входном потоке будет заменено значением, возвращаемым getlogin(). Например, именем текущего пользователя.

Правила, согласно которым, итоговая функция должна печатать на выходе тип лексемы (if, переменная, число, унарная или бинарная операция) и значения для некоторых лексем:

%%
if              printf ("IF statement\n");
[a-z]+          printf ("tag, value %s\n", yytext);
{D}+            printf ("decimal number %s\n", yytext);
"++"            printf ("unary op\n");
"+"             printf ("binary op\n");

Пример подсчёта количества строк и символов в тексте:

%{
   int num_lines = 0, num_chars = 0;
%}
 
%%
 
\n++    ++num_lines; ++num_chars; 
 
.       ++num_chars;
 
%%
main()
{
  yylex();
  printf( "# of lines = %d, # of chars = %d\n", num_lines, num_chars );
}

Далее, функцию созданную генератором возможно использовать с генераторами синтаксических анализаторов. Обычно flex используют с yacc или bison. Синтаксический анализатор использует вызов функции yylex(), созданной генератором flex для поиска следующей лексемы.

Примечания

  1. Cameron MacKinnon Is flex GNU or not? (2 декабря 1996). Архивировано из первоисточника 29 апреля 2012. Проверено 1 августа 2010.
  2. IBM. Пособие.
  3. Обычно — yylex().

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать реферат

Полезное


Смотреть что такое "Flex (генератор лексических анализаторов)" в других словарях:

  • BASIC-256 — с …   Википедия

  • Лексический анализ — Запрос «Лексема (информатика)» перенаправляется сюда; см. также другие значения. В информатике лексический анализ  процесс аналитического разбора входной последовательности символов (например, такой как исходный код на одном из языков… …   Википедия

  • lex — программа для генерации лексических анализаторов, обычно используемая совместно с генератором синтаксических анализаторов yacc. Lex был первоначально написан Эриком Шмидтом (Eric Schmidt) и Майком Леском (Mike Lesk) и является стандартным… …   Википедия

  • Lex — программа для генерации лексических анализаторов, обычно используемая совместно с генератором синтаксических анализаторов yacc. Lex был первоначально написан Эриком Шмидтом (Eric Schmidt) и Майком Леском (Mike Lesk) и является стандартным… …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»