我正在創建一個簡單的后裔運算式評估器,可以使用Python Cookbook評估簡單的數學運算式。(e. g (2 3) * 7)
但是,我一直得到這樣的錯誤:
Traceback (most recent call last):
檔案"...",行111,in<module>。
print(evaluationator.parse("2"))
檔案 "...", 行 43, in parse
self._advance() # Load first lookahead token[/span
檔案 "...", 行 48, in _advance
self.tok, self.nexttok = self.nexttok, next(self.tok, None)
型別錯誤。'NoneType' object is not an iterator
我的符號:
NUM = r"(?P< NUM>d )"
ADD = r"(?P< ADD> )"
SUB = r"(?P< SUB>-)"
MUL = r"(?P< MUL>*)"
TRUEDIV = r"(?P<TRUEDIV>/)"
LEFTPAR = r"(?P<LEFTPAR> ()"
RIGHTPAR = r"(?P<RIGHTPAR>) )"
WS = r"(?P<WS>s )"
master_pat = re.compile("|"/span>.join([NUM, ADD, SUB, MUL, TRUEDIV,
leftpar, rightpar, ws]))
Token = namedtuple("Token"/span>, ["type"/span>, "value"] )
def generate_tokens(text)。
scanner = master_pat.scanner(text)
for match in iter(scanner.match, None):
tok = Token(match.lastgroup, match.group())
if tok.type != "WS":
yield tok.
我的評估器:
class Evaluator。
def parse(self, text)。
self.tokens = generate_tokens(text)
self.tok = None # Last symbol coveredNone # 下一個符號被標記。
self._advance() # Load first lookahead token[/span
return self.expr()
def _advance(self):
""前進一個標記。""
self.tok, self.nexttok = self.nexttok, next(self.tok, None)
def _accept(self, toktype):
""測驗并消耗下一個令牌,如果它與toktype匹配。""。
if self.nexttok and self.nexttok.type == toktype。
自身._advance()
return True
else:
return False:
def _expect(self, toktype):
""Consume next token if it matches toktype or raise SyntaxError""
if not self._accept(toktype)。
raise SyntaxError("invalid syntax"/span>)
# Grammer rules[/span]。
def expr(self)。
""運算式::= term { (' '|'-') term }*""
exprval = self.term()
while self._accept("ADD") or self._accept("Sub") 。
op = self.tok.type。
right = self.term()
if op == "add":
exprval = right
elif op == "sub":
解釋
return exprval
def term(self)。
""因子::=NUM | ( expr )"".
termval = self.factor()
while self._accept("MUL") or self._accept("TRUEDIV") 。
op = self.tok.type: "op"。
right = self.factor()
if op == "MUL"/span>:
termval *= right
elif op == "TRUEDIV":
termval /= right
return termval
def factor(self)。
""factor ::= NUM | ( expr )""。
if self._accept("NUM"/span>)。
return int(self.tok.value)
elif self._accept("LEFTPAR")。
exprval = self.expr()
self._expect("RIGHTPAR")
return exprval
else:
raise SyntaxError("無效的語法")
然而,當我試圖決議anything時,我得到了上述的錯誤。 我怎樣才能做出一個真正有效的遞回遞回決議器呢?
uj5u.com熱心網友回復:
這里的問題是,目前,self.tok從未被設定為除None以外的任何東西,因此出現錯誤。只要將self.tok改為sel.tokens就可以解決這個問題。
def _advance(self)。
""向前推進一個標記。""
self.tok, self.nexttok = self.nexttok, next(self.tokens, None)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314846.html
標籤:
