Jump to content

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

(Перенаправлено из лексического анализатора Flex )
гибкий
Разработчик(и) Верн Паксон
Первоначальный выпуск около 1987 года ; 37 лет назад ( 1987 ) [1]
Стабильная версия
2.6.4 / 6 мая 2017 г .; 7 лет назад ( 06.05.2017 )
Репозиторий
Операционная система Unix-подобный
Тип лексического анализатора Генератор
Лицензия Лицензия BSD
Веб-сайт github /вестес /гибкий

Flex (быстрый генератор лексического анализатора ) — это с открытым исходным кодом бесплатная программная альтернатива lex . [2] Это компьютерная программа , генерирующая лексические анализаторы (также известные как «сканеры» или «лексеры»). [3] [4] Он часто используется как реализация lex вместе с Berkeley Yacc генератором анализатора в BSD (поскольку оба операционных системах, производных от lex и yacc являются частью POSIX ), [5] [6] [7] или вместе с GNU bison (версия yacc ) в портах *BSD [8] и в дистрибутивах Linux. В отличие от Bison, flex не является частью проекта GNU и не распространяется под лицензией GNU General Public License . [9] хотя руководство для Flex было подготовлено и опубликовано Фондом свободного программного обеспечения. [10]

Flex был написан на C примерно в 1987 году. [1] Верн Паксон , с помощью многих идей и большого вдохновения от Ван Джейкобсона . Оригинальная версия Джефа Посканцера . Быстрое табличное представление является частичной реализацией проекта Ван Джейкобсона. Реализация была выполнена Кевином Гонгом и Верном Паксоном. [11]

Пример лексического анализатора

[ редактировать ]

Это пример сканера Flex для учебного языка программирования PL/0 .

Признаваемые токены: ' +', ' -', ' *', ' /', ' =', ' (', ' )', ' ,', ' ;', ' .', ' :=', ' <', ' <=', ' <>', ' >', ' >='; цифры: 0-9 {0-9}; идентификаторы: a-zA-Z {a-zA-Z0-9} и ключевые слова: begin, call, const, do, end, if, odd, procedure, then, var, while.

%{
#include "y.tab.h"
%}

digit         [0-9]
letter        [a-zA-Z]

%%
"+"                  { return PLUS;       }
"-"                  { return MINUS;      }
"*"                  { return TIMES;      }
"/"                  { return SLASH;      }
"("                  { return LPAREN;     }
")"                  { return RPAREN;     }
";"                  { return SEMICOLON;  }
","                  { return COMMA;      }
"."                  { return PERIOD;     }
":="                 { return BECOMES;    }
"="                  { return EQL;        }
"<>"                 { return NEQ;        }
"<"                  { return LSS;        }
">"                  { return GTR;        }
"<="                 { return LEQ;        }
">="                 { return GEQ;        }
"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 = strdup(yytext);
                       return IDENT;      }
{digit}+             { yylval.num = atoi(yytext);
                       return NUMBER;     }
[ \t\n\r]            /* skip whitespace */
.                    { printf("Unknown character [%c]\n",yytext[0]);
                       return UNKNOWN;    }
%%

int yywrap(void){return 1;}

Внутренности

[ редактировать ]

Эти программы выполняют анализ символов и токенизацию с помощью детерминированного конечного автомата (DFA). DFA — это теоретическая машина, принимающая обычные языки . Эти машины являются подмножеством коллекции машин Тьюринга . DFA эквивалентны машинам Тьюринга, движущимся вправо и доступным только для чтения . Синтаксис основан на использовании регулярных выражений . См. также недетерминированный конечный автомат .

Проблемы

[ редактировать ]

Временная сложность

[ редактировать ]

Лексический анализатор Flex обычно имеет временную сложность. по длине ввода. То есть он выполняет постоянное количество операций для каждого входного символа. Эта константа довольно мала: GCC генерирует 12 инструкций для цикла сопоставления DFA. [ нужна ссылка ] Обратите внимание, что константа не зависит от длины токена, длины регулярного выражения и размера DFA.

Однако использование макроса REJECT в сканере, который может сопоставлять очень длинные токены, может привести к тому, что Flex создаст сканер с нелинейной производительностью. Эта функция является необязательной. В этом случае программист явно сказал Flex «вернуться и повторить попытку» после того, как он уже сопоставил некоторые входные данные. Это заставит DFA вернуться назад, чтобы найти другие состояния принятия. Функция REJECT не включена по умолчанию, и из-за последствий для производительности ее использование не рекомендуется в руководстве Flex. [12]

Реентерабельность

[ редактировать ]

По умолчанию сканер, созданный Flex, не является реентерабельным . Это может вызвать серьезные проблемы для программ, использующих сгенерированный сканер из разных потоков. Чтобы решить эту проблему, Flex предоставляет возможности для достижения повторного входа. Подробное описание этих опций можно найти в руководстве Flex. [13]

Использование в средах, отличных от Unix

[ редактировать ]

Обычно сгенерированный сканер содержит ссылки на заголовочный файл unistd.h , специфичный для Unix . Чтобы избежать создания кода, включающего unistd.h , %option nounistd следует использовать . Другая проблема — вызов isatty (функции библиотеки Unix), которую можно найти в сгенерированном коде. % option Never-Interactive заставляет flex генерировать код, который не использует isatty . [14]

Использование flex из других языков

[ редактировать ]

Flex может генерировать код только для C и C++ . Чтобы использовать код сканера, сгенерированный flex из других языков, инструмент привязки языка, такой как SWIG можно использовать .

Поддержка Юникод

[ редактировать ]

Flex ограничен сопоставлением 1-байтовых (8-битных) двоичных значений и поэтому не поддерживает Unicode . [15] RE/flex и другие альтернативы поддерживают сопоставление Unicode.

flex++ — аналогичный лексический сканер для C++ , который входит в состав пакета flex. Сгенерированный код не зависит от какой-либо среды выполнения или внешней библиотеки, за исключением распределителя памяти ( malloc или альтернативы, предоставляемой пользователем), если от него также не зависят входные данные. Это может быть полезно во встроенных и подобных ситуациях, когда традиционная операционная система или средства выполнения C могут быть недоступны.

Сканер C++, созданный flex++, включает файл заголовка. FlexLexer.h, который определяет интерфейсы двух классов, созданных C++.

См. также

[ редактировать ]
  1. ^ Перейти обратно: а б Левин, Джон (август 2009 г.). флекс и бизон . О'Рейли Медиа. п. 9. ISBN  978-0-596-15597-1 . Примерно в 1987 году Верн Паксон из лаборатории Лоуренса в Беркли взял версию lex, написанную на ratfor (расширенном языке Fortran, популярном в то время), и перевел ее на C, назвав ее flex, что означает генератор лексического «быстрый анализатора» . '
  2. ^ Левин, Джон Р .; Мейсон, Тони; Браун, Дуг (1992). lex & yacc (2-е изд.). О'Рейли . п. 279. ИСБН  1-56592-000-7 . Свободно доступная версия lex — flex .
  3. ^ Левин, Джон Р .; Мейсон, Тони; Браун, Дуг (1992). lex & yacc (2-е изд.). О'Рейли . стр. 1–2. ISBN  1-56592-000-7 .
  4. ^ Левин, Джон (август 2009 г.). флекс и бизон . О'Рейли Медиа. п. 304. ИСБН  978-0-596-15597-1 .
  5. ^ OpenBSD (11 декабря 2015 г.). "src/usr.bin/lex/" . Перекрестная ссылка BSD . Проверено 26 декабря 2015 г. Это flex, быстрый генератор лексического анализатора.
  6. ^ " flex(1)" . BSD * Справочные страницы .
  7. ^ " yacc(1)" . BSD * Справочные страницы .
  8. ^ «bison-3.0.4 — генератор синтаксического анализатора GNU» . Порты OpenBSD . 15 ноября 2015 г. Проверено 26 декабря 2015 г.
  9. ^ Flex GNU или нет? , гибкий FAQ
  10. ^ «Flex — генератор сканеров — Содержание — Проект GNU — Фонд свободного программного обеспечения (FSF)» . ftp.gnu.org . Проверено 5 декабря 2019 г.
  11. ^ «Flex, версия 2.5. Быстрый генератор сканера. Издание 2.5, март 1995 г.» . Проверено 20 апреля 2019 г.
  12. ^ «Производительность — лексический анализ с помощью Flex для Flex 2.5.37» . Flex.sourceforge.net . Проверено 25 февраля 2013 г.
  13. ^ «Реентерабельность — лексический анализ с помощью Flex для Flex 2.5.37» . Flex.sourceforge.net . Проверено 25 февраля 2013 г.
  14. ^ «Параметры уровня кода и API — лексический анализ с помощью Flex для Flex 2.5.37» . Flex.sourceforge.net . Проверено 25 февраля 2013 г.
  15. ^ Томассетти, Габриэле (04 марта 2020 г.). «Почему не следует использовать (f)lex, yacc и bison» . Струмента . Проверено 26 октября 2022 г.

Дальнейшее чтение

[ редактировать ]
  • Левин, Джон (август 2009 г.). флекс и бизон . О'Рейли Медиа. ISBN  978-0-596-15597-1 .
  • М. Е. Леск и Э. Шмидт, LEX - Генератор лексического анализатора
  • Альфред Ахо, Рави Сетхи и Джеффри Ульман, Составители: принципы, методы и инструменты , Аддисон-Уэсли (1986). Описывает методы сопоставления с образцом, используемые flex (детерминированные конечные автоматы).
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 6f8870e4b010b4dfd53a676544107711__1722753120
URL1:https://arc.ask3.ru/arc/aa/6f/11/6f8870e4b010b4dfd53a676544107711.html
Заголовок, (Title) документа по адресу, URL1:
Flex (lexical analyser generator) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)