На этом шаге мы приведем текст этой функции и прокомментируем его.
В примере 9.11 приведён код, анализирующий "перевёрнутое" слагаемое.
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 inverted_term(tokens): if tokens == [] or tokens[0] != '(': raise SyntaxError('Syntax error') else: par_counter = 1 n = len(tokens) i = 1 while i < n and par_counter > 0: if tokens[i] == '(': par_counter = par_counter + 1 if tokens[i] == ')': par_counter = par_counter - 1 i = i + 1 if i == n: return parenthesized_expression(tokens) else: p = parenthesized_expression(tokens[0:i]) t = term(tokens[i + 1:]) if tokens[i] == '*': return p * t else: return p / t |
Поскольку оно всегда начинается с открывающей круглой скобки '(', то в случае её отсутствия функция выдаст сообщение о синтаксической ошибке. В противном случае функция в цикле ищет индекс (i) операции, которая следует непосредственно за закрывающей скобкой, соответствующей открывающей. Если i оказалась равной длине входного списка лексем, то всё слагаемое целиком - это выражение в скобках. Следовательно, функция должна вернуть результат вызова метода parenthesized_expression() со всем входным списком (строка 17). Иначе функция вычисляет выражение в первых круглых скобках (строка 19) и слагаемое из множителей до и после лексемы-операции с индексом i (строка 20), а затем применяет к ним эту операцию.
На следующем шаге мы рассмотрим функцию factor().