lex_doc (1119420)

Файл №1119420 lex_doc (Синтаксические и лексические анализаторы)lex_doc (1119420)2019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

Начало формы

Конец формы

Генератор программ лексического анализа lex

Производственно-внедренческий кооператив

"И Н Т Е Р Ф Е Й С"

Диалоговая Единая Мобильная

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

Демос/P 2.1

Генератор программ лексического анализа lex

Москва

1988

Аннотация

В документе описан язык программирования lex, предназ-

наченный для разработки программ лексического анализа. При-

водятся правила работы с компилятором языка lex ОС ДЕМОС.

1. Введение

lex - генератор программ лексического анализа. Лекси-

ческий анализ - это распознавание лексем во входном потоке

символов. Предположим, что задано некоторое конечное мно-

жество слов (лексем) в некотором языке и некоторое входное

слово. Необходимо установить, какой элемент множества (если

он существует) совпадает с данным входным словом.

Обычно лексический анализ выполняется так называемым

лексическим анализатором. Лексический анализатор - это

программа.

Лексический анализ применяется во многих случаях, нап-

ример, для построения пакетного редактора или в качестве

распознавателя директив в диалоговой программе и т.д.

Однако, наиболее важное применение лексического анализатора

- это использование его в компиляторе. Здесь лексический

анализатор выполняет функцию программы ввода данных.

Лексический анализатор выполняет первую стадию компиля-

ции - читает строки компилируемой программы, выделяет лек-

семы и передает их на дальнейшие стадии компиляции (грамма-

тический разбор, кодогенерацию и т.д.).

Лексический анализатор распознает тип каждой лексемы и

соответствующим образом помечает ее. Например, при компиля-

ции Си-программы могут быть выделены следующие типы лексем:

число, идентификатор, оператор, ограничитель и т.д.

Лексический анализатор должен не только выделить лек-

сему, но и выполнить некоторые преобразования. Например,

если лексема - число, то его необходимо перевести во внут-

реннюю (двоичную) форму записи как число с плавающей или

фиксированной точкой. А если лексема - идентификатор, то

его необходимо разместить в таблице, чтобы в дальнейшем

обращаться к нему не по имени, а по адресу в таблице.

Хотя лексический анализ по своей идее прост, тем не

менее эта фаза работы компилятора часто занимает больше вре-

мени, чем любая другая. Частично это происходит из-за необ-

ходимости просматривать и анализировать исходный текст сим-

вол за символом. Иногда даже бывает необходимо вернуть про-

читанный символ во входной поток с тем, чтобы повторить

просмотр и анализ.

Происходит это потому, что часто бывает трудно опреде-

лить, где проходят границы лексемы.

Допустим, имеются две лексемы:

make

makefile

3

Пусть из входного потока поступает набор символов:

...makefile...

При анализе входного потока символов будет выделена лексема

make, хотя правильно было бы выделить лексему makefile.

Единственный способ преодолеть это затруднение - прос-

мотр полученной цепочки символов назад и вперед. В нашем

примере при выделении лексемы make мы должны просмотреть

следующий поступающий символ и, если он будет символом "f",

то вполне возможно, что поступает лексема makefile.

Процесс просмотра входного потока можно рассматривать

как движение влево и вправо рамки над цепочкой символов. При

этом анализируется только тот символ, который охвачен рам-

кой.

...

. .

source make.f.ile file compiler

. .

...

<=== ===>

Анализ заключается в определении соответствия рассматривае-

мой последовательности символов некоторому так называемому

регулярному выражению.

Например, регулярное выражение

(+?[0-9])+|(-?[0-9])+

позволяет выделить в цепочке все лексемы типа целое, перед

которыми либо указан знак (+ или -), либо не указан. Для

чисел с точкой это выражение имело бы вид:

(+?[0-9.])+|(-?[0-9.])+

В тех случаях, когда выделение лексемы затруднено либо по

причине того, что одно регулярное выражение не позволяет ее

однозначно определить, либо из-за того, что лексема является

частью другой, приходится прибегать к контекстно-зависимым

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

лений просмотра входной цепочки символов.

lex частично или полностью автоматизирует процесс

написания программы лексического анализа. lex - это програм-

мирующая программа или генератор программ. lex строит прог-

рамму - лексический анализатор на так называемом host-языке

(или "главном" языке). Это значит, что Lex-программа пишется

на "языке" lex, а Lex-генератор, в свою очередь, генерирует

программу лексического анализа на каком-либо другом языке.

4

Данная версия lex генерирует лексические анализаторы на язы-

ках Си и Ратфор (рациональный диалект Фортрана). В качестве

host-языка мы будем использовать язык Си. Сведения об

использовании в качестве host-языка Ратфор выделены в

отдельный параграф.

В каталоге /usr/lib/lex имеется файл-заготовка ncform,

который используется Lex-генератором для построения лекси-

ческого анализатора. Этот файл является уже готовой прог-

раммой лексического анализа, но в нем не определены дейст-

вия, которые необходимо выполнить при распознавании лексемы,

отстутствуют и сами лексемы, не сформированы рабочие массивы

и т.д.

lex на основе Lex-программы достраивает файл ncform. В

результате мы получаем файл со стандартным именем lex.yy.c,

который является текстом Си-программы, осуществляющей лекси-

ческий анализ.

Lex-программа имеет следующий формат:

определения

%%

правила

%%

подпрограммы, составленные

пользователем

Любой из этих разделов может быть пустым. Простейшая Lex-

программа имеет вид:

%%

Здесь нет никаких определений и никаких правил.

Все разделы Lex-программы мы подробно рассмотрим ниже.

Сейчас целесообразно рассмотреть, что представляют собой

правила.

Правило состоит из двух частей:

РЕГУЛЯРНОЕ_ВЫРАЖЕНИЕ ДЕЙСТВИЕ

По регулярным выражениям, содержащимся в левой части правил,

lex строит детерминированный конечный автомат. Этот автомат

осуществляет интерпретацию, а не компиляцию. Количество пра-

вил и их сложность не влияют на скорость лексического ана-

лиза, если только правила не требуют слишком большого объема

повторных просмотров входной последовательности символов.

Однако, с ростом числа правил и их сложности растет размер

конечного автомата, интерпретирующего их и, следовательно,

растет размер Си-программы, реализующей этот конечный авто-

мат.

5

Рассмотрим в качестве примера следующую Lex-программу:

%%

[jJ][aA][nN][uU][aA][rR][yY] {

printf("Январь"); }

[fF][eE][bB][rR][uU][aA][rR][yY] {

printf("Февраль"); }

[mM][aA][rR][cC][hH] {

printf("Март"); }

[aA][pP][rR][iI][lL] {

printf("Апрель"); }

[mM][aA][yY] {

printf("Май"); }

[jJ][uU][nN][eE] {

printf("Июнь"); }

[jJ][uU][lL][yY] {

printf("Июль"); }

[aA][uU][gG][uU][sS][tT] {

printf("Август"); }

[sS][eE][pP][tT][eE][mM][bB][eE][rR] {

printf("Сентябрь"); }

[oO][cC][tT][oO][bB][eE][rR] {

printf("Октябрь"); }

[nN][oO][vV][eE][mM][bB][eE][rR] {

printf("Ноябрь"); }

[dD][eE][cC][eE][mM][bB][eE][rR] {

printf("Декабрь"); }

[mM][oO][nN][dD][aA][yY] {

printf("Понедельник");}

[tT][uU][eE][sS][dD][aA][yY] {

printf("Вторник"); }

[wW][eE][dD][nN][eE][sS][dD][aA][yY] {

printf("Среда"); }

[tT][hH][uU][rR][sS][dD][aA][yY] {

printf("Четверг"); }

[fF][rR][iI][dD][aA][yY] {

printf("Пятница"); }

[sS][aA][tT][uU][rR][dD][aA][yY] {

printf("Суббота"); }

[sS][uU][nN][dD][aA][yY] {

printf("Воскресенье");}

Программа строит конечный автомат, который распознает анг-

лийские наименования месяцев и дней недели. Каждое правило

здесь определеяет действие (которое взято в фигурные

скобки). Обратите внимание на то, что открывающая фигурная

скобка стоит в той же строке, что и правило - это требование

lex.

Действие в каждом правиле данной Lex-программы - это

вывод русского значения найденного английского слова. В

качестве оператора, выполняющего действие, используется биб-

лиотечная функция языка Си.

6

Пара фигурных скобок определяет блок (в смысле языка

Си), который может содержать любое количество строк. Если

действие содержит всего одну строку Си, то можно ее указать

без фигурных скобок, как обычно. Единственное условие - она

должна начинаться в той же строке, где указано регулярное

выражение.

В программе содержится только раздел правил, их всего

19. Регулярное выражение каждого правила определяет английс-

кое слово, написанное маленькими или большими латинскими

символами. Например "May" (Май) определен как

"[mM][aA][yY]". По этому регулярному выражению будет выде-

лена во входном потоке символов лексема "May", а по действию

этого правила будет выведено "Май". Наличие большой и малой

буквы в квадратных скобках обеспечивает распознавание слова

"May", написанного любыми латинскими символами.

Таким образом, данная Lex-программа строит Си-

программу, которая переводит на русский язык имена месяцев и

дней недели.

Допустим, Lex-программа размещена в файле source.l,

тогда, чтобы получить лексический анализатор на Си, необхо-

димо выполнить следующий набор команд:

% lex source.l

% cc -O lex.yy.c -ll -o program

%

lex всегда, если не указано другое, строит выходной файл с

именем lex.yy.c - Си-программу - лексический анализатор. Во

второй строке этой последовательности команд запускается

Си-компилятор, который выводит результат в файл program.

Program может работать как фильтр в конвейере команд,

как самостоятельная команда и в интерактивном режиме. Напри-

мер:

% program

May

Май

MONDAY

Понедельник

MoNdaY

Понедельник

CNTRL/C

%

Флаг -ll требует подключения библиотеки /usr/lib/libl.a -

библиотеки lex. Если необходимо получить самостоятельную

программу, как в данном случае, подключение библиотеки

7

обязательно, поскольку тогда из нее подключается головной

раздел main. В противном случае, если имеется необходимость

включить анализатор в качестве функции в другую программу

(например, в программу грамматического разбора), эту библио-

теку необходимо вызвать уже при сборке и тогда, если main

определен в вызывающей лексический анализатор программе,

редактор связей не будет подключать раздел main из библио-

теки lex.

Если необходимо получить файл с именем, отличным от

lex.yy.c, можно воспользоваться флагом -t :

% lex -t source.l >&gt; file

По этому флагу результат поступает в файл file.

2. Регулярные выражения в Lex-правилах

Регулярные выражения определяют лексему. Регулярное

выражение может содержать символы латинского и русского

алфавитов в верхнем и нижнем регистрах, другие символы

(цифры, знаки препинания и т.д.) и символы-операторы.

Операторы позволяют осуществлять различные действия над

выделенной цепочкой символов. Операторы также обозначаются

символами.

2.1. Обозначения символов в выражениях

В выражении можно использовать любой символ. Символ

Характеристики

Тип файла документ

Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.

Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.

Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.

Список файлов учебной работы

Синтаксические и лексические анализаторы
Coco-R
Программа - для С++
CocoR
Coco.exe
Action.cpp
Action.h
ArrayList.cpp
ArrayList.h
BitArray.cpp
BitArray.h
CharClass.cpp
CharClass.h
CharSet.cpp
CharSet.h
Coco.atg
Coco.cpp
Comment.cpp
Comment.h
Copyright.frame
DFA.cpp
DFA.h
Generator.cpp
Generator.h
Graph.h
HashTable.cpp
HashTable.h
Makefile.
Melted.cpp
Melted.h
Node.cpp
Node.h
Parser.cpp
Parser.frame
Parser.h
ParserGen.cpp
Parser.frame
Scanner.frame
Taste
Coco.exe
CodeGenerator.h
Copyright.frame
Makefile.
Parser.cpp
Parser.frame
Parser.h
Scanner.cpp
Scanner.frame
Scanner.h
SymbolTable.cpp
SymbolTable.h
Taste.IN
Taste.atg
Taste.cpp
Taste.exe
Test.TAS
build.bat
coc.bat
run.bat
__MACOSX
Taste
._Scanner.frame
cocorc17 - for unix.tgz
Разные мануалы
Примеры
Taste
Coco.exe
CodeGenerator.h
Copyright.frame
Makefile.
Parser.cpp
Parser.frame
Parser.h
Scanner.cpp
Scanner.frame
Scanner.h
SymbolTable.cpp
SymbolTable.h
Taste.IN
Taste.atg
Taste.cpp
Taste.exe
Test.TAS
build.bat
Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7028
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее