Je l'analyseur suivant:Shift/réduire conflicts sur ocamlyacc
%{
open t
open Lexer
%}
%token <int> INT
%token <float> FLOAT
%token <char> CHAR
%token <bool> BOOL
%token PLUS Menos Mult Div Bigger Smaller MINUS TIMES
%token Equals Atribuicao SoE BoE And Or
%token IF THEN ELSE BEGIN END FUNCTION WHILE SEQ RANGE DEF RETURN OF TO PV VIR DD
%token RP LP SPL SPR LB RB
%token EOL
%left PLUS MINUS /* lowest precedence */
%left TIMES Div /* medium precedence */
%nonassoc UMINUS /* highest precedence */
%start main /* the entry point */
%type <int> main %%
main:
| expr EOL { $1 }
expr:
INT { $1 }
| IF LP expr RP { $3 }
| BEGIN expr END { $2 }
| RETURN expr PV { $2 }
| LP expr RP { $2 }
| expr PLUS expr { $1 + $3 }
| expr MINUS expr { $1 - $3 }
| expr TIMES expr { $1 * $3 }
| expr Div expr { $1/$3 }
| MINUS expr %prec UMINUS { - $2 }
Je sais que ce n'est pas complète et je suis encore et construis apprendre à utiliser ocamlyacc/menhir correctement.
Eh bien quand j'ajouter cette ligne: | expr Bigger expr {$1 > $3}
il me donne 10 décalage/réduction des conflits ... Mais quand j'ajoute cette ligne avec des parenthèses comme ceci:
| LP expr RP Bigger LP expr RP {$2 > $6}
LP représente « (» et RP représente ') '
Il convient parfaitement et me donne aucune erreur et aucun changement/réduire les conflits
Est-ce la bonne solution du problème? Si c'est le cas, alors pourquoi? Encore une question, est-ce que je fais quelque chose de mal sur mon analyseur? Ou c'est juste pas complet?
Merci et désolé pour quelque chose!
Il est correct et m'a aidé à comprendre ce qui était erroné thnx –