Aktuelle Zeit: 14.12.2019 01:12

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Parser - Unäres und Binäres Minus
BeitragVerfasst: 11.12.2019 21:51 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Hallo Leute,

eh ich mir weiter 'n Wolf suche will ich mein "Problem" einmal mal hier aufzeigen.
Ich suche nach einer passenden Grammatik, die sowohl das unäre Minus als auch das binäre Minus versteht, ohne dass ich das unäre Minus klammern muss. Dabei soll das unäre Minus aber auf keinen Fall eine höhere Priorität haben als zB ein Malzeichen, zwar führt (-x)*y bei der Multiplikation zum gleichen Ergebnis wie -(x*y) aber das ist nicht immer der Fall.
Somit soll es die gleiche Priorität haben wie ein binäres Minus.

Wie müsste meine Grammatik erweitert werden (Startsymbol S)?
Zitat:
S -> E
E -> '-' E ; Möglich, aber dann kann x*-y nicht interpretiert werden, sondern nur x*(-y)
E -> E '+' T
E -> T
T -> T '*' F
T -> F
F -> '(' E ')'
F -> '-' F ; Nicht möglich, da sonst zu hohe Prio und -x*y wird als (-x)*y interpretiert
F -> var

Akzeptiert werden soll zB:
Zitat:
x * -y als x * (-y)
x * -y * z als x * (-y) * z
- x * y als -(x*y)
x - - y als x-(-x)

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Parser - Unäres und Binäres Minus
BeitragVerfasst: 12.12.2019 01:20 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Sorry, bin nur grad am Handy, aber hab das hier gefunden: https://stackoverflow.com/a/10556521

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Parser - Unäres und Binäres Minus
BeitragVerfasst: 12.12.2019 02:49 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
Entweder bin ich jetzt komplett falsch dran oder du siehst ein Problem wo keines ist.

Ein unary Minus hat in jeden Fall höchste Priorität. Wenn du ein Literal hast, ist das unary Minus ja quasi ein Bestandteil des Literals und gehört folglich auch bei einer Variable zur Variable.


Zitat:
x * -y als x * (-y)
x * -y * z als x * (-y) * z
- x * y als -(x*y)
x - - y als x-(-x)

Auch wenn es sich (wie du selbst schreibst) vom Ergebnis gleich bleibt, ist deine dritte Zeile falsch. Diese müsste definitiv als (-x)*y interpretiert werden. Etwas anderes würde es sein, wenn am Zeilenanfang eine 0 stehen würde, dann wäre es ja auch kein unary Minus sondern ein Binary. Dazu gab es vor ein paar Monaten einen ausführlichen Beitrag auf Spiegel.de, kann ihn aber leider nicht mehr finden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Parser - Unäres und Binäres Minus
BeitragVerfasst: 12.12.2019 09:07 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Josh hat geschrieben:
Ein unary Minus hat in jeden Fall höchste Priorität. Wenn du ein Literal hast, ist das unary Minus ja quasi ein Bestandteil des Literals

Nein, nicht nach den gängigen mathematischen Regeln, denn z.B. ist
-3^2 = -(3^2) = -9
[nicht (-3)*(-3) = 9].

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Parser - Unäres und Binäres Minus
BeitragVerfasst: 12.12.2019 09:24 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
@NicTheQuick: danke, schaue mir den Link in dem Link mal an, der sieht interessant aus.

@Josh: Das mathematische unitäre Minus hat aber die gleiche Priorität wie das binäre Minus oder Plus.
Wenn der Parser -x^y als (-x)^y interpretiert, wäre das fatal (und mathematisch falsch).
Aber ich glaube ich habe in dem Moment wo ich diesen Post mache und den Link von NicTheQuick noch mal anschaue, das Problem gelöst.
Ich kann ja die Priorität wie folgt festlegen:
Code:
Hoch    ^
         - (unitär)
         *
Tief    + -

Zitat:
S -> E
E -> E '+' T
E -> T
T -> T '*' P
T -> P
P -> '-' P
P -> O ^ P
O -> '(' E ')'
O -> var
Edit: Potenz geändert

So wird zwar aus -x*y -> (-x)*y ist mathematisch aber vertretbar, und -x^y wird als -(x^y) interpretiert.
Weiter geht dann auch x*-y*z -> x*(-y)*z und x^-y^z -> x^(-(y^z)).

Somit hattest du auch recht Josh: "du siehst ein Problem wo keines ist."

Danke an euch beide.

_________________
Bild
 
BildBildBild


Zuletzt geändert von STARGÅTE am 12.12.2019 18:45, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Parser - Unäres und Binäres Minus
BeitragVerfasst: 12.12.2019 10:07 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
STARGÅTE hat geschrieben:
Das mathematische unitäre Minus hat aber die gleiche Priorität wie das binäre Minus oder Plus.
Das gilt vielleicht in der Mathematik, für Programmiersprachen ist es aber falsch. Siehe Operatorenpriorität z.B. von Pb oder C++


@Nino
Dass es im allgemeinen so behandelt wird, ist richtig. Das ist aber eher dadurch bedingt, dass das ^ ein rechtsassoziativer Operator ist und dadurch auch im Shunting-Yard-Algorithmus anders behandelt wird. Für mich ist das eine eher unglückliche Lösung, da -3 für mich nicht eine Zahl mit einem Operator darstellt, sondern einfach eine negative Zahl. Dass es nicht immer so behandelt wird, kannst du hier nachlesen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Parser - Unäres und Binäres Minus
BeitragVerfasst: 12.12.2019 10:37 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
STARGÅTE hat geschrieben:
@Josh: Das mathematische unitäre Minus hat aber die gleiche Priorität wie das binäre Minus oder Plus.

Das stimmt nicht. Das unäre Minus kann man wohl am besten verstehen, wenn man es sich als Multiplikation mit -1 vorstellt: -x => -1 * x.
Daraus ergibt sich automatisch die Priorität. Und weil "Punktrechnung vor Strichrechnung" geht, hat das unäre Minus eine höhere Priorität als das binäre Minus.

Josh hat geschrieben:
Dass es nicht immer so behandelt wird, kannst du hier nachlesen.

Ich weiß, dass es nicht immer so behandelt wird. Deshalb habe ich absichtlich geschrieben:
Zitat:
nach den gängigen mathematischen Regeln
Damit meine ich die Regeln, wie man sie in der Schule lernt. Diese grundlegenden mathematischen Regeln stehen nicht zur Disposition! Dass es Software gibt die sich nicht an diese Regeln hält, ist ein anderes Problem (das mich erst dann interessieren würde, wenn ich durch widrige Umstände gezwungen wäre solch eine Software zu benutzen).

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye