Formale Sprache: Unterschied zwischen den Versionen

Aus KGS-Wiki
K (→‎Ableitung von Wörtern aus den Regeln: Schreibweise vereinheitlicht)
(Grammatik in eigenes Lemma ausgelagert)
Zeile 9: Zeile 9:


* Eine Sprache, die [[römische Zahlen]] beschreibt, hat das Alphabet <math>\lbrace \textrm{I}, \textrm{V}, \textrm{X}, \textrm{L}, \textrm{C}, \textrm{D}, \textrm{M} \rbrace</math> und enthält Wörter wie <math>\textrm{XLII}</math> oder <math>\textrm{MMXXIII}</math>.
* Eine Sprache, die [[römische Zahlen]] beschreibt, hat das Alphabet <math>\lbrace \textrm{I}, \textrm{V}, \textrm{X}, \textrm{L}, \textrm{C}, \textrm{D}, \textrm{M} \rbrace</math> und enthält Wörter wie <math>\textrm{XLII}</math> oder <math>\textrm{MMXXIII}</math>.
* Eine Sprache, die chemische Verbindungen beschreibt, könnte das Alphabet <math>\lbrace \textrm{H}, \textrm{He}, \textrm{Li}, \textrm{Be}, \dots, \textrm{Ts}, \textrm{Og}, {}_0, {}_1, {}_2, {}_3, {}_4, {}_5, {}_6, {}_7, {}_8, {}_9 \rbrace</math> haben und enthält Wörter wie <chem>PuF6</chem> oder <chem>C169719H270466N45688O52238S911</chem>.
* Eine Sprache, die chemische Verbindungen beschreibt, könnte das Alphabet <chem>\lbrace H, He, Li, Be, \dots, Ts, Og, {}_0, {}_1, {}_2, {}_3, {}_4, {}_5, {}_6, {}_7, {}_8, {}_9 \rbrace</chem> haben und enthält Wörter wie [https://de.wikipedia.org/wiki/Plutonium(VI)-fluorid <chem>PuF6</chem>] oder [https://de.wikipedia.org/wiki/Titin <chem>C169719H270466N45688O52238S911</chem>].


== Grammatik ==
== Grammatik ==
Nicht alle Wörter, die aus den Symbolen eines Alphabets gebildet werden können, sind auch in der Sprache enhalten. Zum Beispiel können aus dem Alphabet für römische Zahlen auch Wörter wie <math>\textrm{MIMIMI}</math> gebildet werden, die keine gültigen römischen Zahlen darstellen. Denn zu einer Sprache gehören auch '''Regeln''' zur Bildung der Wörter. Diese Regeln fasst man zu einer [[Formale Sprache#Grammatik|Grammatik]] zusammen.


=== Beispiel ===
Siehe [[Formale Grammatik]].
<syntaxhighlight lang="bnf" line="1">
<RoemischeZahl> ::= <Tausender> <Hunderter> <Zehner> <Einer>
<Tausender>    ::= M <Tausender> | ε
<Hunderter>    ::= C | CC | CCC | CD | D | DC | DCC | DCCC | CM | ε
<Zehner>        ::= X | XX | XXX | XL | L | LX | LXX | LXXX | XC | ε
<Einer>        ::= I | II | III | IV | V | VI | VII | VIII | IX | ε
</syntaxhighlight>Diese Regeln bedeuten Folgendes:
 
# Eine <code><RoemischeZahl></code> besteht aus einer <code><Tausender></code>-, einer <code><Hunderter></code>-, einer <code><Zehner></code>- und einer <code><Einer></code>-Stelle ''in dieser Reihenfolge''.
# Die <code><Tausender></code>-Stelle ist ''entweder'' leer – dafür steht das <code>ε</code> – ''oder'' besteht aus einem <code>M</code>, gefolgt von noch mehr <code><Tausender></code>n, die aber auch leer sein dürfen. Der senkrechte Strich <code>|</code> trennt zwei Alternativen.
# Die <code><Hunderter></code>-Stelle ist entweder ein <code>C</code>, ein <code>CC</code>, ... ein <code>CM</code> oder leer.
# Die <code><Zehner></code> und die <code><Einer></code> funktionieren genau wie die Hunderter.
 
=== Syntax ===
{| class="wikitable"
|+
!Syntaxelement
!Erläuterung
|-
|<code><Symbol></code>
|Dies nennt man ''Nichtterminalsymbol'', dieses muss noch weiter durch die Anwendung von Regeln abgeleitet werden, bis irgendwann ein Wort entstanden ist, das keine Nichtterminalsymbole mehr enthält.
|-
|<code>Sekt&nbsp;<nowiki>|</nowiki>&nbsp;Selters</code>
|Der senkrechte Strich trennt zwei Optionen, von denen nur eine gewählt werden kann.
|-
|ε steht für das ''leere Symbol'', das Nichts.
|-
|<code><A> ::= ???</code>
|Ersetze <code><A></code> durch <code>???</code>
|}
 
=== Ableitung von Wörtern aus den Regeln ===
Durch wiederholte Anwendung der Regeln einer Grammatik kann aus einem Nichtterminalsymbol ein vollständiges Wort abgeleitet werden, das keine Nichtterminalsymbole mehr enthält, z.B. aus dem Nichtterminalsymbol <code><RoemischeZahl></code> das Wort <code>MMXXIII</code>.
{| class="wikitable"
|+
!Ableitungsschritt von...
!
!... nach...
!Angewandte Regel
|-
|<code><RoemischeZahl></code>
|→
|<code><Tausender><Hunderter><Zehner><Einer></code>
|<code><RoemischeZahl> ::= <T><H><Z><E></code>
|-
|<code><Tausender><Hunderter><Zehner><Einer></code>
|→
|<code>M<Tausender><Hunderter><Zehner><Einer></code>
|<code><Tausender> ::= M<Tausender></code>
|-
|<code>M<Tausender><Hunderter><Zehner><Einer></code>
|→
|<code>MM<Tausender><Hunderter><Zehner><Einer></code>
|<code><Tausender> ::= M<Tausender></code>
|-
|<code>MM<Tausender><Hunderter><Zehner><Einer></code>
|→
|<code>MM<Hunderter><Zehner><Einer></code>
|<code><Tausender> ::= ε</code>
|-
|<code>MM<Hunderter><Zehner><Einer></code>
|→
|<code>MM<Zehner><Einer></code>
|<code><Hunderter> ::= ε</code>
|-
|<code>MM<Zehner><Einer></code>
|→
|<code>MMXX<Einer></code>
|<code><Zehner> ::= XX</code>
|-
|<code>MMXX<Einer></code>
|→
|<code>MMXXIII</code>
|<code><Einer> ::= III</code>
|}
Die Reihenfolge dieser Ableitungsschritte ist nicht fest, man hätte auch zuerst die <code><Einer></code> zu <code>III</code> ableiten können.
 
Zur Visualisierung der Ableitung zeichnet man '''[[Baum (Datenstruktur)|Ableitungsbäume]]''':
 
{{#mermaid:graph TD
rz("<code>&lt;RoemischeZahl&gt;</code>") --- t1("<code>&lt;Tausender&gt;</code>") & h("<code>&lt;Hunderter&gt;</code>") & z("<code>&lt;Zehner&gt;</code>") & e("<code>&lt;Einer&gt;</code>")
t1 --- m1("<strong><code>M</code></strong>")
t1 --- t2("<code>&lt;Tausender&gt;</code>")
t2 --- m2("<strong><code>M</code></strong>")
t2 --- t3("<code>&lt;Tausender&gt;</code>")
t3 --- eps1("<code>ε</code>")
h --- eps2("<code>ε</code>")
z --- xx("<strong><code>XX</code></strong>")
e --- iii("<strong><code>III</code></strong>")
classDef node stroke:none,fill:none;
}}
 
Die letztendlich abgeleiteten Terminalsymbole stehen dann unten in den Blättern des Baumes.


== Zum Weiterlesen ==
== Zum Weiterlesen ==

Version vom 7. September 2023, 06:48 Uhr

Eine formale Sprache ist eine Sprache, die nicht der Kommunikation dient, sondern zur Definition von Korrektheit in Informatiksystemen. Mit formalen Sprachen wird z.B. die Syntax von Programmiersprachen festgelegt, damit diese von einem Compiler überprüft werden können. Auch technische Spezifikationen wie der Aufbau von E-Mail-Adressen oder URLs werden mit formalen Sprachen festgelegt.

Grundbegriffe

Die Elemente einer formalen Sprache nennt man Wörter und deren Bestandteile Symbole. Alle Symbole einer Sprache bilden deren Alphabet.

Symbole können alles Mögliche sein: Buchstaben, Zahlen, Zeichen oder auch Zeichenketten.

Beispiele

  • Eine Sprache, die römische Zahlen beschreibt, hat das Alphabet und enthält Wörter wie oder .
  • Eine Sprache, die chemische Verbindungen beschreibt, könnte das Alphabet haben und enthält Wörter wie oder .

Grammatik

Siehe Formale Grammatik.

Zum Weiterlesen