2013-05-30 5 views
4

Когда я пытаюсь использовать pycparser для разбора файлов с комментариями, которые я получил ParseErrorPycparser потерпел неудачу на комментарии

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 в текущей версии не поддерживает комментарии в исходном коде, но this fork позволяют это, или вы можете использовать рецепт из вопроса Python snippet to remove C and C++ comments, чтобы удалить комментарии из исходного кода.

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

ответ

6

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

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

Смежные вопросы