Я пишу интерфейс для моего компилятора C, где в настоящее время я добавляю систему типов. Ранее я предполагал, что все было int, и, следовательно, следующее правило работало нормально.
declaration: datatype varList ';' { gTrace<<"declaration ";}
varList: IDENTIFIER { builder.addSymbol($1); }
| varList',' IDENTIFIER { builder.addSymbol($3); }
;
Но теперь я также добавил тип к символу и, следовательно, изменил свое правило, как показано ниже:
declaration: datatype { currentType = $1; } varList ';' { gTrace<<"declaration "; currentType = -1; }
varList: IDENTIFIER { builder.addSymbol($1, getType(currentType)); }
| varList',' IDENTIFIER { builder.addSymbol($3, getType(currentType)); }
;
Когда я это делаю, я получаю ошибку сдвига / уменьшения, поскольку {currentType = $ 1; } рассматривается как пустое правило. Как мне поступить с этой ошибкой? Есть ли способ указать, что это просто действие?
Прикрепленный ниже фрагмент из моего y.output
32 $@6: /* empty */
33 declaration: datatype $@6 varList ';'
34 varList: IDENTIFIER
35 | varList ',' IDENTIFIER