Поскольку синтаксис 'callprocedure' и 'callfunction' идентичен в показанных правилах, Bison (или любой другой аналогичный инструмент) не может различить их.
Вы должныиметь концептуальную разницу - может быть, процедура не возвращает значение, а функция возвращает значение.Но если нет какого-либо синтаксического способа определить, что конкретный вызов принадлежит функции, а не процедуре, вы всегда будете выполнять первое написанное правило.Вы также должны получать предупреждение о неиспользованном правиле.
Одна возможность: если ваши функции и процедуры должны быть объявлены до того, как они могут быть вызваны, вы можете определить, принадлежит ли данное имя функции или процедуре,затем вы можете изменить лексический анализатор так, чтобы он говорил «это ИМЯ ФУНКЦИИ» и «это ИМЯ ПРОЦЕДУРЫ», и тогда грамматика могла бы быть:
callsobrotina: callprocedure | callfunction ;
callprocedure:
T_PROCEDURE_NAME
| T_PROCEDURE_NAME T_PARETESE_E listaexpressoes T_PARENTES_D
;
callfunction:
T_FUNCTION_NAME
| T_FUNCTION_NAME T_PARETESE_E listaexpressoes T_PARENTES_D
;