Объявление %union
изменяет тип yylval
.
Руководство bison
объясняет :
В обычном (нерентабельный) парсер, семантическое значение токена должно храниться в глобальной переменной
yylval
. Когда вы используете только один тип данных для семантических значений,yylval
имеет этот тип. Таким образом, если типint
(по умолчанию), вы можете записать это вyylex
:... yylval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...
Когда вы используете несколько типов данных, тип
yylval
является объединением сделанные из объявления%union
(см. раздел «Коллекция типов значений»). Поэтому, когда вы сохраняете значение токена, вы должны использовать правильный член объединения. Если объявление%union
выглядит так:%union { int intval; double val; symrec *tptr; }
, тогда код в
yylex
может выглядеть следующим образом:blockquote>... yylval.intval = value; /* Put value onto Bison stack. */ return INT; /* Return the type of the token. */ ...