Разобрать postgresql -pycparser.plyparser.ParseError before: pgwin32_signal_event - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужно проанализировать проект с открытым исходным кодом Postgresql, используя pycparser.

При синтаксическом анализе его исходного кода возникает следующая ошибка:

Traceback (most recent call last):
File "examples\using_cpp_libc.py", line 48, in <module>
getAllFiles(projectName)
File "examples\using_cpp_libc.py", line 29, in getAllFiles
ast = parse_file(dirName+'\\'+fname, use_cpp = True, cpp_path = 'cpp', 
cpp_args = [r'-nostdinc',r'-Iutils/fake_libc_include',r'- 
Iprojects/postgresql/src/include'])
File "G:\python\pycparser-master\pycparser\__init__.py", line 92, in 
parse_file
return parser.parse(text, filename)
File "G:\python\pycparser-master\pycparser\c_parser.py", line 152, in parse
debug=debuglevel)
File "G:\python\pycparser-master\pycparser\ply\yacc.py", line 334, in parse
return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)
File "G:\python\pycparser-master\pycparser\ply\yacc.py", line 1204, in 
parseopt_notrack
tok = call_errorfunc(self.errorfunc, errtoken, self)
File "G:\python\pycparser-master\pycparser\ply\yacc.py", line 193, in 
call_errorfunc
r = errorfunc(token)
File "G:\python\pycparser-master\pycparser\c_parser.py", line 1838, in 
p_error
column=self.clex.find_tok_column(p)))
File "G:\python\pycparser-master\pycparser\plyparser.py", line 67, in 
_parse_error
raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: 
projects/postgresql/src/include/pg_config_os.h:366:15: before: 
pgwin32_signal_event

Я использую postgresql-9.6.9, создайте его с помощью Visual Studio Express 2017 для Windows 10 (64-разрядная версия)

1 Ответ

0 голосов
/ 16 февраля 2019

Сообщение в блоге, которое вы цитировали в комментарии, является каноническим ресурсом. Парсинг больших проектов на Си не легок - у них есть свои причуды - поэтому требуется работа. Я сомневаюсь, что это разрешимо в рамках вопроса переполнения стека.

Вам нужно начать решать проблемы один за другим - например, взглянуть на pgwin32_signal_event токен в pg_config_os.h - почему его нельзя проанализировать? Может быть, его тип не разбирается? Это было определено? Может ли он быть добавлен в «фальшивый» заголовок и т. Д. К сожалению, нет простого способа сделать это, кроме как решить все проблемы один за другим.

Обязательно предварительно обработайте файл, который вы анализируете, выгрузив полную предварительно обработанную версию в один файл .c - это объединит все типы в один файл, с которым вы можете работать.

...