スクリプト解析を見ていきます。†parsetok関数は長いです。エラー処理をばさっと削ると以下のような感じ。n;}パーサを作り、トーカナイザからトークンを取得して追加、終わりまで来たらループ終了、(エラーがなかったら)ノードができているのでそれを返すということをしています。ps;}DFAとあります。スクリプトからノードに変換するにはオートマトンを使っているようです。yaccを使っていないのはインデントが意味を持っているから?grammer、その実体は_PyParser_GrammarはPython/graminit.cに定義されています。DFAを表現したデータが格納されているだけなのでこれだけ見てもよくわかりません。graminit.c(とInclude/graminit.h)はParserにあるpgenを用いて生成されているようです。pgen自体の入力ファイルはGrammar/Grammarです。これを見るとPythonの文法が書かれています。†PyParser_AddTokenではトークンと現在の状態(どの文法要素を解析中か)からノードを構築しています。書いてある処理ははっきり言って難解です。普通のDFAの遷移処理に加え解析を高速化するための処理も入っているのでそれを理解して読まないと何が書いてあるかわかりません。いう場合はそもそも何の解析をしているのかを考え、実装の詳細はあまり気にしないほうがいいです。非終端記号の場合はpush終端記号に来たらshift受理状態のままの場合はpopしてスタックが空になったらOKという構文解析の基本が行われていると思っておけばよいです。pushでは現在のスタックトップのノードに子ノードを追加して追加した子ノードを次にノードが追加される場合の親ノードとしています。NCH(n)-1));}shiftではpushは行われないので現在のスタックトップにノードが追加されていくことになります。静的にコードを眺めるだけだとよくわからないので例によってノードを作ってみましょう。解析対象となるコードは以下。10]次のような感じになるはずです。NEWLINE長いわ!演算子の優先順位の都合でかなり深いノードになっています。†というわけでスクリプト解析まで来ました。シンプルなスクリプトなのにかなり深いノードになっています。Rubyの場合こんなに深くならなかったけど、yaccが演算子優先順位を処理してくれるからか。その代わり、Rubyではかっこ省略とかができる関係でparse.yの文法記述がノード作成処理込みで4000行以上になっていますね(2.3.0の場合)。慣れてるからRubyの方がよくない?と感じてますがたぶん構文解析処理的にはPythonの方がシンプルですね。ノードが深い問題はこの後を読んでいけば解決するのでしょう。