В чем разница между синтаксисом и грамматикой?

14

Я понимаю разницу между синтаксисом и семантикой -

Синтаксис : как символы объединяются в правильное выражение или утверждение.
Семантика : значение тех символов, которые образуют выражение или утверждение.

Но что такое грамматика? Например: иногда я слышу, как люди говорят, что какая-то конструкция «грамматически неверна, но синтаксически это правильно». Что это означает?

мп
источник
FWIW, это звучит как глупость для меня. Если грамматика языка принимает фрагмент кода, он соответствует синтаксису. Возможно, у кого-то есть очень широкое (и нестандартное) определение «синтаксиса». Контекст / источник?
@delnan. Не правда. Например int;, грамматически допустимо, но синтаксически плохо сформировано в C ++. Грамматика не имеет проблем с этим кодом, но синтаксические ограничения требуют, чтобы имя указывалось, если первая часть объявления не содержит спецификатора класса или спецификатора перечисления или, в C ++ 11, спецификатора друга .
Йоханнес Шауб -
@ JohannesSchaub-litb: Хотите процитировать часть грамматики, которая делает это действительным?
@Johanes Это обратная ситуация в вопросе.
Николь
2
@ Йоханнес Шауб: Какое правило делает "Int;" действует? Грамматика определяет синтаксис.
Кейси Паттон

Ответы:

6

Грамматика - это набор правил, которые определяют синтаксис для конкретного языка.

Когда люди говорят конкретно о парсере (особенно тот, который сгенерирован с помощью генератора парсера, такого как yacc, Byacc, ANTLR и т. Д.), Они могут немного больше расстраиваться и говорить конкретно о тех синтаксических правилах, которые кодируются с помощью генератора. правила по сравнению с теми частями, которые применяются отдельно кодом, прикрепленным к правилу. Например, в C, когда вы определяете массив, размер, который вы указываете для массива, должен быть строго положительным (не нулевым). Правило грамматики может в основном сказать что-то вроде:

typename var_name '[' unsigned_int ']'

... а затем отдельно, было бы немного кода, чтобы проверить, что unsigned_int был ненулевым. В этом случае может иметь смысл говорить о требованиях к синтаксису и грамматике отдельно друг от друга, так как эти два имеют немного разные требования (которые, соблюдая друг друга, мы предполагаем, соответствуют требованиям самого языка).

Джерри Гроб
источник
3

Разница нечеткая и не стоит беспокоиться о чересчур.

Люди иногда включают контекстно-зависимые ограничения под эгидой синтаксической корректности. Наиболее распространенный пример - система типов. Другое - это правило Java «без утверждений после возврата». Это упрощает формальное обсуждение: синтаксис дает язык (набор предложений / выражений / программ), который является областью семантики; все остальное не "программа", и семантика не должна беспокоиться об этом.

Напротив, «грамматика» обычно относится к методу описания языков без контекста (несмотря на атрибутную грамматику).

Причина, по которой беспокоиться не о чем, заключается в том, что системы типов так же часто рассматриваются как «статическая семантика » языка, как и « синтаксическая дисциплина для корректности». И иногда у языка не совсем правильная грамматика без контекста; C, например, должен передавать информацию из анализатора обратно в лексер.

Прагматически, любой, кто опирается на различие между «синтаксическим» и «грамматическим», должен лучше сказать об этом и объяснить, что они имеют в виду.

Райан Калпеппер
источник
Я не понимаю, почему разница нечеткая. Грамматика описывает синтаксис.
Кейси Паттон
1
@ Casey, нет, согласно одному использованию слова «синтаксис», грамматика определяет расширенный набор синтаксиса.
Райан Калпеппер
0

Грамматика - это набор правил для определения языка. Скорее, грамматика описывает синтаксис и семантику . Язык может иметь две разные грамматики:

  • Синтаксическая грамматика (набор правил, описывающих порядок символов в языке)
  • Грамматика семантики (набор правил, описывающих правильное семантическое размещение и использование этих символов)

Например, часть грамматики в C может выглядеть примерно так:

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

Смысл:

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

Взгляните на этот способ определения грамматики . Если вам действительно интересны грамматики, взгляните на GNU Bison , который в основном является инструментом для описания грамматики языка.

«Грамматически неправильный, но синтаксически правильный» не имеет особого смысла. Возможно, они имеют в виду грамматику, описывающую семантику языка. Конечно, было бы более разумно просто сказать «не семантически правильно».

Кейси Паттон
источник
7
Нет, грамматика не определяет семантику и никогда не должна делать это, если это не что-то экзотическое, например contextfreeart.org
SK-logic