WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте
Flex
Тип генератор лексических анализаторов
Автор
Разработчик Верн Паксон[d][1][3]
Написана на Си
Операционная система Unix-like
Первый выпуск 1987[4]
Аппаратная платформа кроссплатформенное ПО
Последняя версия
Лицензия BSD
Сайт github.com/westes/flex

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

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

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

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

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

Блок определений
%%
Блок правил
%%
Блок кода на Си

Определения содержат стартовые значения и определения, правила, непосредственно сами выражения и соответствующие им действия; пользовательский код просто включается в вывод 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 или GNU bison.

Примечания

  1. 1 2 http://openbsd.su/src/usr.bin/lex/README
  2. http://openbsd.su/src/usr.bin/lex/parse.y
  3. http://openbsd.su/src/usr.bin/lex/COPYING
  4. (unspecified title) — С. 9. — ISBN 978-0-596-15597-1
  5. Release 2.6.4 — 2017.
  6. Cameron MacKinnon. Is flex GNU or not? (2 декабря 1996). Проверено 1 августа 2010. Архивировано 29 апреля 2012 года.
  7. IBM. Пособие.  (недоступная ссылка)
  8. Обычно — yylex().

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии