Compiler construction 野牛派生序

Compiler construction 野牛派生序,compiler-construction,bison,Compiler Construction,Bison,嗨,我在学校项目中使用野牛,但我有个问题,我有下一条规则: callsubrotina : callfunction | callprocedure; callprocedure: T_IDENTIFICADOR {identifier_check( GOTO, $1, TIPO_PROCEDIMENTO );} | T_IDENTIFICADOR T_PARENTESE_E listaexpressoes T_PARENTESE_D

嗨,我在学校项目中使用野牛,但我有个问题,我有下一条规则:

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总是转到“callprocedure”,即使这会触发错误。我如何强制它检查这两条规则?或者我如何创建一个规则来正确处理


PS:对不起那些糟糕的英国人

由于“callprocedure”和“callfunction”的语法在所示规则中是相同的,所以Bison(或任何其他类似工具)无法区分它们

您必须有一个概念上的差异-可能一个过程不返回值,而一个函数确实返回值。但是,除非有某种语法方法来标识特定调用属于函数而不是过程,否则您将始终执行第一条书面规则。您还应该收到关于未使用规则的警告

一种可能性:如果在调用函数和过程之前必须声明它们,这样您就可以知道给定的名称是否属于函数或过程,那么您可以修改词法分析器,将其改为“this is a function name”和“this is a procedure name”,然后语法可以是:

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
    ;