4

如何使用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);

此解析的结果应该是代码和注释树。

如何在不使用第三方库的情况下快速完成?

4

3 回答 3

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 格式,而不会有太多麻烦,并将其用作起点。

于 2009-03-30T16:41:01.613 回答
3

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

S_CODE,S_INLINE,S_MULTLINE = 范围 (3)
f = 打开 (sys.argv[1])
状态 = S_CODE
评论 = ''
i = iter (lambda: f.read (1), '')
而真:
    尝试:
        c = i.next ()
    除了停止迭代:
        休息
    如果状态 == S_CODE:
        如果 c == '/':
            c = i.next ()
            如果 c == '*':
                状态 = S_MULTLINE
            elif c == '/':
                状态 = S_INLINE
    elif 状态 == S_INLINE:
        评论 += c
        如果 c == '\n':
            状态 == S_CODE
    elif 状态 == S_MULTLINE:
        如果 c == '*':
            c = i.next ()
            如果 c == '/':
                评论 += '\n'
                状态 = S_CODE
            别的:
                评论 += '*%s' % c
        别的:
            评论 += c
打印评论
于 2009-03-30T17:10:54.833 回答
1

也许shlex 模块会做?

如果没有,还有一些更强大的替代方案: http ://wiki.python.org/moin/LanguageParsing

于 2009-03-30T16:34:05.857 回答