Modern C++ header parser
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
- Parser requires a C++ preprocessor. If you are parsing
headers that contain macros, you should preprocess your code using the
excellent pure python preprocessor pcpp
or your favorite compiler
- We have implemented support for PCPP, GCC, and MSVC -- but it is not enabled
by default. See the
cxxheaderparser.preprocessormodule for how to enable it.
- We have implemented support for PCPP, GCC, and MSVC -- but it is not enabled
by default. See the
- 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).
It's really easy to add new tests, see the README in the tests directory.
Author
cxxheaderparser was created by Dustin Spicuzza
Credit
- Partially derived from and inspired by the
CppHeaderParserproject 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cxxheaderparser-1.7.0.tar.gz.
File metadata
- Download URL: cxxheaderparser-1.7.0.tar.gz
- Upload date:
- Size: 52.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2d0282e6f3cc25484acb2d737b3b5a646b947ae48cc0060242c50925d402f2ed
|
|
| MD5 |
39f8ac1e9fa5dc171600826656bc9534
|
|
| BLAKE2b-256 |
d3ad652fa2e26afffc1ec0fff168973c41acf0893025dd401b0a056b8f108666
|
Provenance
The following attestation bundles were made for cxxheaderparser-1.7.0.tar.gz:
Publisher:
dist.yml on robotpy/cxxheaderparser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cxxheaderparser-1.7.0.tar.gz -
Subject digest:
2d0282e6f3cc25484acb2d737b3b5a646b947ae48cc0060242c50925d402f2ed - Sigstore transparency entry: 799050087
- Sigstore integration time:
-
Permalink:
robotpy/cxxheaderparser@e1a62b644afb53754bbd0950b5b981536f0aa65b -
Branch / Tag:
refs/tags/1.7.0 - Owner: https://github.com/robotpy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
dist.yml@e1a62b644afb53754bbd0950b5b981536f0aa65b -
Trigger Event:
push
-
Statement type:
File details
Details for the file cxxheaderparser-1.7.0-py3-none-any.whl.
File metadata
- Download URL: cxxheaderparser-1.7.0-py3-none-any.whl
- Upload date:
- Size: 59.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c8ade60cc0c102bdd3eeb26fbc9ae30c3ae9b74ce881fab91e8fe8647b1a5f4
|
|
| MD5 |
6dffb7d5fa3560dad223162e25c3cebf
|
|
| BLAKE2b-256 |
dcc4d09b7f302bcd88391f29b6e1c8236660f01891d8a9b7b9c631bade404862
|
Provenance
The following attestation bundles were made for cxxheaderparser-1.7.0-py3-none-any.whl:
Publisher:
dist.yml on robotpy/cxxheaderparser
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cxxheaderparser-1.7.0-py3-none-any.whl -
Subject digest:
3c8ade60cc0c102bdd3eeb26fbc9ae30c3ae9b74ce881fab91e8fe8647b1a5f4 - Sigstore transparency entry: 799050088
- Sigstore integration time:
-
Permalink:
robotpy/cxxheaderparser@e1a62b644afb53754bbd0950b5b981536f0aa65b -
Branch / Tag:
refs/tags/1.7.0 - Owner: https://github.com/robotpy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
dist.yml@e1a62b644afb53754bbd0950b5b981536f0aa65b -
Trigger Event:
push
-
Statement type: