2009-11-18 8 views
0

J'ai utilisé l'option -v dans yacc pour produire un fichier y.output. Au sommet du fichier il ditQuel est le conflit dans cet analyseur yacc?

Etat 98 conflits: 1 changement/réduire

Plus bas dans le fichier est le suivant:

state 98 

    30 selection_stmt: IF '(' expression ')' statement . 
    31    | IF '(' expression ')' statement . ELSE statement 

    ELSE shift, and go to state 101 

    ELSE  [reduce using rule 30 (selection_stmt)] 
    $default reduce using rule 30 (selection_stmt) 

Quel est le conflit, et comment peut-il être fixé?

+0

duplicata possible de [Comment trouver shift/réduire les conflits dans ce fichier yacc?] (Http://stackoverflow.com/questions/1737460/how-to-find-shift-reduce-conflict-in-this-yacc -fichier) – Flexo

Répondre

0

Essayez quelque chose comme ceci:

election_stmt: IF '(' expression ')' statement . selection_stmt_else_part; 
selection_stmt_else_part: ELSE statement 
         | 
         ; 
1

À peu près tous les changement/réduire l'erreur avec if/then/else déclaration est le problème le dangling else infâme.

Avec ce segment de code:

if (f1): 
    if (f2): 
     c1 
    else: 
     c2 

vous (et Python en raison de son règles d'indentation bizarres) qui savent if l'else appartient, mais un analyseur est pas si intelligent.

Il ne peut pas dire si le else appartient au premier ou au deuxième if.

This link montre comment convertir le LR (n) en un équivalent LR (1) qui devrait résoudre le problème.

Une autre alternative est de changer votre définition de langue de base (si possible) de telle sorte que l'ambiguïté disparaît:

: IF '(' cond ')' THEN statement ENDIF 
| IF '(' cond ')' THEN statement ELSE statement ENDIF 
0

Ahem, la bonne réponse à ce problème est généralement: ne font rien.

Les conflits de décalage/réduction sont attendus avec des grammaires ambiguës. Ils ne sont pas erreurs, ils sont conflits.

Le conflit sera résolu en préférant shift over reduce, ce qui arrive justement pour résoudre le problème canonique dangling else.

Et le bison a même un% attendent n déclaration afin que vous ne recevez pas un avertissement de conflit S/R quand il y a exactement n conflits.