Compilerbau

EBNF Beispiel

Als Anwendungsbeispiel fĂĽr die EBNF Metasprache betrachten wir die formale Definition des [vereinfachten] deutschen Satzbaus:

deutsch   = subjekt verb praedikat objekt
subjekt   = ich | (die katze)
verb      = spiele | spielt
praedikat = [ gerne ]
objekt    = tafli | fangen

Damit sind die formal erlaubten Sätze:

ich spiele tafli
ich spiele gerne tafli
die katze spielt fangen
die katze spielt gerne fangen

Neben obigen semantisch korrekten Sätzen erlaubt die Sprachdefinition aber auch die formal bzw. syntaktisch, aber nicht semantisch korrekten Sätze:

ich spielt tafli
die katze spielt tafli
usw.

Die Sprachdefinition mittels EBNF kann also einfache Sprachzusammenhänge wiedergeben, aber nicht alle Feinheiten einer natürlichen Sprache, die sich häufig nur aus dem Kontext ergeben. In diesem Zusammenhang spricht man auch davon, dass man mit EBNF kontextfreie Grammatiken definieren kann.

Für natürliche Sprachen ist EBNF daher ungeeignet, für einfache Compilersprachen wie C ist es aber hinreichend. Im Gegenteil, es ist sogar gewünscht, Compilersprachen mittels EBNF zu definieren, da sich der Aufwand für den Compilerbau dann aufgrund der einfachen Syntax in Grenzen hält. Es lassen sich sogar Compiler bzw. Parser automatisch aus einer EBNF-Definition erzeugen (Lex/Yacc).

Q EBNF ist selber eine Sprache, wenn auch eine Metasprache, kann sie sich selber definieren?

Ja, wenn man das damit verbundene Henne-Ei Problem außer acht läßt:

grammatik  = { regel }
regel      = regel_name "::=" | "=" abfolge
abfolge    = { variante }
variante   = wort { "|" wort } 
wort       = ( "[" abfolge "]" ) |
             ( "{" abfolge "}" ) |
             ( "(" abfolge ")" ) |
             "wort" | "regel_name"


Erweiterte Backus Naur Form | | Arithmetische AusdrĂĽcke

Options: