Comme vous l'avez souligné, les humains communiquent entre eux par le biais d'un langage "naturel" tel que l'anglais, le français, l'allemand. Ils sont appelés naturels parce que nous les acquérons naturellement plutôt que de les inventer intentionnellement (l'espéranto étant une exception).
Un langage formel est un langage inventé dans un but ou un autre. Un langage de programmation tel que C, par exemple, est un langage formel inventé dans le but de programmer des ordinateurs.
Toutes les langues peuvent être décrites à l'aide d'une grammaire. Une hiérarchie des grammaires a été décrite par Noam Chomsky en 1956. Elle se compose des niveaux suivants:
Grammaires de type 0 (grammaires illimitées). Ils sont les plus généraux et équivalent à une machine de Turing. En tant que tel, le problème de décider si une chaîne donnée fait partie d'une grammaire illimitée est indécidable.
Grammaires de type 1 (grammaires contextuelles). Presque toutes les langues naturelles comme l'anglais sont sensibles au contexte. Un exemple de sensibilité au contexte en anglais sont les deux phrases: «Le temps passe comme une flèche». et "Les fruits volent comme une banane". En général, il est difficile pour les ordinateurs de comprendre les langages contextuels.
Grammaires de type 2 (hors contexte). Les langages sans contexte sont la base théorique de la syntaxe de la plupart des langages de programmation.
Grammaires de type 3 (grammaires normales). La famille des langues régulières peut être obtenue par des expressions régulières. Les langages réguliers sont couramment utilisés pour définir les modèles de recherche et la structure lexicale des langages de programmation.
Les grammaires de type 2 (sans contexte) et de type 3 (standard) sont le plus souvent utilisées par les ordinateurs, car les analyseurs peuvent être implémentés efficacement.
BNF (Backus Normal Form ou Backus – Naur Form) est une technique de notation pour les grammaires hors contexte, souvent utilisée pour décrire la syntaxe des langages utilisés en informatique.
Par exemple, un identifiant peut être décrit comme:
<identifier> ::= <letter> { <letter> | <digit> }
ce qui signifie qu'il doit commencer par une lettre et peut contenir des lettres ou des chiffres supplémentaires.
Plus tôt, une lettre est définie comme un «a» | «b» | 'c' etc., et digit est défini comme '0' à '9' en utilisant le même type de notation.
L'instruction AC "for" peut être définie comme suit:
<for_statement> ::=
'for' '(' <expression> ';' <expression> ';' <expression> ')' <statement>
Les analyseurs et analyseurs lexicaux (les premières étapes d'un compilateur ou d'un interprète) sont ensuite construits pour accepter la grammaire spécifique décrite par le BNF pour une langue particulière. Les analyseurs lexicaux sont généralement utilisés pour séparer les différents jetons d'une langue (comme un mot-clé, un identifiant ou un nombre), et l'analyseur est utilisé pour comprendre comment les jetons fonctionnent ensemble, comme la construction d'une instruction "for" .