Aufgabenblatt 6 - Nr 6.2


Ja, das hat wohl einigen Leuten Schwierigkeiten bereitet.
Eine linkslineare Grammatik kann man iirc sogar im Allgemeinen in eine rechtslineare ueberfuehren.


ja mal so in die Runde gefragt: hat denn überhaupt schon jmd mehr als die ich-bin-comp-bar-5%?? :-/

swing war ja mal megaeinfach dagegen, weil nicht ganz so krass abstrakt… :vogel:


Bin da jetzt auch schon ewig am rumbasteln, aber mal kann er Klammern nicht, mal kann er keine längeren Folgen aus + und *. Beides gleichzeitig will aber irgendwie nicht laufen.
Ich würds wirklich gern selber machen, aber hab langsam keine Lust mehr noch mehr Zeit da rein zu versenken…


100% g

E → “T +” “T +” “T +” …
Ich weiß nicht, was ich noch sagen soll.

In E:
liegt T vor? kommt danach ein “+”?
Wenn ja: Liegt dann wieder E vor?

Der Quellcode ist ganz kurz.
Und vergesst irgendwelche Klammer-Abfragen und
Array-am-Ende-Abfragen.

Es kommt am Ende immer noch ein Zusatzzeichen,
ihr könnt überhaupt nicht bis über das Ende kommen.


Es reicht wirklich, dass man erkennt, dass zu erst ein isFactor() vorliegen muss.
D.h. der Ausdruck beginnt entweder mit einer Zahl zwischen 0-9 oder mit einer “(”. Nach dem Ausdruck muss dann entweder ein isTerm() kommen, also + oder *, oder der Ausdruck ist zu Ende. In allen anderen Fällen dürfte das übergebene Wort nicht zur Sprache gehören.


Wie hast du das denn gelöst? Mit ner Art von


if(isExpression()) return isExpression();
return false;


käme mir das irgendwie komisch vor… :rolleyes:
aber ich glaube ich bin beim Testkäse wieder in ein ganz besonderes anderes Loch getreten, so kurz der Q-Code auch sein mag g


Mehr in der Form:
E:
If (isT())
If (“+”)
E();


also bei mir ist jetzt “+” im isExpression und “*” im isTerm… oder muss ich beide im isTerm abfragen?

wie bzw wo binde ich da die abfrage mit dem “,” ein?


Du musst kein “,” abfragen, sondern “(” und “)” was aber schon in isFactor() erledigt ist.
Hab ich aber beim erstenmal durchlesen auch verrafft :wink:


wenn man sich überlegt, dass “E → E * T” = “E → T * E” und bei isTerm das gleiche, dann ist die Aufgabe eigentlich kein problem. Leider muss man den Tip erstma kriegen, alleine kommt man/ich da nicht drauf…


dann ist ja alles in butter :cheesy:


Entweder ich bin an Wochenende beim Snowboarden zu arg auf den Kopf gefallen, oder ich steh grade auf der Leitung… :anx:
Wie habt ihr denn verhindert, dass er Sachen wie 1+*1 als valid erkennt?


In dem Fall *+ verhindere ich es, indem ich false zurückgebe, wenn nach dem mal kein isFactor() kommt.
im anderen Fall macht das isValidExpression() für mich, weil das * zeichen != 0, dem Sentinel ist.


isValidExpression() dürfte aber nur sowas erkennen 1+2*, da es jar nur einmal aufgerufen wird und dann auch nur wenn die Zeichenfolge bereits komplett geparst wurde (also man beim letzten char ist). Aber das +* kann man eigentlich genauso überprüfen wir *+ (halt mit isTerm() danach).


@the_flow du hattest recht, war wohl schon bisschen spät gestern ;-).
Welche Methode lässt du 2- aussortieren?


Naja, “-” ist doch garnicht drin, oder?
Und 2+ oder 2* wird dann ja durch das oben genannte
if(nextChar() == ‘+’)
proceed();
if(!isFactor)
false
rausgeworfen oder nicht?

Wo habt ihr eigentlich die Schleife eingebaut damit der ganze String ueberprueft wird?


Du brauchst keine Schleife. Wenn du an den richtigen Stellen proceed()-est, dann wird auch der ganze String überprüft.


Genauer gesagt: Der Zaehler huepft im String um eine Position weiter, sobald ein Terminalzeichen gefunden wurde.


Ich raff hier grade garnix mehr…
Bin jetzt inzwischen gestern schon fast 6 Stunden drangesessen und heute jetzt schon wieder 2 aber es will einfach net.
Ich habs zwischenzeitlich soweit hinbekommen, dass er entweder einfache Expressions (1+2*3) erkannt hat oder Klammern ((1)), aber beides funktioniert einfach irgendwie net :frowning:

Vielleicht kann mir einer mal nen kleinen Tipp geben in welche Richtung ich weitersuchen muss, waere echt super!

private boolean isExpression() { if(!isTerm()) { if(nextChar() != '+') { return false; } else { proceed(); if(!isTerm()) { return false; } } } return true; }
und so aehnlich eben auch nochmal mit isTerm().

Oder bin ich irgendwie ganz auf dem falschen Trichter?!

Vielen Dank auf jeden Fall schonmal
cu
Marko


mir lässt meiner sowas durchgehen:

(1*(1+2)+5

das ist ansich falsch, soll dieser fall auch berücksichtigt werden??
Danke im Vorraus
Matteo