Running Bison on this file:
%{
#include
int yylex();
void yyerror(const char*);
%}
%union
{
char name[100];
int val
The union (%union) defined is not intended to be used directly. Rather, you need to tell Bison which member of the union is used by which expression.
This is done with the %type directive.
A fixed version of the code is:
%{
#include
int yylex();
void yyerror(const char*);
%}
%union
{
char name[100];
int val;
}
%token NUM ID
%right '='
%left '+' '-'
%left '*'
%type exp NUM
%type ID
%%
exp : NUM {$$ = $1;}
| ID {$$ = vars[$1];}
| exp '+' exp {$$ = $1 + $3;}
| ID '=' exp {$$ = vars[$1] = $3;}
;
%%