004
11.10.2004, 09:58 Uhr
Bruder Leif
dances with systems (Operator)
|
Moin!
Ich würde erst mal einen kleinen Scanner schreiben, der die Datei in einzelne Tokens zerlegt und Leerzeichen, Kommentare etc. überliest, Stringkonstanten und Variablen als solche erkennt usw. Dann ein Parser, der in mehrere Funktionen unterteilt ist, die jeweils EIN Sprachkonstrukt erkennen können, und sich gegenseitig mit steigender Priorität aufrufen. Wenn Du z.B. mathematische Ausdrücke parsen willst, z.B. 12+3*($hallo-5), kannst Du Prioritäten festlegen:
0 Konstante, Klammer, Variable 1 *, / 2 +, -
Im Parser hast Du dann eine Funktion Prio0(...), eine Prio1(...) usw. Prio0(...) prüft, ob das nächste Token, das der Scanner liefert, eine Zahlenkonstante, eine öffnende Klammer oder eine Variable ist, und hört ansonsten mit dem Parsen auf. Eine Zahlenkonstante wird 1:1 zurückgegeben, bei einer öffnenden Klammer muß der Parser sich selbst nochmal aufrufen (weil eigenständiger Ausdruck), bei einer Variable wird deren Wert zurückgegeben. Analog holt Prio1(...) erstmal den linken Teil eines Ausdrucks (also Prio1), prüft dann, ob eine Punktrechnung folgt; falls ja, wird der rechte Teil des Ausdrucks geholt (diesmal Prio0), gerechnet, und das Ergebnis zurückgegeben. Prio2 analog, Prio3, 4, 5..... soviel Du willst.
Stell Dir erst mal eine vereinfachte Grammatik für Deine Scriptsprache auf. Nach Lehrbuch würde das etwa so aussehen:
Strichrechnung ::= <Strichrechnung> +|- <Punktrechnung> Punktrechnung ::= <Punktrechnung> *|/ <Konstante> Konstante ::= <Zahl> | <Klammerausdruck> | <Variable> Zahl ::= <Ziffer>+ (mindestens eine Ziffer) Ziffer ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" Variable ::= $<Bezeichner> Klammerausdruck ::= "(" <Ausdruck> ")" Bezeichner ::= <Buchstabe>+ Buchstabe ::= ...usw...
Viel Spaß! -- Mit 40 Fieber sitzt man nicht mehr vor dem PC. Man liegt im Bett. Mit dem Notebook. |