Чим відрізняється синтаксис від граматики?


14

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

Синтаксис : як символи поєднуються, щоб утворити дійсний вираз або вираз
Семантика : значення тих символів, які утворюють вираз чи вислів.

Але що таке граматика? Наприклад: іноді я чую, як люди кажуть, що якась конструкція є "граматично неправильною, але синтаксично вона правильною". Що це означає?


FWIW, це для мене звучить як дурниця. Якщо граматика мови приймає фрагмент коду, вона відповідає синтаксису. Можливо, у когось дуже широке (і нестандартне) визначення поняття «синтаксис». Контекст / джерело?

@delnan. Неправда. Наприклад int;, граматично справедливий, але синтаксично неправильно сформований у С ++. Граматика не має проблем з цим кодом, але синтаксичні обмеження вимагають, щоб ім’я було вказано, якщо перша частина декларації не містить специфікатора класу або enum-специфікатора, або, в C ++ 11, friend-specier .
Йоханнес Шауб - ліб

@ JohannesSchaub-litb: Хочете цитувати частину граматики, яка робить це дійсним?

@Johanes Це зворотня ситуація в питанні.
Ніколь

2
@ Йоханнес Шауб: Яке правило робить "int;" чинне? Граматика визначає синтаксис.
Кейсі Паттон

Відповіді:


6

Граматика - це набір правил, що визначають синтаксис для певної мови.

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

typename var_name '[' unsigned_int ']'

... а потім окремо, було б трохи коду, щоб перевірити, чи не підписаний_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-логіка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.