Опубликован: 22.12.2005 | Уровень: для всех | Доступ: платный
Лекция 14:

Устройство интерпретатора языка Python

< Лекция 13 || Лекция 14: 12345678
Аннотация: В этой лекции сделана попытка пролить свет на внутреннее устройство интерпретатора Python. Для иллюстрации работы интерпретатора рассматриваются отладчик, профайлер и "дизассемблер".

Лексический анализ

Лексический анализатор языка программирования разбивает исходный текст программы (состоящий из одиночных символов) на лексемы - неделимые "слова" языка.

Основные категории лексем Python: идентификаторы и ключевые слова (NAME), литералы (STRING, NUMBER и т.п.), операции (OP), разделители, специальные лексемы для обозначения (изменения) отступов (INDENT, DEDENT) и концов строк (NEWLINE), а также комментарии (COMMENT). Лексический анализатор доступен через модуль tokenize, а определения кодов лексем содержатся в модуле token стандартной библиотеки Python. Следующий пример показывает лексический анализатор в действии:

import StringIO, token, tokenize

        prog_example = """
        for i in range(100): # comment
          if i % 1 == 0: \
          print ":", t**2
        """.strip()

        rl = StringIO.StringIO(prog_example).readline

        for t_type, t_str, (br,bc), (er,ec), logl in tokenize.generate_tokens(rl):
          print "%3i %10s : %20r" % (t_type, token.tok_name[t_type], t_str)

А вот что выведет эта программа, разбив на лексемы исходный код примера:

prog_example:

         1       NAME :                'for'
         1       NAME :                  'i'
         1       NAME :                 'in'
         1       NAME :              'range'
        50         OP :                  '('
         2     NUMBER :                '100'
        50         OP :                  ')'
        50         OP :                  ':'
        52    COMMENT :          '# comment'
         4    NEWLINE :                 '\n'
         5     INDENT :                 '  '
         1       NAME :                 'if'
         1       NAME :                  'i'
        50         OP :                  '%'
         2     NUMBER :                  '1'
        50         OP :                 '=='
         2     NUMBER :                  '0'
        50         OP :                  ':'
         1       NAME :              'print'
         3     STRING :                '":"'
        50         OP :                  ','
         1       NAME :                  't'
        50         OP :                 '**'
         2     NUMBER :                  '2'
         6     DEDENT :                   ''
         0  ENDMARKER :                   ''

Фактически получен поток лексем, который может использоваться для различных целей. Например, для синтаксического "окрашивания" кода на языке Python. Словарь token.tok_name позволяет получить мнемонические имена для типа лексемы по номеру.

< Лекция 13 || Лекция 14: 12345678
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Павел Ялганов
Павел Ялганов

Скажите экзамен тоже будет ввиде теста? или там будет какое то практическое интересное задание?

Максим Чиндясов
Максим Чиндясов
Россия, Нижний Новгород
Ольга Коваль
Ольга Коваль
Беларусь, Минск