Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在读取文件时避免使用C样式的注释_Python - Fatal编程技术网

Python 在读取文件时避免使用C样式的注释

Python 在读取文件时避免使用C样式的注释,python,Python,我正在使用python解析函数中LOC的C文件。 我从函数定义的第一行开始,跳过所有行,直到遇到第一个{ 问题是{也可以作为评论的一部分。我只想跳过所有{出现在评论中的内容 e、 g 实现这一点的最佳pythonic方法是什么。如果没有真正的lexer和parser,你会发现要正确实现这一点是非常困难的 这将找到您要查找的开口支撑: f = open("myfile.c") for l in f.readlines(): l = l.split('//')[0] if '{' i

我正在使用python解析函数中LOC的C文件。 我从函数定义的第一行开始,跳过所有行,直到遇到第一个{

问题是{也可以作为评论的一部分。我只想跳过所有{出现在评论中的内容

e、 g


实现这一点的最佳pythonic方法是什么。

如果没有真正的lexer和parser,你会发现要正确实现这一点是非常困难的

这将找到您要查找的开口支撑:

f = open("myfile.c")
for l in f.readlines():
    l = l.split('//')[0]
    if '{' in l:
        break

但是,例如,在字符串文本中可以有双斜杠,等等。

您会发现,如果没有真正的词法分析器和解析器,要正确处理这个问题是非常困难的

这将找到您要查找的开口支撑:

f = open("myfile.c")
for l in f.readlines():
    l = l.split('//')[0]
    if '{' in l:
        break

但是,例如,您可以在字符串文本中使用双斜杠等。

如果您有gcc,您可以使用gcc-E input\u文件作为预处理器,它将删除注释,但也扩展宏-可能会更改LOC。例如,输出将是:

# 1 "_.c" # 1 "" # 1 "" # 1 "_.c" int func( int i, float f, char c ) {
如果您有gcc,您可以使用gcc-E input_文件作为预处理器,它将去除注释,但也会扩展宏-可能会更改LOC。对于您的示例,输出将是:

# 1 "_.c" # 1 "" # 1 "" # 1 "_.c" int func( int i, float f, char c ) {
下面是一个注释剥离器,它还应该理解引用字符串中的注释介绍人:

from pyparsing import cppStyleComment,dblQuotedString

cppStyleComment.ignore(dblQuotedString)
src = cppStyleComment.suppress().transformString(src)

print src
将原始代码段作为src打印:

int func(
             int i, 
             float f,
             char c 
             )
    {

您可以在内存中完成所有这些操作,因此不必首先创建无注释的文件。

这里有一个注释剥离器,它还可以理解引用字符串中的注释介绍人:

from pyparsing import cppStyleComment,dblQuotedString

cppStyleComment.ignore(dblQuotedString)
src = cppStyleComment.suppress().transformString(src)

print src
将原始代码段作为src打印:

int func(
             int i, 
             float f,
             char c 
             )
    {

您可以在内存中完成所有这些操作,因此不必首先创建无注释文件。

+1对于真正的lexer和parser。这里有很多您忽略的复杂性。对于包含/*?的字符串文字,如何处理以//*?开头的行,或者对于真正的lexer和parser,如何处理以/*?+1开头的行。您需要考虑的复杂性很多e忽略这里。包含/*?的字符串文字如何?以/*?或以//*?开头的行如何?这会改变LOC计数。这会改变LOC计数。