Fehlersuche



  • Ich möchte ein größeres Programm kompilieren, was leider nicht funktioniert.

    Es treten mehrere Fehler auf, wobei einige unter Umständen nur Folgefehler sind.

    Aus diesem Grund starte ich zunächst mal mit dem ersten auftretenden Fehler:

    In file included from parser.yy:25:0:
    parser.tab.hh:111:14: Fehler: expected identifier before numeric constant
    #define EXIT 278

    In der betreffenden Datei stehen nur jede Menge Tokens - wahrscheinlich für FLEXX und YACC.

    Kann es sein, dass EXIT schon irgendwie vordefiniert ist und ich daher einen Fehler erhalte?



  • Ja



  • Gibts da Möglichkeiten, das zu umgehen, OHNE dass ich den Quellcode des Programmes anfassen muss.
    Eventuell ist EXIT ja bei einem älteren oder neueren Compiler nicht definiert?



  • Erstmal würde ich doch den Fehler suchen.
    Warum sollte EXIT überhaupt schon definiert sein?

    Da muss doch noch mehr zu dem Fehler gehören. Denn die Zeile, die in der Fehlermeldung auftaucht ist kein Fehler.
    Wie geht es denn dann weiter mit der Ausgabe von gcc?



  • Dake Furble, ich suche auch gerade. EXIT scheint ja nicht im C++-Standard definiert zu sein. Also 2 Möglichkeiten:

    Wird irgendwo im Programm definiert oder ich suche an der falschen Stelle.

    Also weiter im Text:

    In file included from parser.yy:25:0:
    parser.tab.hh:111:14: Fehler: expected identifier before numeric constant
     #define EXIT 278
                  ^
    ./include/CFG.h:96:24: Anmerkung: bei Substitution des Makros »EXIT«
       typedef enum {START, EXIT} MapType;
                            ^
    parser.tab.hh:111:14: Fehler: expected »}« before numeric constant
     #define EXIT 278
                  ^
    ./include/CFG.h:96:24: Anmerkung: bei Substitution des Makros »EXIT«
       typedef enum {START, EXIT} MapType;
                            ^
    parser.tab.hh:111:14: Fehler: expected unqualified-id before numeric constant
     #define EXIT 278
                  ^
    ./include/CFG.h:96:24: Anmerkung: bei Substitution des Makros »EXIT«
       typedef enum {START, EXIT} MapType;
                            ^
    

    Interessanterweise kommt der Block tatsächlich doppelt vor.
    Dann gehts weiter mit den Fehlern:

    ./include/CFG.h:96:30: Fehler: Templatedeklaration von »BuildCFGTraverse<Node> MapType«
       typedef enum {START, EXIT} MapType;
                                  ^
    ./include/CFG.h:120:3: Fehler: »Node« bezeichnet keinen Typ
       Node* GetStmtNode( const AstNodePtr& s, MapType t ) 
       ^
    ./include/CFG.h:131:42: Fehler: »Node« wurde nicht deklariert
       void SetStmtNode( const AstNodePtr& s, Node* n, MapType t)
                                              ^
    ./include/CFG.h:131:51: Fehler: »MapType« wurde nicht deklariert
       void SetStmtNode( const AstNodePtr& s, Node* n, MapType t)
    


  • Da hast Du's doch schon.

    ./include/CFG.h:96:24: Anmerkung: bei Substitution des Makros »EXIT«
       typedef enum {START, EXIT} MapType;
    

    Allerdings wüßte ich jetzt auch nicht, wie Du das beheben kannst. Soll das schon mal kompiliert haben?



  • Soll das schon mal kompiliert haben?

    Nicht bei mir 😉

    Ich sehe jetzt auch das Problem. Die Map, in der EXIT benötigt wird, stammt aus einer anderen Programmkomponente, was ich anhand der Pfadangaben, die bei mir natürlich vollständig sind, sehen kann.

    Der Teil, der EXIT als konstante definieren möchte ist weniger umfangreich. Vielleicht kann ich die parser-Files so anpassen, dass kein Konflikt mehr mit der Map-Definition vorliegt?

    Hier mal die Ausgaben von grep -r EXIT:

    ./parser.ll:exit                   BEGIN(LINE); return EXIT;
    ./cscope.out:   gEXIT
    ./cscope.out:YY_EXIT_FAILURE
    ./cscope.out:   #YY_EXIT_FAILURE
    ./cscope.out:YY_EXIT_FAILURE
    ./cscope.out:   mEXIT
    ./cscope.out:   mEXIT
    ./cscope.out:   #WEXITSTATUS
    ./cscope.out:   `__WEXITSTATUS
    ./cscope.out:   #WIFEXITED
    ./cscope.out:   `__WIFEXITED
    ./cscope.out:   #EXIT_FAILURE
    ./cscope.out:   #EXIT_SUCCESS
    ./cscope.out:   m_SC_ATEXIT_MAX
    ./cscope.out:   #_SC_ATEXIT_MAX
    ./cscope.out:_SC_ATEXIT_MAX
    ./cscope.out:   mCLD_EXITED
    ./cscope.out:   #CLD_EXITED
    ./cscope.out:CLD_EXITED
    ./cscope.out:   #WEXITED
    ./cscope.out:   #__WEXITSTATUS
    ./cscope.out:   `__WEXITSTATUS
    ./cscope.out:   #__WIFEXITED
    ./cscope.out:   #__W_EXITCODE
    ./cscope.out:   #_G_HAVE_ATEXIT
    ./parser.yy:%token NONSINGULAR EXIT KNOWN SKEW SHIFT SHIFT_TO FUSE DISTRIBUTE REMOVE_DEP SCALE REVERSE PEEL
    ./parser.yy:        | EXIT '\n' { return(0); }
    grep: ./bin/chill: Datei oder Verzeichnis nicht gefunden
    ./parser.tab.hh:     EXIT = 278,
    ./parser.tab.hh:#define EXIT 278
    ./lex.yy.cc:BEGIN(LINE); return EXIT;
    ./lex.yy.cc:#ifndef YY_EXIT_FAILURE
    ./lex.yy.cc:#define YY_EXIT_FAILURE 2
    ./lex.yy.cc:    exit( YY_EXIT_FAILURE );
    ./parser.tab.cc:     EXIT = 278,
    ./parser.tab.cc:#define EXIT 278
    ./parser.tab.cc:  "NONSINGULAR", "EXIT", "KNOWN", "SKEW", "SHIFT", "SHIFT_TO", "FUSE",
    Übereinstimmungen in Binärdatei ./lex.yy.o.
    

    Wenn ich es richtig sehe, wird EXIT nur in Parser.tab definiert und verwendet. Wenn ich es hier umbenenne könnte es dann funktionieren?
    Der Zusammenhang zwischen gscope und parser ist mir leider nicht bekannt.



  • Vielen Dank, Thread kann gelöscht werden. Funktioniert nun alles.


Anmelden zum Antworten