LL(1) Konflikte



  • Hoi,
    Ich habe diese Grammatik:

    Main = { Statement }.
    Statement = Expression Semicolon
    Expression = OrExpression
    OrExpression = DivisibilityExpression { OrOp OrExpression }
    DivisibilityExpression = RangeExpression [ DivisibilityOp RangeExpression ]
    RangeExpression = PrimaryExpression [ RangeOp PrimaryExpression ]
    PrimaryExpression = Number | LParen Expression RParen | SumExpression
    SumExpression = Sum Expression From Expression [If Expression]
    

    Coco/R kreidet mir folgendes an:

    LL1 warning in OrExpression: OrOp is start & successor of deletable structure
    LL1 warning in DivisibilityExpression: DividesOp is start & successor of deletable structure
    LL1 warning in RangeExpression: RangeOp is start & successor of deletable structure
    LL1 warning in SumExpression: If is start & successor of deletable structure
    

    Aber erzeugt einen Parser der tut was ich möchte.

    Ich fühle mich gerade richtig dumm aber wo sind hier bitte die Konflikte bzw. wie würde man sie lösen?

    Danke & Grüße,
    Ethon


  • Mod

    Es geht darum, dass deine Grammatik ein dangling else Problem hat (bzw. äquivalent für deine Konstrukte).

    Soweit ich weiß wird Coco/R folgendes tun:

    the generated parser will choose the first of several possible alternatives for X.

    Was wohl vermutlich auch das ist, was du möchtest. Du sagst ja selbst, dass dein Parser tut, was du möchtest. Hast du auch mal einen der mehrdeutigen Fälle als Test probiert?



  • OrExpression = DivisibilityExpression { OrOp OrExpression }
    

    Die Stelle sieht seltsam aus, Iteration und Rekursion zusammen?

    OrExpression = DivisibilityExpression { OrOp DivisibilityExpression }
    

    Meinetst du das nicht so?



  • Upps, beim Rausschreiben den Wurm reinbekommen, danke. 😉

    SeppJ schrieb:

    Es geht darum, dass deine Grammatik ein dangling else Problem hat (bzw. äquivalent für deine Konstrukte).

    Soweit ich weiß wird Coco/R folgendes tun:

    the generated parser will choose the first of several possible alternatives for X.

    Was wohl vermutlich auch das ist, was du möchtest. Du sagst ja selbst, dass dein Parser tut, was du möchtest. Hast du auch mal einen der mehrdeutigen Fälle als Test probiert?

    Danke schon mal für die Antwort.
    Jap, das Verhalten passt mir zu 100%.
    Ich komm gerade echt nicht drauf: Wie sieht eine LL1-Grammatik aus die das dangling else Problem löst und das übliche Verhalten explizit beschreibt ohne etwas an der Syntax zu ändern?
    Nicht möglich oder?


  • Mod

    Ethon schrieb:

    Nicht möglich oder?

    Soweit ich weiß nicht möglich.



  • Besteht der Fehler noch?



  • Naja, Fehler gab's ja keinen. 🙂
    Und die Warnung ist offensichtlich nicht ohne weiteres zu eliminieren. Macht mich zwar als Warnungsphobiker ganz kirre aber ist halt so.




Anmelden zum Antworten