bison / yacc - Prioritätsgrenzen

So habe ich versucht, eine haskellartige Sprachgrammatik mit Bison zu analysieren. Ich werde die Standardprobleme mit Grammatik und unärem Minus weglassen (wie, was ist(-5) von-5 und\x->x-5 oder wenna-b ista-(b) oderapply a (-b) was selbst kann noch seinapply a \x->x-b, haha.) und gehe direkt zu dem, was mich überrascht hat.

Um das Ganze so weit zu vereinfachen, dass es darauf ankommt, betrachten Sie die folgende Situation:

expression: '(' expression ')'
    | expression expression            /* lambda application */
    | '\\' IDENTIFIER "->" expression  /* lambda abstraction */
    | expression '+' expression        /* some operators to play with */
    | expression '*' expression
    | IDENTIFIER | CONSTANT            /* | ..... */
    ;

Ich habe alle Verschiebungs- / Reduzierungskonflikte mit '+' und '*' mit% left und% right Vorrangmakros gelöst, aber irgendwie konnte ich keine gute Lösung finden, wie Vorrang für das @ gesetzt werden kanexpression expression Lambda-Anwendung. Ich habe% precedence und% left und% prec marker ausprobiert, wie zum Beispiel hier gezeigt:%http: //www.gnu.org/software/bison/manual/html_node/Non-Operators.html#Non-Operator, aber es sieht so aus, als würde Bisons Vorrangstellung für diese Regel völlig ignorieren. Zumindest alle Kombinationen, die ich ausprobiert habe, sind fehlgeschlagen. Die Dokumentation zu genau diesem Thema ist recht spärlich, das Ganze scheint nur für den Umgang mit dem "Klassiker" geeignet zu seiexpr. OPER expr. Fall

Frag: Mache ich etwas falsch oder ist das in Bison unmöglich? Wenn nicht, wird es nur nicht unterstützt oder gibt es eine theoretische Begründung, warum nicht?

Anmerkun: Natürlich gibt es eine einfache Problemumgehung, um Linksfalten und Vorrang zu erzwingen, die schematisch wie @ aussehen würd

expression: expression_without_lambda_application
    | expression expression_without_lambda_application
    ;

expression_without_lambda_application: /* ..operators.. */
    | '(' expression ')'
    ;

... aber das ist nicht so ordentlich wie es sein könnte, oder? :]

Vielen Dank

Antworten auf die Frage(1)

Ihre Antwort auf die Frage