PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EBNF und Syntaxdiagramme



snlilli
04-01-2007, 17:45
Hallo ihr Lieben,

ich bin ganz neu hier im Forum und bräuchte dringend Hilfe bei einer Aufgabe die ich leider irgendwie nicht so ganz verstehe.


Da ein Bild dabei ist, hab ich sie mal online gestellt :

http://www.eschgarth.de/Aufgabenblatt7.pdf

Es geht um die Aufgabe 7.1

Dort werden 5 Beispiele arithmetischer Ausdrücke vorgegeben, wobei man bestimmen soll bei welchen keine syntaktische Korrektheit gegeben ist.

Ich bin mir absolut unsicher bei welchen Ausdrücken sich um solche handelt, sie syntaktisch nicht korrekt sind.

Der erste Ausdruck lautet zb einfach 30. Das ist doch absolut korrekt oder nicht ?
Der zweite lautet (20-1)*2 und ist meiner ansicht nach auch korrekt, da durch die Klammern genau definiert ist was zuerst berechnet werden soll.

Bei den weiteren Ausdrücken geht es mir ähnlich.

Der letzte Ausdruck enthält ein "L". Womit ich nicht wirklich etwas anfangen kann.

Habt ihr da vielleicht mehr Ahnung von als ich ?

Wäre super nett, wenn sich das mal jemand ansehen würde.

Gruß Lilian

mehlvogel
04-01-2007, 18:29
Es geht nicht danach, was berechnet werden kann, sondern was nach der gegebenen Grammatik gültig ist, der Sinn ist dabei erstmal zweitrangig. Da Klammern beispielsweise nicht möglich sind, kann (20-1) * 2 nicht abgeleitet werden. Du musst schauen, dass du für "Expressions" eine Ableitung findest, so dass dein Ausdruck herauskommt. Beim ersten ist das ganz einfach:

Expressions -> IntegerLiteral -> Digits -> Digits Digit -> Digit Digit -> 3 0

Vielleicht bekommst du jetzt die anderen Ausdrücke auch hin.

snlilli
04-01-2007, 19:10
Vielen Dank für deine hilfreiche Antwort mehlvogel !

Ich habe versucht deine Lösung nachzuvollziehen und somit die nächten zu lösen.

Ist das so korrekt ? :

2 – 7 + 8 =
Expressions -> IntegerLiteral -> Digits -> Digit -> 2 -> InfixOp-> - -> Expressions -> IntegerLiteral -> Digits -> Digit -> 7 -> InfixOp-> + -> Expressions -> IntegerLiteral -> Digits -> Digit -> 8

oder das ? :

-50 = InfixOp -> - -> Expression -> IntergerLiteral -> Digits -> Digits Digit -> Digit Digit -> 5 0

mehlvogel
04-01-2007, 19:13
Ich hätte es anders aufgeschrieben, aber der Gedanke ist richtig. Hätte es so geschrieben:

Expressions -> IntegerLiteral InfixOp IntegerLiteral InfixOp IntegerLiteral -> Digits - Digits + Digits -> Digit - Digit + Digit -> 2 - 7 + 8

snlilli
04-01-2007, 19:24
Verstehe ! *freu*

Habe nun versucht nach deinem Schema die letzte der 5 Aufgaben zu lösen :

2 % 5 + 9 /L 3L =
Expressions -> IntegerLiteral InfixOp IntegerLiteral InfixOp IntegerLiteral InfixOp IntegerLiteral IntegerLiteral IntegerLiteral -> Digits % Digits + Digits / IntegerTypeSuffix -> Digits -> IntegerTypeSuffix -> Digit % Digit + Digit / L Digit L -> 2 % 5 + 9 / L 3L


Meinst du, das ist so richtig ?

mehlvogel
04-01-2007, 19:37
Nein. Der erste Ableitungsschritt ist falsch. Die Regel lautet:

Expressions ==> IntegerLiteral { InfixOp IntegerLiteral }

Das in den geschweiften Klammern darf beliebig oft wiederholt werden, aber es dürfen nicht einzelne Teile dessen weggelassen werden. Gültige Ableitunten wären bspw.

Expressions -> IntegerLiteral (Das in den geschweiften Klammern wird weggelassen)
Expressions -> IntegerLiteral InfixOp IntegerLiteral (Einmal)
Expressions -> IntegerLiteral InfixOp IntegerLiteral InfixOp IntegerLiteral
Expressions -> IntegerLiteral InfixOp IntegerLiteral InfixOp IntegerLiteral InfixOp IntegerLiteral
... usw

Ich denke das letzte lässt sich nicht ableiten.

snlilli
04-01-2007, 19:48
hmpf das verstehe ich jetzt leider nicht so richtig ..

Habe ich es denn nicht genauso in der ersten Ableitung gemacht ?

Expression -> IntegerLiteral InfixOp IntergerLiteral InfixOp IntergerLiteral InfixOp IntergerLiteral InfixOp IntergerLiteral InfixOp IntergerLiteral

Ich dachte jeder Zahl ist zunächst ein IntegerLiteral zuzuordnen und jedem Operator ein InfixOp. Das macht mir nu bissl sorgen ;(

mehlvogel
04-01-2007, 19:59
Oh ich glaube dann hast du dich vertippt in deinem Posting oben. Dann ist aber deine zweite Ableitung falsch. Dort leitest du

IntegerLiteral -> IntegerTypeSuffix

ab. Die Regel ist allerdings:

IntegerLiteral ==> Digits [ IntegerTypeSuffix ]

d.h. das IntegerTypeSuffix kann weggelassen werden, allerdings muss immer "Digits" enthalten sein. Es gitb für IntegerLiteral also nur zwei gültige Ableitungen:

IntegerLiteral -> Digits
IntegerLiteral -> Digits IntegerTypeSuffix