1

基本的にはルビーの男で、次のようにpyで小さなdslを作成する必要がある状況になりました。ルビーでフォローすることは実行可能であり、pyでまったく同じものを探しています

from_a_dsl_file = "
   take_this 'abc'
   and_process_it
   and_give_me_the_output
"

class A
   def take_this abc
   end

   def and_process_it
   end

   def and_give_me_the_output
     'desired'
   end
end

A.new.instance_eval from_a_dsl_file
# => 'desired'

ヒント、または実用的な例を教えてください

前もって感謝します

4

2 に答える 2

3

私が理解しているように、Ruby では、括弧を必要としない関数呼び出しで実行できるトリッキーなことがいくつかあります。

x y

xRuby では、それは関数が引数として呼び出される関数呼び出しである可能性がyあります。

Python には、そのようなトリックはありません。関数を呼び出す場合は、関数名の後に括弧が必要です。ですから、これでゲームをしようとしてもあまり運が良くないと思いますeval()

言語を解析して、その言語が何をしようとしているのかを理解するパーサーを作成する方がよいでしょう。そのために、Python には特に優れたライブラリがあります。pyparsing

http://pyparsing.wikispaces.com/

PS「Pythonドメイン固有言語」をGoogleで検索するだけで、いくつかの良いリンクが見つかります。多くはStackOverflowにあります。これが私が見つけた最高のものです:

Python のミニ言語

編集:さて、あなたは例を求めました、そしてここに行きます。これは PyParsing での初めてのプログラムで、非常に簡単でした。ドキュメントも読んでいませんでした。Web で見つけたプレゼンテーションの例から作業を行いました。

プレゼンテーションの URL は次のとおりです: http://www.ptmcg.com/geo/python/confs/TxUnconf2008Pyparsing.html

from pyparsing import *

def give_desired_output(s):
    return "desired"

TAKE_THIS = Suppress("take_this") + Suppress(Word(printables))
AND_PROC = Suppress("and_process_it")
AND_GIVE = Keyword("and_give_me_the_output")
AND_GIVE.setParseAction(give_desired_output)

LANGUAGE_LINE = TAKE_THIS | AND_PROC | AND_GIVE

LANGUAGE = ZeroOrMore(LANGUAGE_LINE)


def parse_language(text):
    lst = LANGUAGE.parseString(text)
    assert len(lst) == 1  # trivial language returns a single value
    return lst[0]

if __name__ == "__main__":
    from_a_dsl_file = \
"""
   take_this 'abc'
   and_process_it
   and_give_me_the_output
"""

    print(parse_language(from_a_dsl_file))  # prints the word: desired
于 2013-01-21T08:08:27.760 に答える
1

あなたが見たいと思うかもしれないように聞こえます、exec()そして/またはexecfile()(そして具体的には利用可能なグローバルとローカルを指定する能力のようなもの)。

(もありeval()ますが、一連のコマンドではなく、単一の式のみが許可されます。)

于 2013-01-21T07:06:20.333 に答える