Синтаксис комп'ютерної мови — це сукупність правил, що визначають комбінації символів, які вважаються правильно структурованим документом або фрагментом цієї мови. Це стосується як мов програмування, результатом якого є початковий код, так і мов розмітки, результатом якого є дані.
Синтаксис мови визначає її форму. Текстові комп'ютерні мови базуються на послідовностях символів, а візуальні мови програмування — на просторовому макеті та зв'язках між символами (які можуть бути текстовими чи графічними). Про документи, які синтаксично не правильні, кажуть, що вони мають синтаксичну помилку. Під час розробки синтаксису мови, розробник починає писати приклади як правильних, так і неправильних рядків, перш ніж спробувати з'ясувати загальні правила з цих прикладів.
Отже, синтаксис відноситься до форми, і він протиставляється семантиці — значенням. При використанні комп'ютерних мов семантична обробка зазвичай відбувається після синтаксичної; однак, в деяких випадках для повного синтаксичного аналізу необхідна семантична обробка, і вони виконуються або разом або одночасно. У компіляторі синтаксичний аналіз включає (передній план), тоді як семантичний аналіз включає (вихідний) (і проміжну фазу, якщо цю фазу розрізняють).
Рівні синтаксису
Синтаксис комп'ютерної мови, як правило, розрізняють на три рівні:
- Слова — лексичний рівень, що визначає, як символи утворюють лексеми;
- Фрази — рівень граматики, який визначає, як лексеми утворюють фрази;
- Контекст — визначення, на що посилаються імена об'єктів або змінних, якщо типи є придатними, тощо.
Такий підхід забезпечує модульність, яка дозволяє описувати та обробляти кожен рівень окремо і часто незалежно. По-перше, лексер перетворює лінійну послідовність символів у лінійну послідовність (лексем) (також відомо як «лексичний аналіз»). По-друге, аналізатор перетворює лінійну послідовність лексем у ієрархічне дерево синтаксису (відомо як «синтаксичний аналіз»). По-третє, контекстуальний аналіз визначає імена та перевіряє типи. Ця модульність іноді можлива, але у більшості мов світу попередній крок залежить від пізнішого кроку — наприклад, [en] у C відбувається тому, що токенізація залежить від контексту. Навіть у цих випадках синтаксичний аналіз часто сприймається як наближення до ідеальної моделі.
Стадії синтаксичного розбору можна розділити на дві частини: дерево розбору, або «дерево конкретного синтаксису», яке визначається граматикою, але, як правило, занадто детальне для практичного використання, і абстрактне синтаксичне дерево (АСД), що спрощує задачу до зручної форми. Етапи АСД та контекстуального аналізу можна вважати формою семантичного аналізу, оскільки вони додають значення та інтерпретацію синтаксису, або ручну реалізацію синтаксичних правил, яку було б важко або незручно описати чи реалізувати формально.
Рівні зазвичай відповідають рівням в ієрархії Чомскі. Слова належать регулярній мові, породжуваній [en] (КВМ), як правило, [en] (ДКВМ), зазначеною в [en] фрази, яка є граматикою типу 2, поданою як [en] у формі Бекуса — Наура (ФБН). Граматики фраз часто задаються в набагато більш обмежених граматиках, ніж повні контекстно-вільні граматики, щоб зробити їх більш легкими для синтаксичного аналізу; в той час як [en] може аналізувати будь-яку ДКВМ в лінійному часі, простий синтаксичний [en] і ще простіший синтаксичний аналізатор LL ефективніші, але можуть аналізувати тільки граматики, породжувальні правила яких є обмеженими.
Загалом, контекстна структура може бути описана контекстно-залежною граматикою та автоматично проаналізована такими засобами, як [en], хоча, як правило, цей крок виконується вручну, за допомогою [en] та перевірки типу, і реалізується через таблицю символів, який зберігає назви та типи для кожної області застосування.
Були написані інструменти, які автоматично генерують лексер з лексичної специфікації, написаної в регулярних виразах, і парсер з граматики фраз, написаної в ФБН: це дозволяє використовувати декларативне програмування, а не процедурне чи функціональне. Помітним прикладом є пара [en]-Yacc. Вони автоматично створюють конкретне синтаксичне дерево. Після цього автор-аналізатор повинен вручну написати код, який описує, як це перетворюється на абстрактне синтаксичне дерево. Контекстний аналіз також зазвичай виконується вручну. Незважаючи на існування цих автоматичних інструментів, синтаксичний аналіз часто реалізовується вручну з різних причин — можливо, структура фрази не є контекстною, або альтернативна реалізація покращує ефективність чи повідомлення про помилки, або дозволяє граматику змінювати легше. Парсери часто пишуться на функціональних мовах, таких як Haskell, або на мовах скриптів, таких як Python або Perl, або на C або .
Приклади помилок
Наприклад, (add 1 1)
— є синтаксично правильною програмою Lisp (за умови, що функція «add» існує, інакше дозвіл імен не виконується), яка додає 1 і 1. Однак наступні дії є неприпустимими:
(_ 1 1) lexical error: '_' is not valid
(add 1 1 parsing error: missing closing ')'
Зверніть увагу на те, що лексер не може ідентифікувати першу помилку — все, що він знає, це те, що після створення токена LEFT_PAREN, після '(' подальша частина програми непридатна, оскільки, згідно правил, жодне слова не починається з '_'. Друга помилка виявляється на етапі синтаксичного аналізу: синтаксичний аналізатор визначив породжувальне правило «list» через токен '(' (як єдиний збіг), і тому може видати повідомлення про помилку; у загальному випадку вона може бути [en].
Помилки типу і неоголошені помилки змінних іноді вважаються синтаксичними помилками, коли вони виявляються під час компіляції (що зазвичай буває при компіляції строго типізованих мов), хоча зазвичай такі помилки класифікуються як семантичні.
Як приклад — код Python
'a' + 1
містить помилку типу, так як вона додає рядковий літерал до цілочисельного літералу. Типи помилок такого роду можуть бути виявлені під час компіляції: вони можуть бути знайденими під час аналізу (аналізу фрази), якщо компілятор використовує окремі правила, які дозволяють «integerLiteral + integerLiteral», але не «stringLiteral + integerLiteral», хоча більш імовірно, що компілятор буде використовувати правило парсингу, яке дозволяє всі вирази виду «LiteralOrIdentifier + LiteralOrIdentifier», і тоді помилки будуть виявлені в ході контекстуального аналізу (при перевірці типу). У деяких випадках ця перевірка не виконується компілятором, і ці помилки виявляються лише під час виконання.
У мовах з (динамічною типізацією) багато помилок типу можна виявити лише під час виконання. Наприклад, код Python
a + b
синтаксично коректний на рівні фраз, але коректність типів a і b може бути визначена тільки під час виконання, оскільки змінні не мають типів у Python, а лише значення. Якщо існують розбіжності щодо того, чи повинна помилка типу, виявлена компілятором, називатися синтаксичною помилкою (а не (статичною семантичною) помилкою), помилки типу, які можна виявити лише під час виконання програми, завжди розглядаються як семантичні, а не синтаксичні помилки.
Визначення синтаксису
Синтаксис текстових мов програмування зазвичай визначається з допомогою комбінації регулярних виразів (для лексичної структури) та нотації Бекуса — Наура (для граматичної структури) для індуктивного визначення синтаксичних категорій та символів терміналу. Синтаксичні категорії визначаються правилами, вони називаються [en] та визначають до якої синтаксичної категорії належать значення. Термінальні символи — це конкретні символи або рядки символів (наприклад, ключові слова, такі як define, if, let або void), з яких будуються синтаксично коректні програми.
Мова може мати різні еквівалентні граматики, такі як еквівалентні регулярні вирази (на лексичному рівні) або різні правила фраз, які генерують одну й ту саму мову. Використання більш широкої категорії граматик, такої як граматика LR, може дозволити більш короткі або більш прості граматики у порівнянні з обмеженими категоріями, такими як граматика LL, яка може зажадати більш довгих граматик з великою кількістю правил. Різні, але еквівалентні граматики фраз дають різні дерева синтаксичного аналізу, хоча базова мова (набір допустимих документів) одна і та сама.
Приклад: Lisp S-вирази
Нижче наведена проста граматика, визначена з використанням нотації регулярних виразів і розширеної нотації Бекуса — Наура. Приклад описує синтаксис S-виразів та даних для мови програмування Lisp, який визначає [en] для синтаксичних категорій expression, atom, number, symbol та list:
expression = atom | list atom = number | symbol number = [+-]?['0'-'9']+ symbol = ['A'-'Z']['A'-'Z''0'-'9'].* list = '(', expression*, ')'
Ця граматика визначає наступне:
- вираз — це атом або список;
- атом — це число або символ;
- число — це неперервна послідовність однієї або декількох десяткових цифр, яким необов'язково передує знак плюс або мінус;
- символ — це літера за якою йдуть нуль або більше будь-яких символів (за винятком пробілів);
- список — це узгоджена пара дужок всередині якої нуль або більше виразів;
Тут десяткові цифри, символи верхнього і нижнього регістру, а також круглі дужки є термінальними символами.
Нижче наведені приклади правильно побудованих послідовностей лексем в цій граматиці: '12345
', '()
', '(A B C232 (1))
'
Складні граматики
Граматику, необхідну для визначення мови програмування, можна класифікувати за її положенням в ієрархії Чомскі. Граматика фраз більшості мов програмування може бути визначена за допомогою граматики типу 2, тобто вони є контекстно-вільними граматиками, хоча загальний синтаксис є контекстно-залежним (через оголошення змінних і вкладені області), отже, типом 1. Однак є винятки, і для деяких мов граматика фраз має тип 0 (Turing-complete).
В деяких мовах, таких як Perl і Lisp, специфікація (чи реалізація) мови дозволяє створювати конструкції, які виконуються на етапі синтаксичного аналізу. Крім того, ці мови мають конструкції, які дозволяють програмісту змінювати поведінку аналізатора. Ця комбінація ефективно розмиває відмінність між синтаксичним розбором та виконанням, а також робить аналіз синтаксису нерозв'язною проблемою в цих мовах, що означає, що фаза синтаксичного аналізу може не завершитися. Наприклад, в Perl можна виконати код під час синтаксичного аналізу з використанням оператора BEGIN
, а прототипи функцій Perl можуть змінити синтаксичну інтерпретацію і, можливо, навіть синтаксичну валідність коду. У розмовній мові це називається «тільки Perl може аналізувати Perl» (тому що код повинен виконуватися під час синтаксичного аналізу і може змінювати граматику), або більш сильно «навіть Perl не може аналізувати Perl» (бо це нерозв'язне). Аналогічно, макроси Lisp, введені синтаксисом defmacro
, також виконуються під час синтаксичного аналізу, а це означає, що компілятор Lisp повинен мати всю систему часу виконання Lisp. На відміну від цього, макроси C є просто заміною рядків і не вимагають виконання коду.
Синтаксис проти семантики
Синтаксис мови описує форму допустимої програми, але не надає ніякої інформації про значення програми або результати виконання цієї програми. Значення, що надається комбінації символів, обробляється семантикою. Не всі синтаксично правильні програми є семантично правильними. Існує багато синтаксично правильних програм, проте, вони утворені не правильно відповідно до правил мови; і можуть (в залежності від специфікації мови і [en]) привести до помилки при перекладі або виконанні. У деяких випадках такі програми можуть проявляти невизначену поведінку. Навіть коли програма чітко визначена в мові, вона все одно може мати значення, яке не передбачувалося автором.
Під час використання природної мови як прикладу, можемо зробити висновок, що неможливо призначати значення граматично правильному реченню, або речення може бути помилковим:
- [en]»: граматично правильно утворене речення, але не має прийнятного значення.
- «Джон — одружений холостяк»: граматично правильно утворене речення, але виражає значення, яке не може бути правдою.
Наступний фрагмент мови C синтаксично коректний, але виконує операцію, яка не визначена семантично (оскільки p — це нульовий вказівник, операції p-> real і p-> im не мають сенсу):
complex *p = NULL; complex abs_p = sqrt (p->real * p->real + p->im * p->im);
Або простіший приклад:
int x; printf("%d", x);
є синтаксично допустимим, але не є семантично визначеним, оскільки використовує [en]. Незважаючи на те, що компілятори для деяких мов програмування (наприклад, Java і C#) будуть виявляти помилки неініціалізованих змінних такого роду, вони повинні розглядатися як (семантичні) помилки, а не помилки синтаксису.
Див. також
Щоб швидко порівняти синтаксис різних мов програмування, перегляньте список з прикладами програми «Hello world!» на різних мовах:
- Синтаксис Прологу
- [en]
- [en]
- [en]
- [en]
- Синтаксис JavaScript
- [en]
- Синтаксис Луа
- [en]
Примітки
- What is Syntax?. www.computerhope.com (англ.). Процитовано 5 серпня 2019.
- Friedman, Daniel P.; Mitchell Wand; Christopher T. Haynes (1992). Essentials of Programming Languages (вид. 1st). The MIT Press. ISBN .
- Smith, Dennis (1999). Designing Maintainable Software. Springer Science & Business Media.
- Aho, Alfred V.; Monica S. Lam; Ravi Sethi; Jeffrey D. Ullman (2007). Compilers: Principles, Techniques, and Tools (вид. 2nd). Addison Wesley. ISBN .Section 4.1.3: Syntax Error Handling, pp.194–195.
- Louden, Kenneth C. (1997). Compiler Construction: Principles and Practice. Brooks/Cole. ISBN . Exercise 1.3, pp.27–28.
- Semantic Errors in Java.
- (1997). Introduction to the Theory of Computation. PWS Publishing. ISBN . Section 2.2: Pushdown Automata, pp.101–114.
- В наступних обговореннях можна знайти приклади:
- Perl and Undecidability
- LtU comment clarifying that the undecidable problem is membership in the class of Perl programs
- chromatic's example of Perl code that gives a syntax error depending on the value of random variable
- . Apl.jhu.edu. 8 лютого 1996. Архів оригіналу за 6 серпня 2013. Процитовано 17 серпня 2013.
- The Common Lisp Cookbook - Macros and Backquote. Cl-cookbook.sourceforge.net. 16 січня 2007. Процитовано 17 серпня 2013.
- Issue of syntax or semantics?
Посилання
- Різні синтаксичні конструкції, що використовуються в мовах комп'ютерного програмування
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Sintaksis komp yuternoyi movi ce sukupnist pravil sho viznachayut kombinaciyi simvoliv yaki vvazhayutsya pravilno strukturovanim dokumentom abo fragmentom ciyeyi movi Ce stosuyetsya yak mov programuvannya rezultatom yakogo ye pochatkovij kod tak i mov rozmitki rezultatom yakogo ye dani Pidsvichuvannya sintaksisu ta vidstupi chasto vikoristovuyutsya dlya dopomogi programistam u rozpiznavanni elementiv vihidnogo kodu Cej kod Python vikoristovuye kolorove vidilennya Sintaksis movi viznachaye yiyi formu Tekstovi komp yuterni movi bazuyutsya na poslidovnostyah simvoliv a vizualni movi programuvannya na prostorovomu maketi ta zv yazkah mizh simvolami yaki mozhut buti tekstovimi chi grafichnimi Pro dokumenti yaki sintaksichno ne pravilni kazhut sho voni mayut sintaksichnu pomilku Pid chas rozrobki sintaksisu movi rozrobnik pochinaye pisati prikladi yak pravilnih tak i nepravilnih ryadkiv persh nizh sprobuvati z yasuvati zagalni pravila z cih prikladiv Otzhe sintaksis vidnositsya do formi i vin protistavlyayetsya semantici znachennyam Pri vikoristanni komp yuternih mov semantichna obrobka zazvichaj vidbuvayetsya pislya sintaksichnoyi odnak v deyakih vipadkah dlya povnogo sintaksichnogo analizu neobhidna semantichna obrobka i voni vikonuyutsya abo razom abo odnochasno U kompilyatori sintaksichnij analiz vklyuchaye perednij plan todi yak semantichnij analiz vklyuchaye vihidnij i promizhnu fazu yaksho cyu fazu rozriznyayut Rivni sintaksisuSintaksis komp yuternoyi movi yak pravilo rozriznyayut na tri rivni Slova leksichnij riven sho viznachaye yak simvoli utvoryuyut leksemi Frazi riven gramatiki yakij viznachaye yak leksemi utvoryuyut frazi Kontekst viznachennya na sho posilayutsya imena ob yektiv abo zminnih yaksho tipi ye pridatnimi tosho Takij pidhid zabezpechuye modulnist yaka dozvolyaye opisuvati ta obroblyati kozhen riven okremo i chasto nezalezhno Po pershe lekser peretvoryuye linijnu poslidovnist simvoliv u linijnu poslidovnist leksem takozh vidomo yak leksichnij analiz Po druge analizator peretvoryuye linijnu poslidovnist leksem u iyerarhichne derevo sintaksisu vidomo yak sintaksichnij analiz Po tretye kontekstualnij analiz viznachaye imena ta pereviryaye tipi Cya modulnist inodi mozhliva ale u bilshosti mov svitu poperednij krok zalezhit vid piznishogo kroku napriklad en u C vidbuvayetsya tomu sho tokenizaciya zalezhit vid kontekstu Navit u cih vipadkah sintaksichnij analiz chasto sprijmayetsya yak nablizhennya do idealnoyi modeli Stadiyi sintaksichnogo rozboru mozhna rozdiliti na dvi chastini derevo rozboru abo derevo konkretnogo sintaksisu yake viznachayetsya gramatikoyu ale yak pravilo zanadto detalne dlya praktichnogo vikoristannya i abstraktne sintaksichne derevo ASD sho sproshuye zadachu do zruchnoyi formi Etapi ASD ta kontekstualnogo analizu mozhna vvazhati formoyu semantichnogo analizu oskilki voni dodayut znachennya ta interpretaciyu sintaksisu abo ruchnu realizaciyu sintaksichnih pravil yaku bulo b vazhko abo nezruchno opisati chi realizuvati formalno Rivni zazvichaj vidpovidayut rivnyam v iyerarhiyi Chomski Slova nalezhat regulyarnij movi porodzhuvanij en KVM yak pravilo en DKVM zaznachenoyu v en frazi yaka ye gramatikoyu tipu 2 podanoyu yak en u formi Bekusa Naura FBN Gramatiki fraz chasto zadayutsya v nabagato bilsh obmezhenih gramatikah nizh povni kontekstno vilni gramatiki shob zrobiti yih bilsh legkimi dlya sintaksichnogo analizu v toj chas yak en mozhe analizuvati bud yaku DKVM v linijnomu chasi prostij sintaksichnij en i she prostishij sintaksichnij analizator LL efektivnishi ale mozhut analizuvati tilki gramatiki porodzhuvalni pravila yakih ye obmezhenimi Zagalom kontekstna struktura mozhe buti opisana kontekstno zalezhnoyu gramatikoyu ta avtomatichno proanalizovana takimi zasobami yak en hocha yak pravilo cej krok vikonuyetsya vruchnu za dopomogoyu en ta perevirki tipu i realizuyetsya cherez tablicyu simvoliv yakij zberigaye nazvi ta tipi dlya kozhnoyi oblasti zastosuvannya Buli napisani instrumenti yaki avtomatichno generuyut lekser z leksichnoyi specifikaciyi napisanoyi v regulyarnih virazah i parser z gramatiki fraz napisanoyi v FBN ce dozvolyaye vikoristovuvati deklarativne programuvannya a ne procedurne chi funkcionalne Pomitnim prikladom ye para en Yacc Voni avtomatichno stvoryuyut konkretne sintaksichne derevo Pislya cogo avtor analizator povinen vruchnu napisati kod yakij opisuye yak ce peretvoryuyetsya na abstraktne sintaksichne derevo Kontekstnij analiz takozh zazvichaj vikonuyetsya vruchnu Nezvazhayuchi na isnuvannya cih avtomatichnih instrumentiv sintaksichnij analiz chasto realizovuyetsya vruchnu z riznih prichin mozhlivo struktura frazi ne ye kontekstnoyu abo alternativna realizaciya pokrashuye efektivnist chi povidomlennya pro pomilki abo dozvolyaye gramatiku zminyuvati legshe Parseri chasto pishutsya na funkcionalnih movah takih yak Haskell abo na movah skriptiv takih yak Python abo Perl abo na C abo C Prikladi pomilok Div takozh Sintaksichna pomilka Napriklad add 1 1 ye sintaksichno pravilnoyu programoyu Lisp za umovi sho funkciya add isnuye inakshe dozvil imen ne vikonuyetsya yaka dodaye 1 i 1 Odnak nastupni diyi ye nepripustimimi 1 1 lexical error is not valid add 1 1 parsing error missing closing Zvernit uvagu na te sho lekser ne mozhe identifikuvati pershu pomilku vse sho vin znaye ce te sho pislya stvorennya tokena LEFT PAREN pislya podalsha chastina programi nepridatna oskilki zgidno pravil zhodne slova ne pochinayetsya z Druga pomilka viyavlyayetsya na etapi sintaksichnogo analizu sintaksichnij analizator viznachiv porodzhuvalne pravilo list cherez token yak yedinij zbig i tomu mozhe vidati povidomlennya pro pomilku u zagalnomu vipadku vona mozhe buti en Pomilki tipu i neogolosheni pomilki zminnih inodi vvazhayutsya sintaksichnimi pomilkami koli voni viyavlyayutsya pid chas kompilyaciyi sho zazvichaj buvaye pri kompilyaciyi strogo tipizovanih mov hocha zazvichaj taki pomilki klasifikuyutsya yak semantichni Yak priklad kod Python a 1 mistit pomilku tipu tak yak vona dodaye ryadkovij literal do cilochiselnogo literalu Tipi pomilok takogo rodu mozhut buti viyavleni pid chas kompilyaciyi voni mozhut buti znajdenimi pid chas analizu analizu frazi yaksho kompilyator vikoristovuye okremi pravila yaki dozvolyayut integerLiteral integerLiteral ale ne stringLiteral integerLiteral hocha bilsh imovirno sho kompilyator bude vikoristovuvati pravilo parsingu yake dozvolyaye vsi virazi vidu LiteralOrIdentifier LiteralOrIdentifier i todi pomilki budut viyavleni v hodi kontekstualnogo analizu pri perevirci tipu U deyakih vipadkah cya perevirka ne vikonuyetsya kompilyatorom i ci pomilki viyavlyayutsya lishe pid chas vikonannya U movah z dinamichnoyu tipizaciyeyu bagato pomilok tipu mozhna viyaviti lishe pid chas vikonannya Napriklad kod Python a b sintaksichno korektnij na rivni fraz ale korektnist tipiv a i b mozhe buti viznachena tilki pid chas vikonannya oskilki zminni ne mayut tipiv u Python a lishe znachennya Yaksho isnuyut rozbizhnosti shodo togo chi povinna pomilka tipu viyavlena kompilyatorom nazivatisya sintaksichnoyu pomilkoyu a ne statichnoyu semantichnoyu pomilkoyu pomilki tipu yaki mozhna viyaviti lishe pid chas vikonannya programi zavzhdi rozglyadayutsya yak semantichni a ne sintaksichni pomilki Viznachennya sintaksisuRozbir dereva kodu Python z tokenizaciyeyu vstavki Sintaksis tekstovih mov programuvannya zazvichaj viznachayetsya z dopomogoyu kombinaciyi regulyarnih viraziv dlya leksichnoyi strukturi ta notaciyi Bekusa Naura dlya gramatichnoyi strukturi dlya induktivnogo viznachennya sintaksichnih kategorij ta simvoliv terminalu Sintaksichni kategoriyi viznachayutsya pravilami voni nazivayutsya en ta viznachayut do yakoyi sintaksichnoyi kategoriyi nalezhat znachennya Terminalni simvoli ce konkretni simvoli abo ryadki simvoliv napriklad klyuchovi slova taki yak define if let abo void z yakih buduyutsya sintaksichno korektni programi Mova mozhe mati rizni ekvivalentni gramatiki taki yak ekvivalentni regulyarni virazi na leksichnomu rivni abo rizni pravila fraz yaki generuyut odnu j tu samu movu Vikoristannya bilsh shirokoyi kategoriyi gramatik takoyi yak gramatika LR mozhe dozvoliti bilsh korotki abo bilsh prosti gramatiki u porivnyanni z obmezhenimi kategoriyami takimi yak gramatika LL yaka mozhe zazhadati bilsh dovgih gramatik z velikoyu kilkistyu pravil Rizni ale ekvivalentni gramatiki fraz dayut rizni dereva sintaksichnogo analizu hocha bazova mova nabir dopustimih dokumentiv odna i ta sama Priklad Lisp S virazi Nizhche navedena prosta gramatika viznachena z vikoristannyam notaciyi regulyarnih viraziv i rozshirenoyi notaciyi Bekusa Naura Priklad opisuye sintaksis S viraziv ta danih dlya movi programuvannya Lisp yakij viznachaye en dlya sintaksichnih kategorij expression atom number symbol ta list expression atom list atom number symbol number 0 9 symbol A Z A Z 0 9 list expression Cya gramatika viznachaye nastupne viraz ce atom abo spisok atom ce chislo abo simvol chislo ce neperervna poslidovnist odniyeyi abo dekilkoh desyatkovih cifr yakim neobov yazkovo pereduye znak plyus abo minus simvol ce litera za yakoyu jdut nul abo bilshe bud yakih simvoliv za vinyatkom probiliv spisok ce uzgodzhena para duzhok vseredini yakoyi nul abo bilshe viraziv Tut desyatkovi cifri simvoli verhnogo i nizhnogo registru a takozh krugli duzhki ye terminalnimi simvolami Nizhche navedeni prikladi pravilno pobudovanih poslidovnostej leksem v cij gramatici 12345 A B C232 1 Skladni gramatiki Gramatiku neobhidnu dlya viznachennya movi programuvannya mozhna klasifikuvati za yiyi polozhennyam v iyerarhiyi Chomski Gramatika fraz bilshosti mov programuvannya mozhe buti viznachena za dopomogoyu gramatiki tipu 2 tobto voni ye kontekstno vilnimi gramatikami hocha zagalnij sintaksis ye kontekstno zalezhnim cherez ogoloshennya zminnih i vkladeni oblasti otzhe tipom 1 Odnak ye vinyatki i dlya deyakih mov gramatika fraz maye tip 0 Turing complete V deyakih movah takih yak Perl i Lisp specifikaciya chi realizaciya movi dozvolyaye stvoryuvati konstrukciyi yaki vikonuyutsya na etapi sintaksichnogo analizu Krim togo ci movi mayut konstrukciyi yaki dozvolyayut programistu zminyuvati povedinku analizatora Cya kombinaciya efektivno rozmivaye vidminnist mizh sintaksichnim rozborom ta vikonannyam a takozh robit analiz sintaksisu nerozv yaznoyu problemoyu v cih movah sho oznachaye sho faza sintaksichnogo analizu mozhe ne zavershitisya Napriklad v Perl mozhna vikonati kod pid chas sintaksichnogo analizu z vikoristannyam operatora BEGIN a prototipi funkcij Perl mozhut zminiti sintaksichnu interpretaciyu i mozhlivo navit sintaksichnu validnist kodu U rozmovnij movi ce nazivayetsya tilki Perl mozhe analizuvati Perl tomu sho kod povinen vikonuvatisya pid chas sintaksichnogo analizu i mozhe zminyuvati gramatiku abo bilsh silno navit Perl ne mozhe analizuvati Perl bo ce nerozv yazne Analogichno makrosi Lisp vvedeni sintaksisom defmacro takozh vikonuyutsya pid chas sintaksichnogo analizu a ce oznachaye sho kompilyator Lisp povinen mati vsyu sistemu chasu vikonannya Lisp Na vidminu vid cogo makrosi C ye prosto zaminoyu ryadkiv i ne vimagayut vikonannya kodu Sintaksis proti semantikiSintaksis movi opisuye formu dopustimoyi programi ale ne nadaye niyakoyi informaciyi pro znachennya programi abo rezultati vikonannya ciyeyi programi Znachennya sho nadayetsya kombinaciyi simvoliv obroblyayetsya semantikoyu Ne vsi sintaksichno pravilni programi ye semantichno pravilnimi Isnuye bagato sintaksichno pravilnih program prote voni utvoreni ne pravilno vidpovidno do pravil movi i mozhut v zalezhnosti vid specifikaciyi movi i en privesti do pomilki pri perekladi abo vikonanni U deyakih vipadkah taki programi mozhut proyavlyati neviznachenu povedinku Navit koli programa chitko viznachena v movi vona vse odno mozhe mati znachennya yake ne peredbachuvalosya avtorom Pid chas vikoristannya prirodnoyi movi yak prikladu mozhemo zrobiti visnovok sho nemozhlivo priznachati znachennya gramatichno pravilnomu rechennyu abo rechennya mozhe buti pomilkovim en gramatichno pravilno utvorene rechennya ale ne maye prijnyatnogo znachennya Dzhon odruzhenij holostyak gramatichno pravilno utvorene rechennya ale virazhaye znachennya yake ne mozhe buti pravdoyu Nastupnij fragment movi C sintaksichno korektnij ale vikonuye operaciyu yaka ne viznachena semantichno oskilki p ce nulovij vkazivnik operaciyi p gt real i p gt im ne mayut sensu complex p NULL complex abs p sqrt p gt real p gt real p gt im p gt im Abo prostishij priklad int x printf d x ye sintaksichno dopustimim ale ne ye semantichno viznachenim oskilki vikoristovuye en Nezvazhayuchi na te sho kompilyatori dlya deyakih mov programuvannya napriklad Java i C budut viyavlyati pomilki neinicializovanih zminnih takogo rodu voni povinni rozglyadatisya yak semantichni pomilki a ne pomilki sintaksisu Div takozhShob shvidko porivnyati sintaksis riznih mov programuvannya pereglyante spisok z prikladami programi Hello world na riznih movah Sintaksis Prologu en en en Sintaksis C en Sintaksis JavaScript en Sintaksis Lua en PrimitkiWhat is Syntax www computerhope com angl Procitovano 5 serpnya 2019 Friedman Daniel P Mitchell Wand Christopher T Haynes 1992 Essentials of Programming Languages vid 1st The MIT Press ISBN 0 262 06145 7 Smith Dennis 1999 Designing Maintainable Software Springer Science amp Business Media Aho Alfred V Monica S Lam Ravi Sethi Jeffrey D Ullman 2007 Compilers Principles Techniques and Tools vid 2nd Addison Wesley ISBN 0 321 48681 1 Section 4 1 3 Syntax Error Handling pp 194 195 Louden Kenneth C 1997 Compiler Construction Principles and Practice Brooks Cole ISBN 981 243 694 4 Exercise 1 3 pp 27 28 Semantic Errors in Java 1997 Introduction to the Theory of Computation PWS Publishing ISBN 0 534 94728 X Section 2 2 Pushdown Automata pp 101 114 V nastupnih obgovorennyah mozhna znajti prikladi Perl and Undecidability LtU comment clarifying that the undecidable problem is membership in the class of Perl programs chromatic s example of Perl code that gives a syntax error depending on the value of random variable Apl jhu edu 8 lyutogo 1996 Arhiv originalu za 6 serpnya 2013 Procitovano 17 serpnya 2013 The Common Lisp Cookbook Macros and Backquote Cl cookbook sourceforge net 16 sichnya 2007 Procitovano 17 serpnya 2013 Issue of syntax or semantics PosilannyaRizni sintaksichni konstrukciyi sho vikoristovuyutsya v movah komp yuternogo programuvannya