Jaka jest różnica między składnią a gramatyką?

14

Rozumiem różnicę między składnią a semantyką -

Składnia : sposób łączenia symboli w celu utworzenia prawidłowego wyrażenia lub instrukcji.
Semantyka : znaczenie tych symboli, które tworzą wyrażenie lub wyrażenie.

Ale jaka jest gramatyka? Na przykład: czasami słyszę, jak ludzie mówią, że jakaś konstrukcja jest „niepoprawna gramatycznie, ale poprawna składniowo”. Co to znaczy?

CPX
źródło
FWIW, to brzmi dla mnie jak nonsens. Jeśli gramatyka języka akceptuje fragment kodu, jest on zgodny ze składnią. Być może ktoś ma bardzo szeroką (i niestandardową) definicję „składni”. Kontekst / źródło?
@delnan. Nie prawda. Na przykład int;jest poprawny gramatycznie, ale źle sformułowany w C ++. Gramatyka nie ma problemu z tym kodem, ale ograniczenia składniowe wymagają podania nazwy, jeśli pierwsza część deklaracji nie zawiera specyfikatora klasy lub specyfikatora wyliczeniowego , a w C ++ 11 specyfikatora znajomego .
Johannes Schaub - litb
@ JohannesSchaub-litb: Chcesz zacytować tę część gramatyki, która sprawia, że ​​jest to ważne?
@Johanes To jest odwrotność sytuacji w pytaniu.
Nicole
2
@ Johannes Schaub: Jaka reguła czyni „int;” ważny? Gramatyka określa składnię.
Casey Patton

Odpowiedzi:

6

Gramatyka to zestaw reguł, które definiują składnię dla określonego języka.

Kiedy ludzie mówią konkretnie o parserze (zwłaszcza generowanym za pomocą generatora parsera, takiego jak yacc, Byacc, ANTLR itp.), Mogą nieco rozdzielić włosy i mówić konkretnie o tych regułach składniowych, które są kodowane przy użyciu reguły, a te części, które są egzekwowane osobno przez kod dołączony do reguły. Na przykład w C podczas definiowania tablicy rozmiar określony dla tablicy musi być ściśle dodatni (nie zero). Reguła gramatyczna może w zasadzie powiedzieć coś takiego:

typename var_name '[' unsigned_int ']'

... a następnie osobno będzie trochę kodu, aby sprawdzić, czy unsigned_int był niezerowy. W tym przypadku, to mógłby zrobić jakiś sens mówić o wymagania składni i gramatyki niezależnie od siebie, przy czym dwa mające nieco inne wymogi (że egzekwowane wspólnie zakładają zmieścić wymagania samego języka).

Jerry Coffin
źródło
3

Różnica jest rozmyta i nie warto się zbytnio martwić.

Ludzie czasami uwzględniają ograniczenia kontekstowe pod parasolem poprawności składniowej. Najczęstszym przykładem jest system typów. Kolejną jest zasada Java „brak instrukcji po powrocie”. Upraszcza to formalną dyskusję: składnia daje język (zestaw zdań / wyrażeń / programów), który jest domeną semantyki; wszystko inne nie jest „programem”, a semantyka nie musi się tym przejmować.

W przeciwieństwie do tego, „gramatyki” typowo odnosi się do sposobu opisania bezkontekstowych języki (gramatyk atrybutów mimo wszystko).

Powodem, dla którego nie warto się zbytnio martwić, jest to, że systemy typów są równie często uważane za „statyczną semantykę ” języka, jak są one „ dyscypliną syntaktyczną dla poprawności”. A czasem język nie ma odpowiedniej gramatyki bezkontekstowej; Na przykład C musi przekazać informacje z analizatora składni z powrotem do leksera.

Pragmatycznie każdy, kto opiera się na rozróżnieniu między „składniowym” i „gramatycznym”, powinien to powiedzieć i wyjaśnić, co mają na myśli.

Ryan Culpepper
źródło
Nie rozumiem, dlaczego różnica jest rozmyta. Gramatyka opisuje składnię.
Casey Patton
1
@Casey, nie, zgodnie z jednym użyciem słowa „składnia” gramatyka określa nadzbiór składni.
Ryan Culpepper
0

Gramatyka to zestaw reguł definiujących język. Gramatyka opisuje raczej składnię i semantykę . Język może mieć dwie różne gramatyki:

  • Gramatyka składniowa (zestaw reguł opisujących kolejność symboli w języku)
  • Gramatyka semantyki (zbiór zasad opisujących prawidłowe umieszczanie semantyczne i użycie tych symboli)

Na przykład część gramatyki w C może wyglądać mniej więcej tak:

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

Znaczenie:

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

Spójrz na ten sposób definiowania gramatyki . Jeśli naprawdę interesujesz się gramatykami, spójrz na GNU Bison , który jest w zasadzie narzędziem do opisu gramatyki języka.

„Gramatycznie niepoprawne, ale poprawne składniowo” nie ma zbyt dużego sensu. Może odnoszą się do gramatyki opisującej semantykę języka. Jednak z pewnością bardziej sensowne byłoby po prostu powiedzenie „nie semantycznie poprawne”.

Casey Patton
źródło
7
Nie, gramatyka nie definiuje semantyki i nigdy nie powinna tego robić, chyba że jest to coś egzotycznego, na przykład contextfreeart.org
SK-logic