Модуль Genlex
module Genlex: sig .. end
Обобщённый лексический анализатор.
Этот модуль реализует простой «стандартный» лексический анализатор, представленный как функция от потоков символов к потокам токенов. Он реализует примерно лексические соглашения OCaml, но параметризуется набором ключевых слов вашего языка.
Пример: лексический анализатор, подходящий для настольного калькулятора, получается путём
let lexer = make_lexer ["+"; "-"; "*"; "/"; "let"; "="; "("; ")"] Соответствующий синтаксический анализатор будет функцией от token stream до, например, int, и будет иметь правила, такие как:
let rec parse_expr = parser
| [< n1 = parse_atom; n2 = parse_remainder n1 >] -> n2
and parse_atom = parser
| [< 'Int n >] -> n
| [< 'Kwd "("; n = parse_expr; 'Kwd ")" >] -> n
and parse_remainder n1 = parser
| [< 'Kwd "+"; n2 = parse_expr >] -> n1 + n2
| [< >] -> n1
Следует заметить, что использование ключевого слова parser и связанной нотации для потоков доступно только через расширения camlp4. Это означает, что необходимо предварительно обработать исходные файлы, например, с помощью командной строки "-pp" компилятора.
type token =
|
| Kwd of
|
|
| Ident of
|
|
| Int of
|
|
| Float of
|
|
| String of
|
|
| Char of
|
Тип токенов. Лексические классы: Int и Float для целых и вещественных чисел; String для строковых литералов, заключённых в двойные кавычки; Char для символьных литералов, заключённых в одинарные кавычки; Ident для идентификаторов (либо последовательности букв, цифр, нижних подчёркиваний и кавычек, либо последовательности «символов операторов», таких как +, *, и т. д.); и Kwd для ключевых слов (либо идентификаторов, либо отдельных «специальных символов», таких как (, }, и т. д.).
val make_lexer : string list -> char Stream.t -> token Stream.t
Построение функции лексического анализатора. Первый аргумент — список ключевых слов. Идентификатор s возвращается как Kwd s, если s принадлежит этому списку, и как Ident s в противном случае. Специальный символ s возвращается как Kwd s, если s принадлежит этому списку, и вызывает лексическую ошибку (исключение Stream.Error с нарушающим лексемой в качестве параметра) в противном случае. Пробелы и переводы строк пропускаются. Комментарии, ограниченные (* и *), также пропускаются, и могут быть вложенными. Исключение Stream.Failure генерируется, если конец потока неожиданно достигается.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/Genlex.html