Parsen von Operatoren - wie Mehrdeutigkeiten aufloesen?



  • Hallo Leute!

    Ich bastle immer noch an meiner Scriptsprache und moechte es dem Benutzer erlauben, beliebige Prefix-, Infix- und Postfix-Operatoren zu definieren. Allerdings gibt es dann keine eindeutige Grammatik mehr fuer Ausdruecke.

    Meine Idee war, eine Regel fuer Ausdruecke zu definieren, die alle Moeglichkeiten abdeckt und in einem weiteren Schritt danach Ausdruecke nach den bekannten Operatoren zu parsen. Ich komme jedoch nicht darauf, wie man eine solche EBNF-Regel definieren koennte.

    Irgendwelche Ideen, wie ich dieses Problem moeglichst einfach loesen kann?

    Gruesse,
    Der Kellerautomat



  • Wo hast du Doppeldeutigkeit?

    C++ erlaubt ja auch eigene Operatoren zu definieren (halt nur aus einem vordefinierten Set an Zeichen) aber ich kann prefix ++ und postfix ++ und infix + definieren ohne dass es probleme gibt.

    Oder übersehe ich da jetzt irgendwas?



  • Shade ich glaube er möchte eine neuen Operator einführen können und nicht nur die standard Operatoren überladen

    Wie du das löst ist abhängig davon wie der Rest deiner Syntax gestaltet ist.
    Was du dir angucken könntest wäre Haskell (explizite annotation bei benutzung) Ocaml (das erste zeichen der Funktion entscheidet was für ein Operator (in/post/pre-fix) sie ist und wo sie in der Auswertunghierachie steht) Scala (bei Mehtoden mit einem Argument kann man . und() weglassen)

    Hier habe ich noch einen interessanten Link http://stackoverflow.com/questions/7324402/parser-for-user-defined-infix-operators



  • Haskell erlaubt das auch, der Benutzer kann die Prioritaet selbst festlegenÖ

    3.2.2 Fixity Declarations
    A fixity declaration can be given for any infix operator or constructor (including those made from ordinary identifiers, such as `elem`). This declaration specifies a precedence level from 0 to 9 (with 9 being the strongest; normal application is assumed to have a precedence level of 10), and left-, right-, or non-associativity. For example, the fixity declarations for ++ and . are:

    infixr 5 ++
    infixr 9 .

    Both of these specify right-associativity, the first with a precedence level of 5, the other 9. Left associativity is specified via infixl, and non-associativity by infix. Also, the fixity of more than one operator may be specified with the same fixity declaration. If no fixity declaration is given for a particular operator, it defaults to infixl 9. (See §4.4.2 for a detailed definition of the associativity rules.)



  • Danke fuer die Tipps. Ich hab mir jetzt schon selbst eine moegliche Loesung zusammenreimen koennen. Ja, es ging darum, auch eigene Operatoren definieren zu koennen.


Anmelden zum Antworten