Hier ist es syntaktisch unmöglich zu sagen, ob f / g Funktionsaufrufe oder Typumwandlungen sind, ohne zu wissen, wie sie deklariert werden. Wissen Compiler den Unterschied im Parsing-Schritt oder beheben sie dies normalerweise in einem zweiten Durchgang?
%Vor% Sehr frühe Versionen von C (bevor die erste Ausgabe von K & amp; R 1978 veröffentlicht wurde) hatten nicht das Merkmal typedef
. In dieser Version von C konnte ein Typname immer syntaktisch erkannt werden. int
, float
, char
, struct
usw. sind Schlüsselwörter. Andere Elemente eines Typnamens sind Interpunktionssymbole wie *
und []
. (Parser können zwischen Schlüsselwörtern und Bezeichnern unterscheiden, die keine Schlüsselwörter sind, da es nur eine kleine und feste Anzahl von ihnen gibt.)
Wenn typedef
hinzugefügt wurde, musste es in die vorhandene Sprache angepasst werden. A typedef
erstellt einen neuen Namen für einen vorhandenen Typ. Dieser Name ist ein einzelner Bezeichner - der sich nicht syntaktisch von einem anderen gewöhnlichen Bezeichner unterscheidet.
Ein C-Compiler muss eine Symboltabelle verwalten, während er seine Eingabe analysiert. Wenn ein Bezeichner gefunden wird, muss er in der Symboltabelle nachsehen, ob es sich um einen Typnamen handelt. Ohne diese Informationen ist die Grammatik mehrdeutig.
In gewisser Hinsicht kann man sich eine typedef
-Deklaration als ein neues temporäres Schlüsselwort vorstellen. Aber es sind Schlüsselwörter, die durch neue Deklarationen in inneren Bereichen verborgen werden können.
Zum Beispiel:
%Vor%Parsen von C ist schwierig.
Ich denke, sie machen es träge: Wann immer ein Token geparst wird, wird das Parsen des nächsten Tokens verzögert, bis die semantische Information dieses Symbols bekannt ist. Wenn der nächste Token geparst wird, weiß der Compiler bereits, ob das Symbol, auf das verwiesen wird, ein Typname ist oder nicht (er muss früher deklariert worden sein), und kann entsprechend handeln (In diesem Ansatz sind also die semantischen und syntaktischen Analysen verflochten und können nicht getrennt werden.)