Модуль 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. Функция должна поместить 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.0
Разные функции
val flush_input : lexbuf -> unit
Удалить содержимое буфера и сбросить текущую позицию до 0. Следующее использование lexbuf вызовет повторную загрузку.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/Lexing.html