#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. ах, тогда весь внедренный раздел (от { до } ) учитывается для одного индекса