2010-11-21 8 views
0

Hallo, ich bin mit Bison für ein Schulprojekt, aber ich habe ein Problem habe ich die nächsten Regeln:Bison Ableitungsordnung

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

Das Problem Bison geht immer auf „callprocedure“, auch wenn diese einen Fehler auslösen. Wie kann ich es erzwingen, beide Regeln zu überprüfen? Oder wie kann ich eine Regel erstellen, um richtig zu behandeln?

PS: Sorry für die schlechten Englisch Leute.

Antwort

0

Da die Syntax der a 'callprocedure' und 'callfunction' in den gezeigten Regeln identisch ist, gibt es für Bison (oder ein anderes analoges Werkzeug) keine Möglichkeit, zwischen ihnen zu unterscheiden.

Sie müssen einen konzeptionellen Unterschied haben - vielleicht gibt eine Prozedur keinen Wert zurück und eine Funktion gibt einen Wert zurück. Aber es sei denn, es gibt einen syntaktischen Weg zu identifizieren, dass ein bestimmter Aufruf zu einer Funktion und nicht zu einer Prozedur gehört, Sie erhalten immer die erste geschriebene Regel ausgeführt. Sie sollten auch eine Warnung über eine nicht verwendete Regel erhalten.

Eine Möglichkeit: Wenn Ihre Funktionen und Prozeduren deklariert werden müssen, bevor sie aufgerufen werden können, können Sie feststellen, ob ein bestimmter Name zu einer Funktion oder Prozedur gehört NAME 'und' das ist ein VERFAHRENSNAME ', und dann könnte die Grammatik sein:

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 
    ;