Лексический анализ
Лексический анализатор языка программирования разбивает исходный текст программы (состоящий из одиночных символов) на лексемы — неделимые «слова» языка.
Основные категории лексем 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 : ' '
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 позволяет получить мнемонические имена для типа лексемы по номеру.
Больше книг — больше знаний!
Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ