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. Функция должна поместить n байтов или меньше в s, начиная с индекса 0, и вернуть количество предоставленных байтов. Возвращаемое значение 0 означает конец ввода.

val set_position : lexbuf -> position -> unit

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

  • Since 4.11
val set_filename : lexbuf -> string -> unit

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

  • Since 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, чтобы отразить начало новой строки. Вы можете вызвать эту функцию в семантическом действии правила, которое соответствует символу конца строки. Функция ничего не делает, когда отслеживание позиции отключено.

  • Since 3.11

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

val flush_input : lexbuf -> unit

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

© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/api/Lexing.html

Spec-Zone.ru

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