Is C++ context-free or context-sensitive?
Ich höre oft Behauptungen, dass C ++ eine kontextsensitive Sprache ist. Nehmen Sie das folgende Beispiel:
a b(c);
Ist das eine Variablendefinition oder eine Funktionsdeklaration? Das hängt von der Bedeutung des Symbols abc
. Obc
ist einVariable, danna b(c);
definiert eine Variable mit dem Namenb
vom Typa
. Es wird direkt mit initialisiertc
. Aber fallsc
ist einArt, danna b(c);
deklariert eine Funktion namensb
das braucht einec
und gibt ein zurücka
.
Wenn Sie die Definition von kontextfreien Sprachen nachschlagen, wird Ihnen im Grunde gesagt, dass alle Grammatikregeln linke Seiten haben müssen, die aus genau einem nicht-terminalen Symbol bestehen. Kontextsensitive Grammatiken erlauben hingegen beliebige Folgen von terminalen und nicht terminalen Symbolen auf der linken Seite.
Beim Durchsuchen von Anhang A von "Die C ++ - Programmiersprache" konnte ich keine einzige Grammatikregel finden, die auf der linken Seite außer einem einzigen nicht-terminalen Symbol noch etwas anderes enthielt. Das würde bedeuten, dass C ++ kontextfrei ist. (Natürlich ist jede kontextfreie Sprache auch in dem Sinne kontextsensitiv, dass die kontextfreien Sprachen eine Teilmenge der kontextsensitiven Sprachen bilden, aber das ist nicht der Punkt.)
Ist C ++ also kontextfrei oder kontextsensitiv?