2012-02-26 9 views
0

私はインタープリタをプロジェクトとして設計しています。受け入れられるプログラムは、0個以上の宣言の後に0個以上のステートメントが続きます。私はこれらの可能性の両方を扱うために異なる(再帰的)手続きを呼び出します。それぞれの手続きは、完了時にTrueを、エラー時にFalseを返します。Pythonがインタプリタとして入力を解析しています

宣言は、宣言が常に非終端型の「型」で始まります(それ自体はTrueのFalseを返す別のプロシージャです)。

私の質問は次のとおりです。私は両方のエラーと、入力ファイルの先頭の宣言が終了したかどうかをチェックする必要があります。以下は、宣言と文をチェックするトップ層から抜粋されて:あなたは再帰的にこれらの関数呼び出しを下って、あなたは最終的にあなたのコードがあるかどうかに基づいて、TrueまたはFalse

while self.declaration(): 
    #Do stuff 
while self.statement(): 
    #Do stuff 

返されます任意のエラー。しかし、同時に、declaration()ループからstatement()ループに移動する宣言がなくなったときにチェックできるようにする必要があります。

つまり、最初のループでは、エラーが発生したときと宣言が完了したときの両方でコードがFalseを返します。これをどうやって解決するのですか?

注:どちらの関数も、プログラム内でインデックス(コードから個々のキーワードを抽出する)を移動するため、「タイプ」が次にあるかどうかを判断するために余分なチェックを呼び出すことはできません。

パーサーが始まり、コード内の宣言の数を数える前に(そのインデックスを使用して)先読みしてから、私が検出した宣言の数を宣言()してください。誰もがより良い解決策を考えることができますか?ご協力いただきありがとうございます。

ここで法的コードのサンプル(変数は便利なものを含んでいるでしょうかどうかを無視)です:

if (foo < 3) { 
    array int [ 3 ] a ? #Declaration 
} 
int c ?     #Declaration 

ポイントビーイング、任意の宣言:ここで不正なコードのサンプルが

int c ?     #Declaration 
if (foo < 3) { 
    a is 7 ? 
} 

です受け入れられたプログラムで行われるものは、他のすべてのステートメントに先行する必要があります。

+0

おそらく、宣言とステートメントの両方を含むあなたの言語のサンプルを投稿することができますか? –

答えて

0

私がやり遂げたのは、エラー時に終了し、Falseを再帰ツリーの不正なパスとしてカウントすることでした。それはかなり簡単で驚くほど正確でした。

関連する問題