【问题标题】:Pycparser failed on commentsPycparser 评论失败
【发布时间】:2013-05-26 01:41:26
【问题描述】:

当我尝试使用 pycparser 来解析带有 cmets 的文件时,我得到了 ParseError

import pycparser
parser = pycparser.CParser()
parser.parse("int main(void){return 0;}")
parser.parse("/* comment */ int main(void){return 0;}")


Traceback (most recent call last):
File "test_pycparser.py", line 18, in <module> parser.parse("/* comment */ int main(void){return 0;}")
File "build\bdist.win32\egg\pycparser\c_parser.py", line 124, in parse
File "build\bdist.win32\egg\pycparser\ply\yacc.py", line 265, in parse
File "build\bdist.win32\egg\pycparser\ply\yacc.py", line 1047, in parseopt_notrack
File "build\bdist.win32\egg\pycparser\c_parser.py", line 1423, in p_error
File "build\bdist.win32\egg\pycparser\plyparser.py", line 54, in _parse_error
pycparser.plyparser.ParseError: :1:1: before: /

解决方案:当前版本的pycparser 不支持源代码中的cmets,但this fork 允许,或者您可以使用问题Python snippet to remove C and C++ comments 中的配方从源代码中删除cmets .

import pycparser
import re
def comment_remover(text):
    def replacer(match):
        s = match.group(0)
        if s.startswith('/'):
            return ""
        else:
            return s
    pattern = re.compile(
        r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
        re.DOTALL | re.MULTILINE
    )
    return re.sub(pattern, replacer, text)

parser = pycparser.CParser(keep_comment=True)
parser.parse("int main(void){return 0;}")
parser.parse("/* comment */ int main(void){return 0;}")
parser_2 = pycparser.CParser()
parser.parse(comment_remover("/* comment */ int main(void){return 0;}"))

【问题讨论】:

    标签: python c pycparser


    【解决方案1】:

    确实,pycparser 不解析 cmets 或与 C 预处理器相关的任何内容(在常规 C 编译器中,预处理器会在编译器看到 cmets 之前将其剥离)。

    要阻止 cmets 弄乱您的解析,请首先通过预处理器运行代码,如 pycparser README 中所建议的那样。不幸的是,要真正有意义地解析 cmets(并获取它们的内容),pycparser 不是正确的工具。

    【讨论】:

      猜你喜欢
      • 2011-09-28
      • 1970-01-01
      • 2013-06-07
      • 2012-08-22
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      相关资源
      最近更新 更多