使用Python解析.h文件以便评论的简单方法?

时间:2009-03-30 16:27:45

标签: python parsing lexer

如何使用 Python C 评论和实体名称编写的 .h 文件轻松解析>

我们假设将内容进一步写入已经开发的word文件中。

源注释使用简单的标记样式规则进行格式化。 注释标签用于轻松区分一个实体注释与其他非文档注释。 评论可以是多行形式。每条评论都直接依据实体定义:

//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 个答案:

答案 0 :(得分:4)

这已经完成了。好几次。

这是用Python编写的C语言的解析器。从这开始。

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

其他解析器。

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

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

您可以下载任何ANSI C Yacc语法并将其重新编写为PLY格式而不会有太多麻烦,并将其作为起点。

答案 1 :(得分:3)

这是一个快速而肮脏的解决方案。它不会处理字符串中的注释,但因为这只适用于不应成为问题的头文件。

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

答案 2 :(得分:1)

也许shlex module会这样做?

如果没有,还有一些更强大的选择: http://wiki.python.org/moin/LanguageParsing