Язык программирования 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 позволяет получить мнемонические имена для типа лексемы по номеру.



Содержание раздела