2016-03-18 21 views
2

タイトルを参照してください。私が書いている小さなツールでは、簡単なブール値のフィルタ言語を導入し、それを「適切に」行い、パーサージェネレータを使用することにしました。グラコで遊んだ後に、私はそれが好きで、フィルタ言語がかなり速くなっていることも分かりました:)(グラコなしでパーサーを生成することは可能ですか?

他のコンピュータでツールを使用したい場合や、他の人にはまず何らかの方法でグラコを利用できるようにしなければなりません。それは他のすべてが標準的なpython3のものなので、ちょっと面倒です。

私は、必要なgrako-classを一緒にパッケージすることが可能だと思いますが、ちょっと混乱しているようです(ライセンスは何らかの言及があります)。たぶん私はいくつかの組み込みメソッドを見落としてしまったでしょう。

+0

時にはパーサージェネレータが過剰です。シンプルなブール式の式言語を書こうと思っているなら、手書きの再帰的な下降パーサーと外部パッケージの依存関係を使わずに、かなり効果的に行うことができます。 http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is-usable-on-8-bit-embedded-systems/2336769#2336769 –

+0

Thxのヒント。私は同意する、これのためのジェネレータを使用してトップの上に少しビットだったが、そのちょうど "楽しさ"のために - と私はかなりの間に何かで遊んでいないために1つを使用した;-))。 – mageta

答えて

1

短い答えはいいえです。

Grakoが生成するパーサーには、grakoライブラリが必要です。例えば

with self._group(): 
    with self._choice(): 
     with self._option(): 
      self._token('nameguard') 
     with self._option(): 
      self._token('ignorecase') 
     with self._option(): 
      self._token('left_recursion') 
     self._error('expecting one of: ignorecase left_recursion nameguard') 

すべてself._xyz()grako.contexts.ParseContextまたはgrako.parsing.Parserのいずれかから来ます。バックトラック、キャッシュ、およびブック管理は、コンテキストマネージャとデコレータの背後に隠されています。

生成されたパーサーがgrakoに依存していることは、(難読化されたコードを生成する多くの優れたパーサジェネレータが存在するため)プロジェクトの主な目的の1つであった、 。

もう1つのオプションは、生成されたパーサーが依存する可能性のあるコードを各パーサーにコピーすることでしたが、それは少しばかり気になりませんでした。

+1

明確化:パーサーやトランスレータを構築するためにGrakoライブラリを覚える必要はありません。READMEで十分です。しかし、複雑なソースやターゲット言語に対処するには、それに関してGrakoライブラリが提供しているものを調査するか、同等以上の他のソースを見つけるのが最善です。 – Apalala

関連する問題