Простой способ разобрать .h файл для комментариев, используя Python? - PullRequest
4 голосов
/ 30 марта 2009

Как легко разобрать файл .h , записанный в C для комментариев и имен сущностей с использованием Python ?

Мы предполагаем для дальнейшей записи содержимого в уже разработанный файл слов.

Исходные комментарии форматируются с использованием простых правил стиля тегов. Теги комментариев, используемые для простого отличия одного комментария объекта от другого и недокументированных комментариев. Комментарий может быть многострочным. Каждый комментарий остается прямо на определение сущности:

//ENUM My comment bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
//     could be multi-line. Bla bla bla bla bla bla bla bla bla.
enum my_enum
{
    //EITEM My enum item 1.
    //      Just could be multi-line too.
    MY_ENUM_ITEM_1,

    //EITEM My enum item 2
    MY_ENUM_ITEM_2,
};

//STRUCT My struct
struct my_struct {

    //MEMBER struct member 1
    int m_1_;
};

//FUNC my function 1 description.
//     Could be multi-line also.
//INPUT  arg1 - first argument
//RETURN pointer to an allocated my_struct instance.
my_struct* func_1(int arg1);

В результате этого анализа должно появиться дерево кодов и комментариев.

Как сделать это быстро и без использования сторонних библиотек ?

Ответы [ 3 ]

4 голосов
/ 30 марта 2009

Это уже сделано. Несколько раз.

Вот синтаксический анализатор языка Си, написанный на Python. Начните с этого.

http://wiki.python.org/moin/SeeGramWrap

Другие парсеры.

http://wiki.python.org/moin/LanguageParsing

http://nedbatchelder.com/text/python-parsers.html

Вероятно, вы могли бы скачать любую грамматику ANSI C Yacc и без особых проблем переработать ее в формат PLY и использовать ее в качестве отправной точки.

3 голосов
/ 30 марта 2009

Вот быстрое и грязное решение. Он не будет обрабатывать комментарии в строках, но так как это только для заголовочных файлов, это не должно быть проблемой.

S_CODE,S_INLINE,S_MULTLINE = range (3)
f = open (sys.argv[1])
state = S_CODE
comments = ''
i = iter (lambda: f.read (1), '')
while True:
    try:
        c = i.next ()
    except StopIteration:
        break
    if state == S_CODE:
        if c == '/':
            c = i.next ()
            if c == '*':
                state = S_MULTLINE
            elif c == '/':
                state = S_INLINE
    elif state == S_INLINE:
        comments += c
        if c == '\n':
            state == S_CODE
    elif state == S_MULTLINE:
        if c == '*':
            c = i.next ()
            if c == '/':
                comments += '\n'
                state = S_CODE
            else:
                comments += '*%s' % c
        else:
            comments += c
print comments
1 голос
/ 30 марта 2009

Возможно шлекс модуль подойдет?

Если нет, есть несколько более мощных альтернатив: http://wiki.python.org/moin/LanguageParsing

...