Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.06.2012, 23:34

Begrifflichkeit der Informatik

Hallo Community!
Habe ein Problem mit der Verständlichkeit dieses Begriffes: rekursive Syntaxstruktur.

Ich bedanke mich schonmal im voraus ;)

lg. denniro euer Dummy :DD
Only God can judge me.

2

28.06.2012, 23:45

Moin,

ich rate mal ins Blaue hinein: Eien rekursive Syntaxstruktur ist vermutlich eine Syntax, die Elemente enthält, die sich wiederum selbst enthalten können.

Beispiel:
Asudruck := Ausdruck [ + Operator [+ Ausdruck] ]
Ausdruck := Funktion(Ausdruck)
Ausdruck := Konstante
Ausdruck := ""
Operator := +|-|*.....

Funktion := ...

Jeder Ausdruck kann also einen anderen Ausdruck enthalten.
Praxisbeispiel: Der Ausdruck (3+5) * 6 wird in Runde 1 zu :
Ausdruck1: (3+5)
Operator: *
Ausdruck2: 6

aufgelöst. In Runde zwei wird der Ausdruck 1 nochmal in zwei Teilausdrücke und den Operator "+" zerlegt.

Ich weiß, dass es für Sprachtheorie noch eine spezielle Syntax gibt. Ich hab leider die Details vergessen, verzeihe mir :)


MfG

3

28.06.2012, 23:54

Moin,

ich rate mal ins Blaue hinein: Eien rekursive Syntaxstruktur ist vermutlich eine Syntax, die Elemente enthält, die sich wiederum selbst enthalten können.

Beispiel:
Asudruck := Ausdruck [ + Operator [+ Ausdruck] ]
Ausdruck := Funktion(Ausdruck)
Ausdruck := Konstante
Ausdruck := ""
Operator := +|-|*.....

Funktion := ...

Jeder Ausdruck kann also einen anderen Ausdruck enthalten.
Praxisbeispiel: Der Ausdruck (3+5) * 6 wird in Runde 1 zu :
Ausdruck1: (3+5)
Operator: *
Ausdruck2: 6

aufgelöst. In Runde zwei wird der Ausdruck 1 nochmal in zwei Teilausdrücke und den Operator "+" zerlegt.

Ich weiß, dass es für Sprachtheorie noch eine spezielle Syntax gibt. Ich hab leider die Details vergessen, verzeihe mir :)


MfG



Okey danke dir, hoffe, dass ich es einigermaßen richtig verstanden habe.

Es ist also eine Syntax, die Elemente enthält, die wiederrum sich selbst enthalten?
Also, wie du schon zum Beispiel Ausdruck aufgeführt hast:
1 = Ausdruck
1+2 = Ausdruck
a = 1+3 = Ausdruck

Gehören denn Summanden, Faktoren .. auch dazu?

lg. denniro
Only God can judge me.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

29.06.2012, 01:19

Der richtige Begriff von dem, was da beschrieben wird, ist Grammatik. In dem Beispiel auch kontextfreie Grammatik. Den Begriff "rekursive Syntaxstruktur" scheint es nur in "Der C++ Programmierer" zu geben. Wird wohl verwendet, weil es anschaulicher ist.

Aber davon ab, lassen sich natürlich auch einfache arithmetische Ausdrücke damit definieren. Das geht hin bis zu kompletten Programmiersprachen. Wobei C++ dann wohl nicht mehr kontextfreie definierbar sein soll. Du kannst die Syntaxdiagramme einfach in die von dispy beschriebene Form bringen indem du alle Möglichkeiten durchgehst.

z.B.
Ausdruck := Summand | +Summand | -Summand | Summand + Summand | +Suummand + Summand | -Summand + Summand | usw.

In dem Buch wird dann halt Summand und Faktor so gekoppelt, damit die Operatorenreihenfolge, sprich Punkt- vor Strichrechnung, durch den Parser eingehalten wird.

5

29.06.2012, 11:12

Der richtige Begriff von dem, was da beschrieben wird, ist Grammatik. In dem Beispiel auch kontextfreie Grammatik. Den Begriff "rekursive Syntaxstruktur" scheint es nur in "Der C++ Programmierer" zu geben. Wird wohl verwendet, weil es anschaulicher ist.

Aber davon ab, lassen sich natürlich auch einfache arithmetische Ausdrücke damit definieren. Das geht hin bis zu kompletten Programmiersprachen. Wobei C++ dann wohl nicht mehr kontextfreie definierbar sein soll. Du kannst die Syntaxdiagramme einfach in die von dispy beschriebene Form bringen indem du alle Möglichkeiten durchgehst.

z.B.
Ausdruck := Summand | +Summand | -Summand | Summand + Summand | +Suummand + Summand | -Summand + Summand | usw.

In dem Buch wird dann halt Summand und Faktor so gekoppelt, damit die Operatorenreihenfolge, sprich Punkt- vor Strichrechnung, durch den Parser eingehalten wird.


Genau dieses Gekoppelte ist ein wenig schwer zu verstehen für mich.

lg. denniro
Only God can judge me.

6

29.06.2012, 11:36

*wieder ins Blaue schieß* :)

Du arbeitest immer mit Abschnitten von deinem gesamten Quellcode. Wenn du jetzt diese Abschnitte weiter zerlegst, so gehst du die Liste der Elementdefinitionen so lange durch, bis eine Definition auf deinen Abschnitt passt.
Beispiel:

Quellcode

1
2
3
4
5
6
Ausdruck := Summand + Summand
Ausdruck := Faktor * Faktor
Ausdruck := [+|-] Konstante
...
Summand := Ausdruck
Faktor      := Ausdruck


Wenn du jetzt den Abschnitt "3+5" auswertest, gehst du die Liste durch
1. passt

Damit hast du dann Summand + Summand => der erste Summand ist 3, der zweite 5.


Wenn du "2*3+5" auswertest, gehst du wieder durch die Liste:
1. passt
D.h. der erste Summand ist "2*3", der zweite "5"

Nun gehts weiter: suche "2*3" in der Liste
1. passt nicht
2. passt => Faktor1 ist "2", Faktor2 ist "3".

2, 3 und 5 sind nun alle Konstanten und lassen sich nicht weiter auflösen.

Wenn du nun die Berechnung durchführen willst, so gehst du rückwärts vor und setzt alles wieder ein:
Summand(Faktor(2) * Faktor(3)) + Summand(5)

Hier sieht man jetzt sehr schon an der Klammersetzung, dass zuerst 2*3 ausgerechnet wird und erst _danach_ 5 draufaddiert wird.


Jetzt drehen wir das Beispiel mal um und nehmen folgende Liste an:

Quellcode

1
2
3
4
5
6
Ausdruck := Faktor * Faktor
Ausdruck := Summand + Summand
Ausdruck := [+|-] Konstante
...
Summand := Ausdruck
Faktor      := Ausdruck


Wenn wir "2*3+5" nun wieder zerlegen, wird daraus Faktor(2) * Faktor(Summe(2+5)). Wie man sehr schon sieht, entspricht das "2*(3+5)", obwohl die mathematischen Rechenregeln eigentlich "(2*3)+5" vorschreiben würden.

Deswegen kann man in der Sprachtheorie Operatoren mit in den Ausdrücken definieren, wobei die Operatoren mit der niedrigsten Priorität immer ganz oben landen. Denn bei der eigentlichen Berechnung wird es von unten aufgerollt und die als ersten "gematchten" Operatoren werden als letztes ausgeführt.

In den meisten anständigen C++-Büchern (C++ Primer :D ) Findest du eine (lange) Liste der Operatorprioritäten der Sprache selber, zusammen mit der Assoziativit und so weiter.


Als Alternative zur Infixnotation gibt es noch die Präfixnotation (die du spätestens mit funktionalen Sprachen kennen lernen wirst) - die hat damit weniger Probleme, da die Reihenfolge direkt durch die Definition vorgegeben ist.

MfG

Werbeanzeige