phply

Lexer and parser for PHP source implemented using PLY


Keywords
language, parsing, php, ply, python
License
BSD-3-Clause
Install
pip install phply==1.0.0

Documentation

phply

phply is a parser for the PHP programming language written using PLY, a Lex/YACC-style parser generator toolkit for Python.

Why?

Good question. Because I'm crazy. Because it seemed possible.

Things I'm interested in doing with it:

  • Converting PHP code to Python
  • Running PHP templates in a Python environment
  • Learning more about parsing "industrial" languages, warts and all

What does it stand for?

  • phply -> PHP PLY
  • phply -> PHP Hypertext Preprocessor Python Lex YACC
  • phply -> PHP Hypertext Preprocessor Hypertext Preprocessor Python Lex Yet Another Compiler Compiler
  • (... to be completed ...)

How do you pronounce it?

If you're conservative, it's pronounced "pee aich ply". If you're liberal, it's "fiply". And if you're anarchist, pronounce it however you want. Who am I to tell you what to do?

What's working?

  • Lexer matching the standard PHP lexer token-for-token
  • Parser and abstract syntax tree for most of the PHP grammar
  • Script to convert PHP source to JSON-based ASTs
  • Script to convert PHP source to Jinja2 source (experimental)

What's not?

Some things can't be parsed yet. They are getting fewer by the day, but there is still a fair amount of work to do:

  • Labels and goto
  • Some other stuff, probably

Who's working on it?

See the AUTHORS file.

Troubleshooting

Couldn't create 'phply.parsetab'

Phply relies on ply to generate and cache some tables required for the parser. These have been generated with the latest available version of ply for the phply release. If you installed phply under a different user and a new ply was released, the parsetab file cannot be automatically updated. Your options are to:

  • raise an issue for phply
  • rebuild the package yourself

How do I use it?

  • Lexer test: python phply/phplex.py
  • Parser test: python phply/phpparse.py
  • JSON dump: cd tools; python php2json.py < input.php > output.json
  • Jinja2 conversion: cd tools; python php2jinja.py < input.php > output.html
  • Fork me on GitHub and start hacking :)