Как использовать m4 при создании файлов заголовков C ++ с помощью Flex и Bison?

У меня есть вопрос, касающийся использования макросов C ++ m4. Я пытаюсь скомпилировать чужой код, и в одном из заголовочных файлов есть строка, которая выглядит следующим образом:

b4_copyright(C++ Skeleton parser for LALR(1) parsing with Bison, 2002, 2003)

Это, конечно, возвращает ошибку при попытке скомпилировать код:

error: expected constructor, destructor, or type conversion before ‘(’ token

Определение b4_copyright в файле c.m4 из установки бизона есть:

m4_define([b4_copyright],
[/* A Bison parser, made by GNU Bison b4_version.  */

/* $1

m4_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [   ])

...

This special exception was added by the Free Software Foundation in
version 2.2 of Bison.  */])

Я думаю, что ошибка происходит, когда файл заголовка генерируется flex и bison. По какой-то причине, когда Bison проходит анализируемый код, он не подавляет вывод макроса m4 (в данном случае b4_copyright), как это должно быть. Когда он создает файл заголовка, он оставляет строки из стандартного вывода макросов, которые он выполнил. Зачем это делать?

Согласно файлу c.m4 (где определение для b4_copyright), вывод должен быть подавлен. Файл c.m4 также использует определения из m4sugar.m4. Однако эти определения, по-видимому, не применяются нигде в файле c.m4, потому что он не использует функцию m4_divert (которая определена в m4sugar.m4) для подавления вывода, как я думаю, это должно быть.

1

Решение

Ваша проблема довольно удивительна: пользователь никогда не должен подвергаться воздействию этих внутренних деталей, даже если вы стараетесь! В частности, с Flex вы можете делать все, что захотите, Bison должен оставаться стабильным: ему никогда не нужно читать файлы Flex.

Так что на самом деле, либо ваша установка M4 неверна, либо кто-то играл с вашими файлами скелета Bison (что никогда не должно происходить). В любом другом случае это ошибка, о которой следует сообщить в соответствующий список (bug-bison на gnu.org).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]