2016-12-20 4 views
0

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!

Répondre

1

Bigger et Smaller doivent être déclarées comme %left ou %right
associatif ainsi que les opérations mathématiques:

%left Bigger Smaller 
%left PLUS MINUS 
%left TIMES Div 
%nonassoc UMINUS 
+0

Il est correct et m'a aidé à comprendre ce qui était erroné thnx –