Ошибка разбора Pycparser на byteswap.h

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

  File "test.py", line 14, in <module>
    cpp_args=['-E', r'-Iutils/fake_libc_include'])
  File "/usr/lib/python2.7/site-packages/pycparser/__init__.py", line 93, in parse_file
    return parser.parse(text, filename)
  File "/usr/lib/python2.7/site-packages/pycparser/c_parser.py", line 146, in parse
    debug=debuglevel)
  File "/usr/lib/python2.7/site-packages/ply/yacc.py", line 265, in parse
    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc)
  File "/usr/lib/python2.7/site-packages/ply/yacc.py", line 1047, in parseopt_notrack
    tok = self.errorfunc(errtoken)
  File "/usr/lib/python2.7/site-packages/pycparser/c_parser.py", line 1680, in p_error
    column=self.clex.find_tok_column(p)))
  File "/usr/lib/python2.7/site-packages/pycparser/plyparser.py", line 55, in
_parse_error
    raise ParseError("%s: %s" % (coord, msg))

/usr/include/bits/byteswap.h:46:1: before: {

Это на CentOS 7.

Код:

      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))

#ifdef __GNUC__
# if __GNUC_PREREQ (4, 3)
static __inline unsigned int
__bswap_32 (unsigned int __bsx)
{
  return __builtin_bswap32 (__bsx);
}
# elif __GNUC__ >= 2
#  if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__            \
                           || defined __pentiumpro__ || defined __pentium4__  \
                           || defined __k8__ || defined __athlon__            \
                           || defined __k6__ || defined __nocona__            \
                           || defined __core2__ || defined __geode__          \
                           || defined __amdfam10__)

2 ответа

Решение

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

pyparser не поддерживает определенные ключевые слова, такие как компилятор __inline, Вы должны использовать заголовки fake_libc_include. См. https://github.com/eliben/pycparser/wiki/FAQ

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