• 締切済み

Pythonで構文解析する高速なライブラリを探しています

Pythonで、数式(Pythonの式ではない。二項演算・関数呼び出し・タプルなどがある)を解析し、構文木を作ろうとしています。 いままでSimpleParse・PLYを試しましたが処理が遅く、もっと速い方法を探しています。 SimpleParse・PLY・spark以外の構文解析ライブラリをご存知のかたは教えてください。 また、SimpleParseやPLYで高速に解析する方法があれば教えてください。 なお、yaccを使ってCで実装するのは最後の手段と言うことで

みんなの回答

回答No.2

たしかにPLY遅いですね。 なので、わたしもPythonパーサの比較記事を探したことがあります。(PLYは載ってませんが、、、) http://www.python.org/community/sigs/retired/parser-sig/towards-standard/ YAPPSというのは、Sparkの10倍くらい速いみたいです。 BisonGenというのは、さらにその5倍くらい速いみたいです。が、これはCでPython Extensionを作るツールみたいです。(最後の手段ですね) ちなみに、PLYで100Mbyteのファイルをスキャンすると5分以上かかります。 同等の処理をflex+bison+Cで行うと10秒以内でした。 PLYのレクサー部分が遅いみたいです。 スクリプト言語で1文字ループして、それを遅い正規表現エンジンに喰わせて、、、なのでしかたないですね。

参考URL:
http://www.python.org/community/sigs/retired/parser-sig/towards-standard/
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>数式(Pythonの式ではない。二項演算・関数呼び出し・タプルなどがある)を解析し、構文木を作ろうとしています。 この程度なら手書きで書き起こすのも難しくはないと思いますが。 高速高速っていろんな質問ででますけど、具体的にどのくらい 高速化しなければならないのか書かれてないものばかりですよね。

関連するQ&A

  • LALRで解析できてLLで出来ない場合は?

    すいません 今Haskellの勉強をしていて Parsecという構文解析ライブラリを触っています コンパイラというのを始めて作ってみて思ったのですが Parsecでも四則演算やif文が動く状態まで作ってみて LL文法でも結構なんでも解析出来ちゃう実感を感じてしまったのですが yacc等で使われているLALR法で解析できるのにLL法で解析できない文法というのは 具体的にはどのような文法なのでしょうか? 特にどれでも良いので産業界で受け入れられているプログラミング言語の構文など出していただけると幸いです

  • SQLの構文解析

    プログラミング初心者ですがよろしくお願いします。 SQL文の字句、構文解析を行いたいと思っていて、SQL文が書かれたテキストファイルを入力とし、構文木もしくはそれににた情報を出力できるようなものがほしいです。 どこかにSQL構文のパーサーのソースコードライブラリは無いでしょうか?できればフリーがいいです。 C言語やflex,bisonなどのソースコードがあればいいのですが探しても見つかりません。どなたかご存じありませんか?よろしくお願いします。

  • LL(n)構文解析機での高速化手法

    プログラム言語の処理系の勉強のために、実際に処理系を作成してみています 四則演算などの基礎的なところが動くようになって喜んでいたのですが 次のような文法で大きく解析速度が落ちてしまうという問題が起きてしまいました (構文解析だけで1分ほどかかってしまいました) ->(n) do if( n.(==)(1), do 1 end, do n.(*)(fact(n.(-)(1))) end ) end 文法の詳細は何となく察していただくとして 解析速度の大きな低下の原因を探ってみたところ 括弧「()」の入れ子階層が深く入り組むほど倍々ゲームで解析速度が落ちている処まで絞り込めてきました おそらく閉じ括弧「)」を先読みしても間違ったものを拾って失敗しているのではないかなと推測しています 一応使っている環境は下に挙げますが おそらくはLL(n)構文解析での一般的な問題だと思いました どうすれば高速化できるか教えていただけないでしょうか? ・開発言語はC# ・パーサー・コンビネーターでSparacheというライブラリを使用させていただきました https://github.com/sprache/Sprache ・ライブラリは開始括弧「(」をっ見つけると閉じ括弧「)」の先読みを、してくれている…様子です ・トークナイズや中間表現への変更は行わないで直接文字列をプログラムとして評価しています はじめて作ってみた処理系なので失敗してはその原因を調べなおして勉強しているものですが お知恵を貸していただければ幸いです

  • BNF記法について

    最近質問させていただいたものですが、また分からな いことがあり、質問させてください。 ある、アルゴリズムの問題集をやっていて、BNF記法に 従った数式を解析して計算するというものでした。 BNFの定義として、 式=項 | 式 加法演算子 項 項=因子| 項 乗法演算子 因子 因子=数 加法演算子='+'|'-' 乗法演算子='*'|'/' となっています。 そのテキストで、例として、 項=3*4/5 というのがありました。これは理解できました。しかし、 式=1+2+3*4/5-6 というのが理解できません。 式=式 加法演算子 項 と、項=項 乗法演算子  因子 というのを再帰的に当てはめていくのだと思うのです が、式として成立させるのは定義からして無理だと 思うのですが。1+2+3*4/5-6を式として解釈するには どのようにしたらよいかお教えください。よろしく お願いいたします。 ちなみに、1+2+3*4/5-6は、問題集に載っているアルゴリズムで問題なく解けました。  

  • OpenCLで演算した結果(座標)を使用して、OpenGLのライブラリ

    OpenCLで演算した結果(座標)を使用して、OpenGLのライブラリ(glvertex)などで描画したいのですが、実装方法がわかりません。 OpenCLで算出した結果を、一度ホスト(CPU)側に戻す方法はわかっているのですが、データ量が多いのでデバイス(GPU)側のままの状態にしたいと考えています。

  • Cコードでのパイプの疑似的な再現方法

    どうも、他の人が作ったコマンドプロンプトで利用するプログラムをDLLに変更したいと思っています。 hoge.txt > mage.exe という風にテキストを引き渡すと、構文解析を行って必要な情報を返してくれるプログラムなので、テキストを引き渡さないときは、入力するためのプロンプトを出してきます。 このプログラムをdllにしてC#等から呼び出せるようにしたいのです。 最初は何処かでchar*とかを引数に取る関数があるだろうと思っていたのですが 実際は結構呼び出しの深いところの複数個所でgetcharが呼ばれていて、直すのが大変そうなので 内部のgetchar渡した文字列を取り出せるように、パイプのデータ渡しを疑似的に再現できないでしょうか? ちょっとこのあたりの知識がないのでお力添えをお願いいたします。 ちなみに触っているのはyaccで生成したパーサーで構文解析を行ってくれるプログラムです。

  • XML(Atom)読み込みライブラリを探しています

     C/C++ で利用する,XML(できれば Atom)を読み込んで解析できるライブラリを探しています。  要件としては,  - Windows ベースのプログラムで利用したいが,できれば .NET Framework や MFC に依存しないもの(C/C++ ネイティブ)。  - Atom 形式が適切に読めるものが最高だが,一般の XML が解析できるものでもじゅうぶん。  - 解析(パース)できて適切に解析木にアクセスできればじゅうぶん(複雑な書き換えなどは行わない)。 です。  今のところ,マイクロソフトの「XmlLite」   http://msdn.microsoft.com/msdnmag/issues/07/04/Xml/default.aspx?loc=jp を探し当てましたが,ほかにより適切なものがあるか,お尋ねする次第です。  特に,実際に C・C++ で開発などを行っている方で,XML を扱うプログラムを書かれている方のご意見を頂戴できればと思います。このような方法が定石であるとか,開発のヒントを合わせてご教示くだされば幸いです。

  • 逆ポーランド記法

    電卓もどきのアルゴリズムを教えて下さい 指定された数式を解読して、演算結果を求める処理を作成したいのですが・・・・ 今考えている手順は (1) 数式を解析して 逆ポーランド記法の中間言語にして於いておく (2) 逆ポーランド記法の中間言語を演算して答えを求める と考えているのですが・・・ << 例 >>  演算式 1+2×3=    答え 7  演算式 (1+2)×3=  答え 9 大昔の知識ですのでもっとシンプルな方法が有りましたらアドバイス頂けませんでしょうか?

  • pythonでexcel操作

    表記の件、全くの初心者です Pythonを始め EXCEL操作を始めたかなりの初心者です AnakondaからPythonはインストール済でpaizaで練習した構文はprintで正しく出来てはいます。 このサイトを閲覧しています https://www.python-izm.com/third_party/excel/openpyxl/openpyxl_read/ ここではExcel操作ライブラリであるOpenPyXLを用いたExcelファイルの読み込みに関連する機能について触れています コマンドプロンプトでpip install openpyxlと書き込みEnterしました するとRequirement ーーーーー anaconda と3列表示されました Installは出来ているように思いますがここから先が全然分かりません このopenpyxlなるものを開く方法が分かりません。 ここからはサイトからのコピペです まずはExcelブックの開いてみましょう。Excelであればどのようなファイルでも構いませんが、例で使用しているファイルは下記リンクよりダウンロード出来ます。 import openpyxl book = openpyxl.load_workbook('test_book.xlsx') このように表示されます(黒いベタに文字が書かれていますが(コマンドプロンプトのような感じです)これは何ですか何に書き込まれているのか全然分かりません。 次に ブック内のシート数と全シート名を出力してみましょう。 1 2 9 import openpyxl book = openpyxl.load_workbook('test_book.xlsx') print('--------------------------------') print(len(book.sheetnames)) print('--------------------------------') for name in book.get_sheet_names(): print(name) 初心者で散々試したのですが分からずよろしくお願いいたします。 これしか書きようがなくすいません。

  • c# この高速化の方法あり?

     こんにちは、c#初心者です。  今回は初期化の高速化の方法で悩んでいるので質問させていただきました。  ライブラリ内でstrring型と同じくらい頻繁に初期化が行われる使い方をされるクラスAを作り、そこからクラスBへ、クラスBからクラスCへ…クラスEといった感じで継承させています。  ところが、どのクラスもクラスAと同じように頻繁に新しいインスタンスが初期化されるのでコンストラクタの処理時間が一部のパフォーマンスに結構ひびくのですが、継承しているために、クラスCを初期化するだけで、クラスAとクラスBのコンストラクタが呼び出されてしまい、このことが特にクラスEではきついのです。  確かに呼び出しに取られる時間は少ないとはいえ、もともとコンストラクタでの作業は少ないので、割合としてはそこそこな時間を取っている状態になっています。  そこで思いついたのが、インターフェイスを利用して継承を使わないという方法です。  それぞれ、IA, IB, …, IEで対応するインターフェイスを実装。例えばクラスBはIA, IBの二つ、クラスEはIA~IE全てのインターフェイスを実装している状態です。  他に思いついたのは、上記の方法+クラスB以降を全てクラスAから派生させるという方法です。速度は満点ではありませんが、これならある程度抽象化もできて、余分なコンストラクタ呼び出しも1回で済みます。  ちなみにこれは現在製作中のライブラリ内で使われているクラスです。末端のアプリケーションなら問題ないような気がするのですが、何しろライブラリなのでこんな手法は如何かと思い質問させていただきました。  自分が見る限りではコンストラクタ内に他に余分なコードはありませんし、無論ループはありませんが、他に高速化する方法があればそれも教えていただきたいです。  とりあえず、言語の性能を最大限に引き出すことでの高速化をコンセプトにしているので多言語への乗り換えは無しということでお願いします。

専門家に質問してみよう