Разделение правила грамматики в Bison

У меня есть правило Бизона

block: LBRACE  { some code } decls stmts RBRACE {more code } 
     ;

Проблема в разделе «больше кода», у меня есть

$$ = $3 ;

По сути, я хочу, чтобы возвращаемое значение блока было stmts. Когда я это делаю, Бизон говорит: «Блок на 3 доллара не имеет типа». Если я удаляю блок кода, содержащий какой-то код, и вставляю его в последний блок, bison не жалуется. У меня stmts и все его производные объявлены как типы. Так это не разрешено Бизоном? Я могу внести изменения в грамматику, чтобы приспособиться к этому, но будет утомительно и намного проще просто использовать вышеизложенное.


person Kizaru    schedule 28.08.2010    source источник


Ответы (1)


Используйте $4, чтобы обратиться к stmts. Поскольку у вас есть действие в середине правила все последующие номера символов смещаются, так как само действие может иметь значение.

Соответствующие номера компонентов:
$1 LBRACE
$2 { some code }
$3 decls
$4< /strong> stmts
$5 RBRACE
$6 { more code }

person Jeff Mercado    schedule 28.08.2010