我有以下解析器:
%{
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 }我知道这是不完整的,我仍然在建立它,并学习如何正确地使用ocamlyacc/menhir。
当我加上这一行:| expr Bigger expr {$1 > $3},它给我10班/减少冲突.但是,当我用括号添加这一行时:
| LP expr RP Bigger LP expr RP {$2 > $6} LP代表'(‘和RP代表')’
它非常适合,没有错误,也没有移位/减少冲突。
这是问题的正确解决办法吗?如果是,那为什么?还有一个问题,我在解析器上做错什么了吗?还是只是不完整?
谢谢,对不起!
发布于 2016-12-20 03:32:59
Bigger和Smaller需要声明为%left或%right
结合数学运算:
%left Bigger Smaller
%left PLUS MINUS
%left TIMES Div
%nonassoc UMINUShttps://stackoverflow.com/questions/41234144
复制相似问题