prog_example = """ 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

prog_example = """

Поиск

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:

 

NAME :

'for'

NAME :

'i'

NAME :

'in'

NAME :

'range'

OP :

'('

NUMBER :

'100'

OP :

')'

OP :

':'

COMMENT :

'# comment'

NEWLINE :

'\n'

INDENT :

' '

NAME :

'if'

NAME :

'i'

OP :

'%'

NUMBER :

'1'

OP :

'=='

NUMBER :

'0'

OP :

':'

NAME :

'print'

STRING :

'":"'

OP :

','

NAME :

't'

OP :

'**'

NUMBER :

'2'

DEDENT :

''

ENDMARKER :

''


 

 


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

 

Синтаксический анализ

 

Вторая стадия преобразования исходного текста программы в байт-код интерпретатора состоит в синтаксическом анализе исходного текста.Модуль parser содержит функции suite() и expr() для построения деревьев синтаксического разбора соответственно для кода программ и выраженийPython.Модуль symbol содержит номера символов грамматикиPython,словарь для получения названия символа из грамматикиPython.

 

Следующая программа анализирует достаточно простой кодPython (prg)и порождает дерево синтаксического разбора(AST-объект),который тут же можно превращать в кортеж и красиво выводить функцией pprint.pprint().Далее определяется функция для превращения номеров символов в их мнемонические обозначения(имена)в грамматике:

 



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 49; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.146 (0.005 с.)