Skip to main content

Parse C++ header files and generate a data structure representing the class

Project description

cxxheaderparser

A pure python C++ header parser that parses C++ headers in a mildly naive manner that allows it to handle many C++ constructs, including many modern (C++11 and beyond) features.

This is a complete rewrite of the CppHeaderParser library. CppHeaderParser is really useful for some tasks, but it's implementation is a truly terrible ugly hack built on top of other terrible hacks. This rewrite tries to learn from CppHeaderParser and leave its ugly baggage behind.

Goals:

  • Parse syntatically valid C++ and provide a useful (and documented!) pure python API to work with the parsed data
  • Process incomplete headers (doesn't need to process includes)
  • Provide enough information for binding generators to wrap C++ code
  • Handle common C++ features, but it may struggle with obscure or overly complex things (feel free to make a PR to fix it!)

Non-goals:

  • Does not produce a full AST, use Clang if you need that
  • Not intended to validate C++, which means this will not reject all invalid C++ headers! Use a compiler if you need that
  • No C preprocessor substitution support implemented. If you are parsing headers that contain macros, you should preprocess your code using the excellent pure python preprocessor pcpp or your favorite compiler
    • See cxxheaderparser.preprocessor for how to use
  • Probably won't be able to parse most IOCCC entries

There are two APIs available:

  • A visitor-style interface to build up your own custom data structures
  • A simple visitor that stores everything in a giant data structure

Live Demo

A pyodide-powered interactive demo is at https://robotpy.github.io/cxxheaderparser/

Documentation

Documentation can be found at https://cxxheaderparser.readthedocs.io

Install

Requires Python 3.6+, no non-stdlib dependencies if using Python 3.7+.

pip install cxxheaderparser

Usage

To see a dump of the data parsed from a header:

# pprint format
python -m cxxheaderparser myheader.h

# JSON format
python -m cxxheaderparser --mode=json myheader.h

# dataclasses repr format
python -m cxxheaderparser --mode=repr myheader.h

# dataclasses repr format (formatted with black)
python -m cxxheaderparser --mode=brepr myheader.h

See the documentation for anything more complex.

Bugs

This should handle even complex C++ code with few problems, but there are almost certainly weird edge cases that it doesn't handle. Additionally, not all C++17/20 constructs are supported yet (but contributions welcome!).

If you find an bug, we encourage you to submit a pull request! New changes will only be accepted if there are tests to cover the change you made (and if they don’t break existing tests).

Author

cxxheaderparser was created by Dustin Spicuzza

Credit

  • Partially derived from and inspired by the CppHeaderParser project originally developed by Jashua Cloutier
  • An embedded version of PLY is used for lexing tokens
  • Portions of the lexer grammar and other ideas were derived from pycparser
  • The source code is liberally sprinkled with comments containing C++ parsing grammar mostly derived from the Hyperlinked C++ BNF Grammar
  • cppreference.com has been invaluable for understanding many of the weird quirks of C++, and some of the unit tests use examples from there
  • Compiler Explorer has been invaluable for validating my understanding of C++ by allowing me to quickly type in quirky C++ constructs to see if they actually compile

License

BSD License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cxxheaderparser-1.1.0.tar.gz (84.9 kB view details)

Uploaded Source

Built Distribution

cxxheaderparser-1.1.0-py3-none-any.whl (55.7 kB view details)

Uploaded Python 3

File details

Details for the file cxxheaderparser-1.1.0.tar.gz.

File metadata

  • Download URL: cxxheaderparser-1.1.0.tar.gz
  • Upload date:
  • Size: 84.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for cxxheaderparser-1.1.0.tar.gz
Algorithm Hash digest
SHA256 42bb76d1047e0cda2eadde0278ae8537620f960b511294cdf2afee2d6f273dcb
MD5 470353f646d8a51b4c2628cad323c34c
BLAKE2b-256 5efac55079ec05f5bea3803ff360f0bdad3618e342db575015da6b9a431b28af

See more details on using hashes here.

File details

Details for the file cxxheaderparser-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cxxheaderparser-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 31f20fa99365fd3a515576057a38c09b55ebc3d46a6a451d22b7078daab6cdc4
MD5 b79d44de758702f6e78d4b4e3eaaf89b
BLAKE2b-256 e544b1b0b9c06de45d00c73406746944c28dbb2da8c81e92a3a9265c7db79886

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page