5

Python に似た独自の組み込み言語を使用してツールを作成しています。構文でインデントを意味のあるものにしたい (行頭のタブとスペースがコマンドのネストを表すようにするため)。

これを行う最善の方法は何ですか?

私は以前に再帰降下と有限オートマトンのパーサーを書いたことがあります。

4

3 に答える 3

5

現在のCPythonのパーサーは、ASDLと呼ばれるものを使用して生成されているようです。

要求しているインデントに関しては、andと呼ばれる特別なレクサートークンを使用して行われます。これを複製するには、これらのトークンをレクサーに実装し(スタックを使用して前のインデントされた行の開始列を格納する場合は非常に簡単です)、通常どおりに文法にプラグインします(他のキーワードや演算子トークンと同様)。 。INDENTDEDENT

于 2013-03-20T19:24:56.093 に答える
0

Pythonコンパイラ、特にをチェックしてくださいcompiler.parse

于 2013-03-20T19:16:10.950 に答える
0

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

また、このWebサイト(http://erezsh.wordpress.com/2008/07/12/python-parsing-1-lexing/)には、特に次のような詳細情報があります。

PythonのインデントはDFAでは解決できません。(文脈自由文法で解決できるかどうか、私はまだ困惑しています)。

PyPyは、Pythonの字句解析に関する興味深い投稿を作成しました(字句解析出力を後処理することで解決する予定です)

CPythonのトークナイザーはCで記述されています。アドホックで、手書きで、複雑です。これは、私が知っているPython字句解析の唯一の公式実装です。

于 2013-03-20T19:16:36.680 に答える