Порядок происхождения бизонов

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

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 );} ;

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

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


person Carlos Alessandro    schedule 21.11.2010    source источник


Ответы (1)


Поскольку синтаксис 'процедуры вызова' и 'функции вызова' в показанных правилах идентичен, 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
    ;
person Jonathan Leffler    schedule 21.11.2010