2016-04-07 9 views
0

私はカスタム言語のために 'interpreter'を書こうとしています。"def"の名前をPython(および他のキーワード)に変更しました

言語は、Pythonに非常に似ていますが、いくつかの違いなどがあります。この問題を解決するための最良の方法だろう何

sub subRoutine() 
    print("hello") 

のPython:

def subRoutine(): 
    print("hello") 

カスタム? 私はpythonのソースを変更して再コンパイルする必要があります、私は私がそのような低レベルで物事を変更することを可能にするライブラリを書くことができますか?

乾杯

+8

なぜこれをやっていますか? Pythonのプリプロセッサは実際には新しい "インタプリタ"ではありません。あなたは何かを学ぼうとしていますか?本当に新しいものを発明しようか? – ShadowRanger

+1

カスタム言語を作成しようとしている場合、Tclを見てみることをお勧めします。これにより、何かを再定義することができ、カスタムDSLを作成するのに最適な非常に単純な構文が得られます。 –

+1

http://mathamy.com/import-accio-bootstrapping-python-grammar.html楽しい –

答えて

1

私がいることを念頭に置いて、this fileによって開始する:このファイルで指定された文法を変更

は、パーサーモジュールの対応する変化(../Modules/parsermoduleを最も可能性が高い必要があります.c)。 line 27

funcdef: 'def' NAME parameters ['->' test] ':' suite 

文法は、しかしdefの簡単な置換のために変更すべきではありませんが、STDLIBの全体のPythonコードは大きく変更に感動されます。


私はこのソースのtarballを使用して、それを自分自身をテストし、Grammarファイルに'createfunc''def'を交換しています。 はしかし、CPythonのコンパイル時に、このエラーが発生します

Fatal Python error: Py_Initialize: Unable to get the locale encoding 
    File "/udd/lbourneu/Documents/projects/cpython/Python-3.4.4/Lib/encodings /__init__.py", line 42 
    def normalize_encoding(encoding): 
        ^
SyntaxError: invalid syntax 

あなたはPythonコードのコンパイルを取得するために、新しいものに任意のdef声明を交換する必要があります。

注:find . -type f -name "*" -exec sed -i 's/def /createfunc /g' {} +を使用することは十分ではありません。

/usr/bin/mkdir -p Include 
python3.4 ./Parser/asdl_c.py -h Include ./Parser/Python.asdl 
    File "./Parser/asdl_c.py", line 14 
    createfunc get_c_type(name): 
        ^
SyntaxError: invalid syntax 

コマンドpython3.4 ./Parser/asdl_c.py -h Include ./Parser/Python.asdlthis commentは、問題を示しています。あなたは、Pythonをコンパイルするのpythonを必要とし、両方が同じソースコードを理解する必要があります。 linked articleによって導入されたトリックは、それを置き換える代わりにキーワードを追加することです。

後で、defキーワードが完全に新しいものに置き換えられた文法で、コンパイルに2番目のもの(defsubを両方とも理解する)を使用する第3のPythonをコンパイルできます。

関連する問題