Шаг 149.
Рекурсия на Python. Взаимная рекурсия. Грамматики и синтаксический анализатор ... . Синтаксический анализатор. Функция inverted_term()

    На этом шаге мы приведем текст этой функции и прокомментируем его.

    В примере 9.11 приведён код, анализирующий "перевёрнутое" слагаемое.


Пример 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().




Предыдущий шаг Содержание Следующий шаг