На этом шаге мы приведем текст этой функции и прокомментируем его.
В примере 9.10 приведён код метода, который анализирует слагаемое, состоящее из множителей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
def term(tokens): if tokens == []: raise SyntaxError('Syntax error') else: par_counter = 0 i = len(tokens) - 1 while i > 0 and ((tokens[i] != '*' and tokens[i] != '/') or par_counter > 0): if tokens[i] == ')': par_counter = par_counter + 1 if tokens[i] == '(': par_counter = par_counter - 1 i = i - 1 if i == 0: return factor(tokens) else: t = term(tokens[0:i]) f = factor(tokens[i + 1:]) if tokens[i] == '*': return t * f else: return t / f |
Он очень похож на код примера 9.9 тем, что в нём операции '*' и '/' играют ту же роль, что операции '+' и '-' в функции expression(). Цикл while ищет индекс лексемы-операции над множителями вне круглых скобок. Если этот индекс i = 0, слагаемое не содержит лексемы-операции.
Следовательно, оно может быть простым множителем (F), и функция должна вызвать метод factor() со всем входным списком лексем (строка 17). В противном случае алгоритм выполнит бинарную операцию token[i] ('*' или '/') над значениями её левого и правого операндов - слагаемого (t) и множителя (f) соответственно.
На следующем шаге мы рассмотрим функцию inverted_term().