Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1Лексический анализ.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
45.62 Кб
Скачать

Атырауский инженерно-гуманитарный институт

Кафедра «Информатика, автоматизация и управление»

Реферат

Дисциплина : «Теория языков и автоматов» Тема: «Лексический анализ»

Выполнил: студент 2-го курса

спец. АиУ Серикбаев Б

Проверила: ст. преподаватель Кубашева.Д.А

Атырау 2017

Содержание

ВВЕДЕНИЕ………………………………………………………………………..3

1.Пример…………………………………………………………………………...4

2.Лексический анализатор……………………………………………………......6

3.Генераторы лексических анализаторов………………………………………..7

Литература……………………………………………………………………….10

ВВЕДЕНИЕ

В информатике лексический анализ («токенизация», от англ. tokenizing) — процесс аналитического разбора входной последовательности символов на распознанные группы — лексемы, с целью получения на выходе идентифицированных последовательностей, называемых «токенами» (подобно группировке букв в словах). В простых случаях понятия «лексема» и «токен» идентичны, но более сложные токенизаторы дополнительно классифицируют лексемы по различным типам («идентификатор, оператор», «часть речи» и т. п.). Лексический анализ используется в компиляторах и интерпретаторах исходного кода языков программирования, и в различных парсерах слов естественных языков.

Как правило, лексический анализ производится с точки зрения определённого формального языка или набора языков. Язык, а точнее его грамматика, задаёт определённый набор лексем, которые могут встретиться на входе процесса.

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

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

Каждый токен можно представить в виде структуры, содержащей идентификатор токена (или идентификатор класса токена) и, если нужно, последовательность символов лексемы, выделенной из входного потока (строку, число и т. д.).

Цель такой конвертации обычно состоит в том, чтобы подготовить входную последовательность для другой программы, например для грамматического анализатора, и избавить его от определения лексических подробностей в контекстно-свободной грамматике (что привело бы к усложнению грамматики).

1. Пример

Для примера, исходный код следующей строки программы

net_worth_future = (assets - liabilities);

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

ИМЯ "net_worth_future"

РАВЕНСТВО

ОТКРЫВАЮЩАЯ_СКОБКА

ИМЯ "assets"

МИНУС

ИМЯ "liabilities"

ЗАКРЫВАЮЩАЯ_СКОБКА

ТОЧКА_С_ЗАПЯТОЙ

Пример такого лексического анализатора на языке PHP (часть его):

class tokenstream {

// Входной поток

private $input_stream;

// Указатель позиции во входном потоке

public $seek = 0;

// Конструктор

public function __construct ( $input ) {

// Инициализируем входной поток

$this -> input_stream = $input;

}

// Возвращает очередной символ из входного потока

public function readChar ( ) {

$char = ( isset ( $this -> input_stream [ $this -> seek ] ) ? $this -> input_stream [ $this -> seek ] : false );

$this -> seek++;

return $char;

}

// Производит токенизацию

public function tokenize ( ) {

$output = array ( );

while ( ( $char = $this -> readChar ( ) ) !== false ) {

if ( preg_match ( '/\s/', $char ) ) { // Неотображаемые символы

} elseif ( preg_match ( '/\"/', $char ) ) { // Кавычки

$output [ ] = 'T_QUOTE';

} elseif ( условие ) {

$output [ ] = 'T_...'

}

}

return $output;

}

}

// Исходный код для разбора

$my_source = '

function foo ( ) {

$my_var = "foo-bar";

}

';

// Создаем экземпляр класса парсера

$tokenstream = new tokenstream ( $my_source );

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

print_r ( $tokenstream -> tokenize ( ) );