Was ist der Zweck von ungegetc (oder Ungetch von K & R)?

8

Kann mir jemand den Zweck von Ungetch erklären? Dies ist von K & amp; R Kapitel 4, wo Sie einen Reverse Polish Calculator erstellen.

Ich habe das Programm ohne den Aufruf von Ungetch ausgeführt und in meinen Tests funktioniert es immer noch gleich.

%Vor%

(Ich habe den ternären Operator in getch entfernt, um es klarer zu machen.)

    
Tyler 24.01.2009, 20:30
quelle

4 Antworten

26

Ich weiß nicht über das spezifische Beispiel, auf das Sie sich beziehen (Es ist vermutlich 23 Jahre her, dass ich K & amp; R gelesen habe, und das war die erste Ausgabe.), aber oft beim Parsen ist es praktisch, einen Blick auf die Nächstes Zeichen, um zu sehen, ob es Teil dessen ist, was Sie gerade analysieren. Wenn Sie beispielsweise eine Zahl lesen, möchten Sie die Ziffern so lange lesen, bis Sie zu einer Nicht-Ziffer kommen. Ungetc lässt den Nummernleser das nächste Zeichen betrachten, ohne es zu verbrauchen, so dass jemand anderes es lesen kann. In Greg Hewgills Beispiel von "2 3+" würde der Nummernleser die 3 Ziffern lesen, dann das Pluszeichen lesen und wissen, dass die Nummer beendet ist, dann das Pluszeichen rückgängig machen, so dass es später gelesen werden kann.

    
David Norman 24.01.2009, 20:37
quelle
10

Versuchen Sie, das Programm ohne Leerzeichen um Operatoren auszuführen. Ich erinnere mich nicht genau an das Format dieses Beispiels und ich habe K & R nicht griffbereit, aber anstatt "2 3 +" zu verwenden, versuche "2 3+". Die ungetch() wird wahrscheinlich beim Analysieren von Zahlen verwendet, da der Zahlenparser Ziffern liest, bis er etwas erhält, das keine Ziffer ist. Wenn die Nicht-Ziffer ein Leerzeichen ist, liest die nächste getch() die + und alles ist gut. Wenn die nächste Nicht-Ziffer jedoch ein + ist, muss sie auf den Eingangsstrom zurückgeschoben werden, damit die Haupt-Leseschleife sie wieder finden kann.

Ich hoffe, ich erinnere mich an das Beispiel richtig.

    
Greg Hewgill 24.01.2009 20:33
quelle
4

Es wird häufig für lexikalische Scanner verwendet (der Teil des Compilers, der Ihren Text in Blöcke wie Variablennamen, Konstanten, Operatoren usw. aufteilt). Die Funktion ist nicht notwendig für den Scanner, es ist einfach sehr praktisch.

Wenn Sie zum Beispiel einen Variablennamen lesen, wissen Sie nicht, wann Sie fertig sind, bis Sie ein Zeichen gelesen haben, das nicht Teil des Variablennamens sein kann. Aber dann musst du dich an diesen Charakter erinnern und einen Weg finden, ihn dem nächsten Teil des Lexers mitzuteilen. Sie könnten eine globale Variable oder etwas erstellen oder sie an den Aufrufer übergeben. Wie aber geben Sie andere Dinge zurück, z. B. Fehlercodes? Stattdessen heben Sie das Zeichen () auf, um es in den Eingabestream zurückzuversetzen, tun Sie alles, was Sie mit Ihrem Variablennamen tun müssen, und kehren Sie zurück. Dann, wenn der Lexer beginnt, den nächsten Chunk zu lesen, muss er sich nicht nach zusätzlichen Charakteren umsehen.

    
user58658 24.01.2009 20:43
quelle
-2

Sehen Sie sich diesen Code an, Sie werden es verstehen:

%Vor%     
amazzal 16.07.2012 15:34
quelle

Tags und Links