如何使用 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);
这个解析的结果应该是代码和注释树。
如何在不使用第三方库的情况下快速完成 ?
答案 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