Playing with pyparsing

by syoyo

そろそろ yacc/lex でパーザを書くことに限界(コンフリクトやメンテナンス性)を感じているので、パーザコンビネータなどでコンフリクトがなく、またメンテナンスしやすいパーザプログラミング手法に注目しています.

Haskell の Parsec や、 Packrat パーザがそのようなコンフリクトがなくて、かつメンテナンスしやすいパーザ記述手法になるようです.

最近はかなり Python っ子なので、同様なものが Python でないか探したところ、pyparsing という同様なことができるライブラリを見つけました.

http://pyparsing.wikispaces.com/

Packrat なパーザも制限がありますがサポートされています.

pyparsing を使って簡単な四則演算パーザを作ってみました.

それぞれの項 or 式で AST(Abstract Syntax Tree)を生成し、パース後に AST を evaluate して値を計算します.

operatorPrecedence() を使うと、括弧のパースなどを自動でしてくれるようになるみたいです.

実行結果はこんな感じ.

二個目はパースエラーが期待される例なのですが、expressive にエラーが表示されています. エラーも、次に何が期待されるかを表示してくれますので、ユーザフレンドリなパーサを書く場合によいのではないでしょうか.

ちなみに、Parsec だとエラーが起きたときに、情報としてエラーの起きた行の文字列というのが無いんですよね. なので上記の例のようにエラーの起きた行を表示したい場合、Parsec だと extra なコーディングをしないといけなくなります.

Advertisements