6

私は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で調べてみましたが、運がありませんでした)。

前もって感謝します。

4

2 に答える 2

8

私は現在、これにかなり似たプログラミング言語を実装しています(奇妙なことにマルチレベルブレークを含む)。私の解決策は、トークナイザーにインデントに基づいてインデントトークンとディデントトークンを発行させることでした。例えば:

while 1: # colons help :)
    print('foo')
    break 1

になります:

["while", "1", ":",
    indent,
    "print", "(", "'foo'", ")",
    "break", "1",
    dedent]

ただし、トークナイザーによる'\n'の処理はやや複雑になります。また、トークナイザーとパーサーを最初から作成したので、これがlexとyaccで実行可能かどうかはわかりません。

編集:

半実用的な擬似コードの例:

level = 0
levels = []
for c = getc():
    if c=='\n':
        emit('\n')
        n = 0
        while (c=getc())==' ':
            n += 1
        if n > level:
            emit(indent)
            push(levels,n)
        while n < level:
            emit(dedent)
            level = pop(levels)
            if level < n:
                error tokenize
        # fall through
    emit(c) #lazy example
于 2010-04-30T03:42:22.197 に答える
3

非常に興味深い運動。endキーワードを 使用して、スコープがいつ終了するかを確認できませんか?

別の言い方をすれば、ネストされた複数のループから一度に抜け出すことができる言語を見たことがありません。それには正当な理由があるかもしれません...

于 2010-04-30T03:05:48.640 に答える