Як ви вказали, люди спілкуються між собою "природною" мовою, такою як англійська, французька, німецька. Їх називають природними, тому що ми, природно, набуваємо їх, а не навмисно їх вигадуємо (есперанто є винятком).
Формальна мова - це винайдена з тією чи іншою метою. Наприклад, мова програмування, така як C, - це формальна мова, придумана з метою програмування комп'ютерів.
Усі мови можна описати за допомогою граматики. Ієрархію граматик описав Ноам Хомський у 1956 р. Він складається з таких рівнів:
Граматики типу 0 (граматики без обмежень). Вони найбільш загальні і еквівалентні машині Тьюрінга. Отже, проблема вирішення питання про те, чи є даний рядок частиною необмеженої граматики, не можна вирішити.
Граматики типу 1 (граматики, що залежать від контексту). Майже всі природні мови, такі як англійська, залежать від контексту. Прикладом контекстної чутливості в англійській мові є дві фрази: "Час летить як стріла". і "Фруктові мухи, як банан". Загалом, комп'ютерам важко зрозуміти контекстно-чутливі мови.
Граматики типу 2 (без контексту). Безтекстові мови є теоретичною основою для синтаксису більшості мов програмування.
Граматики типу 3 (звичайні граматики). Сімейство регулярних мов можна отримати регулярними виразами. Звичайні мови зазвичай використовуються для визначення шаблонів пошуку та лексичної структури мов програмування.
Граматики типу 2 (без контексту) та 3 (звичайні) найчастіше є комп’ютерами, оскільки парсери для них можуть бути ефективно реалізовані.
BNF (Backus Normal Form або Backus – Naur Form) - це метод позначення граматів без контексту, які часто використовуються для опису синтаксису мов, що використовуються в обчисленні.
Наприклад, ідентифікатор може бути описаний як:
<identifier> ::= <letter> { <letter> | <digit> }
що означає, що він повинен починатися з літери і може містити додаткові літери або цифри.
Раніше в літері було визначено "a" | 'b' | 'c' тощо, і цифра визначається як '0' до '9', використовуючи однотипні позначення.
Оператор AC "for" може бути визначений як:
<for_statement> ::=
'for' '(' <expression> ';' <expression> ';' <expression> ')' <statement>
Лексичні аналізатори та аналізатори (перші етапи компілятора чи інтерпретатора) потім будуються для прийняття конкретної граматики, описаної BNF для певної мови. Лексичні аналізатори зазвичай використовуються для відокремлення різних лексем мови (наприклад, ключового слова, ідентифікатора чи числа), і аналізатор використовується для з'ясування того, як лексеми працюють разом, наприклад, як побудований оператор "для" .