2013-03-20 5 views
5

私はPythonに似た独自の組み込み言語を使ってツールを書いています。私はシンタックスでインデントを意味のあるものにしたい(行頭のタブとスペースがコマンドのネストを表すように)。Python風の字下げ文法で言語を書くには?

これを行うにはどのような方法が最適ですか?

これまでに、再帰的降下および有限オートマトンパーサーを作成しました。

+0

この質問のタイトルを変更することをお勧めします。リストページから誤解を招くことがあります。おそらく、「オフサイドルール」 – forivall

+0

@forivall doneに言及してください! :) –

+1

現在のタイトルはどうですか?私はそれがはるかに良いと思う! :) – ulidtko

答えて

5

ASDLと呼ばれるものを使用して生成された電流CPythonのパーサseems to be。特殊なレクサーを使用して、あなたが求めているのインデントについて

it's doneINDENTDEDENTトークンと呼ばれます。これを複製するには、レクサーにこれらのトークンを実装するだけです(以前のインデントされた行の開始列を格納するためにスタックを使用するとかなり簡単です)。そして、通常のように(他のキーワードや演算子トークンと同様に) 。

+0

それはいいです...しかし、私はそれを自分で書く正しい技法を決定したいと思っています。 –

+0

@oleg、私が上にリンクしたpythonのドキュメントを見てください。彼らは2つの特別なトークン、インデントとデデンツを使用します。 – ulidtko

+0

hm ...それは意味をなさない。私の悪い私はそれを最初に考えなかった:) –

0

python compiler、特にcompiler.parseを参照してください。

+0

はそうではありませんPythonについて...それはPythonの構文についてです。それはちょうどそれに似ています。コマンドはPythonではありません。人間が読める言語です... –

0

私は任意のレクサー/パーサー世代(http://www.antlr.org)のANTLRをお勧めします。

また、このウェブサイト(http://erezsh.wordpress.com/2008/07/12/python-parsing-1-lexing/)は、特に、いくつかのより多くの情報を持っています

Pythonのインデントは、DFAで解決することはできません。 (文脈自由文法でも解くことができるのかどうかまだ分かりません)。

PyPyは

はCPythonのトークナイザはC.それのアドホック、手書き、および 複雑で書かれている(彼らは後処理レクサーの出力を使用してそれを解決しようとする)字句のPythonについての興味深い記事を制作しました。私が知っているのは というPythonのレキシングの公式実装です。

+1

私はC言語の単純な実装のためのパーサを書いていましたが、再帰的な降下パーサーでした。私は複雑な複雑さは必要ありません。それは約30のコマンドです。 –

関連する問題