Spec-Zone.ru › OCaml 4.14

Модуль 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 string
| Ident of string
| Int of int
| Float of float
| String of string
| Char of char

Тип токенов. Лексические классы: 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

Spec-Zone.ru

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