2

私はPythonでコンパイラーを書いていますが、PLYでインデントを解析する方法がわからないため、手書きのレクサーを作成しました。また、私のレクサーは次のyieldようないくつかのステートメントを使用します。

def scan():
...
    for i in tokens:
        if i[0]: yield Token(self.line, i[0] if i[0] in keywords else "ident", i[0])
            elif i[1]:
                 if "e" in i[1]:
                     base, exp = i[1].split("e")
                     val = float(base) * 10 ** int(exp)
                 else: val = float(i[1])
                 yield Token(self.line, "float", val)
        ... other cases ...

ただし、PLYパーサーにはメソッドが必要であることに気付いたtokenので、次のようなメソッドを作成しました。

def token(self):
    return next(self.scan())

私のテストによると、実際のスキャンscan()には平均124ミリ秒かかりますが、PLYパーサーを使用すると、数分経っても解析が開始されません。私のtoken()方法には問題があるようです。

また、インターフェイスになるようscan()にメソッドの名前を変更しようとしました。Pythonは次のようなものを返します

AttributeError: 'generator' object has no attribute 'type'

したがって、PLYには一度に1つのトークンを返すメソッドが必要なようです。

token()の次の反復を返し、それほどscan()遅くならないようにメソッドを書き直す方法はありますか?

4

1 に答える 1

1

次のように、ジェネレータをどこかに保存する必要があります。

def start(...):
   self.lexer = self.scan()

def token(...):
    return next(self.lexer)

免責事項:私はPLYについて何も知りません。

于 2012-03-31T17:07:35.857 に答える