【问题标题】:C file splitting in Python?Python中的C文件拆分?
【发布时间】:2011-08-07 16:56:28
【问题描述】:

我正在写关于 C 文件的论文。我需要拆分一个 C 标头来操纵然后组成它的单打词。我必须按所有这些字符分割行:

  1. 空格和制表符
  2. 新行;\n
  3. 单行 cmets 和多行 cmets // /* */
  4. 指针*
  5. 数组括号[][dimension]

所以,例如,如果我有这几行:

/* This is a
   multiline comment.
*/

typedef int rocket;

// This is a single line comment.
typedef double* pi[10];

split 函数应该返回一个列表(或其他所有内容),如下所示:

["/*","This","is","a","\n","multiline","comment.","\n","*/","\n","\n","typedef","int","rocket",";","\n","\n","//","This","is","a","single","line","comment.","\n","typedef","double","*","pi","[10]",";"]

这应该在 Python 中完成!

我试过这个,但我对正则表达式的了解很少,这表明我找到了一个可怕的解决方案! :)

谢谢, 达里奥。

【问题讨论】:

  • 你可以得到一个 C 语法解析器...
  • 那不掉cmets,空行吗?
  • @yi_H:这取决于解析器。我已经在 Delphi 中编写了一个简单的 C 解析器(不是几乎完整,但对我的目的来说已经足够好了),它可以保留 cmets,甚至在正确的位置很好地格式化它们,从而转换为 Delphi。大多数 C 和 C++ 编译器附带的 预处理器 可能会删除 cmets。
  • 您可能需要重新提出您的问题。现在,这听起来像是“请发送论文”。
  • Ops...如果这听起来像是一个 DoTheWorkForMe 问题,我很抱歉!这不是我的论文的要求,而是我希望它像解决这个特定问题的简单请求。我是第一个想做自己的工作的人! :)

标签: python c string header split


【解决方案1】:

也许你应该考虑玩弄pycparser。 (在不知道你实际在做什么的情况下,我真的不能说更多,抱歉)

【讨论】:

  • 我会看看pycparser,它看起来很有趣!谢谢。
【解决方案2】:

您拥有为您想要的工作完成的语法解析器。您可以在此处找到它们的列表: http://wiki.python.org/moin/LanguageParsing 它会让你的生活更轻松。

【讨论】:

  • 我终于找到了使用ModGrammar的解决方案!谢谢你,也感谢所有回答这个问题的人!
【解决方案3】:

你可以使用re.split得到你想要的:

c_code = """
/* This is a
   multiline comment.
*/

typedef int rocket;

// This is a single line comment.
typedef double* pi[10];
"""

import re

def split_c(c_code):
    tok_re = r"(\n)|\s|(;|/\*|//|\*/|\*|\[\d*\])"
    return [t for t in re.split(tok_re, c_code) if t]

print split_c(c_code)

这会产生:

['\n', '/*', 'This', 'is', 'a', '\n', 'multiline', 'comment.', '\n', '*/', 
'\n', '\n', 'typedef', 'int', 'rocket', ';', '\n', '\n', 
'//', 'This', 'is', 'a', 'single', 'line', 'comment.', '\n', 
'typedef', 'double', '*', 'pi', '[10]', ';', '\n']

请注意,随着您的需求变得越来越复杂(例如,我担心 [10] 示例确实需要变得更加复杂),这种技术可能需要完全替换。

【讨论】:

  • 对于pi[ 10],可预见地失败了。当然你也可以解决这个问题,然后继续直到你涵盖了整个 c 标准(在这种情况下甚至可能),但实际上这就是解析器的用途..
  • 同样值得深思,请注意pi[ /* yep that's allowed */ 10] 是完全有效的 C 代码 - 使用正则表达式来获得乐趣。
  • 是的,没错,这就是我的意思,这种技术需要被替换。
  • 我应该换一种说法:@Dario:真的很可能你需要一种更好的方法来提取你的 C 文件。
  • @Ned:我明白你在说什么,你的意思是 Lex/Yacc 方式。但是我使用 C 关键字作为自动机的输入,在状态之间切换。而且我认为使用我自己制作的解析器而不是已经存在的解析器更简单。
猜你喜欢
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多