114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 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](https://github.com/ned14/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](https://www.nongnu.org/hcb/)
 | ||
| * 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](godbolt.org) 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
 | 
