Синтаксическая ошибка LZZ для typedef enum _foo { a } foo;
Почему LZZ говорит мне, что линия typedef enum _foo { a } foo;
имеет синтаксическую ошибку?
Test.lzz:1:19: Syntax error before '{'.
Test.lzz:1:1: Discarding 'typedef'.
Test.lzz:1:28: Syntax error before ';'.
Test.lzz:1:28: Inserting '<identifier>' before ';'.
2 ответа
Из документации:
В отличие от реального синтаксического анализатора C++, Lzz не поддерживает базу данных типов и имен шаблонов. Lzz анализирует, используя только контекстную информацию. Однако, поскольку грамматика C++ неоднозначна, эта стратегия неадекватна в нескольких контекстах; К счастью, Лзз может пропустить большинство из них.
Этот инструмент не принимает C++ в качестве входных данных; он принимает урезанный язык, который выглядит неопределенно как C++, производя C++ в качестве вывода. Если вы хотите использовать его, вам придется выучить его собственный язык и надеяться, что он подходит для кода, который вы хотите написать. Лично я бы предложил вам придерживаться стандарта C++, поскольку этот язык хорошо документирован и широко понят.
Вы часто видите это в коде, перенесенном из C. Не могли бы вы просто сделать это вместо
enum foo { a }
Документация Lzz говорит, что деклараторы после определений классов не поддерживаются (см. Определения классов в разделе поддерживаемых конструкций), и дает несколько примеров. То же самое относится и к перечислениям, хотя и не говорит об этом явно.
Примечание. Lzz допускает определение класса (или перечисления) без конечной точки с запятой.