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 冲突
这是问题的正确解法吗?如果是,那为什么呢?
还有一个问题,我是不是在我的解析器上做错了什么?或者它只是不完整?
感谢和抱歉!
Bigger
和 Smaller
需要声明为 %left
或 %right
结合数学运算:
%left Bigger Smaller
%left PLUS MINUS
%left TIMES Div
%nonassoc UMINUS
我有以下解析器:
%{
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 冲突
这是问题的正确解法吗?如果是,那为什么呢? 还有一个问题,我是不是在我的解析器上做错了什么?或者它只是不完整?
感谢和抱歉!
Bigger
和 Smaller
需要声明为 %left
或 %right
结合数学运算:
%left Bigger Smaller
%left PLUS MINUS
%left TIMES Div
%nonassoc UMINUS