Jump to content

Камлп4

Camlp4 — это программная система для написания расширяемых парсеров языков программирования. Он предоставляет набор библиотек OCaml , которые используются для определения грамматик, а также загружаемых расширений синтаксиса таких грамматик. Camlp4 означает Caml Preprocessor и Pretty-Printer , и одним из его наиболее важных приложений было определение доменно-ориентированных расширений синтаксиса OCaml .

Camlp4 был частью официального дистрибутива OCaml, разработанного в INRIA . Ее первоначальный автор — Даниэль де Рауглодр. Версия OCaml 3.10.0, выпущенная в мае 2007 года, представляет собой значительно модифицированную и обратно несовместимую версию Camlp4. De Rauglaudre поддерживает отдельную обратно совместимую версию, переименованную в Camlp5. Все приведенные ниже примеры относятся к Camlp5 или предыдущей версии Camlp4 (версии 3.09 и более ранние).

Версия 4.08, выпущенная летом 2019 года, [1] была последней официальной версией этой библиотеки. В настоящее время он устарел; [2] вместо этого рекомендуется использовать PPX (PreProcessor eXtensions) [3] [4] библиотеки. [5]

Конкретный и абстрактный синтаксис

[ редактировать ]

Препроцессор Camlp4 работает, загружая набор скомпилированных модулей, которые определяют синтаксический анализатор, а также красивый принтер : синтаксический анализатор преобразует входную программу во внутреннее представление. Это внутреннее представление составляет абстрактное синтаксическое дерево (AST). Его можно вывести в двоичной форме, например, передать непосредственно одному из компиляторов OCaml или преобразовать обратно в текстовую программу. Понятие конкретного синтаксиса относится к формату, в котором абстрактный синтаксис представлен .

Например, выражение OCaml (1 + 2) также можно записать ((+) 1 2) или (((+) 1) 2). Разница существует только на уровне конкретного синтаксиса, поскольку эти три версии являются эквивалентными представлениями одного и того же абстрактного синтаксического дерева. Как показывает определение пересмотренного синтаксиса OCaml, один и тот же язык программирования может использовать разные конкретные синтаксисы. Все они сходятся к абстрактному синтаксическому дереву в уникальном формате, который может обрабатываться компилятором.

Абстрактное синтаксическое дерево находится в центре расширений синтаксиса, которые на самом деле являются программами OCaml. Хотя определение грамматик должно быть выполнено в OCaml, определяемый или расширяемый синтаксический анализатор не обязательно связан с OCaml, и в этом случае синтаксическое дерево, которым манипулируют, не является деревом OCaml. Предоставляется несколько библиотек, которые облегчают определенные манипуляции с синтаксическими деревьями OCaml.

Области применения

[ редактировать ]

Языки, специфичные для предметной области, являются основным приложением Camlp4. Поскольку OCaml — это многопарадигмальный язык с интерактивным верхним уровнем и компилятором собственного кода, его можно использовать в качестве серверной части для любого исходного языка. Единственное, что нужно сделать разработчику, — это написать грамматику Camlp4, которая преобразует рассматриваемый предметно-ориентированный язык в обычную программу OCaml. например C. Также можно использовать другие целевые языки ,

Если целевым языком является OCaml, можно определить простые синтаксические дополнения или синтаксический сахар , чтобы обеспечить выразительность, которую нелегко достичь с помощью стандартных функций языка OCaml. Расширение синтаксиса определяется скомпилированным модулем OCaml, который передается исполняемому файлу camlp4o вместе с программой для обработки.

Camlp4 включает предметно-ориентированный язык , поскольку он предоставляет расширения синтаксиса, которые упрощают разработку расширений синтаксиса. Эти расширения позволяют компактно определять грамматики ( EXTEND операторы) и кавычки, такие как <:expr< 1 + 1 >>, т.е. деконструкция и построение абстрактных синтаксических деревьев в конкретном синтаксисе.

В следующем примере определяется расширение синтаксиса OCaml. Он предоставляет новое ключевое слово , memo, который можно использовать в качестве замены function и обеспечивает автоматическое запоминание функций с сопоставлением с образцом . Мемоизация заключается в сохранении результатов предыдущих вычислений в таблице так, чтобы фактическое вычисление функции для каждого возможного аргумента происходило не более одного раза.

Это pa_memo.ml, файл, который определяет расширение синтаксиса:

let unique =
  let n = ref 0 in
  fun () -> incr n; "__pa_memo" ^ string_of_int !n

EXTEND
  GLOBAL: Pcaml.expr;

  Pcaml.expr: LEVEL "expr1" [
    [ "memo"; OPT "|"; pel = LIST1 match_case SEP "|" ->
      let tbl = unique () in
      let x = unique () in
      let result = unique () in
      <:expr< 
      let $lid:tbl$ = Hashtbl.create 100 in
      fun $lid:x$ ->
        try Hashtbl.find $lid:tbl$ $lid:x$ 
        with [ Not_found -> 
                let $lid:result$ = match $lid:x$ with [ $list:pel$ ] in
                do { Hashtbl.replace $lid:tbl$ $lid:x$ $lid:result$; 
                     $lid:result$ } ]
      >> ]
  ];

  match_case: [
    [ p = Pcaml.patt; w = OPT [ "when"; e = Pcaml.expr -> e ]; 
      "->"; e = Pcaml.expr -> 
       (p, w, e) ]
  ];
END

Пример программы, использующей это расширение синтаксиса:

let counter = ref 0 (* global counter of multiplications *)

(* factorial with memoization *)
let rec fac = memo
    0 -> 1
  | n when n > 0 -> 
      (incr counter;
       n * fac (n - 1))
  | _ -> invalid_arg "fac"

let run n =
  let result = fac n in
  let count = !counter in
  Printf.printf "%i! = %i     number of multiplications so far = %i\n"
    n result count 

let _ =
  List.iter run [5; 4; 6]

Вывод программы следующий: функция fac (факториал) вычисляет только те продукты, которые не вычислялись ранее:

5! = 120     number of multiplications so far = 5
4! = 24     number of multiplications so far = 5
6! = 720     number of multiplications so far = 6
  1. ^ "ocaml/camlp4" . Гитхаб . Проверено 4 февраля 2020 г.
  2. ^ Димино, Жереми (07.08.2019). «Конец Camlp4» . ОКамл . Архивировано из оригинала 04 февраля 2020 г. Проверено 4 февраля 2020 г.
  3. ^ «ППХ» . ocamllabs.io . Проверено 4 февраля 2020 г.
  4. ^ Мецгер, Перри. «Руководство по расширениям препроцессора» . OCamlverse . Архивировано из оригинала 5 февраля 2020 г. Проверено 5 февраля 2020 г.
  5. ^ Димино, Джереми. «Преобразование базы кода из camlp4 в ppx» . Джейн Стрит Технический блог . Архивировано из оригинала 04 февраля 2020 г. Проверено 4 февраля 2020 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: eb6a40938887d99f4d593b4915eb44d8__1709122440
URL1:https://arc.ask3.ru/arc/aa/eb/d8/eb6a40938887d99f4d593b4915eb44d8.html
Заголовок, (Title) документа по адресу, URL1:
Camlp4 - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)