Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Camlp4 — это программная система для создания расширяемых парсеров для языков программирования. Она предоставляет набор библиотек OCaml, используемых для определения грамматик, а также загружаемых синтаксических расширений для этих грамматик. Аббревиатура Camlp4 расшифровывается как Caml Preprocessor and Pretty Printer, и одним из важнейших применений Camlp4 было определение предметно-ориентированных расширений синтаксиса OCaml. Camlp4 входила в состав официального дистрибутива OCaml, разрабатываемого в INRIA. Её первоначальным автором является Даниэль де Роглаудр. Версия OCaml 3.10.0, выпущенная в мае 2007 года, представила значительно измененную и обратно несовместимую версию Camlp4. Де Роглаудр поддерживает отдельную обратно совместимую версию, которая была переименована в Camlp5. Все примеры, приведенные ниже, относятся к Camlp5 или к более ранним версиям Camlp4 (версиям 3.09 и более старым). Версия 4.08, выпущенная летом 2019 года, была последней официальной версией этой библиотеки. В настоящее время она считается устаревшей, и вместо неё рекомендуется использовать библиотеки PPX (PreProcessor eXtensions).
Camlp4 is a software system for writing extensible parsers for programming languages. It provides a set of OCaml libraries that are used to define grammars as well as loadable syntax extensions of such grammars. Camlp4 stands for Caml Preprocessor and Pretty Printer and one of its most important applications was the definition of domain specific extensions of the syntax of OCaml. Camlp4 was part of the official OCaml distribution which is developed at the INRIA. Its original author is Daniel de Rauglaudre. OCaml version 3.10.0, released in May 2007, introduced a significantly modified and backward incompatible version of Camlp4. De Rauglaudre maintains a separate backward compatible version, which has been renamed Camlp5. All of the examples below are for Camlp5 or the previous version of Camlp4 (versions 3.09 and prior). Version 4.08, released in the summer of 2019, was the last official version of this library. It is currently deprecated; instead, it is recommended to use the PPX (PreProcessor eXtensions) libraries.
Конкретный и абстрактный синтаксис
Предпроцессор Camlp4 работает, загружая набор скомпилированных модулей, которые определяют как парсер, так и модуль форматированного вывода: парсер преобразует входную программу во внутреннее представление. Это внутреннее представление и составляет абстрактное синтаксическое дерево (AST). Оно может быть выведено в двоичном формате, например, передано непосредственно одному из компиляторов OCaml, или преобразовано обратно в текстовую программу. Понятие конкретного синтаксиса относится к формату, в котором представлен абстрактный синтаксис. Например, выражение OCaml (1 + 2) также может быть записано как ((+) 1 2) или (((+) 1) 2). Разница заключается лишь в уровне конкретного синтаксиса, поскольку все три варианта являются эквивалентными представлениями одного и того же абстрактного синтаксического дерева. Как демонстрирует определение пересмотренного синтаксиса для OCaml, один и тот же язык программирования может использовать различные конкретные синтаксисы. Все они сходятся к абстрактному синтаксическому дереву в едином формате, который может обработать компилятор. Абстрактное синтаксическое дерево лежит в основе синтаксических расширений, которые, по сути, являются программами OCaml. Хотя определение грамматик должно выполняться в OCaml, парсер, который определяется или расширяется, не обязательно связан с OCaml, и в этом случае дерево синтаксиса, с которым ведется работа, не является деревом синтаксиса OCaml. Предоставлено несколько библиотек, облегчающих специфическую манипуляцию синтаксическими деревьями OCaml.
A Camlp4 preprocessor operates by loading a collection of compiled modules which define a parser as well as a pretty printer: the parser converts an input program into an internal representation. This internal representation constitutes the abstract syntax tree (AST). It can be output in a binary form, e. g. it can be passed directly to one of the OCaml compilers, or it can be converted back into a clear text program. The notion of concrete syntax refers to the format in which the abstract syntax is represented. For instance, the OCaml expression (1 + 2) can also be written ((+) 1 2) or (((+) 1) 2). The difference is only at the level of the concrete syntax, since these three versions are equivalent representations of the same abstract syntax tree. As demonstrated by the definition of a revised syntax for OCaml, the same programming language can use different concrete syntaxes. They would all converge to an abstract syntax tree in a unique format that a compiler can handle. The abstract syntax tree is at the center of the syntax extensions, which are in fact OCaml programs. Although the definition of grammars must be done in OCaml, the parser that is being defined or extended is not necessarily related to OCaml, in which case the syntax tree that is being manipulated is not the one of OCaml. Several libraries are provided which facilitate the specific manipulation of OCaml syntax trees.
Области применения
Языки, специфичные для предметной области, являются одним из основных применений Camlp4. Поскольку OCaml — это многопарадигмальный язык с интерактивной средой разработки и компилятором в машинный код, его можно использовать как бэкенд для любого оригинального языка. Разработчику необходимо лишь написать грамматику Camlp4, которая преобразует рассматриваемый язык, специфичный для предметной области, в обычную программу на OCaml. Можно также использовать другие целевые языки, такие как C.
Domain specific languages are a major application of Camlp4. Since OCaml is a multi paradigm language, with an interactive toplevel and a native code compiler, it can be used as a backend for any kind of original language. The only thing that the developer has to do is write a Camlp4 grammar which converts the domain specific language in question into a regular OCaml program. Other target languages can also be used, such as C.
Если целевым языком является OCaml, можно определить простые синтаксические расширения или синтаксический сахар для обеспечения выразительности, которую сложно достичь, используя стандартные возможности языка OCaml. Расширение синтаксиса определяется скомпилированным модулем OCaml, который передается исполняемому файлу camlp4o вместе с программой для обработки. Camlp4 сам по себе включает язык, специфичный для предметной области, поскольку предоставляет расширения синтаксиса, облегчающие разработку таких расширений. Эти расширения позволяют компактно определять грамматики (операторы EXTEND) и использовать цитаты, такие как <:expr< 1 + 1 >>, то есть деконструировать и конструировать абстрактные синтаксические деревья в конкретном синтаксисе.
If the target language is OCaml, simple syntax add ons or syntactic sugar can be defined, in order to provide an expressivity which is not easy to achieve using the standard features of the OCaml language. A syntax extension is defined by a compiled OCaml module, which is passed to the camlp4o executable along with the program to process. Camlp4 includes a domain specific language as it provides syntax extensions which ease the development of syntax extensions. These extensions allow a compact definition of grammars (EXTEND statements) and quotations such as <:expr< 1 + 1 >>, i. e. deconstructing and constructing abstract syntax trees in concrete syntax.