pycparser.plyparser.ParseError в сложной структуре

Я пытаюсь использовать pycparser для анализа этого кода C:

https://github.com/nbeaver/mx-trunk/blob/0b80678773582babcd56fe959d5cfbb776cc0004/libMx/d_adsc_two_theta.c

Репо с минимальным примером и Makefile находится здесь:

https://github.com/nbeaver/pycparser-problem

Использование pycparser v2.14 (из pip) и gcc 4.9.2 на Debian Jessie.

Что я пробовал:

  • Передайте флаг -nostdinc gcc, включая папку fake_libc_include.
  • Используйте -D'__attribute__(x)=' для удаления расширений GCC
  • Используйте поддельные заголовки, например. <sys/param.h>
  • Используйте -std=c99, если код не совместим с C99.
  • Воспроизведите пример Redis на случай, если что-то странное с моей машиной.

Вот как выглядит трассировка:

Traceback (most recent call last):
  File "just_parse.py", line 21, in <module>
    parse(path)
  File "just_parse.py", line 9, in parse
    ast = pycparser.parse_file(filename)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/__init__.py", line 93, in parse_file
    return parser.parse(text, filename)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/c_parser.py", line 146, in parse
    debug=debuglevel)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/ply/yacc.py", line 265, in parse
    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/ply/yacc.py", line 1047, in parseopt_notrack
    tok = self.errorfunc(errtoken)
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/c_parser.py", line 1680, in p_error
    column=self.clex.find_tok_column(p)))
  File "/home/nathaniel/.local/lib/python2.7/site-packages/pycparser/plyparser.py", line 55, in _parse_error
    raise ParseError("%s: %s" % (coord, msg))
pycparser.plyparser.ParseError: in/d_adsc_two_theta.c:63:82: before: .

Трассировка указывает на эту строку:

https://github.com/nbeaver/mx-trunk/blob/0b80678773582babcd56fe959d5cfbb776cc0004/libMx/d_adsc_two_theta.c#L63

Что, в свою очередь, указывает на этот макрос #define:

https://github.com/nbeaver/mx-trunk/blob/0b80678773582babcd56fe959d5cfbb776cc0004/libMx/mx_motor.h#L484


person Nathaniel M. Beaver    schedule 18.08.2016    source источник
comment
Я думаю, что вы должны отладить свое программное обеспечение Python в первую очередь. Здесь нет конкретной проблемы gcc. Вы должны добавить тег python и позволить сообществу python помочь вам.   -  person Konstantin Vladimirov    schedule 19.08.2016
comment
Спасибо, я сделал это только сейчас.   -  person Nathaniel M. Beaver    schedule 19.08.2016
comment
ваш код c компилируется и работает без python? почему вы не используете cffi? вы сообщили об этой проблеме в трекерах ply/pycparser? github.com/eliben/pycparser/issues/new github.com/dabeaz/ply/issues/new   -  person denfromufa    schedule 25.08.2016
comment
@denfromufa Да, код компилируется с помощью GCC. Я не использую cffi, потому что хочу только разобрать код C и выполнить статический анализ. Да, я только что отправил отчет об ошибке здесь: github.com/eliben/pycparser/issues/143< /а>   -  person Nathaniel M. Beaver    schedule 25.08.2016
comment
Я что-то упускаю или нужно удалить тег python-cffi?   -  person Armin Rigo    schedule 26.08.2016
comment
Я удалил тег python-cffi.   -  person Nathaniel M. Beaver    schedule 26.08.2016
comment
Кроме того, я исправил проблему в репозитории, из-за которой было сложнее воспроизвести ошибку.   -  person Nathaniel M. Beaver    schedule 27.08.2016


Ответы (1)


Причина, по-видимому, заключается в функции offsetof(). Однако минимальные рабочие примеры исправлены последними коммитами:

https://github.com/eliben/pycparser/issues/87

person Nathaniel M. Beaver    schedule 14.09.2016