Я создаю собственный компилятор с flex / bison, и у меня есть файл TokenTypes.h, где я определяю все свои коды типов токенов. Я широко использую эти коды в программе, поэтому я подумал, что лучше определить их самостоятельно и сохранить контроль над ними, а не позволять бизону делать это. TokenTypes.h выглядит так:
#define TokenType_INT 1
#define TokenType_PLUS 2
//...
Моя проблема в том, что я не понял, как сказать бизону использовать эти числовые коды. Я прочитал в документах, что я могу указать их буквально:
%token INTEGER 1
но я не хочу снова жестко кодировать число (в этом примере 1) здесь, поскольку оно определено в TokenTypes.h, и я надеялся, что мне не придется повторять и поддерживать все определения в 2 местах.
Я попытался использовать ключ # define'd TokenType_INT вместо его значения (1) в моем объявлении% token, но из-за этого произошел сбой бизона:
In file included from ../data/syntax.y:11:0,
from ../src/Compiler.c:15:
../src/parser/../lexer/TokenTypes.h:3:31: error: expected identifier before numeric constant
#define TokenType_INT 1
^
../src/parser/autoGenerated.Syntax.h:73:5: note: in expansion of macro ‘TokenType_INT’
TokenType_INT = 259,
^~~~~~~~~~~~~~~~
In file included from ../data/lex.l:12:0:
../src/lexer/TokenTypes.h:3:31: error: expected identifier before numeric constant
#define TokenType_INT 1
РЕДАКТИРОВАТЬ : Для тех, у кого может быть тот же вопрос, что и у меня:
Как уже говорилось в комментариях к моему посту, в Bison это невозможно и нежелательно, поэтому я оставлю эту идею и позволю bison определить значения.