私はflex、byacc(字句および構文解析用)およびC ++を使用して言語のような小さなPythonを開発していますが、スコープ制御に関していくつか質問があります。
Pythonと同じように、インデントに空白(またはタブ)を使用しますが、それだけでなく、たとえば、別のwhileループ内にあるwhileループ内に「break2」と入力した場合のように、インデックスブレークを実装したいのですが、最後の1つですが、最初のループからも(したがって、ブレーク後の番号2)などです。
例:
while 1
while 1
break 2
'hello world'!! #will never reach this. "!!" outputs with a newline
end
'hello world again'!! #also will never reach this. again "!!" used for cout
end
#after break 2 it would jump right here
しかし、スコープがいつ終了するかを確認するための「アンチ」タブ文字がないため(たとえば、Cのように「}」文字を使用するだけです)、この方法が最適かどうか疑問に思いました。
externを使用してlexファイルでアクセスするyaccファイルに「inttabIndex」のようなグローバル変数を定義します。次に、lexファイルでタブ文字を見つけるたびにその変数を1ずつインクリメントします。yaccファイルを解析するときに「break」キーワードを見つけた場合は、tabIndex変数からその後に入力した量だけデクリメントします。コンパイル後にEOFに到達し、tabIndex!= 0を取得すると、コンパイルエラーが出力されます。
問題は、インデントが減少したかどうかを確認するための最良の方法は何ですか?lexから\ b(バックスペース)文字を読み取ってから、tabIndex変数を減少させる必要があります(ユーザーがbreakを使用しない場合)?
これを達成する別の方法は?
また、もう1つの小さな質問ですが、すべての実行可能ファイルにstart()という関数の開始点を持たせたいのですが、これをyaccファイルにハードコーディングする必要がありますか?
長い質問で申し訳ありませんが、どんな助けでも大歓迎です。また、誰かがpython用のyaccファイルを提供できる場合は、ガイドラインとして役立ちます(Googleで調べてみましたが、運がありませんでした)。
前もって感謝します。