首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对ocamlyacc的移位/减少合并

对ocamlyacc的移位/减少合并
EN

Stack Overflow用户
提问于 2016-12-20 02:52:34
回答 1查看 85关注 0票数 0

我有以下解析器:

代码语言:javascript
复制
%{

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代表')

它非常适合,没有错误,也没有移位/减少冲突。

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

谢谢,对不起!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-20 03:32:59

BiggerSmaller需要声明为%left%right

结合数学运算:

代码语言:javascript
复制
%left Bigger Smaller
%left PLUS MINUS
%left TIMES Div
%nonassoc UMINUS
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41234144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档