私は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()
遅くならないようにメソッドを書き直す方法はありますか?