Die EBNF der PLR
Die Python Language Reference (PLR) verwendet eine spezielle Form der EBNF, die hier vorgestellt werden soll (Stand PLR 3.8.0a0 von Anfang 2019).
Die PLR selber bezeichnet ihre Form der EBNF als “modified BNF grammar notation ”.
Terminalsymbole
Terminalsymbole erscheinen in Anführungszeichen.
- Schreibweise der PLR
"a"
So steht beispielweise »"a"« für das Schriftzeichen »a«.
Produktionsregeln
Produktionsregeln werden mit einem »::=« geschrieben.
- Produktionsregelschreibweise der PLR
letter ::= "a"
Die obige Produktionsregel würde besagen, daß »a« ein Exemplar der Kategorie »letter« ist.
Alternativen
Alternativen werden mit einem senkrechten Strich »|« geschrieben.
- Produktionsregelschreibweise der PLR
letter ::= "a" | "b"
Die obige Produktionsregel würde besagen, daß sowohl ein »a« als auch ein »b« ein Exemplar der Kategorie »letter« ist.
Sequenzen
Sequenzen werden durch Hintereinanderschreibung ausgedrückt.
- Produktionsregelschreibweise der PLR
name ::= letter letter
Die obige Produktionsregel würde besagen, daß ein Name eine Abfolge von zwei Buchstaben sein kann.
Prioritäten
Eine Sequenzierung hat höhere Priorität als eine Alternative.
- Produktionsregelschreibweise der PLR
name ::= 'a' 'x' | 'y'
Die obige Produktionsregel würde besagen, daß »ax« oder »y« Namen sind.
Klammern
Runde Klammer werden verwendet, um Bestandteile zusammenzufassen..
- Produktionsregelschreibweise der PLR
name ::= 'a'( 'x' | 'y' )
Die obige Produktionsregel würde besagen, daß ein Name ein »a« ist, dem ein »x« oder ein »y« folgen kann.
Referenzen
Namensreferenzen
Eine Referenz auf eine Kategorie erfolgt durch Verwendung des kursiv geschriebenen Namens der anderen Kategorie.
- Produktionsregelschreibweise der PLR
name ::= letter
Die obige Produktionsregel würde besagen, daß ein Name ein (Exemplar der Kategorie) »letter« sein kann.
Beschreibungsreferenzen
Eine Kategorie kann durch eine englischsprachige Beschreibung innerhalb spitzer Klammern gebildet werden
- Kategorieschreibweise der PLR
<any letter>
Die Kategorie »<any letter>« würde also „irgendeinen Buchstaben“ umfassen. (Dies wäre beispielsweise nicht ganz klar: sind nur englische Buchstaben gemeint oder beispielsweise auch griechische?)
(Solche Beschreibungen werden in der PLR nur in morphologische Produktionsregeln verwendet.)
Wiederholungen
*-Wiederholungen
Eine Wiederholung wird durch einen dem zu Wiederholendem nachfolgenden Stern »*« gekennzeichnet.
- Produktionsregelschreibweise der PLR
name ::= letter*
Die obige Produktionsregel würde besagen, daß ein Name eine Wiederholung von beliebig vielen, auch null (also gar keinem), »letter« sein kann.
+-Wiederholungen
Wenn eine Wiederholung durch ein dem zu Wiederholendem nachfolgendes Plus »*« gekennzeichnet ist, so muß das Wiederholte mindestens einmal vorkommen.
- Produktionsregelschreibweise der PLR
name ::= letter+
Die obige Produktionsregel würde besagen, daß ein Name eine Wiederholung von beliebig vielen, aber mindestens einem, »letter« sein kann.
Optionen
Etwas Optionales wird durch Einschluß in eckige Klammern gekennzeichnet.
- Produktionsregelschreibweise der PLR
name ::= letter [letter]
Die obige Produktionsregel würde besagen, daß ein Name ein Buchstabe ist, dem ein weiterer Buchstabe folgen kann. »[letter]« bedeutet also „ein oder kein »letter«“.
Mehr zu Prioritäten
Die höchste Priorität haben die Kennzeichnungen von Optionen oder Wiederholungen mit »[«, »]«, »*« oder »+«.
Die Prorität der Sequenz befindet sich in der Mitte.
Die niedrigste Priorität hat die Alternative »|«.
Angaben außerhalb der EBNF
Außerhalb der EBNF wird in PLR 3.8.0a0 Abschnitt 1.2 festgelegt, daß alle Verwendungen der EBNF im Kapitel 2 “Lexical Analysis ” als morphologisch zu verstehen sind (Terminalsymbole sind einzelne Schriftzeichen, und es darf kein zusätzlicher Leerraum eingefügt werden) und alle Verwendungen nach jenem Kapitel als syntaktisch zu verstehen sind (Terminalsymbole sind einzelne Schriftzeichen, und es darf zusätzlicher Leerraum eingefügt werden).
Außerdem gibt es einige Regeln zur Einrückung, zur Fortsetzung von Zeilen und zur Gestaltung von Leerraum, die nicht durch die EBNF-Produktionsregeln ausgedrückt werden.
Seltener gebrauchte Notationen
Bereiche von Zeichen
Bereiche von Zeichen des ASCII-Codes werden mit drei Punkten »...« gekennzeichnet. Diese drei Punkte habe höhere Priorität als die Sequenz aber niedrigere als Optionen und Wiederholungen.
- Schreibweise der PLR
"a"..."z"
Die Schreibweise »"a"..."z"« steht für alle Buchstaben zwischen »a« und »z«,die es im ASCII-Code gibt.
- Druckbare Zeichen des ASCII -Codes
!"#$%&'()*+,-./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz{|}~
Beispiele aus der PLR
- Morphologie eines Zeichenfolgenliterals
stringliteral ::= [stringprefix](shortstring | longstring)
stringprefix ::= "r" | "u" | "R" | "U" | "f" | "F"
| "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::= shortstringchar | stringescapeseq
longstringitem ::= longstringchar | stringescapeseq
shortstringchar ::= <any source character except "\" or newline or the quote>
longstringchar ::= <any source character except "\">
stringescapeseq ::= "\" <any source character>
- Syntax eines additiven Ausdrucks
m_expr ::= u_expr | m_expr "*" u_expr | m_expr "@" m_expr |
m_expr "//" u_expr| m_expr "/" u_expr |
m_expr "%" u_expr
a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr
- Syntax einer if-Anweisung
if_stmt ::= "if" expression ":" suite
( "elif" expression ":" suite )*
["else" ":" suite]