Wie Sie betonten, kommunizieren Menschen über eine "natürliche" Sprache wie Englisch, Französisch, Deutsch miteinander. Sie werden natürlich genannt, weil wir sie auf natürliche Weise erwerben, anstatt sie absichtlich zu erfinden (Esperanto ist eine Ausnahme).
Eine formale Sprache ist eine, die für den einen oder anderen Zweck erfunden wurde. Eine Programmiersprache wie beispielsweise C ist eine formale Sprache, die zum Programmieren von Computern erfunden wurde.
Alle Sprachen können mit einer Grammatik beschrieben werden. Eine Hierarchie von Grammatiken wurde 1956 von Noam Chomsky beschrieben. Sie besteht aus den folgenden Ebenen:
Typ-0-Grammatiken (uneingeschränkte Grammatiken). Sie sind die allgemeinsten und entsprechen einer Turing-Maschine. Daher ist das Problem der Entscheidung, ob eine bestimmte Zeichenfolge Teil einer uneingeschränkten Grammatik ist, nicht zu entscheiden.
Typ-1-Grammatiken (kontextsensitive Grammatiken). Fast alle natürlichen Sprachen wie Englisch sind kontextsensitiv. Ein Beispiel für Kontextsensitivität im Englischen sind die beiden Ausdrücke: "Die Zeit vergeht wie ein Pfeil." und "Obst fliegt wie eine Banane." Im Allgemeinen ist es für Computer schwierig, kontextsensitive Sprachen zu verstehen.
Typ-2-Grammatiken (kontextfrei). Kontextfreie Sprachen sind die theoretische Grundlage für die Syntax der meisten Programmiersprachen.
Typ-3-Grammatiken (reguläre Grammatiken). Die Familie der regulären Sprachen kann durch reguläre Ausdrücke erhalten werden. Reguläre Sprachen werden häufig verwendet, um Suchmuster und die lexikalische Struktur von Programmiersprachen zu definieren.
Typ 2 (kontextfrei) und Typ 3 (regulär) Grammatiken werden am häufigsten von Computern verwendet, da Parser für sie effizient implementiert werden können.
BNF (Backus-Normalform oder Backus-Naur-Form) ist eine Notationstechnik für kontextfreie Grammatiken, die häufig zur Beschreibung der Syntax von Computersprachen verwendet wird.
Ein Bezeichner könnte beispielsweise wie folgt beschrieben werden:
<identifier> ::= <letter> { <letter> | <digit> }
Das heißt, es muss mit einem Buchstaben beginnen und kann zusätzliche Buchstaben oder Ziffern enthalten.
Früher wurde ein Buchstabe als 'a' | definiert 'b' | 'c' usw., und die Ziffer wird unter Verwendung derselben Schreibweise als '0' bis '9' definiert.
Eine "for" -Anweisung kann definiert werden als:
<for_statement> ::=
'for' '(' <expression> ';' <expression> ';' <expression> ')' <statement>
Lexikalische Analysatoren und Parser (die ersten Schritte eines Compilers oder Interpreters) werden dann so konstruiert, dass sie die vom BNF für eine bestimmte Sprache beschriebene spezifische Grammatik akzeptieren. Lexikalische Analysatoren werden in der Regel verwendet, um die verschiedenen Token einer Sprache (z. B. ein Schlüsselwort, ein Bezeichner oder eine Zahl) herauszusuchen, und der Parser wird verwendet, um herauszufinden, wie die Token zusammenarbeiten, z. B. wie eine "for" -Anweisung erstellt wird .