Pycparser не удалось на комментарии

Когда я пытаюсь использовать pycparser для разбора файлов с комментариями я получил 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 в текущей версии не поддерживает комментарии в исходном коде, но этот ветвь разрешает это, или вы можете использовать рецепт из фрагмента Python вопроса, чтобы удалить комментарии C и C++, чтобы удалить комментарии из исходного кода.

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;}"))

1 ответ

Решение

Действительно, pycparser не анализирует комментарии или что-либо, связанное с препроцессором C (в обычном компиляторе C препроцессор отбирает комментарии до того, как компилятор их видит).

Чтобы комментарии не мешали вашему синтаксическому анализу, сначала запустите код через препроцессор, как предложено в pycparser README, К сожалению, для осмысленного анализа комментариев (и получения их содержимого) pycparser не является подходящим инструментом.

Другие вопросы по тегам