6

Python でゲームを作成しており、マップ データ ファイル用の DSL を作成することにしました。正規表現を使用して独自のパーサーを作成できることはわかっていますが、PHP エンジンで使用されている re2c のように、これをより簡単に実行できる既存の python ツールがあるかどうか疑問に思っています。

追加情報:

  • はい、確かに DSL必要です。そうでなくても、プロジェクトで DSL を構築して使用する経験が必要です。
  • DSL にはデータ (宣言型?) のみが含まれており、「実行」されません。ほとんどの行は次のようになります。

    SOMETHING: !abc @123 #xyz/123

    データのツリーを読み取るだけです。

4

8 に答える 8

12

私はいつもpyparsingに感銘を受けてきました。著者のPaulMcGuireは、Pythonリスト/ comp.lang.pythonでアクティブになっており、それに関するクエリで常に非常に役立ちました。

于 2008-12-04T01:02:53.107 に答える
6

これは非常にうまく機能するアプローチです。

abc= ONETHING( ... )
xyz= ANOTHERTHING( ... )
pqr= SOMETHING( this=abc, that=123, more=(xyz,123) )

宣言的。解析しやすい。

と...

それは実際にはPythonです。いくつかのクラス宣言と作業は完了です。DSL は実際にはクラス宣言です。

重要なのは、DSL は単にオブジェクトを作成するだけだということです。DSL を定義するときは、まずオブジェクト モデルから始める必要があります。後で、そのオブジェクト モデルにいくつかの構文を配置します。構文から始めるのではなく、モデルから始めます。

于 2008-12-04T01:09:56.947 に答える
4

はい、解析ツールはたくさんありますが、標準ライブラリにはありません。

私が見たものから、PLYとSPARKは人気があります。PLYはyaccに似ていますが、文法をdocstringで記述するため、Pythonですべてを実行します。

個人的には、パーサーコンビネーター(関数型プログラミングから取得)の概念が好きで、構文解析がとても好きです。文法とアクションをPythonで直接記述し、簡単に始めることができます。ただし、デフォルトのタイプを使用する代わりに、アクションを使用して独自のツリーノードタイプを作成することになりましたParserElement

それ以外の場合は、 YAMLなどの既存の宣言型言語を使用することもできます。

于 2008-12-04T00:59:31.600 に答える
2

あなたが説明している「小さな言語」の場合、単純な分割、シュレックス(#がコメントを定義することに注意してください)または正規表現を使用します。

>>> line = 'SOMETHING: !abc @123 #xyz/123'

>>> line.split()
['SOMETHING:', '!abc', '@123', '#xyz/123']

>>> import shlex
>>> list(shlex.shlex(line))
['SOMETHING', ':', '!', 'abc', '@', '123']

以下は一例で、何を求めているのか正確にはわかりません。

>>> import re
>>> result = re.match(r'([A-Z]*): !([a-z]*) @([0-9]*) #([a-z0-9/]*)', line)
>>> result.groups()
('SOMETHING', 'abc', '123', 'xyz/123')
于 2009-11-02T12:00:47.817 に答える
2

DSL は良いものなので、自分を弁護する必要はありません :-) しかし、内部 DSL について考えたことはありますか? これらには、外部 (解析済み) DSL に対して非常に多くの利点があるため、少なくとも検討する価値があります。DSL とネイティブ言語の力を組み合わせると、実際に多くの問題が解決されます。また、Python は内部 DSL が苦手というわけではありませんwith

于 2008-12-05T06:10:45.340 に答える
2

SNMP 通知定義を読み込み、これから Java クラスと SNMP MIB ファイルを自動的に生成するために、このようなものを仕事で書いています。この小さな DSL を使用すると、20 行の仕様を記述でき、約 80 行の Java コードと 100 行の MIB ファイルが生成されます。

これを実装するために、実際には単純な Python 文字列処理 (split()、スライスなど) を使用してファイルを解析しました。Python の文字列機能は、私の (単純な) 解析のニーズのほとんどに十分対応できることがわかりました。

他の人が言及したライブラリに加えて、より複雑で適切な解析機能が必要なものを書いている場合は、Python (および他の言語) をサポートするANTLRを使用するでしょう。

于 2008-12-04T20:08:42.280 に答える
1

宣言的な python の行で、私は 'bpyml' と呼ばれるヘルパー モジュールを作成しました。これにより、冗長なタグを使用せずに、より XML 構造化された方法で python でデータを宣言できます。XML との間で変換することもできますが、有効な python です。

https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/scripts/modules/bpyml.py

使用例 http://wiki.blender.org/index.php/User:Ideasman42#Declarative_UI_In_Blender

于 2011-11-18T10:15:42.693 に答える