Я пытаюсь создать программу, которая анализирует и перечисляет содержимое заголовочных файлов.Пока все хорошо, мне было легко разбирать и перечислять заголовки, которые я написал, но когда я начал разбирать кроссплатформенные заголовки API, все стало не так.
Мой текущий подход довольно прост, вот пример псевдокода парсингаследующая функция:
void foo(int a);
void is a type, so we are dealing with instancing a type
foo is the name of that type
foo is followed by brackets, meaning it is a function of type void named foo
int is a type...
a is the name of that type instance
foo is a function of type void that takes one parameter of type int named a
Однако, когда я попал в более крупные и сложные заголовки, я наткнулся на несколько нерегулярные прототипы, включающие макросы, и бог знает что.Пример:
GLAPI void APIENTRY glEvalCoord1d( GLdouble u );
GLAPI и APIENTRY являются зависимыми от платформы макросами.Какой вид портит мою простую схему синтаксического анализа, поскольку она ожидает, что имя объекта будет соответствовать его типу.Эти два макроса преобразуются в __stdcall, __declspec (dllimport) или extern, но теоретически они могут означать что угодно, но их смысл остается неясным до момента компиляции.
Как написать мой анализатор, чтобы он мог справиться с такимиСценарии и не запутаться?Сами макросы определены на более ранней стадии, поэтому парсер может знать, что GLAPI и APIENTRY являются макросами, поэтому их можно просто игнорировать, это путь?Естественно, это всего лишь один из множества вариантов нарушений, которые парсер может наткнуться на синтаксический анализ различных заголовков, поэтому приветствуются любые общие методы обработки синтаксического анализа любого «легального» содержимого заголовка.