Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Parser: Überladene Operatoren

  Alt 1. Mai 2013, 21:55
Ich weiß nicht, ob ich es ganz richtig verstanden habe, aber ich bin der Meinung, dass ein Operator immer die gleiche Priorität haben sollte, unabhängig von den Datentypen. Sonst wird es nämlich nicht nur haarig zu implementieren, sondern auch irgendwann schwer nachzuvollziehen. Außerdem erschließt sich mir der Sinn nicht wirklich, die Priorität vom Datentyp abhängig zu machen; ich kenne auch keine dynamisch typisierte Sprache, die das so macht.

Wenn man es so macht, dass ein Operator immer die gleiche Priorität hat, ist es doch eigentlich einfach: Beim Parsen kümmert man sich erst mal gar nicht um die Datentypen sondern baut erst mal nur einen abstrakten Baum auf. Im nächsten Schritt arbeitet man diesen dann ab, und beachtet dabei die Typen. Das geht im einfachsten Fall mit einer case-Anweisung und damit in konstanter Laufzeit.

Edit:
Noch mal bezüglich:
Zitat:
1 Op Op Op 1 = (((1 Op) Op) Op 1) oder (1 Op (Op (Op 1))) oder ((1 Op) Op (Op 1))
Und dummerweise entstehen auch Möglichkeiten wie:
(1 Op) (Op (Op 1)) die dann zu einem Fehler führen
Das eine nennt man linksassoziativ und das andere rechtsassoziativ. Das ist auch wieder eine reine Frage der Definition, genau wie die Operatorenrangfolge. In der Mathematik sind z.B. Subtraktion und Division linksassoziativ, aber Potenzen rechtsassoziativ.

Geändert von Namenloser ( 1. Mai 2013 um 22:07 Uhr)
  Mit Zitat antworten Zitat