2016-07-10 12 views
0

Ich versuche, einen Compiler mit lex und yacc zu tun, aber aus irgendeinem Grund funktioniert der Code nicht auf meiner VM-Maschine in meinem MAC, weil es sagt, dass es einige gibt Funktionen fehlen in der Kopfzeile. Diese Funktionen sind, islower() und isupper(). ECHO und yylex aus irgendeinem Grund fehlen auch. Ich habe sowohl Bison und Flex für Lex und Yacc deinstalliert und installiert, aber nichts hat es behoben.Funktionen in <locale> fehlend - islower() und isupper()

Der gleiche Code funktioniert gut in meinem VM-Computer in einem Windows-Computer. Also mein Code ist nicht das Problem. Hier ist der Fehler error caused with functions missing

+2

Veröffentlichen Sie keine Bilder von Textterminals. –

+1

Für den unteren Teil haben Sie einfach vergessen, aufzunehmen. –

+1

Ich habe Ctypes und es sagt: keine solche Datei oder Verzeichnis. Das könnte das Problem sein. Wie repariere ich es? – Kikadass

Antwort

1
  1. islower und isupper in <ctype.h> zu finden sind, nicht in <locale.h>. Es ist möglich, dass einige nicht standardkonforme C-Bibliotheksimplementierungen eine locale.h bereitstellen, die auch ctype.h enthält, aber das ist sicherlich nicht der Fall bei der Standard-C-Installation unter Mac OS X (oder Linux).

  2. Es liegt in Ihrer Verantwortung zu schreiben yyerror; Sie müssen auch in jeder Datei, in der sie aufgerufen wird, einen genauen Prototyp bereitstellen. Es wird automatisch vom yacc/bison-generierten Parser aufgerufen, aber yacc/bison stellt keine besonderen Anforderungen an den yyerror Prototyp. Es kann einen beliebigen Typ oder keinen Typ zurückgeben, da der von yacc/bison generierte Parser niemals den Rückgabewert verwendet. Und es kann eine Varargs-Funktion sein, wenn Sie eine Version schreiben möchten, die eine Art Printf-Style-Interpolation durchführt. Sie müssen es auch in jeder anderen Übersetzungsunion deklarieren, die es nutzt (wie Ihr Lexer es offensichtlich tut).

  3. yylex wird nicht automatisch von der yacc/bison-generated-Grammatik deklariert, obwohl sie aufgerufen wird und eine int zurückgegeben wird. Mit einem bison-generierten Parser hängen die genauen Argumente, die yylex (und yyerror) zur Verfügung gestellt werden, von einer Vielzahl von Bison-Deklarationen ab; Insbesondere, wenn Sie angeben, dass der Lexer reentrant ist, liefert Bison zusätzliche Argumente. Im einfachsten Fall (ohne Bison Erklärungen), sollte der Prototyp

    int yylex(void); 
    

    sein, die die yylex von lex/flex erzeugt passt (wieder ohne reentrancy Erklärungen). Im traditionellen C ist die obige Deklaration nicht notwendig, da int der Standardrückgabetyp für nicht deklarierte Funktionen ist und das Fehlen von Argumenten im Aufruf dem Fehlen von Argumenten in der Definition entspricht. Moderne C-Compiler (wie zum Beispiel clang, wie sie auf OS X und/oder gcc zu finden sind) warnen jedoch vor fehlenden Prototypen, selbst wenn der Code trotzdem funktionieren würde. Es wird dringend empfohlen, dass Sie explizite Erklärungen enthalten, wie sie in der bison manual erwähnt: (Abschnitt 1.9, Hervorhebung hinzugefügt)

    Der Prolog kann in den Aktionen verwendeten Typen und Variablen definieren. Sie können auch Präprozessorbefehle verwenden, um Makros zu definieren, die dort verwendet werden, und #include verwenden, um Headerdateien einzuschließen, die eines dieser Dinge ausführen. Sie müssen den lexikalischen Analysator yylex und den Fehlerdrucker yyerror hier, zusammen mit anderen globalen Bezeichnern deklarieren, die von den Aktionen in den Grammatikregeln verwendet werden.

  4. Ich weiß nicht, wo man den Eindruck, dass der Compiler ECHO über beschwert, es sei denn, es die fehl am Platze caret ist; Der Fehlertext besagt eindeutig, dass das Problem bei yyerror liegt. Die Einfügemarke ist an der falschen Stelle, da die angezeigte Zeile die Quellzeile in Ihrer lexikalischen Definitionsdatei ist, während die Zeile, über die sich der C-Compiler gerade beschwört, die von flex erzeugte Zeile ist, die das Muster . nicht enthält und daher beabstandet ist etwas anders.

    Das ist eine Schwäche in Klirren des Mechanismus ist Carets für Verwenden Sie die präzise Ort des Fehlers zu zeigen, aber ich denke, dass im Großen und Ganzen zustimmen werde es viel freundlicher ist, dass Sie die ursprüngliche Quelle Linie zu zeigen, mit die entsprechende Zeilennummer.