Qual è la differenza tra sintassi e grammatica?


14

Capisco la differenza tra sintassi e semantica -

Sintassi : come i simboli vengono combinati per formare un'espressione o un'istruzione valida.
Semantica : il significato di quei simboli che formano un'espressione o un'affermazione.

Ma qual è la grammatica? Ad esempio: a volte sento persone dire che un costrutto è "grammaticalmente errato ma sintatticamente è corretto". Cosa significa?


FWIW, questo mi sembra una sciocchezza. Se la grammatica della lingua accetta il pezzo di codice, è conforme alla sintassi. Forse qualcuno ha una definizione molto ampia (e non standard) di "sintassi". Contesto / source?

@delnan. Non vero. Ad esempio, int;è grammaticalmente valido, ma sintatticamente mal formato in C ++. La grammatica non ha problemi con questo codice, ma i vincoli di sintassi richiedono che venga fornito un nome se la prima parte di una dichiarazione non contiene specificatore di classe o specificatore di enum o, in C ++ 11, specificatore di amico .
Johannes Schaub - litb

@ JohannesSchaub-litb: Vuoi citare la parte della grammatica che lo rende valido?

@Johanes Questo è il contrario della situazione nella domanda.
Nicole,

2
@ Johannes Schaub: quale regola rende "int;" valido? La grammatica definisce la sintassi.
Casey Patton,

Risposte:


6

Una grammatica è un insieme di regole che definiscono la sintassi per una determinata lingua.

Quando le persone parlano specificamente di un parser (in particolare uno generato con un generatore di parser come yacc, Byacc, ANTLR, ecc.), Possono fare un po 'più di divisione dei capelli e parlare in particolare di quelle regole sintattiche che sono codificate usando il generatore regole, rispetto alle parti che vengono applicate separatamente dal codice allegato a una regola. Ad esempio, in C quando si definisce un array, la dimensione specificata per l'array deve essere strettamente positiva (non zero). La regola grammaticale potrebbe sostanzialmente dire qualcosa del tipo:

typename var_name '[' unsigned_int ']'

... e poi separatamente, ci sarebbe un po 'di codice per verificare che unsigned_int fosse diverso da zero. In questo caso, potrebbe avere senso parlare dei requisiti della sintassi e della grammatica separatamente l'uno dall'altro, con i due che hanno requisiti leggermente diversi (che, applicati insieme, presumiamo corrispondano ai requisiti della lingua stessa).


3

La differenza è confusa e non vale la pena preoccuparsi troppo.

Le persone a volte includeranno vincoli sensibili al contesto sotto l'egida della correttezza sintattica. L'esempio più comune è un sistema di tipi. Un'altra è la regola "nessuna istruzione dopo il ritorno" di Java. Questo semplifica la discussione formale: la sintassi produce una lingua (un insieme di frasi / espressioni / programmi) che è il dominio della semantica; qualsiasi altra cosa non è "un programma" e la semantica non deve preoccuparsene.

Al contrario, "grammatica" si riferisce in genere a un metodo per descrivere linguaggi senza contesto (nonostante le grammatiche degli attributi).

La ragione per cui non vale la pena preoccuparsi molto è che i sistemi di tipi sono spesso considerati la " semantica statica " di una lingua in quanto sono una " disciplina sintattica per la correttezza". E a volte una lingua non ha una vera grammatica senza contesto; C, ad esempio, deve reinserire le informazioni dal parser nel lexer.

Pragmaticamente, chiunque faccia affidamento su una distinzione tra "sintattico" e "grammaticale" dovrebbe dirlo meglio e spiegarne il significato.


Non capisco perché la differenza sia confusa. La grammatica descrive la sintassi.
Casey Patton,

1
@Casey, no, secondo un uso della parola "sintassi", la grammatica specifica un superset della sintassi.
Ryan Culpepper,

0

Una grammatica è un insieme di regole per definire una lingua. Piuttosto, la grammatica descrive la sintassi e la semantica . Una lingua potrebbe avere due grammatiche diverse:

  • Grammatica della sintassi (un insieme di regole che descrive l'ordinamento dei simboli nella lingua)
  • Grammatica semantica (un insieme di regole che descrivono il posizionamento semantico valido e l'uso di quei simboli)

Ad esempio, una parte della grammatica in C potrebbe assomigliare a:

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

Senso:

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 ....

Dai un'occhiata a questo modo di definire una grammatica . Se sei davvero curioso di grammatiche, dai un'occhiata a GNU Bison , che è fondamentalmente uno strumento per descrivere la grammatica di una lingua.

Il "grammaticalmente errato ma sintatticamente corretto" non ha molto senso. Forse si riferiscono a una grammatica che descrive la semantica di una lingua. Avrebbe sicuramente più senso dire "non semanticamente corretto", però.


7
No, la grammatica non definisce la semantica e non dovrebbe mai farlo, a meno che non sia qualcosa di esotico, come contextfreeart.org
SK-logic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.