我想制作一個 Lisp 解釋器,我只是在對其進行標記后努力翻譯它。所以在標記它之后,我的串列看起來像這樣。
tokenized = ["(", "car", "'","(", "20", "40", "60", ")", ")"]
我想要的是把它翻譯成看起來像這樣的東西
translated = [["CAR", "'", [20, 40, 60]]]
我需要一種在看到“(”時創建一個新串列并在看到“)”時關閉它的方法。如果我需要更好地解釋它,請告訴我,我不擅長解釋。
uj5u.com熱心網友回復:
好的,所以這就像一個遞回下降決議器。每次看到一個開括號時,它都會創建一個新的list,將其附加到輸出串列并向下遞回,但使用新串列。每次它看到一個右括號時,它都會回傳到之前的位置。遞回的基本情況是到達要決議的專案的末尾:
def rdp(items):
it = iter(items)
def inner(it, out):
while True:
token = next(it)
if token == '(':
nxt = []
out.append(nxt)
inner(it, nxt)
continue
elif token == ')':
return
out.append(token)
nxt = []
try:
inner(it, nxt)
except StopIteration:
pass
return nxt
tokenized = ["(", "car", "'","(", "20", "40", "60", ")", ")"]
translated = rdp(tokenized)
按要求輸出
注意:我剛剛編輯它以移動遞回函式的try:except:外部inner()以避免重復例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483176.html
標籤:Python python-3.x 口齿不清 口译员
上一篇:獲取機器人連接到的語音通道的ID
