привет,
подскажите пожалуйста правильный способ (или близкий к оному) к разрешению следующей задачи:
необходимо программно сделать семантический анализ питоновского исходного кода на предмет поиска непроинициализированных переменных не прибегая к компиляции и анализу процесса выполнения байткода в рантайме (например с помощью 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