J'essaye d'analyser une grammaire simple en utilisant un générateur d'analyseur LALR (1) (Bison, mais le problème n'est pas spécifique à cet outil), et je frappe un changement-réduire le conflit. Les documents et d'autres sources que j'ai trouvé sur la fixation de ceux-ci ont tendance à dire un ou plusieurs des éléments suivants:Comment résoudre un conflit de décalage-réduction en grammaire non ambiguë
- Si la grammaire est ambiguë (par exemple if-then-else ambiguïté), changer la langue pour corriger l'ambiguïté .
- S'il s'agit d'un problème de priorité d'opérateur, spécifiez la priorité explicitement.
- Acceptez la résolution par défaut et dites au générateur de ne pas s'en plaindre.
Cependant, aucun d'entre eux semblent s'appliquer à ma situation: la grammaire est sans ambiguïté pour autant que je peux dire (même si bien sûr il est ambigu avec un seul caractère de préanalyse), il n'a qu'un seul opérateur, et la résolution par défaut entraîne des erreurs d'analyse sur une entrée correctement formée. Existe-t-il des techniques pour retravailler la définition d'une grammaire pour supprimer les conflits de décalage-réduction qui ne tombent pas dans les catégories ci-dessus?
Pour concrétude, voici la grammaire en question:
%token LETTER
%%
%start input;
input: /* empty */ | input input_elt;
input_elt: rule | statement;
statement: successor ';';
rule: LETTER "->" successor ';';
successor: /* empty */ | successor LETTER;
%%
L'objectif est d'analyser les lignes des points-virgules séparées de la forme "[A-Za-z] +" ou « [A-Za-z ] -> [A-Za-z] + ".
Bah, je suis un peu rouillé avec la théorie de la compilation ... Savez-vous où le conflit est dans votre grammaire? –
Bison a dit "POSIX dit que la règle% start doit apparaître avant la ligne %%". –