Уведомления

Группа в Telegram: @pythonsu

#1 Июль 6, 2011 17:11:16

gits
От:
Зарегистрирован: 2011-07-06
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

семантический анализ кода

привет,

подскажите пожалуйста правильный способ (или близкий к оному) к разрешению следующей задачи:
необходимо программно сделать семантический анализ питоновского исходного кода на предмет поиска непроинициализированных переменных не прибегая к компиляции и анализу процесса выполнения байткода в рантайме (например с помощью virtualenv).

Как я сейчас себе представляю, решение должно проходить в три этапа:

1. разделение всего кода на чанки согласно областям видимости
2. построение списка видимых имен для каждого из чанков, начиная с самого верхнего, рекурсивно спускаясь во вложенные
3. анализ каждого чанка по подготовленному списку доступных для использования в нем имен на предмет поиска непроинициализированных переменных.

я предполагал что на каждом этапе мне поможет tokenize(для выявления определения новой области видимости, определения переменных и проч.) но либо я что-то неправильно понимаю, либо то дерево которое он строит не обладает достаточной информацией к решению поставленной задачи.

например для сорца вида:
def test(arg):
a = 5
b = 6

будет получен такой оутпут после tokenize.tokenize()

5 INDENT -
1 NAME - def
1 NAME - test
53 OP - (
1 NAME - arg
53 OP - )
53 OP - :
4 NEWLINE -

5 INDENT -
1 NAME - a
53 OP - =
2 NUMBER - 5
4 NEWLINE -

1 NAME - b
53 OP - =
2 NUMBER - 6
4 NEWLINE -

где цифра - код терма, далее символьное обозначение терма и само значение терма. Из этого видно что и зарезервированное слово def и название функции и название переменных относится к одному тому же семейству термов NAME - что никак не помогает определить кто из них кто, и в случае разделения исходника на области видимости и в случае поиска в каждой области имен переменных.. вообщем я в замешательстве полном.

Если есть любые идеи буду признателен весьма. python 3.2



Отредактировано (Июль 6, 2011 17:31:17)

Офлайн

#2 Июль 6, 2011 19:26:12

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

семантический анализ кода

tokenize должно быть маловато. Я бы скорее искал решение в анализе ast.
Делайте ast.parse и ходите по дереву.



Офлайн

#3 Июль 6, 2011 21:30:35

gits
От:
Зарегистрирован: 2011-07-06
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

семантический анализ кода

Андрей Светлов
tokenize должно быть маловато. Я бы скорее искал решение в анализе ast.
Делайте ast.parse и ходите по дереву.
спасибо, судя по всему это действительно то что мне было нужно =)



Офлайн

#4 Июль 6, 2011 22:25:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

семантический анализ кода

Если будет не лень — расскажите о результате. Сам никогда не использовал — читал лишь код проектов, которые бегали по AST.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version