Was ist der Unterschied zwischen Syntax und Grammatik?

14

Ich verstehe den Unterschied zwischen Syntax und Semantik -

Syntax : wie die Symbole zu einem gültigen Ausdruck oder einer gültigen Anweisung kombiniert werden.
Semantik : Die Bedeutung der Symbole, die einen Ausdruck oder eine Aussage bilden.

Aber was ist die Grammatik? Zum Beispiel: Manchmal höre ich Leute sagen, dass ein Konstrukt "grammatikalisch falsch, syntaktisch aber richtig" ist. Was bedeutet es?

cpx
quelle
FWIW, das klingt für mich nach Unsinn. Wenn die Grammatik der Sprache den Code akzeptiert, entspricht sie der Syntax. Vielleicht hat jemand eine sehr breite (und nicht standardmäßige) Definition von "Syntax". Kontext / Quelle?
@delnan. Nicht wahr. Zum Beispiel int;ist grammatikalisch gültig, aber syntaktisch falsch in C ++. Die Grammatik hat kein Problem mit diesem Code, aber Syntaxbeschränkungen erfordern, dass ein Name angegeben wird, wenn der erste Teil einer Deklaration keinen Klassenspezifizierer oder Aufzählungsspezifizierer oder in C ++ 11 einen Freundespezifizierer enthält .
Johannes Schaub - litb
@ JohannesSchaub-litb: Möchtest du den Teil der Grammatik zitieren, der dies gültig macht?
@ Johannes Das ist das Gegenteil der Situation in der Frage.
Nicole
2
@ Johannes Schaub: Welche Regel macht "int;" gültig? Die Grammatik definiert die Syntax.
Casey Patton

Antworten:

6

Eine Grammatik ist eine Reihe von Regeln, die die Syntax für eine bestimmte Sprache definieren.

Wenn Leute speziell über einen Parser sprechen (insbesondere über einen Parser, der mit einem Parsergenerator wie yacc, Byacc, ANTLR usw. generiert wurde), können sie etwas mehr Haarspalterei betreiben und speziell über die syntaktischen Regeln sprechen, die mit Hilfe des Generators codiert werden Regeln im Vergleich zu den Teilen, die separat durch Code erzwungen werden, der an eine Regel angehängt ist. Wenn Sie beispielsweise in C ein Array definieren, muss die Größe, die Sie für das Array angeben, streng positiv sein (nicht null). Die Grammatikregel könnte im Grunde etwa so lauten:

typename var_name '[' unsigned_int ']'

... und dann gibt es separat ein bisschen Code, um zu überprüfen, ob das unsigned_int nicht Null ist. In diesem Fall könnte es sinnvoll sein, die Anforderungen der Syntax und der Grammatik getrennt voneinander zu besprechen, wobei die beiden leicht unterschiedliche Anforderungen haben (die zusammen erzwungen werden, setzen voraus, dass sie den Anforderungen der Sprache selbst entsprechen).

Jerry Sarg
quelle
3

Der Unterschied ist unscharf und es lohnt sich nicht, sich zu viele Sorgen zu machen.

Menschen werden manchmal kontextsensitive Einschränkungen unter dem Dach der syntaktischen Korrektheit einbeziehen. Das häufigste Beispiel ist ein Typensystem. Ein weiterer Grund ist Javas Regel "Keine Anweisungen nach Rückgabe". Dies vereinfacht die formale Diskussion: Die Syntax ergibt eine Sprache (eine Menge von Sätzen / Ausdrücken / Programmen), die der Bereich der Semantik ist; alles andere ist "kein Programm", und die Semantik braucht sich nicht darum zu kümmern.

Im Gegensatz dazu bezieht sich "Grammatik" typischerweise auf ein Verfahren zum Beschreiben von kontextfreien Sprachen (ungeachtet von Attributgrammatiken).

Der Grund, warum man sich nicht viele Sorgen machen sollte, ist, dass Typsysteme ebenso oft als "statische Semantik " einer Sprache angesehen werden wie als " syntaktische Disziplin für Korrektheit". Und manchmal hat eine Sprache keine richtige kontextfreie Grammatik. C muss beispielsweise Informationen aus dem Parser zurück in den Lexer übertragen.

Pragmatisch sollte jeder, der sich auf eine Unterscheidung zwischen "syntaktisch" und "grammatisch" stützt, dies sagen und erklären, was sie bedeuten.

Ryan Culpepper
quelle
Ich verstehe nicht, warum der Unterschied verschwommen ist. Die Grammatik beschreibt die Syntax.
Casey Patton
1
@Casey, nein, gemäß einer Verwendung des Wortes "Syntax" gibt die Grammatik eine Obermenge der Syntax an.
Ryan Culpepper
0

Eine Grammatik ist ein Regelwerk zur Definition einer Sprache. Vielmehr beschreibt die Grammatik die Syntax und Semantik . Eine Sprache kann zwei verschiedene Grammatiken haben:

  • Syntax-Grammatik (eine Reihe von Regeln, die die Reihenfolge der Symbole in der Sprache beschreiben)
  • Semantik-Grammatik (eine Reihe von Regeln, die die gültige semantische Platzierung und Verwendung dieser Symbole beschreiben)

Zum Beispiel könnte ein Teil der Grammatik in C ungefähr so ​​aussehen:

if statement -> if_keyword "(" expression ")" if_block
if_keyword -> "if"
logical_statement -> some other stuff here...

Bedeutung:

an if statement is made of an if keyword followed by a parenthesis followed by an expression followed by a parenthesis followed by an if block
an if keyword is ....

Schauen Sie sich diese Art der Definition einer Grammatik an . Wenn Sie wirklich neugierig auf Grammatiken sind, werfen Sie einen Blick auf GNU Bison , ein Werkzeug zur Beschreibung der Grammatik einer Sprache.

Das "grammatisch falsche, aber syntaktisch korrekte" macht nicht allzu viel Sinn. Vielleicht beziehen sie sich auf eine Grammatik, die die Semantik einer Sprache beschreibt. Es wäre sicherlich sinnvoller, nur "nicht semantisch korrekt" zu sagen.

Casey Patton
quelle
7
Nein, Grammatik definiert keine Semantik und sollte es niemals tun, es sei denn, es ist etwas Exotisches wie contextfreeart.org
SK-logic