Синтаксическая ошибка в семантическом предикате бизона - PullRequest
0 голосов
/ 27 мая 2018

Поэтому я пытаюсь использовать функцию семантического предиката 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 года. Я был бы удивлен, если бы эта проблема вообще нигде не рассматривалась).Может кто-нибудь просветить меня об этой проблеме?Спасибо.

При необходимости я мог бы попытаться зарегистрировать ошибку с бизоном (нужно выяснить, как это сделать), но я не уверен, является ли это моей собственной проблемой или нет.

1 Ответ

0 голосов
/ 27 мая 2018

Насколько я вижу, эта ошибка существовала в течение некоторого времени (возможно, с тех пор, как была введена функция семантического предиката, хотя кажется, что кто-то должен был ее протестировать в какой-то момент с какой-то версией зубра).

Самый простой обходной путь - отключить генерацию директив #line, что можно сделать, просто добавив -l (или --no-lines) в командную строку бизона.Однако это усложнит интерпретацию сообщений об ошибках, которые в противном случае ссылались бы на номера строк в вашем файле грамматики бизонов.

В качестве второго обходного пути вы можете найти файл c.m4, который, вероятно, находится в /usr/share/bison/c.m4 (конечно, это зависит от вашего дистрибутива).Строка 462 этого файла (в бизоне 3.0.4) гласит:

    if (! ($2)) YYERROR;

Если добавить символ новой строки непосредственно перед $2, чтобы он читал

    if (! (
           $2)) YYERROR;

, тогда все должноработать хорошо(По крайней мере, так оно и было, когда я его проверял.)

...