Beim Durchsehen der BNF-Grammatik von C fand ich es seltsam, dass die Produktionsregel für eine Deklaration so aussah (laut https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%) 20C% 20in% 20Backus-Naur% 20form.htm ):
<declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ;
Warum einen *
Quantifizierer (dh null oder mehr Vorkommen) für die verwenden init-declarator
? Dadurch können Anweisungen wie int;
oder void;
syntaktisch gültig sein, obwohl sie semantisch ungültig sind. Könnten sie nicht einfach einen +
Quantifizierer (ein oder mehrere Vorkommen) anstelle *
der Produktionsregel verwendet haben?
Ich habe versucht, ein einfaches Programm zu kompilieren, um zu sehen, was der Compiler ausgibt, und alles, was er tut, ist eine Warnung auszugeben.
Eingang:
int main(void) {
int;
}
Ausgabe:
test.c: In function ‘main’:
test.c:2:5: warning: useless type name in empty declaration
int;
^~~
c
language-lawyer
context-free-grammar
rafaelfp
quelle
quelle
int
als Rückgabetyp fürmain
und nicht()
als Parametertypenliste in Funktionen verwenden, sondern(void)
stattdessen.Antworten:
declaration-specifier
beinhaltettype-specifier
, was beinhaltetenum-specifier
. Ein Konstrukt wieist eine gültige
declaration
mit nrinit-declarator
.Konstrukte wie
int;
werden durch Einschränkungen jenseits der Grammatik ausgeschlossen :Ich würde vermuten, dass es Abwärtskompatibilitätsgründe dafür gibt, dass Ihr Compiler nur eine Warnung ausgibt.
quelle
Eine Deklaration ohne Init-Deklarator:
ist harmlos für Deklarationsspezifiziererlisten, die kein einzelner
enum
/struct
/union
Spezifizierer sind, und es stimmt sinnvollerweise mit denen überein, die es sind.In jedem Fall stimmt die dargestellte Grammatik auch fälschlicherweise mit Deklarationen wie
int struct foo x;
oder übereindouble _Bool y;
(sie ermöglicht mehrere Spezifizierer, um mit Dingen wie übereinzustimmenlong long int
), aber all diese können später in einer semantischen Prüfung erkannt werden.Die BNF-Grammatik selbst wird nicht alle illegalen Konstrukte aussortieren.
quelle