Рубрики

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

FLEX (генератор быстрого лексического анализатора) — это инструмент / компьютерная программа для генерации лексических анализаторов (сканеров или лексеров), написанная Верном Паксоном в C примерно в 1987 году. Она используется вместе с генератором синтаксического анализатора Berkeley Yacc или генератором синтаксического анализатора GNU Bison . Flex и Bison более гибки, чем Lex и Yacc, и создают более быстрый код.
Бизон производит парсер из входного файла, предоставленного пользователем. Функция yylex () автоматически генерируется flex, когда она снабжена файлом .l, и эта функция yylex () должна вызываться анализатором для извлечения токенов из текущего / этого потока токенов.

Примечание . Функция yylex () — это основная функция flex, которая выполняет раздел правил, а расширение (.l) — это расширение, используемое для сохранения программ.

Установка Flex в Ubuntu:

sudo apt-get update
sudo apt-get install flex

Примечание. Если команда «Обновить» некоторое время не запускается, лучше сначала запустить ее, чтобы установить более новую версию, так как более старая версия может не работать с другими установленными пакетами или может отсутствовать сейчас.

Данное изображение описывает, как используется Flex:

Шаг 1: Входной файл описывает генерируемый лексический анализатор с именем lex.l, написанный на лексическом языке. Компилятор lex преобразует программу lex.l в C, в файл, который всегда называется lex.yy.c.
Шаг 2: Компилятор C компилирует файл lex.yy.c в исполняемый файл с именем a.out.
Шаг 3: Выходной файл a.out берет поток входных символов и генерирует поток токенов.

Структура программы:
Во входном файле есть 3 раздела:
1. Раздел определения: раздел определения содержит объявление переменных, регулярные определения, манифестные константы. В разделе определения текст заключен в квадратные скобки «% {%}» . Все, что написано в этих скобках, копируется непосредственно в файл lex.yy.c

Синтаксис:

%{
   // Definitions
%}

2. Раздел правил. Раздел правил содержит ряд правил в форме: шаблон должен быть непреднамеренным, а действие должно начинаться с той же строки в скобках {}. Раздел правил заключен в «%% %%» .
Синтаксис:

%%
pattern  action
%%

Примеры: в таблице ниже приведены некоторые совпадения с образцом.

PatternIt can match with
[0-9]all the digits between 0 and 9
[0+9]either 0, + or 9
[0, 9]either 0, ‘, ‘ or 9
[0 9]either 0, ‘ ‘ or 9
[-09]either -, 0 or 9
[-0-9]either – or all digit between 0 and 9
[0-9]+one or more digit between 0 and 9
[^a]all the other characters except a
[^A-Z]all the other characters except the upper case letters
a{2, 4}either aa, aaa or aaaa
a{2, }two or more occurrences of a
a{4}exactly 4 a’s i.e, aaaa
.any character except newline
a*0 or more occurrences of a
a+1 or more occurrences of a
[a-z]all lower case letters
[a-zA-Z]any alphabetic letter
w(x | y)zwxz or wyz

3. Раздел кода пользователя: этот раздел содержит операторы C и дополнительные функции. Мы также можем скомпилировать эти функции отдельно и загрузить с помощью лексического анализатора.

Основная структура программы:

%{
// Definitions
%}

%%
Rules
%%

User code section

Как запустить программу:
Для запуска программы ее сначала необходимо сохранить с расширением .l или .lex . Выполните следующие команды на терминале, чтобы запустить файл программы.
Шаг 1: lex filename.l или lex filename.lex в зависимости от файла расширения сохраняется с
Шаг 2: gcc lex.yy.c
Шаг 3: ./a.out
Шаг 4: Предоставьте входные данные для программы, если это необходимо

Примечание. Нажмите Ctrl + D или используйте какое-либо правило, чтобы прекратить принимать данные от пользователя. Пожалуйста, смотрите выходные изображения ниже программ, чтобы очистить, если сомневаетесь, чтобы запустить программы.

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

/ *** Раздел определения имеет одну переменную
к которому можно получить доступ внутри yylex ()
и главная () *** /
%{

int count = 0;

%}

  
/ *** Раздел правил имеет три правила, первое правило
соответствует заглавным буквам, второе правило
соответствует любому символу кроме символа новой строки и
третье правило не принимает ввод после ввода *** /
%%

[A-Z] {printf("%s capital letter\n", yytext);

       count++;}

.     {printf("%s not a capital letter\n", yytext);}

\n    {return 0;}

%%

  
/ *** Кодовая секция печатает номер
заглавная буква присутствует в данном вводе *** /

int yywrap(){}

int main(){

  
// Объяснение:
// yywrap () - переносит вышеуказанный раздел правила
/ * yyin - получает указатель файла

          который содержит входные данные * /

/ * yylex () - это основная функция flex

          который управляет секцией правил * /

// yytext - текст в буфере

  
// Раскомментируем строки ниже
// взять входные данные из файла
// ФАЙЛ * fp;
// char filename [50];
// printf ("Введите имя файла: / n");
// scanf ("% s", имя файла);
// fp = fopen (filename, "r");
// yyin = fp;

  
yylex();

printf("\nNumber of Captial letters " 

      "in the given input - %d\n", count);

  

return 0;

}

Выход:

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

/ * Декалирование двух счетчиков по одному на номер
других строк по количеству символов * /
%{

int no_of_lines = 0;

int no_of_chars = 0;

%}

  
/ *** правило 1 считает количество строк,
Правило 2 подсчитывает количество символов
и правило 3 указывает, когда следует остановиться
принимая вход *** /
%%
\n      ++no_of_lines;
.       ++no_of_chars;

end     return 0;

%%

  
/ *** Раздел кода пользователя *** /

int yywrap(){}

int main(int argc, char **argv)

{

  
yylex();

printf("number of lines = %d, number of chars = %d\n",

       no_of_lines, no_of_chars );

  

return 0;

}

Выход:

Рекомендуемые посты:

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

0.00 (0%) 0 votes