package pyast
Install
Dune Dependency
Authors
Maintainers
Sources
sha512=6457a333f472e72198307e65b1c3c9b4e7815547d3b84ad90338a05f3b4b701e371e109400c8a6f7ee0d629807a8b5c44489ce61c73484482271f8095a67816b
Description
This library provides versioned abstract syntax tree for all Python versions from Python 2.5 to Python 3.11.
Published: 25 Oct 2022
README
Python versioned abstract syntax trees and interface to the Python parser
This library provides versioned abstract syntax tree for all Python versions from Python 2.5 to Python 3.11.
Related work
The library pyre-ast
is another OCaml library for parsing Python files using the Python interpreter itself. However, pyast
emphasizes compability between Python versions, enabling OCaml programs to be written with the version of the AST of their choice and still be compatible with the interpreter installed on the system, whatever its version.
Installation
The library is not packaged in the official opam repository yet. It can be pinned with the following command.
opam pin add https://github.com/thierry-martinez/pyast.git
Otherwise, the command dune build @install && dune install
performs the installation (or, equivalently, make install
).
Usage
All Python versions are represented as a module, from Pyast.V2_5
to Pyast.V3_11_0
, which is aliased to Pyast.Latest
: it is recommended to use preferably Pyast.Latest
, unless there is a reason to target a particular verison of Python. The API documentation can be generated with opam build @doc
(or, equivalently, make doc
): the documentation will be generated in _build/default/_doc/_html/
.
utop
can be convenient to discover the API. For instance,
% dune utop
# Py.initialize ();;
# Pyast.Latest.parse "x = 0";;
- : Pyast.V3_11_0.mod_ =
Pyast.Latest.Ast.Module
{Pyast.Latest.Ast.body =
[{Pyast.Latest.Ast.desc =
Pyast.Latest.Ast.Assign
{Pyast.Latest.Ast.targets =
[{Pyast.Latest.Ast.desc =
Pyast.Latest.Ast.Name
{Pyast.Latest.Ast.id = "x"; ctx = Pyast.Latest.Ast.Store};
lineno = 1; col_offset = 0; end_lineno = None;
end_col_offset = None}];
value =
{Pyast.Latest.Ast.desc =
Pyast.Latest.Ast.Constant
{Pyast.Latest.Ast.value =
Some (Pyast.V3_11_0.Num (Pyast.V3_11_0.Int 0));
kind = None};
lineno = 1; col_offset = 4; end_lineno = None; end_col_offset = None};
type_comment = None};
lineno = 1; col_offset = 0; end_lineno = None; end_col_offset = None}];
type_ignores = []}
Parsing is delegated to the Python interpreter which is executed through bindings that are provided by py.ml
. All the modules Pyast.V*
mentioned above provide the following functions:
val parse_ast : Py.Object.t -> Ast.mod_
, which builds an OCaml representation from an abstract syntax tree already parsed in Python (typically withast.parse
).val parse : ?filename:string -> ?mode:Pyast__.Pyparse.compile_mode -> string -> Ast.mod_
, which parses a string in a givenmode
, usingfilename
in error messages (filename
does not have to point to an existing file and can be an arbitrary string).val parse_file : ?mode:Pyast__.Pyparse.compile_mode -> string -> Ast.mod_
, which parses a file given its name.
Note that Pyast.V*.Ast
is included in Pyast.V*
, and in particular, Pyast.V*.Ast.mod_
and Pyast.V*.mod_
both denote the type of a Python module.
The abstract syntax trees are automatically generated from the ASDL grammar which is used in the CPython implementation. Conversions can be performed between AST versions with the Pyast.V*.To
functors: for instance, the module Pyast.V2_5.To (Pyast.V3_11_0)
provides a module containing functions for converting all the non-terminal symbols of the grammar, and in particular a function val mod_: Pyast.V2_5.mod_ -> Pyast.V3_11_0.mod_
. These functions are automatically called by the functions parse*
mentioned above to convert the abstract syntax tree parsed by the version of the Python interpreter available to the targeted version. (The module corresponding to the version of the Python interpreter is available through the function Pyast.get_current_version
, and more generally Pyast.get_version
returns the first-class module corresponding to a given version at run-time.)
Dependencies (8)
Dev Dependencies (4)
-
odoc
with-doc & >= "1.5.1"
-
conf-python-3-dev
with-test
-
alcotest
with-test & >= "1.4.0"
-
pattern
with-test & >= "0.3.1"
Used by
None
Conflicts
None