任何人都可以指向我到一个程序,条关串从C源代码?例

#include <stdio.h>
static const char *place = "world";
char * multiline_str = "one \
two \
three\n";
int main(int argc, char *argv[])
{
        printf("Hello %s\n", place);
        printf("The previous line says \"Hello %s\"\n", place);
        return 0;
}

变得

#include <stdio.h>
static const char *place = ;
char * multiline_str = ;
int main(int argc, char *argv[])
{
        printf(, place);
        printf(, place);
        return 0;
}

什么我找的是一个程序非常喜欢 stripcmt 只有我想带串并不意见。

原因我要寻找一个已经制定的程序而不仅仅是一些有用的经常表达的是 因为当你开始考虑所有情况(报价内串,多行串等) 事情通常可以(多少)复杂得多,它第一次出现。和 有的限制在什么分辨率可以实现的,我怀疑它是不可能的为这项任务。如果你认为你有一个 非常 稳健的经常表达随时提交,但是请不天真 sed 's/"[^"]*"//g' 喜欢的建议。

(不需要特殊处理的(可能是联合国不限成员)串的内部意见,这些将被删除第一次)

支持多行串的嵌入内容的行为不重要的(不合法的C),但是串跨越多条线结束\结束时必须得到支持。

这几乎是一样的 一些 其他的 的问题, 但我发现没有参考任何工具。

有帮助吗?

解决方案

可以下载源代码以StripCmt (名为.tar.gz - 5kB的)。这是平凡小,不应该太难以适应条纹字符串,而不是(这是公布根据GPL )。

您可能还需要探讨C字符串的官方词汇语言规则。我发现的速度非常快,但它可能不明确指示。它的字符串定义为:

stringcon ::= "{ch}", where ch denotes any printable ASCII character (as specified by isprint()) other than " (double quotes) and the newline character.

其他提示

所有这些令牌在C(和大多数其他的编程语言)是"定期".也就是说,他们可以配合的一个经常的表达。

一个定期表达对C strings:

"([^"\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))*"

Regex是不是太难以理解。基本上一字符串是一对双报价周围堆:

  • 非特殊的(非报价/反斜杠/newline)人物
  • 逃跑,开始与反斜杠,然后由一个:
    • 一个简单逃脱字
    • 1至3个八位数字
    • x和1个或多个六位数字

这是基于部分6.1.4和6.1.3.4的C89/C90规范。如果其他什么蹑手蹑脚在C99,这不会赶上,但是,这不应该很难解决。

这里是蟒蛇剧本过滤C源文件中删除的字符串:

import re, sys
regex = re.compile(r'''"([^"\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))*"''')
for line in sys.stdin:
  print regex.sub('', line.rstrip('\n'))

编辑:

它发生在我之后,我发表上述,虽然它是真实的,所有C的标记规则,通过不切分的一切我们已经有了一个机会麻烦。特别是,如果双引号显示在什么应该是另一个令我们可以领导下花园的道路。你提到的意见已经被剥夺了,因此只有其他的事我们真的需要担心的是角文字(虽然这种方法Im要使用可以很容易地扩展,以处理的评论)。这里有一个更强大的脚本字处理文字的:

import re, sys
str_re = r'''"([^"\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))*"'''
chr_re = r"""'([^'\\\n]|\\(['"?\\abfnrtv]|[0-7]{1,3}|x[0-9a-fA-F]+))'"""

regex = re.compile('|'.join([str_re, chr_re]))

def repl(m):
  m = m.group(0)
  if m.startswith("'"):
    return m
  else:
    return ''
for line in sys.stdin:
  print regex.sub(repl, line.rstrip('\n'))

基本上我们发现串和文字文本标记,然后离开char文字的单独但是剥离出来串的文本。Char文字regex是非常相似的字符串中的一个。

在红宝石:

#!/usr/bin/ruby
f=open(ARGV[0],"r")
s=f.read
puts(s.gsub(/"(\\(.|\n)|[^\\"\n])*"/,""))
f.close

打印到标准输出

在使用Python pyparsing:

from pyparsing import dblQuotedString

source = open(filename).read()
dblQuotedString.setParseAction(lambda : "")
print dblQuotedString.transformString(source)

同时打印到stdout。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top