Hi! > Le 16 nov. 2018 à 12:23, Askar Safin <safinas...@mail.ru> a écrit : > > Hi. I noticed strange behavior in Bison. Probably I simply don't understand > something. Or I found a bug. > This is my input file: http://paste.debian.net/hidden/a72e301e . I process it > using the following command line: "bison -do test.tab.cpp test.ypp". > Bison shows no warnings. > Then I add one line. This is edited file: > http://paste.debian.net/hidden/1d8be22a .
The diff is: akim@io ~bison $ diff ~/Downloads/paste_a72e301e.txt ~/Downloads/paste_1d8be22a.txt --- /Users/akim/Downloads/paste_a72e301e.txt 2018-11-16 17:43:21.296705198 +0100 +++ /Users/akim/Downloads/paste_1d8be22a.txt 2018-11-16 17:43:10.564650439 +0100 @@ -53,6 +53,8 @@ %start document +%destructor { delete $$; } <val *> + %% %type <val *> expr; > And then I process it using the same command line. > And I see the following warnings: > > test.ypp:63.3-66.5: warning: unset value: $$ [-Wother] > ID[id] > ^^^^^^ > test.ypp:71.3-73.5: warning: unset value: $$ [-Wother] > | '\'' expr[e] > ^^^^^^^^^^^^ > test.ypp:71.8-11: warning: unused value: $2 [-Wother] > | '\'' expr[e] > ^^^^ > test.ypp:78.3-80.5: warning: unset value: $$ [-Wother] > %empty > ^^^^^^ > test.ypp:81.3-83.5: warning: unset value: $$ [-Wother] > | expr[car] exprs[cdr] > ^^^^^^^^^^^^^^^^^^^^ > test.ypp:81.3-6: warning: unused value: $1 [-Wother] > | expr[car] exprs[cdr] > ^^^^ > test.ypp:81.13-17: warning: unused value: $2 [-Wother] > | expr[car] exprs[cdr] > ^^^^^ Well, your file is very fishy. Bison is complaining about this: expr: ID[id] { std::move (*$id); } you are telling it that expr has a value, yet you don’t set it. You must write expr: ID[id] { $$ = SOMETHING(std::move (*$id)); } The documentation is indeed lacking details on this regard. The code is clearer :) /*----------------------------------------------------------------------. | A symbol should be used if either: | | 1. It has a destructor. | | 2. The symbol is a midrule symbol (i.e., the generated LHS | | replacing a midrule action) that was assigned to or used, as in | | "exp: { $$ = 1; } { $$ = $1; }". | `----------------------------------------------------------------------*/ > My OS is Debian Stretch x86_64. Bison installed from Debian repo. "dpkg -l > bison" reports "2:3.0.4.dfsg-1+b1". "bison --version" reports "3.0.4". > > So, it seems that Bison for unknown reason ignores « %define parse.error > verbose", but %destructor somehow causes Bison to actually show warnings. I think you misunderstand parse.error: its point is to make *your* parser more verbose, not the one of Bison. Bison’s warnings are tuned with -W. Cheers.