2017-05-23 2 views
2

Ich weiß, dass C nicht eine kontextfreie Sprache ist, ein berühmtes Beispiel ist:Wie macht man die Sprache C kontextfrei?

int foo; 
typedef int foo; 
foo x; 

In diesem Fall wird die Lexer nicht, ob foo in der 3. Zeile nicht kennt, eine Kennung ist, oder typedef.

Meine Frage ist, ist dies der einzige Grund, dass C eine Kontextsensitive Sprache macht?

Ich meine, wenn wir typedef loswerden, würde es kontextfreie Sprache werden? Oder gibt es andere Gründe (Beispiele), die das verhindern?

+0

Wenn Sie solche Dinge entfernen, haben Sie nicht mehr C, sondern eine völlig neue Sprache, die * ähnlich (aber nicht kompatibel) ist. –

+0

'+' hängt vom Kontext ab: in '40 + 2' bedeutet es ganzzahlige Addition; in '40 + 2.0' bedeutet es Gleitkommaaddition. – pmg

+2

@pmg Der Parser kümmert sich nicht, was die Arten von Dingen sind. – sepp2k

Antwort

4

Ja. C kann mit einer klassischen lex + yacc-Kombination geparst werden. Die Lexer Definition und die yacc Grammatik

http://www.quut.com/c/ANSI-C-grammar-l-2011.html und frei verfügbar ist http://www.quut.com/c/ANSI-C-grammar-y-2011.html

Wie Sie aus der lex Datei sehen können, ist es einfach, mit Ausnahme der kontextsensitiven check_type() (und comment(), aber Kommentar Verarbeitung technisch gehört zum Präprozessor), wodurch typedef die einzige Quelle der Kontextsensitivität ist. Da die yacc-Datei auch keine kontextsensitiven Tricks enthält, wäre ein typedef -less C eine vollkommen kontextfreie Sprache.

+0

Wenn Sie den Präprozessor ignorieren :-) – rici

0

Nein. C kann keine strikt kontextunabhängige Sprache sein. Dafür sollten Sie eine Syntax beschreiben, die es nicht erlaubt, eine nicht deklarierte Variable (das ist ein Kontext) auf ähnliche Weise zu verwenden, wie Sie es in Ihrer Frage beschreiben. Die Sprachautoren beschreiben die Syntax immer mit einer Art kontextfreier Grammatik, aber nur um die wichtigsten syntaktischen Konstrukte der Sprache zu beschreiben. Der Fall, den Sie beschreiben (indem Sie einen Typ-Bezeichner in eine andere Tokenklasse einfügen, um dort hingelangen zu können, wo er nicht hingehört), ist nur ein Beispiel. Wenn Sie zum Beispiel schauen, die Freiheit in der Reihenfolge für Dinge wie static unsigned long long int variable vereinfacht die Syntax Erinnern von Programmierern, aber kompliziert die Dinge für den Compiler-Autoren.

Verwandte Themen