Встраивание кода в Yacc

#yacc #bison

#yacc #bison

Вопрос:

Я пишу файл yacc как часть компилятора. У меня следующая ошибка:

 lang_grammar.y:143.54-55: $2 of `ClassDeclaration' has no declared type
lang_grammar.y:143.69-70: $4 of `ClassDeclaration' has no declared type
lang_grammar.y:143.84-85: $6 of `ClassDeclaration' has no declared type
  

происходит в этой строке в моем файле .y:

 CLASS { /* code will be embedded here */ } ID EXTENDS ID '{' ClassBody '}'
    { $$.classDeclaration = new ClassDeclaration($2.identifier, $4.identifier, $6.classBody); }
  

Когда я удаляю внутренний внедренный код:

 CLASS ID EXTENDS ID '{' ClassBody '}'
    { $$.classDeclaration = new ClassDeclaration($2.identifier, $4.identifier, $6.classBody); }
  

Это работает просто отлично.

Существуют ли ограничения на встраивание кода в yacc? У меня сложилось впечатление, что это возможно.

Спасибо.

Ответ №1:

Я думаю, вы использовали неправильные индексы. Ранее встроенные коды также индексировались, скажем

 CLASS { /* code will be embedded here */ } ID EXTENDS ID '{' ClassBody '}'
$1    $2                                   $3 $4      $5 $6  $7        $8
  

Итак, коды действий должны быть

 { $$.classDeclaration = new ClassDeclaration($3.identifier, $5.identifier, $7.classBody); }
  

Комментарии:

1. ах, тогда весь внедренный раздел (от { до } ) учитывается для одного индекса