Shift/reduce ocamlyacc 冲突

Shift/reduce conflits on 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                {  }

    expr:           
      INT               {  }  
    | IF LP expr RP         {  }
    | BEGIN expr END        {  }
    | RETURN expr PV        {  }
    | LP expr RP            {  }
    | expr PLUS expr        {  +  }
    | expr MINUS expr       {  -  }
    | expr TIMES expr           {  *  }
    | expr Div expr             {  /  }
    | MINUS expr %prec UMINUS   { -  }

我知道它还不完整,我仍在构建它并学习如何正确使用 ocamlyacc/menhir。

好吧,当我添加这一行时:| expr Bigger expr { > } 它给了我 10 个 shift/reduce 冲突...但是当我添加带有括号的这一行时:

| LP expr RP Bigger LP expr RP { > } LP 代表'(' RP 代表')'

它非常合适,没有错误,也没有 shift/reduce 冲突

这是问题的正确解法吗?如果是,那为什么呢? 还有一个问题,我是不是在我的解析器上做错了什么?或者它只是不完整?

感谢和抱歉!

BiggerSmaller 需要声明为 %left%right
结合数学运算:

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