野牛派生命令

时间:2010-11-21 03:57:36

标签: compiler-construction bison

嗨,我正在将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 );} ;

问题是野牛总是进入“callprocedure”,即使这会触发错误。我如何强制它检查这两个规则?或者我如何创建一个正确对待的规则?

PS:对不好的英国人抱歉。

1 个答案:

答案 0 :(得分:0)

由于a'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
    ;