stringtranslate.com

Лекс (программное обеспечение)

Lex — это компьютерная программа , которая генерирует лексические анализаторы («сканеры» или «лексеры»). [1] [2] Она обычно используется с генератором парсеров yacc и является стандартным генератором лексических анализаторов во многих Unix и Unix-подобных системах. Эквивалентный инструмент указан как часть стандарта POSIX . [3]

Lex считывает входной поток, указывающий лексический анализатор, и пишет исходный код , реализующий лексический анализатор на языке программирования C.

Помимо C, некоторые старые версии Lex могли генерировать лексер в Ratfor . [4]

История

Lex был первоначально написан Майком Леском и Эриком Шмидтом [5] и описан в 1975 году. [6] [7] В последующие годы Lex стал стандартным генератором лексических анализаторов на многих Unix и Unix-подобных системах. В 1983 году Lex был одним из нескольких инструментов UNIX, доступных для операционной системы UNOS компании Charles River Data Systems по лицензии Bell Laboratories . [8] Хотя изначально Lex распространялся как проприетарное программное обеспечение, некоторые версии Lex теперь имеют открытый исходный код . Версии Lex с открытым исходным кодом, основанные на оригинальном проприетарном коде, теперь распространяются с операционными системами с открытым исходным кодом, такими как OpenSolaris и Plan 9 от Bell Labs . Одна популярная версия Lex с открытым исходным кодом, называемая flex , или «быстрый лексический анализатор», не является производной от проприетарного кодирования.

Структура файла Lex

Структура файла Lex намеренно похожа на структуру файла yacc: файлы делятся на три раздела, разделенные строками, содержащими только два знака процента, как показано ниже:

Пример файла Lex

Ниже приведен пример файла Lex для гибкой версии Lex. Он распознает строки чисел (положительные целые числа) во входных данных и просто выводит их.

/*** Раздел определений ***/% { /* Код C, который необходимо скопировать дословно */ #include <stdio.h> % } %% /*** Раздел правил ***/  /* [0-9]+ соответствует строке из одной или нескольких цифр */ [ 0-9 ] + { /* yytext — это строка, содержащая совпадающий текст. */ printf ( "Увидел целое число: %s \n " , yytext ); }     . | \ n { /* Игнорировать все остальные символы. */ }   %% /*** Раздел кода C ***/int main ( void ) { /* Вызвать лексер, затем выйти. */ yylex (); return 0 ; }     

Если этот ввод задан в flex, он будет преобразован в файл C, . Это может быть скомпилировано в исполняемый файл, который сопоставляет и выводит строки целых чисел. Например, учитывая ввод: lex.yy.c

abc123z.!&*2gj6

программа выведет на печать:

Увидел целое число: 123Увидел целое число: 2Увидел целое число: 6

Использование Lex с другими инструментами программирования

Использование Lex с генераторами парсеров

Lex, как и другие лексические анализаторы, ограничивает правила теми, которые можно описать регулярными выражениями . Благодаря этому Lex может быть реализован конечным автоматом, как показано в иерархии языков Хомского . Для распознавания более сложных языков Lex часто используется с генераторами синтаксических анализаторов, такими как Yacc или Bison . Генераторы синтаксических анализаторов используют формальную грамматику для разбора входного потока.

Обычно предпочтительнее, чтобы парсер, например, сгенерированный Yacc, принимал поток токенов («токен-поток») в качестве входных данных, а не обрабатывал поток символов («символ-поток») напрямую. Lex часто используется для создания такого токена-потока.

Синтаксический анализ без сканера подразумевает прямой анализ входного потока символов без отдельного лексического анализатора.

Лекс и сделай

make — это утилита, которая может использоваться для поддержки программ, включающих Lex. Make предполагает, что файл с расширением .lявляется исходным файлом Lex. Внутренний макрос make LFLAGSможет использоваться для указания параметров Lex, которые будут автоматически вызываться программой make. [9]

Смотрите также

Ссылки

  1. ^ Левин, Джон Р.; Мейсон, Тони; Браун, Дуг (1992). lex & yacc (2-е изд.). O'Reilly . стр. 1–2. ISBN 1-56592-000-7.
  2. ^ Левин, Джон (август 2009). flex & bison. O'Reilly Media. стр. 304. ISBN 978-0-596-15597-1.
  3. ^ Технические характеристики Open Group Base, выпуск 7, издание 2018 г. § Shell & Utilities § Utilities § lex
  4. ^ Джон Р. Левин; Джон Мейсон; Дуг Браун (1992). Lex & Yacc . O'Reilly. ISBN 9781565920002.
  5. ^ Lesk, ME; Schmidt, E. "Lex – A Lexical Analyzer Generator". Архивировано из оригинала 2012-07-28 . Получено 16 августа 2010 .
  6. ^ Lesk, ME; Schmidt, E. (21 июля 1975 г.). "Lex – A Lexical Analyzer Generator" (PDF) . UNIX TIME-SHARE SYSTEM:UNIX PROGRAMMER'S MANUAL, Seventh Edition, Volume 2B . bell-labs.com . Получено 20 декабря 2011 г. .
  7. ^ Lesk, ME (октябрь 1975 г.). "Lex – генератор лексического анализатора". Comp. Sci. Tech. Rep. № 39. Мюррей-Хилл, Нью-Джерси: Bell Laboratories.
  8. ^ The Insider's Guide To The Universe (PDF) . Charles River Data Systems, Inc. 1983. стр. 13.
  9. ^ "make". Базовые спецификации Open Group (6). IEEE и Open Group. 2004. IEEE Std 1003.1, издание 2004 г.

Внешние ссылки