Ошибка вы получаете это:
pycparser.plyparser.ParseError: /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h:40:27: before: __gnuc_va_list
линия обозначается как вызывает ошибку (stdarg.h:40
):
typedef __builtin_va_list __gnuc_va_list;
В GCC, __builtin_va_list
есть, как указывает его название, построенный в компилятору. Следовательно, объявление такого типа не требуется (или разрешено).
Для компиляторов C очень часто используется метод на основе символьной таблицы для синтаксического анализа имен типов, поскольку в грамматике имеется несколько двусмысленностей, если вы не можете различить имя типа из другого идентификатора. Такой синтаксический анализатор будет считать, что необъявленный идентификатор не является typename, и если __builtin_va_list
не является именем, то typedef
является синтаксической ошибкой.
Итак, я полагаю, что используемая вами грамматика pyparser не знает о типах gcc builtin (и почему?).
Ваш факелиб, похоже, содержит тот же заголовочный файл. Это неудивительно, так как трудно подделать stdarg.h
; хотя технически это заголовок библиотеки, он является частью небольшого набора заголовков, который должен предоставляться компилятором даже в автономной (без стандартной библиотеки) реализации: <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>
и <stdnoreturn.h>
(стандарт C11, пункт 4, пункт 6). Они должны быть реализованы компилятором, потому что внешняя библиотека не может достаточно знать о характере скомпилированного кода, чтобы правильно определить их.
В зависимости от того, что требуется от pyparsed выхода, вы можете быть в состоянии обойти это для pyparser, включив в определение __builtin_va_list
, такие как:
typedef struct __builtin_va_list { } __builtin_va_list;
__builtin_va_list
не только встроенный НКУ типа данных, хотя вы не можете столкнуться с другими. Таким образом, вам может потребоваться повторить это решение несколько раз, пока вы не достигнете того, чего вы пытаетесь достичь.
Привет, жаль, что я так долго, чтобы вернуться к вам. Я внедрил для изменения предложенный вами файл '', который дал мне ошибку, но ошибка остается прежней. Вот как выглядит место в файле сейчас. '#ifndef __GNUC_VA_LIST #define __GNUC_VA_LIST typedef struct __builtin_va_list {}; typedef __builtin_va_list __gnuc_va_list; # endif' Если у вас есть другой вход, я бы хотел его услышать. –
Araiguma
@Araiguma: К сожалению, извините. Это была очевидная ошибка; Я не знаю, о чем я думал. Это должно быть 'typedef struct __builtin_va_list {} __builtin_va_list;'; Я исправил это в ответе. – rici