Bonjour tous,
je suis en train de découvrir bison/flex pour développer un "compilateur" pour un langage simple dans un projet.
J'ai défini mon lexique et ma grammaire avec flex/bison et tout fonctionne trop bien...
Mais bison me marque Conflits : 1 décalage/réduction.
Après des recherches il s'avère qu'il s'agit d'une déclaration récursive et qu'il ne sait plus s'il doit choisir entre un décalage ou une réduction.
Dans mon langage que je définis, on peut taper des fonctions du type :
SetValue(), IncValue( iCpt ), SetArray( tArray, 2, 4, 5 )
Et j'ai donc écrit une seule de grammaire qui permet de dire que un nom suivi de parenthèses avec 0 ou plusieurs arguments est une fonction.
Donc j'ai tapé la grammaire suivante:
c'est la définition DEF_FunctionParameter qui est donc réentrante et génère ce conflit.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 // Gestion des fonctions // Nom( [[Paramètre 0]...[Paramètre n]] ) DEF_Function: ESCT_Name ESCT_LeftBracket DEF_FunctionParameter ESCT_RightBracket { } ; // Définition d'un paramètre de fonction // [RIEN] ou [Nom] ou [Parametre, Paramètre] DEF_FunctionParameter: /* empty */ | ESCT_Name { } | DEF_FunctionParameter ESCT_Comma DEF_FunctionParameter { } ;
ma question est : est-il possible de virer se conflit ? si oui, comment ?
est-ce dû au fait que mon language est du type LALR(1) (je débute!) ou un truc du genre et que bison ne le gère pas.
Je peux fournir le rapport de Bison.
Merci à tous
Partager