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

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

    В примере 9.10 приведён код метода, который анализирует слагаемое, состоящее из множителей.


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




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