![]() | Ned Batchelder : Blog | Code | Text | Site Python parsing tools » Home : Text |
Created 30 September 2004, last updated 29 December 2012 NOTE: I am no longer updating this page. Michael Bernstein has a copy at Python Parsing Tools that will be easier to keep up-to-date. The python.org wiki also has a page called LanguageParsing. A few years ago, I went looking for Python parsing tools. I spent a long time researching the various options. When I was done, I had a cheat sheet on the different alternatives. This is that cheat sheet, cleaned up a bit. It is very spotty. Because this is a compilation of factoids freely available on the web, it is in the public domain. The tools are presented here in random order. I tried organizing them, but I couldn't find a scheme that seemed to help. Some points of comparison:
The toolsPly pyparsing ANTLR pyPEG pydsl LEPL CodeTalker funcparserlib Simple Top-Down Parsing in Python Pysec: Monadic Combinatoric Parsing in Python (aka Parsec in Python) picoparse Aperiot PyGgy Parsing Rparse SableCC GOLD Parser Plex yeanpypa ZestyParser BisonGen DParser for Python Yapps PyBison Yappy Toy Parser Generator kwParsing Martel SimpleParse SPARK mxTextTools FlexBisonModule Bison In A Box Berkeley Yacc PyLR Standard ModulesThe Python standard library includes a few modules for special-purpose parsing problems. These are not general-purpose parsers, but don't overlook them. If your need overlaps with their capabilities, they're perfect:
See also
| |
The contents of this page are in the public domain. | |
Comments
Re BisonGen.
True: docs are sparse. We developed it really as an internal tool for generating parsers needed in 4Suite, but got some interest in using it standalone, so started releasing versions of it.
Earlier versions of BisonGen used to generate a bison and flex file for second-srtage processing by the GNU tools, but Jeremy, in a fit of brilliant madness rewrote all the state table analysis and construction code from those packages in Python, so now you're right, it really has little to do with bison. Perhaps a name change is in order, but again given our shallow follow-thru w.r.t. BisonGen...
I'll at least cobble together a home page.
Thanks for maintaining your list. It really helped me find a python parser.
Thanks a lot. Great list, came across pyparser thanks to this.
Nice compilation!
Was very helpful for knowing many things i did not know previously.
Also, it would be great if you can add an a rating and reviews to the tools so that it can help novices like me to select a parser and get going.It will be much better in the long run.
Suman, I don't have the time to rate and review each of these. I tried to objectively describe them. Trying out each of them would be a much larger undertaking. And I don't know that my criteria would be the same as yours.
There is also a comparison on
http://wiki.python.org/moin/LanguageParsing
In the standard modules, you might consider adding the cmd module. It's convenient when you don't want to bother with writing a grammar for a simple command-line tool. It uses a naming convention to map the user's input to function names; if a match is found, the function is called, otherwise, an error function is called.
--dang
Nice listing of resources. I hate to admit, but i don't know if i need a parser or not.. Essentially i know i spend a lot of time using regular expressions, but don't know if i can get a better deal with a parser.
The links i have so far focus on the technical aspects. So far i can not find detail on where lex / parse should and should not be used. Proly i should keep reading... Thanks for the info.
Would be so helpful if was some sort of blurb about how fast these are. I am currently writing a mud, and will definitely need a parser, looked into many of these parsers, honestly speed is a very big issue. Unfortunately haven't seen any kind of benchmarks for most of these.
Ned -- thanks.
I appreciate the overview. This is helping jumpstart me.
I also second the request for some kind of review.
-- joe
Hello, Thank for this pages! We use your work in order to choose the best tool for our needs. We work on a Flight Management projet (100 ingenieers)...
Hi. I recently found a **great** public-domain Python-based parsing library.
It's called "yeanpypa" (YEt ANother PYthon PArsing lib) and is inspired by PyParsing and Boost::Spirit (a C++-based parsing lib that I've used a fair bit).
Indeed, IMO yeanpypa feels very much like Spirit.
The main difference to some other parsing libs is that with (say) Spirit, you specify the BNF-grammar from the top down. So, to use a nonsensical but easy-to-understand example, if you did a BNF grammar for a book (say a novel), Spirit would do it as (in pseudo-code)-
Book = one-or-more chapters
Chapter = one-or-more pages
Pages = one-or-more paragraphs
Paragraph = one-or-more-lines
Line = one-or-more words
... and so on. In yeanpypa, you would do -
Words = one-or-more letters
Line = one-or-more words
Paragraph = one-or-more-lines
Pages = one-or-more paragraphs
Chapter = one-or-more pages
Book = one-or-more chapters
Yeanpypa is great! I've tried PyParsing but just couldn't get the hang of it. Then I tried yeanpypa and (having used Spirit) I "got it" *immediately!*
Here are the URLs for yeanpypa -
http://freshmeat.net/projects/yeanpypa/
http://www.slash-me.net/dev/snippets/yeanpypa/documentation.html
'Construct' is a declarative framework for the definition of arbitrary data structures. These data structures, called 'constructs', allow both parsing and building (symmetrically).
http://construct.wikispaces.com
Ned, pyparsing.
pyparsing!!!!!!!!!!
Great! Thanks for the list. Looks like you've been maintaining this for *years*. Good job.
Python 2.6 has a json parsing module built in.
http://docs.python.org/library/json.html
Toy Parser Generator link is now http://christophe.delord.free.fr/tpg/index.html
This was fantastically helpful. Thanks for posting this. I'm toying with piPEG and testing others.
Christophe Delord, the same author of Toy Parser Generator has published another parser named SP
link: http://www.cdsoft.fr/sp/
Last release: Sunday 22 May 2011
Seems interesting, but I haven't used yet.
PD: thanks Ned for the list, and other posters for updates
Did you forget the standard module tokenize? It fills somewhat the same niche as shlex, but provides a more detailed tokenization. Unlike shlex, which provides a shell-style tokenization, tokenize is more attuned to the lexing needs of Python itself.
The tokenize module also provides more information about where in the text stream each token appears. That information allows it to reconstitute a modified version of the original text from a modified token stream.
Glad this is still such a great reference. We never did get a chance to do much more work on BisonGen, but Just this week I needed a full-featured lexer for Python 3 (to implement MicroXML) and I ended up porting Plex to Python 3. It's a fair whack of a change so I'm posting it in case it helps others:
https://github.com/uogbuji/plex3
Thanks for this great list!
Modgrammar is really good btw., in terms of it's design and license (BSD 3-Clause).
Any chance of adding lrparsing to this list?
Hi, I've forked the list and updated it to fix broken links, reference latest versions, and add various libraries and tools, standard modules, etc. Still a work in progress: https://github.com/webmaven/python-parsing-tools
Pull requests welcome.
Hey There! The link to FlexBisonModule seems to be broken. You might want to use http://www.crsr.net/Software/FBModule.html for it instead.
Pradyun, I updated the FlexBisonModule link on the copy of this list that I now maintain: https://github.com/webmaven/python-parsing-tools
Add a comment: