Die eben vereinfacht geschilderten Vorgänge gliedern sich grundsätzlich in zwei Teilaufgaben
Gegeben sei folgendes C-Programm
int main() { return 0; }Möchte man das kurze C-Progamm übersetzen, so muss unter anderem die Syntax geprüft werden. Ein entsprechender Parser würde folgende Symbole erkennen:
'int' '_' 'main' '(' ')' '_' '{' '\n' '\t' 'return' '_' '0' ';' '\n' '}' '\n'Wie bereits erwähnt, kann man Symbole zu Token zusammenfassen. Beispielsweise interessiert es nicht, um was für einen konkreten Rückgabewert es sich handelt. Entscheidend ist, aus syntaktischen Gesichtspunkten, allein der Rückgabetyp. Solche Typen definiert man mittels regulärer Ausdrücke. So kann man relativ einfach festlegen, was unter einer Zahl verstanden werden soll, oder wie Variablen auszusehen haben. Im Folgenden ist das Programm von oben in die einzelnen Token aufgeteilt.
KWINT, SPACE, ID, OPAR, CPAR, SPACE, OBRACE, SPACE, SPACE, KWRETURN, SPACE, OCTALCONST, SPACE, SEMICOLON, SPACE, CBRACE, SPACE, EOF
Ein Token kann somit als Tupel gesehen werden, dass neben den Bezeichner eine Ausprägung beinhaltet
Beispiel:
A -> B | A + A | A x A | (A) B -> a | b | Ba | Bb | B0 | B1
(a0 + b1) x a + b
An diesem Beispiel lässt sich des weiteren das Top Down - Verfahren erläutern. Bei diesem Verfahren wird, ausgehend von einem Wurzelknoten, der gesamte Baum aufgebaut.
Die BNF unterscheidet zwei Arten von Zeichen. Terminal- und Nichtterminalsymbole, auch syntaktische Variable genannt. Terminalsymbole bestehen aus Zeichen und zeichnen sich dadurch aus, dass diese atomar, d.h. nicht weiter zerlegbar sind. Nichtterminalsymbole, eingeschlossen in spitzen Klammern, werden in Ableitungsregeln (Produktionen) definiert und solange abgeleitet, bis sie durch Terminalsymbole ersetzt worden sind. Die Zeichenfolge ::= wird zur Definition verwendet, das Zeichen | dient als Alternative.
Beispiel:
<ziffer> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9Eine Ziffer (Nichtterminalsymbol) kann durch eines der Terminalsymbole (0-9) dargestellt werden
Sequenz:
<zahl > ::= <zahl> | <ziffer> <ziffer> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9Durch die hier enthaltene Rekursion lässt sich eine beliebigstellige Zahl darstellen