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
;