Hello,

I have the following grammar,

%skeleton "lalr1.cc"
%require "3.0.2"
%defines
%define api.value.type variant
%define api.token.constructor
%define parse.assert
%define api.token.prefix {TOK_}
%locations
%define parse.trace

%token
  END 0 "end of file"
  ASSIGN ":="
  MINUS  "-"
  PLUS   "+"
  STAR   "*"
  SLASH  "/"
  LP     "("
  RP     ")"

%token <int> NUMBER "number"
%type  <int> exp

%%

%start unit;

unit: exp { driver.result = $1; };

%left "+" "-";
%left "*" "/";

exp:
exp "+" exp { $$ = $1 + $3; }
| exp "-" exp { $$ = $1 - $3; }
| exp "*" exp { $$ = $1 - $3; }
| exp "/" exp { $$ = $1 - $3; }
| "(" exp ")" { $$ = $1; }
| "number" { std::swap($$, $1); }

%%

When I try to create a parser from it, I get,

$ bison testcase.yy
testcase.yy:40.22-23: error: $1 of ‘exp’ has no declared type
 | "(" exp ")" { $$ = $1; }

I was following the C++ tutorial in the manual. I've checked my work  a
couple of times, I don't see what I've done different from the tutorial in
this example.
I've clearly defined a type for "exp":
%type  <int> exp

So why the error message?

Thank you for Bison!
-Simbad.
_______________________________________________
help-bison@gnu.org https://lists.gnu.org/mailman/listinfo/help-bison

Reply via email to