Spec-Zone.ru › OCaml

Модуль Lexing

module Lexing: sig .. end

Библиотека времени выполнения для лексеров, сгенерированных с помощью ocamllex.

Позиции

type position = {
pos_fname : string;
pos_lnum : int;
pos_bol : int;
pos_cnum : int;
}

Значение типа position описывает точку в исходном файле. pos_fname — имя файла; pos_lnum — номер строки; pos_bol — смещение начала строки (количество символов между началом lexbuf и началом строки); pos_cnum — смещение позиции (количество символов между началом lexbuf и позицией). Разность между pos_cnum и pos_bol — это смещение символа внутри строки (то есть номер столбца, если считать, что каждый символ занимает один столбец).

Сведения о том, как механизм лексического анализа управляет позициями, см. в документации к типу lexbuf.

val dummy_pos : position

Значение типа position, гарантированно отличающееся от любой допустимой позиции.

Буферы лексера

type lexbuf = {
refill_buff : lexbuf -> unit;
mutable lex_buffer : bytes;
mutable lex_buffer_len : int;
mutable lex_abs_pos : int;
mutable lex_start_pos : int;
mutable lex_curr_pos : int;
mutable lex_last_pos : int;
mutable lex_last_action : int;
mutable lex_eof_reached : bool;
mutable lex_mem : int array;
mutable lex_start_p : position;
mutable lex_curr_p : position;
}

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

Лексеры могут по желанию отслеживать поля позиций lex_curr_p и lex_start_p. Этот режим «отслеживания позиций» включён по умолчанию и соответствует передаче ~with_position:true функциям, создающим буферы лексера. В этом режиме механизм лексического анализа и действия лексера совместно отвечают за корректное обновление полей позиций, как описано в следующем абзаце. Если этот режим явно отключён (с помощью ~with_position:false), механизм лексического анализа не будет изменять поля позиций, и действия лексера также не должны этого делать; тогда поля lex_curr_p и lex_start_p всегда будут содержать dummy_pos — недопустимую позицию. Отслеживание позиций позволяет избежать выделения памяти и операций записи в память, а также значительно повысить производительность лексера в тех случаях, когда lex_start_p и lex_curr_p не нужны.

Режим отслеживания позиций работает следующим образом. Для каждого токена механизм лексического анализа копирует lex_curr_p в lex_start_p, а затем изменяет поле pos_cnum у lex_curr_p, обновляя его на количество символов, прочитанных с начала lexbuf. Остальные поля механизм лексического анализа не изменяет. Чтобы они оставались корректными, их нужно инициализировать перед первым использованием lexbuf и обновлять в соответствующих действиях лексера (то есть в конце каждой строки — см. также new_line).

val from_channel : ?with_positions:bool -> in_channel -> lexbuf

Создать буфер лексера для указанного канала ввода. Lexing.from_channel inchan возвращает буфер лексера, который читает данные из канала ввода inchan, начиная с текущей позиции чтения.

val from_string : ?with_positions:bool -> string -> lexbuf

Создать буфер лексера, который читает данные из указанной строки. Чтение начинается с первого символа строки. При достижении конца строки генерируется условие конца ввода.

val from_function : ?with_positions:bool -> (bytes -> int -> int) -> lexbuf

Создать буфер лексера, в котором для чтения используется указанная функция. Когда сканеру понадобятся дополнительные символы, он вызовет эту функцию, передав ей последовательность байтов s и количество байтов n. Функция должна поместить в s не более n байтов, начиная с индекса 0, и вернуть количество предоставленных байтов. Возвращаемое значение 0 означает конец ввода.

val set_position : lexbuf -> position -> unit

Задать начальную отслеживаемую позицию ввода для lexbuf, указав пользовательское значение. Игнорирует pos_fname. О том, как изменить это поле, см. Lexing.set_filename.

  • Начиная с версии 4.11
val set_filename : lexbuf -> string -> unit

Задать имя файла в начальной отслеживаемой позиции равным file в lexbuf.

  • Начиная с версии 4.11
val with_positions : lexbuf -> bool

Узнать, отслеживает ли буфер лексера поля позиций lex_curr_p / lex_start_p, в соответствии с соответствующим необязательным аргументом функций создания буферов лексера (значение по умолчанию — true).

Если with_positions равно false, действия лексера не должны изменять поля позиций. Если всё же изменять их, это может снова включить режим with_position и снизить производительность.

Функции для семантических действий лексера

Следующие функции можно вызывать из семантических действий определений лексера (ML-кода в фигурных скобках, вычисляющего значение, возвращаемое функциями лексического анализа). Они предоставляют доступ к строке символов, соответствующей регулярному выражению, связанному с семантическим действием. Эти функции следует применять к аргументу lexbuf, которому в коде, сгенерированном ocamllex, присваивается буфер лексера, переданный функции разбора.

val lexeme : lexbuf -> string

Lexing.lexeme lexbuf возвращает строку, соответствующую регулярному выражению.

val lexeme_char : lexbuf -> int -> char

Lexing.lexeme_char lexbuf i возвращает символ с номером i в совпавшей строке.

val lexeme_start : lexbuf -> int

Lexing.lexeme_start lexbuf возвращает смещение в потоке ввода первого символа совпавшей строки. Смещение первого символа потока равно 0.

val lexeme_end : lexbuf -> int

Lexing.lexeme_end lexbuf возвращает смещение в потоке ввода символа, следующего за последним символом совпавшей строки. Смещение первого символа потока равно 0.

val lexeme_start_p : lexbuf -> position

Подобно lexeme_start, но возвращает полное значение типа position вместо смещения. Если отслеживание позиций отключено, функция возвращает dummy_pos.

val lexeme_end_p : lexbuf -> position

Подобно lexeme_end, но возвращает полное значение типа position вместо смещения. Если отслеживание позиций отключено, функция возвращает dummy_pos.

val new_line : lexbuf -> unit

Обновить поле lex_curr_p в lexbuf, чтобы оно соответствовало началу новой строки. Эту функцию можно вызвать в семантическом действии правила, совпадающего с символом конца строки. Если отслеживание позиций отключено, функция ничего не делает.

  • Начиная с версии 3.11

Разные функции

val flush_input : lexbuf -> unit

Очистить содержимое буфера и сбросить текущую позицию в 0. При следующем использовании lexbuf будет выполнено пополнение буфера.

© 1995-2026 INRIA.
https://ocaml.org/manual/5.5/api/Lexing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API