Модуль Lexing
module Lexing: sig .. end
Библиотека времени выполнения для лексеров, сгенерированных с помощью ocamllex.
Позиции
type position = {
pos_fname :
| |
pos_lnum :
| |
pos_bol :
| |
pos_cnum :
|
} Значение типа 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 :
| |
mutable lex_buffer :
| |
mutable lex_buffer_len :
| |
mutable lex_abs_pos :
| |
mutable lex_start_pos :
| |
mutable lex_curr_pos :
| |
mutable lex_last_pos :
| |
mutable lex_last_action :
| |
mutable lex_eof_reached :
| |
mutable lex_mem :
| |
mutable lex_start_p :
| |
mutable lex_curr_p :
|
} Тип буферов лексера. Буфер лексера — это аргумент, передаваемый функциям сканирования, определённым сгенерированными сканерами. Буфер лексера хранит текущее состояние сканера, а также функцию для пополнения буфера данными из входного потока.
Лексеры могут по желанию отслеживать поля позиций 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