[linux-l] Grammar Design

Axel Weiß aweiss at informatik.hu-berlin.de
Mi Jul 13 18:25:47 CEST 2005


Oliver Bandel schrieb:
> Hi,
>
> hier ist doch sicherlich ein Informatiker an Bord, oder jemand,
> der aus anderen Gründen/Hintergründen her schon mal ne eigene
> Sprache implementiert hat?
>
> Folgende Ausgangssituation:
>   Gegeben sei eine (ungefähre) Idee einer
>   neu zu entickelnden Sprache sowie die Möglichkeit, eine
>   Grammatik mit lex & yacc zu implementieren.

Hi Oliver,

wenn Du lex und yacc sinnvoll einsetzen willst, soltest Du darauf achten, 
bei einer LR1-Grammatik zu bleiben. (C ist z.B. *keine* LR1-Grammatik. 
Was das für Probleme bereitet, wenn man dennoch lex und yacc dafür 
einsetzt, kannst Du in den gcc-Quellen studieren. Von der C-Grammatik 
ist jedenfalls nicht mehr viel übrig.) Nur dann kannst Du die BNF in 
yacc einfach eintippen.

>
> Zu lösendes Problem:
>    Finde einen Weg, effektiv eine Grammatik
>   für die Sprache zu entwickeln, so daß man schnell von der Idee
>   der Sprache zur Implemntierung der selbigen kommt.
>
> Also: Wie entwirft man auf elegante und effiziente/schnelle Weise
>      eine Grammatik, ohne sich all zu oft in Parser-Konflikten
>      zu verlieren.

Welchen Weg Du gehst, orientiert sich natürlich an Deinen Vorlieben ;)

> Da sich die zu entwickelnde Sprache noch im Aufbau befindet kann
> nicht auf eine fertige Grammatik zurück gegriffen werden und einfach
> die BNF implementiert werden.
> Deswegen ist das ganze Problem auch noch ständig im Fluß.
>
> Mit was föngt man an?
> Keywords und Priotitäten vorgeben (Klammerungen usw.) und arbeitet
> sich dann von unten nach oben?
>
> Oder geht man eher von oben nach unten vor beim Grammatik-Entwickeln?

Wenn Du mich fragst, meine Checkliste sieht ungefähr so aus:
1. Brauche ich überhaupt eine neue Sprache (oder gibt es bereits eine,
   die für meine Zwecke geeignet ist)?
2. Was will ich Ausdrücken? Welche Strukturen sollen repräsentiert
   werden? (Ausdrücke, Graphen/Bäume, Relationen, Text, Objekte,
   Automaten usw.)
3. Welche Sprachelemente brauche ich, um das auszudrücken, was ich
   ausdrücken will? Wie kann ich diese in einer LR1-Grammatik fassen? Wie
   sehen die Terminale und (viel wichtiger) die Nichtterminale aus?
4. Kann ich vielleicht Teile vorhandener Sprachen (z.B. reguläre
   Ausdrücke) wiederverwenden? Wie lassen sich diese Teile in die
   Grammatik integrieren?

Bevor ich also meine Tastatur und die Toolchain bemühe, will ich schonmal 
wenigstens eine Vorstellung von dem haben, was da wachsen will. Die BNF 
kann dabei eine Hilfe sein. "Von oben nach unten" empfinde ich 
jedenfalls angenehmer als umgekehrt.

Wenn Du die Details (das "Ganz unten") am Anfang noch nicht kennst, ist 
das nicht so schlimm, wenn Deine neue Sprache erweiterbar/modular 
aufgebaut ist. Dann kannst Du die Implementierung ganzer Teile ruhig mal 
auf später verschieben oder "kleine Änderungen mit kleinen Auswirkungen" 
machen.

Und wenn Du Deine eigenen Konzepte noch nicht ganz verstanden hast, hilft 
es oft mal, "Quick & Dirty" ein paar Versuche zu hacken. Wenn Du dann 
verstanden hast, wie es geht, kannst Du ruhig und sauber nochmal von 
vorne anfangen.

Das Wichtigste: Spaß soll es machen!

			Axel

-- 
Humboldt-Universität zu Berlin
Institut für Informatik
Signalverarbeitung und Mustererkennung
Dipl.-Inf. Axel Weiß
Rudower Chaussee 25
12489 Berlin-Adlershof
+49-30-2093-3050
** www.freesp.de **



Mehr Informationen über die Mailingliste linux-l