Поэтому я пытаюсь использовать функцию семантического предиката bison , но я столкнулся с несколькими проблемами, пытаясь заставить его работать.
Проблема возникает, когда я пытаюсь скомпилировать сгенерированный файл .tab.c
с помощью gcc.Я использую gcc 7.1.0 и bison 3.0.4.Вот фрагмент ошибки компиляции:
test2.tab.c: In function ‘yyuserAction’:
test2.tab.c:811:12: error: stray ‘#’ in program
if (! (#line 19 "test2.y" /* glr.c:816 */
^
test2.tab.c:811:13: error: ‘line’ undeclared (first use in this function); did you mean ‘uint’?
if (! (#line 19 "test2.y" /* glr.c:816 */
^~~~
uint
Итак, я взял пример бизона для семантического предиката и сделал его рабочим примером:
%{
int new_syntax = 0;
int yyerror(const char* msg) { /* some error handling */ }
%}
%token id
%glr-parser
%%
prog: %empty
| prog widget
| prog flip
;
widget: %?{ new_syntax } "widget" id old_arg
| %?{ !new_syntax } "widget" id new_arg
;
flip: "flip" { new_syntax = !new_syntax; }
;
old_arg: /* something here */
;
new_arg: /* something else here */
;
%%
После игры с вкладкойфайл, я понял, что добавление новой строки перед директивами #line
разрешает синтаксическую ошибку, (но он чувствует себя немного хакерским, напрямую изменяя сгенерированный файл. Плюс, вам придется выровнять с некоторыми пробелами, чтобы gcc вычислил правильный столбецпозиция кода).
Интересно, является ли это ошибкой самого бизона, или я использую семантические предикаты неправильно, или этот синтаксис был корректен в более ранней версии gcc, или что-то в этом роде?еще.
Я также пытался найти в Интернете эту проблему или ошибку, уже зарегистрированную в bison, но не нашел ни одной.(Похоже, последней версии бизонов исполнилось 3 года. Я был бы удивлен, если бы эта проблема вообще нигде не рассматривалась).Может кто-нибудь просветить меня об этой проблеме?Спасибо.
При необходимости я мог бы попытаться зарегистрировать ошибку с бизоном (нужно выяснить, как это сделать), но я не уверен, является ли это моей собственной проблемой или нет.