Skip to content
Shantanu edited this page Sep 12, 2023 · 8 revisions

The mypy parser uses the CPython "ast" module to convert source code into an abstract syntax tree (AST). The mypy parser then translates the CPython AST into a mypy AST defined in mypy/nodes.py. (The term parse tree is sometimes used informally as a synonym of AST.)

We don't use the CPython AST directly since it doesn't contain all the node types and attributes mypy needs. Having a custom AST implementation also gives us more flexibility and is more efficient.

You can manually call the mypy.parse.parse function to experiment with it (first install test dependencies in the current virtualenv):

$ cd mypy  # mypy repo
$ python
>>> from mypy.options import Options
>>> from mypy.parse import parse
>>> print(parse("print('hello, world')", "hello.py", None, None, Options()))
MypyFile:1(
  hello.py
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(print)
      Args(
        StrExpr(hello, world)))))

The names MypyFile, ExpressionStmt, CallExpr, NameExpr and StrExpr refer to AST node classes defined in mypy/nodes.py. The numbers after colons are line numbers.

The parser does only a minimal amount of consistency checks. As such it also accepts many invalid programs. The next compiler pass, Semantic Analyzer, performs additional checks.