Найти - Пользователи
Полная версия: семантический анализ кода
Начало » Python для экспертов » семантический анализ кода
1
gits
привет,

подскажите пожалуйста правильный способ (или близкий к оному) к разрешению следующей задачи:
необходимо программно сделать семантический анализ питоновского исходного кода на предмет поиска непроинициализированных переменных не прибегая к компиляции и анализу процесса выполнения байткода в рантайме (например с помощью 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
Андрей Светлов
tokenize должно быть маловато. Я бы скорее искал решение в анализе ast.
Делайте ast.parse и ходите по дереву.
gits
Андрей Светлов
tokenize должно быть маловато. Я бы скорее искал решение в анализе ast.
Делайте ast.parse и ходите по дереву.
спасибо, судя по всему это действительно то что мне было нужно =)
Андрей Светлов
Если будет не лень — расскажите о результате. Сам никогда не использовал — читал лишь код проектов, которые бегали по AST.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB