Порядок вывода бизонов - PullRequest
0 голосов
/ 21 ноября 2010

Привет, я использую бизона для школьного проекта, но у меня проблема: у меня есть следующие правила:

callsubrotina : callfunction | callprocedure;

callprocedure: 
        T_IDENTIFICADOR
        {identifier_check( GOTO, $1, TIPO_PROCEDIMENTO );} 
    |   T_IDENTIFICADOR  T_PARENTESE_E listaexpressoes T_PARENTESE_D
        {identifier_check( GOTO, $1, TIPO_PROCEDIMENTO );} 
    ;

callfunction: 
        T_IDENTIFICADOR
        {identifier_check( LD_VAR, $1, TIPO_FUNCAO );} 
    |   T_IDENTIFICADOR  T_PARENTESE_E listaexpressoes T_PARENTESE_D
        {identifier_check( LD_VAR, $1, TIPO_FUNCAO );} ;

Проблема в том, что бизон всегда переходит к "callprocedure", даже если это вызывает ошибку. Как я могу заставить его проверить оба правила? Или как я могу создать правило для правильного лечения?

PS: Извините за плохих английских людей.

1 Ответ

0 голосов
/ 21 ноября 2010

Поскольку синтаксис '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
    ;
...